diff --git a/.circleci/.env_8.0-shared.ci b/.circleci/.env_8.0-shared.ci index f31cdae6b..804586d37 100644 --- a/.circleci/.env_8.0-shared.ci +++ b/.circleci/.env_8.0-shared.ci @@ -1,9 +1,10 @@ #!/usr/bin/env make PHP_VERSION=8.0 +WITH_SOURCEMAPS=0 +ASSERTIONS=0 OPTIMIZE=2 -BROTLI=0 -GZIP=0 +SYMBOLS=0 WITH_BCMATH=1 WITH_CALENDAR=1 @@ -14,10 +15,13 @@ WITH_TOKENIZER=1 WITH_PHAR=static -WITH_LIBXML=static -WITH_DOM=static -WITH_XML=static -WITH_SIMPLEXML=static +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared WITH_LIBZIP=shared WITH_ICONV=shared @@ -28,13 +32,14 @@ WITH_ZLIB=shared WITH_LIBPNG=shared WITH_FREETYPE=shared WITH_LIBJPEG=shared +WITH_LIBWEBP=shared WITH_YAML=shared -WITH_TIDY=shared WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared +WITH_WAITLINE=1 WITH_PDO_PGLITE=0 -WITH_VRZNO=0 +WITH_VRZNO=1 diff --git a/.circleci/.env_8.1-shared.ci b/.circleci/.env_8.1-shared.ci index e4a0629f9..5b0a19522 100644 --- a/.circleci/.env_8.1-shared.ci +++ b/.circleci/.env_8.1-shared.ci @@ -1,9 +1,10 @@ #!/usr/bin/env make PHP_VERSION=8.1 +WITH_SOURCEMAPS=0 +ASSERTIONS=0 OPTIMIZE=2 -BROTLI=0 -GZIP=0 +SYMBOLS=0 WITH_BCMATH=1 WITH_CALENDAR=1 @@ -14,10 +15,13 @@ WITH_TOKENIZER=1 WITH_PHAR=static -WITH_LIBXML=static -WITH_DOM=static -WITH_XML=static -WITH_SIMPLEXML=static +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared WITH_LIBZIP=shared WITH_ICONV=shared @@ -28,10 +32,12 @@ WITH_ZLIB=shared WITH_LIBPNG=shared WITH_FREETYPE=shared WITH_LIBJPEG=shared +WITH_LIBWEBP=shared WITH_YAML=shared -WITH_TIDY=shared WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.circleci/.env_8.2-shared.ci b/.circleci/.env_8.2-shared.ci index 039f1f6a8..cc0ce1806 100644 --- a/.circleci/.env_8.2-shared.ci +++ b/.circleci/.env_8.2-shared.ci @@ -1,9 +1,10 @@ #!/usr/bin/env make PHP_VERSION=8.2 +WITH_SOURCEMAPS=0 +ASSERTIONS=0 OPTIMIZE=2 -BROTLI=0 -GZIP=0 +SYMBOLS=0 WITH_BCMATH=1 WITH_CALENDAR=1 @@ -14,10 +15,13 @@ WITH_TOKENIZER=1 WITH_PHAR=static -WITH_LIBXML=static -WITH_DOM=static -WITH_XML=static -WITH_SIMPLEXML=static +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared WITH_LIBZIP=shared WITH_ICONV=shared @@ -28,10 +32,12 @@ WITH_ZLIB=shared WITH_LIBPNG=shared WITH_FREETYPE=shared WITH_LIBJPEG=shared +WITH_LIBWEBP=shared WITH_YAML=shared -WITH_TIDY=shared WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.circleci/.env_8.3-shared.ci b/.circleci/.env_8.3-shared.ci index e8a79a8cf..1d11f27da 100644 --- a/.circleci/.env_8.3-shared.ci +++ b/.circleci/.env_8.3-shared.ci @@ -1,9 +1,10 @@ #!/usr/bin/env make PHP_VERSION=8.3 +WITH_SOURCEMAPS=0 +ASSERTIONS=0 OPTIMIZE=2 -BROTLI=0 -GZIP=0 +SYMBOLS=0 WITH_BCMATH=1 WITH_CALENDAR=1 @@ -14,10 +15,13 @@ WITH_TOKENIZER=1 WITH_PHAR=static -WITH_LIBXML=static -WITH_DOM=static -WITH_XML=static -WITH_SIMPLEXML=static +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared WITH_LIBZIP=shared WITH_ICONV=shared @@ -28,10 +32,12 @@ WITH_ZLIB=shared WITH_LIBPNG=shared WITH_FREETYPE=shared WITH_LIBJPEG=shared +WITH_LIBWEBP=shared WITH_YAML=shared -WITH_TIDY=shared WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.circleci/.env_8.4-shared.ci b/.circleci/.env_8.4-shared.ci index 8654e379f..db238f9b9 100644 --- a/.circleci/.env_8.4-shared.ci +++ b/.circleci/.env_8.4-shared.ci @@ -1,9 +1,10 @@ #!/usr/bin/env make PHP_VERSION=8.4 +WITH_SOURCEMAPS=0 +ASSERTIONS=0 OPTIMIZE=2 -BROTLI=0 -GZIP=0 +SYMBOLS=0 WITH_BCMATH=1 WITH_CALENDAR=1 @@ -14,10 +15,13 @@ WITH_TOKENIZER=1 WITH_PHAR=static -WITH_LIBXML=static -WITH_DOM=static -WITH_XML=static -WITH_SIMPLEXML=static +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared WITH_LIBZIP=shared WITH_ICONV=shared @@ -28,10 +32,12 @@ WITH_ZLIB=shared WITH_LIBPNG=shared WITH_FREETYPE=shared WITH_LIBJPEG=shared +WITH_LIBWEBP=shared WITH_YAML=shared -WITH_TIDY=shared WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.circleci/.env_8.5-dynamic.ci b/.circleci/.env_8.5-dynamic.ci new file mode 100644 index 000000000..f7ad41dd6 --- /dev/null +++ b/.circleci/.env_8.5-dynamic.ci @@ -0,0 +1,37 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +OPTIMIZE=2 +BROTLI=0 +GZIP=0 + +WITH_BCMATH=1 +WITH_CALENDAR=1 +WITH_CTYPE=1 +WITH_EXIF=1 +WITH_FILTER=1 +WITH_TOKENIZER=1 + +WITH_PHAR=dynamic + +WITH_LIBXML=dynamic +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic + +WITH_LIBZIP=dynamic +WITH_ICONV=dynamic +WITH_SQLITE=dynamic + +WITH_GD=dynamic +WITH_ZLIB=dynamic +WITH_LIBPNG=shared +WITH_FREETYPE=shared +WITH_LIBJPEG=shared + +WITH_YAML=dynamic +WITH_TIDY=dynamic +WITH_MBSTRING=dynamic +WITH_ONIGURUMA=dynamic +WITH_OPENSSL=dynamic +WITH_INTL=dynamic diff --git a/.circleci/.env_8.5-shared.ci b/.circleci/.env_8.5-shared.ci new file mode 100644 index 000000000..79a8c8e8e --- /dev/null +++ b/.circleci/.env_8.5-shared.ci @@ -0,0 +1,43 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +WITH_SOURCEMAPS=0 +ASSERTIONS=0 +OPTIMIZE=2 +SYMBOLS=0 + +WITH_BCMATH=1 +WITH_CALENDAR=1 +WITH_CTYPE=1 +WITH_EXIF=1 +WITH_FILTER=1 +WITH_TOKENIZER=1 + +WITH_PHAR=static + +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared + +WITH_LIBZIP=shared +WITH_ICONV=shared +WITH_SQLITE=shared + +WITH_GD=static +WITH_ZLIB=shared +WITH_LIBPNG=shared +WITH_FREETYPE=shared +WITH_LIBJPEG=shared +WITH_LIBWEBP=shared + +WITH_YAML=shared +WITH_MBSTRING=static +WITH_ONIGURUMA=shared +WITH_OPENSSL=shared +WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.circleci/.env_8.5.ci b/.circleci/.env_8.5.ci new file mode 100644 index 000000000..afe70f94c --- /dev/null +++ b/.circleci/.env_8.5.ci @@ -0,0 +1,38 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +OPTIMIZE=2 +BROTLI=0 +GZIP=0 + +WITH_BCMATH=1 +WITH_CALENDAR=1 +WITH_CTYPE=1 +WITH_EXIF=1 +WITH_FILTER=1 +WITH_MBSTRING=1 +WITH_PHAR=1 +WITH_TOKENIZER=1 + +WITH_LIBXML=1 +WITH_DOM=1 +WITH_XML=1 +WITH_SIMPLEXML=1 + +WITH_LIBZIP=1 +WITH_ICONV=1 +WITH_SQLITE=1 +WITH_VRZNO=1 + +WITH_EXIF=1 +WITH_GD=1 +WITH_ZLIB=1 +WITH_LIBPNG=1 +WITH_FREETYPE=1 +WITH_LIBJPEG=1 + +WITH_YAML=1 +WITH_TIDY=1 +WITH_ONIGURUMA=1 +WITH_OPENSSL=1 +WITH_INTL=1 diff --git a/.cloudflare/pages/functions/[[path]].js b/.cloudflare/pages/functions/[[path]].js index 10aaf1538..7bcde13ce 100644 --- a/.cloudflare/pages/functions/[[path]].js +++ b/.cloudflare/pages/functions/[[path]].js @@ -31,12 +31,43 @@ export const onRequest = async (context) => { return new Response("Not found", { status: 404 }); } - // return new Response(JSON.stringify({key, exists: !isMissing(obj), obj})); - - return new Response(obj.body, { - headers: { - "Content-Type": obj.httpMetadata?.contentType || "application/octet-stream", - "Access-Control-Allow-Origin": "*", - }, - }); + // Preserve original content-type for use after negotiating compression + const originalContentType = obj.httpMetadata?.contentType || "application/octet-stream"; + + // Negotiate pre-compressed variants: Brotli preferred, then gzip + const acceptEncoding = context.request.headers.get("Accept-Encoding") || ""; + let encoding; + + if (acceptEncoding.includes("br")) { + const brKey = key + ".br"; + const brObj = await context.env.NIGHTLY_BUILDS.get(brKey); + if (!isMissing(brObj)) { + obj = brObj; + encoding = "br"; + } + } + + // Fallback to gzip if supported + if (!encoding && acceptEncoding.includes("gzip")) { + const gzKey = key + ".gz"; + const gzObj = await context.env.NIGHTLY_BUILDS.get(gzKey); + if (!isMissing(gzObj)) { + obj = gzObj; + encoding = "gzip"; + } + } + + console.log({originalContentType, encoding}); + + const headers = { + "Content-Type": originalContentType, + "Access-Control-Allow-Origin": "*", + }; + if (encoding) { + headers["Content-Encoding"] = encoding; + headers["Cache-Control"] = "no-transform"; + headers["Vary"] = "Accept-Encoding"; + } + + return new Response(obj.body, { headers, encodeBody: "manual" }); }; diff --git a/.editorconfig b/.editorconfig index f3f9e9904..5d7e727c9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -29,3 +29,6 @@ indent_style = space [*.json] indent_size = 2 indent_style = space + +[test/browser/browser.spec.mjs-snapshots/*.json] +insert_final_newline = false diff --git a/.github/.env_8.0.dynamic.ci b/.github/.env_8.0.dynamic.ci index 6427443b1..341738cdc 100644 --- a/.github/.env_8.0.dynamic.ci +++ b/.github/.env_8.0.dynamic.ci @@ -6,5 +6,8 @@ ASSERTIONS=0 OPTIMIZE=3 SYMBOLS=0 +WITH_WAITLINE=1 WITH_PDO_PGLITE=0 -WITH_VRZNO=0 +WITH_VRZNO=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.0.shared.ci b/.github/.env_8.0.shared.ci index e18d699ca..cc59cd409 100644 --- a/.github/.env_8.0.shared.ci +++ b/.github/.env_8.0.shared.ci @@ -19,6 +19,8 @@ WITH_LIBXML=shared WITH_DOM=dynamic WITH_XML=dynamic WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic WITH_TIDY=shared WITH_LIBZIP=shared @@ -38,5 +40,6 @@ WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared +WITH_WAITLINE=1 WITH_PDO_PGLITE=0 -WITH_VRZNO=0 +WITH_VRZNO=1 diff --git a/.github/.env_8.0.static.ci b/.github/.env_8.0.static.ci index 0b70ab7ab..2303d0ad0 100644 --- a/.github/.env_8.0.static.ci +++ b/.github/.env_8.0.static.ci @@ -19,6 +19,8 @@ WITH_LIBXML=static WITH_DOM=static WITH_XML=static WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static WITH_TIDY=static WITH_LIBZIP=static @@ -35,8 +37,9 @@ WITH_LIBWEBP=static WITH_YAML=static WITH_MBSTRING=static WITH_ONIGURUMA=static -WITH_OPENSSL=1 +WITH_OPENSSL=static WITH_INTL=static +WITH_WAITLINE=1 WITH_PDO_PGLITE=0 -WITH_VRZNO=0 +WITH_VRZNO=1 diff --git a/.github/.env_8.1.dynamic.ci b/.github/.env_8.1.dynamic.ci index 22ad9aa90..189d1a105 100644 --- a/.github/.env_8.1.dynamic.ci +++ b/.github/.env_8.1.dynamic.ci @@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0 ASSERTIONS=0 OPTIMIZE=3 SYMBOLS=0 + +WITH_WAITLINE=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.1.shared.ci b/.github/.env_8.1.shared.ci index 02ebb2388..b88819ca6 100644 --- a/.github/.env_8.1.shared.ci +++ b/.github/.env_8.1.shared.ci @@ -19,6 +19,8 @@ WITH_LIBXML=shared WITH_DOM=dynamic WITH_XML=dynamic WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic WITH_TIDY=shared WITH_LIBZIP=shared @@ -37,3 +39,5 @@ WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.github/.env_8.1.static.ci b/.github/.env_8.1.static.ci index 1cb5d5d2d..1019e6cd2 100644 --- a/.github/.env_8.1.static.ci +++ b/.github/.env_8.1.static.ci @@ -19,6 +19,8 @@ WITH_LIBXML=static WITH_DOM=static WITH_XML=static WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static WITH_TIDY=static WITH_LIBZIP=static @@ -35,5 +37,7 @@ WITH_LIBWEBP=static WITH_YAML=static WITH_MBSTRING=static WITH_ONIGURUMA=static -WITH_OPENSSL=1 +WITH_OPENSSL=static WITH_INTL=static + +WITH_WAITLINE=1 diff --git a/.github/.env_8.2.dynamic.ci b/.github/.env_8.2.dynamic.ci index 23589edcb..94456f8d8 100644 --- a/.github/.env_8.2.dynamic.ci +++ b/.github/.env_8.2.dynamic.ci @@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0 ASSERTIONS=0 OPTIMIZE=3 SYMBOLS=0 + +WITH_WAITLINE=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.2.shared.ci b/.github/.env_8.2.shared.ci index a98792071..e2aa53d5e 100644 --- a/.github/.env_8.2.shared.ci +++ b/.github/.env_8.2.shared.ci @@ -19,6 +19,8 @@ WITH_LIBXML=shared WITH_DOM=dynamic WITH_XML=dynamic WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic WITH_TIDY=shared WITH_LIBZIP=shared @@ -37,3 +39,5 @@ WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.github/.env_8.2.static.ci b/.github/.env_8.2.static.ci index 9f936d7ab..53c027667 100644 --- a/.github/.env_8.2.static.ci +++ b/.github/.env_8.2.static.ci @@ -19,6 +19,8 @@ WITH_LIBXML=static WITH_DOM=static WITH_XML=static WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static WITH_TIDY=static WITH_LIBZIP=static @@ -35,5 +37,7 @@ WITH_LIBWEBP=static WITH_YAML=static WITH_MBSTRING=static WITH_ONIGURUMA=static -WITH_OPENSSL=1 +WITH_OPENSSL=static WITH_INTL=static + +WITH_WAITLINE=1 diff --git a/.github/.env_8.3.dynamic.ci b/.github/.env_8.3.dynamic.ci index 48a512900..dcb6a6b4b 100644 --- a/.github/.env_8.3.dynamic.ci +++ b/.github/.env_8.3.dynamic.ci @@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0 ASSERTIONS=0 OPTIMIZE=3 SYMBOLS=0 + +WITH_WAITLINE=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.3.shared.ci b/.github/.env_8.3.shared.ci index 2d517356b..cba12935d 100644 --- a/.github/.env_8.3.shared.ci +++ b/.github/.env_8.3.shared.ci @@ -19,6 +19,8 @@ WITH_LIBXML=shared WITH_DOM=dynamic WITH_XML=dynamic WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic WITH_TIDY=shared WITH_LIBZIP=shared @@ -37,3 +39,5 @@ WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.github/.env_8.3.static.ci b/.github/.env_8.3.static.ci index 1e41bd621..78144b7be 100644 --- a/.github/.env_8.3.static.ci +++ b/.github/.env_8.3.static.ci @@ -19,6 +19,8 @@ WITH_LIBXML=static WITH_DOM=static WITH_XML=static WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static WITH_TIDY=static WITH_LIBZIP=static @@ -35,7 +37,7 @@ WITH_LIBWEBP=static WITH_YAML=static WITH_MBSTRING=static WITH_ONIGURUMA=static -WITH_OPENSSL=1 +WITH_OPENSSL=static WITH_INTL=static - +WITH_WAITLINE=1 diff --git a/.github/.env_8.4.dynamic.ci b/.github/.env_8.4.dynamic.ci index 3566fed86..a8f6abf95 100644 --- a/.github/.env_8.4.dynamic.ci +++ b/.github/.env_8.4.dynamic.ci @@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0 ASSERTIONS=0 OPTIMIZE=3 SYMBOLS=0 + +WITH_WAITLINE=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.4.shared.ci b/.github/.env_8.4.shared.ci index 12793d44e..562228c30 100644 --- a/.github/.env_8.4.shared.ci +++ b/.github/.env_8.4.shared.ci @@ -19,6 +19,8 @@ WITH_LIBXML=shared WITH_DOM=dynamic WITH_XML=dynamic WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic WITH_TIDY=shared WITH_LIBZIP=shared @@ -37,3 +39,5 @@ WITH_MBSTRING=static WITH_ONIGURUMA=shared WITH_OPENSSL=shared WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.github/.env_8.4.static.ci b/.github/.env_8.4.static.ci index 2a55a8df5..71ac9a0bb 100644 --- a/.github/.env_8.4.static.ci +++ b/.github/.env_8.4.static.ci @@ -19,6 +19,8 @@ WITH_LIBXML=static WITH_DOM=static WITH_XML=static WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static WITH_TIDY=static WITH_LIBZIP=static @@ -35,5 +37,7 @@ WITH_LIBWEBP=static WITH_YAML=static WITH_MBSTRING=static WITH_ONIGURUMA=static -WITH_OPENSSL=1 +WITH_OPENSSL=static WITH_INTL=static + +WITH_WAITLINE=1 diff --git a/.github/.env_8.5.dynamic.ci b/.github/.env_8.5.dynamic.ci new file mode 100644 index 000000000..b15b02bb6 --- /dev/null +++ b/.github/.env_8.5.dynamic.ci @@ -0,0 +1,11 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +WITH_SOURCEMAPS=0 +ASSERTIONS=0 +OPTIMIZE=3 +SYMBOLS=0 + +WITH_WAITLINE=1 +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic diff --git a/.github/.env_8.5.shared.ci b/.github/.env_8.5.shared.ci new file mode 100644 index 000000000..239123385 --- /dev/null +++ b/.github/.env_8.5.shared.ci @@ -0,0 +1,43 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +WITH_SOURCEMAPS=0 +ASSERTIONS=0 +OPTIMIZE=3 +SYMBOLS=0 + +WITH_BCMATH=1 +WITH_CALENDAR=1 +WITH_CTYPE=1 +WITH_EXIF=1 +WITH_FILTER=1 +WITH_TOKENIZER=1 + +WITH_PHAR=static + +WITH_LIBXML=shared +WITH_DOM=dynamic +WITH_XML=dynamic +WITH_SIMPLEXML=dynamic +WITH_XMLREADER=dynamic +WITH_XMLWRITER=dynamic +WITH_TIDY=shared + +WITH_LIBZIP=shared +WITH_ICONV=shared +WITH_SQLITE=shared + +WITH_GD=static +WITH_ZLIB=shared +WITH_LIBPNG=shared +WITH_FREETYPE=shared +WITH_LIBJPEG=shared +WITH_LIBWEBP=shared + +WITH_YAML=shared +WITH_MBSTRING=static +WITH_ONIGURUMA=shared +WITH_OPENSSL=shared +WITH_INTL=shared + +WITH_WAITLINE=1 diff --git a/.github/.env_8.5.static.ci b/.github/.env_8.5.static.ci new file mode 100644 index 000000000..85a80c69f --- /dev/null +++ b/.github/.env_8.5.static.ci @@ -0,0 +1,43 @@ +#!/usr/bin/env make +PHP_VERSION=8.5 + +WITH_SOURCEMAPS=0 +ASSERTIONS=0 +OPTIMIZE=3 +SYMBOLS=0 + +WITH_BCMATH=1 +WITH_CALENDAR=1 +WITH_CTYPE=1 +WITH_EXIF=1 +WITH_FILTER=1 +WITH_TOKENIZER=1 + +WITH_PHAR=static + +WITH_LIBXML=static +WITH_DOM=static +WITH_XML=static +WITH_SIMPLEXML=static +WITH_XMLREADER=static +WITH_XMLWRITER=static +WITH_TIDY=static + +WITH_LIBZIP=static +WITH_ICONV=static +WITH_SQLITE=static + +WITH_GD=static +WITH_ZLIB=static +WITH_LIBPNG=static +WITH_FREETYPE=static +WITH_LIBJPEG=static +WITH_LIBWEBP=static + +WITH_YAML=static +WITH_MBSTRING=static +WITH_ONIGURUMA=static +WITH_OPENSSL=static +WITH_INTL=static + +WITH_WAITLINE=1 diff --git a/.github/bin/index-dirs.sh b/.github/bin/index-dirs.sh index 38c35b753..d22f38a78 100755 --- a/.github/bin/index-dirs.sh +++ b/.github/bin/index-dirs.sh @@ -9,10 +9,10 @@ TREE_FLAGS='-FCL 1' cd ${PACKAGES_DIR}; find . -type d | while read DIR; do { - [[ "${DIR::-1}" == "pdo-cfd1" ]] && continue; - [[ "${DIR::-1}" == "pdo-pglite" ]] && continue; - [[ "${DIR::-1}" == "vrzno" ]] && continue; - [[ "${DIR::-1}" == "waitline" ]] && continue; + [[ "${DIR:2}" == "pdo-cfd1" ]] && continue; + [[ "${DIR:2}" == "pdo-pglite" ]] && continue; + [[ "${DIR:2}" == "vrzno" ]] && continue; + [[ "${DIR:2}" == "waitline" ]] && continue; test -d ${DIR} || continue; pushd ${DIR} > /dev/null; @@ -21,6 +21,20 @@ find . -type d | while read DIR; do { perl -pi -e "s#^##" index.html perl -pi -e "s#^

#at $(date)

#" index.html perl -pi -e "s#\t

#\t

php-wasm © 2021-$(date +%Y) Sean Morris

#" index.html + shopt -s nullglob + for BINARY in *.wasm; do + brotli -kfZ "${BINARY}" + gzip -n -k9 "${BINARY}" + done; + for BINARY in *.so; do + brotli -kfZ "${BINARY}" + gzip -n -k9 "${BINARY}" + done; + for DAT in *.dat; do + brotli -kfZ "${DAT}" + gzip -n -k9 "${DAT}" + done; + shopt -u nullglob popd > /dev/null; }; done; @@ -43,4 +57,3 @@ tree ${TREE_FLAGS} -H "./" -T 'php-wasm/' -I "index.html" > index.html; perl -pi -e "s#^##" index.html perl -pi -e "s#^

#at $(date)

#" index.html perl -pi -e "s#\t

#\t

php-wasm © 2021-$(date +%Y) Sean Morris

#" index.html - diff --git a/.github/bin/verify-sdl-main-module.sh b/.github/bin/verify-sdl-main-module.sh new file mode 100755 index 000000000..7700aaf69 --- /dev/null +++ b/.github/bin/verify-sdl-main-module.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +set -euo pipefail + +PHP_VERSION="${1:?usage: verify-sdl-main-module.sh }" +WRAPPER="packages/php-wasm/php${PHP_VERSION}_sdl-web.mjs" + +if [[ ! -f "${WRAPPER}" ]]; then + echo "missing SDL wrapper artifact: ${WRAPPER}" >&2 + exit 1 +fi + +WASM_BASENAME="$( + perl -ne ' + if (/new URL\("([^"]+\.wasm)", import\.meta\.url\)/) { + print "$1\n"; + exit 0; + } + if (/var f="([^"]+\.wasm)"/) { + print "$1\n"; + exit 0; + } + ' "${WRAPPER}" +)" + +if [[ -z "${WASM_BASENAME}" ]]; then + echo "could not resolve wasm path from SDL wrapper: ${WRAPPER}" >&2 + exit 1 +fi + +WASM="$(dirname "${WRAPPER}")/${WASM_BASENAME}" + +if [[ ! -f "${WASM}" ]]; then + echo "missing SDL wasm artifact: ${WASM}" >&2 + exit 1 +fi + +if ! command -v wasm-objdump >/dev/null 2>&1; then + echo "wasm-objdump is required to validate ${WASM}" >&2 + exit 1 +fi + +OBJDUMP_LOG="$(mktemp)" +trap 'rm -f "${OBJDUMP_LOG}"' EXIT +wasm-objdump -x "${WASM}" > "${OBJDUMP_LOG}" + +if grep -E -q 'GOT\.mem\.SDL_(HIDAPI|VIRTUAL|DUMMY)_JoystickDriver' "${OBJDUMP_LOG}"; then + echo "SDL main module still imports joystick driver globals: ${WASM}" >&2 + exit 1 +fi + +if grep -E -q ' <- env\.emscripten_compute_dom_pk_code' "${OBJDUMP_LOG}"; then + echo "SDL main module still imports emscripten_compute_dom_pk_code: ${WASM}" >&2 + exit 1 +fi + +if grep -E -q 'asyncifyStubs\["emscripten_compute_dom_pk_code"\]=undefined' "${WRAPPER}"; then + echo "SDL wrapper still leaves emscripten_compute_dom_pk_code unresolved: ${WRAPPER}" >&2 + exit 1 +fi diff --git a/.github/workflows/build-demo-step.yaml b/.github/workflows/build-demo-step.yaml new file mode 100644 index 000000000..5d4515b91 --- /dev/null +++ b/.github/workflows/build-demo-step.yaml @@ -0,0 +1,62 @@ +name: Build Web Demo + +on: + workflow_call: + inputs: + libType: + required: true + type: string + +jobs: + test: + name: Build Web Demo w/${{ inputs.libType }} libs + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + + - name: Disable man-db auto-update + run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + + - name: Download Artifact + uses: actions/download-artifact@v8 + with: + pattern: php-compressed-${{ inputs.libType }} + merge-multiple: true + path: ./ + + - name: Extract Artifact + run: | + for TAR in php-compressed-*.tar.gz; do + tar -xzf ${TAR} + done; + + - name: Ensure the demo uses local packages + run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..; + + - name: Build Web Demo + run: cd demo-web; ./switch-packages.sh local; npm run build; cd ..; + env: + LIB_TYPE: ${{ inputs.libType }} + CI: '' + + - name: Take Snapshot + run: | + sudo chown -R ${USER}:${USER} . + sudo chmod -R u+rwX,go+rX . + tar --exclude=.git \ + --format=posix \ + --exclude='php-demo-web-${{ inputs.libType }}.tar.gz' \ + --ignore-failed-read \ + --warning=no-file-changed \ + -czf 'php-demo-web-${{ inputs.libType }}.tar.gz' \ + docs + + - name: Upload artifact + uses: actions/upload-artifact@v6 + with: + name: php-demo-web-${{ inputs.libType }} + path: php-demo-web-${{ inputs.libType }}.tar.gz + compression-level: 0 diff --git a/.github/workflows/build-step.yaml b/.github/workflows/build-step.yaml index e19325a5b..c76e683ca 100644 --- a/.github/workflows/build-step.yaml +++ b/.github/workflows/build-step.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Import `.env` file run: | @@ -33,7 +33,7 @@ jobs: - name: Download Artifact if: ${{ inputs.libType != 'static' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: php-dependencies-* merge-multiple: true @@ -46,22 +46,27 @@ jobs: tar -xzf ${TAR} done; + - name: Re-flatten mtimes after extraction + if: ${{ inputs.libType != 'static' }} + run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC' + - name: Apply executable cache if: ${{ inputs.libType != 'static' }} run: | - ls ./.cache/executables-* | while read -r CACHE; do - cat ${CACHE} | xargs -I{} chmod +x {} + shopt -s nullglob + for CACHE in ./.cache/executables-*; do + xargs -r -a "${CACHE}" chmod +x done - name: Install NPM packages run: npm ci - - name: Install deps - run: sudo apt update && sudo apt install coreutils docker-compose -y + - name: Verify Docker Compose + run: docker compose version - name: Cache Docker image id: cache-docker-image - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: /tmp/builder-image.tar key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }} @@ -76,26 +81,37 @@ jobs: time make --debug=basic image docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest - - name: Spin up docker-network - run: docker network create phpwasm_default - - name: Build demo-node run: npm install --prefix demo-node - name: Build PHP For Node - run: time make --debug=basic node-mjs + run: time make --debug=basic node-mjs node-js + + - name: Build PHP for Web + run: time make --debug=basic web-mjs web-js - - name: Build PHP for Web & PHP-CGI for Worker - run: time make --debug=basic web-mjs worker-cgi-mjs + - name: Build PHP-CGI for Worker + run: time make --debug=basic worker-cgi-mjs worker-cgi-js - - name: Build php${{ inputs.phpVersion }}-sdl.so - run: time make --debug=basic packages/sdl/php${{ inputs.phpVersion }}-sdl.so packages/sdl/libGL.so PHP_VERSION=${{ inputs.phpVersion }} + - name: Build PHP CGI for Node + run: time make --debug=basic node-cgi-mjs node-cgi-js - - name: Build PHP (sdl) for Web - run: time make --debug=basic web-mjs WITH_SDL=1 + - name: Build PHP CLI for Node + run: time make --debug=basic node-cli-mjs node-cli-js - - name: Build PHP DBG & CLI Previews - run: time make --debug=basic web-dbg-mjs web-cli-mjs + - name: Build PHP DBG for Node + run: time make --debug=basic node-dbg-mjs node-dbg-js + + - name: Build PHP CLI for Web + run: time make --debug=basic web-cli-mjs web-cli-js + + - name: Build PHP DBG for Web + run: time make --debug=basic web-dbg-mjs web-dbg-js + + - name: Build PHP (sdl variant) for Web + run: | + sudo rm -f .cache/config-cache third_party/php${{ inputs.phpVersion }}-src/configured + time make --debug=basic web-mjs WITH_SDL=1 - name: Take Snapshot run: | @@ -113,7 +129,7 @@ jobs: lib - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-uncompressed-${{ inputs.phpVersion }}-${{ inputs.libType }} path: php-uncompressed-${{ inputs.phpVersion }}-${{ inputs.libType }}.tar.gz @@ -127,7 +143,7 @@ jobs: tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz . - name: Upload Failure Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: ${{ failure() }} with: name: failure-snapshot-${{ inputs.phpVersion }}-${{ inputs.libType }} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c0d03b2a3..883d38f13 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,6 +1,9 @@ name: Build Artifacts -on: [push] +on: + push: + paths-ignore: + - '.cloudflare/pages/functions/\[\[path\]\].js' permissions: contents: read @@ -19,15 +22,15 @@ jobs: matrix: ${{ steps.set-matrix.outputs.libgroups }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - name: Install docker-compose - run: sudo apt update && sudo apt install docker-compose -y + - name: Verify Docker Compose + run: docker compose version - name: Install NPM packages run: npm ci @@ -41,7 +44,7 @@ jobs: - name: Cache Docker image id: cache-docker-image - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: /tmp/builder-image.tar key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }} @@ -66,7 +69,7 @@ jobs: libgroup: ${{ fromJSON(needs.generate-lib-group-matrix.outputs.matrix) }} steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -76,15 +79,15 @@ jobs: - name: Install NPM packages run: npm ci - - name: Install docker-compose - run: sudo apt update && sudo apt install docker-compose -y + - name: Verify Docker Compose + run: docker compose version - name: Import configuration run: cp -p .github/.env_8.4.dynamic.ci .env - name: Cache Docker image id: cache-docker-image - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: /tmp/builder-image.tar key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }} @@ -99,9 +102,6 @@ jobs: time make --debug=basic image docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest - - name: Spin up docker-network - run: docker network create phpwasm_default - - name: Build shared libraries run: time make --debug=basic ${{ matrix.libgroup }} WITH_SDL=dynamic @@ -124,7 +124,7 @@ jobs: lib - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-dependencies-${{ matrix.libgroup }} path: php-dependencies-${{ matrix.libgroup }}.tar.gz @@ -132,12 +132,11 @@ jobs: - build-php-dynamic: needs: [build-libs] strategy: matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] uses: ./.github/workflows/build-step.yaml with: phpVersion: ${{ matrix.phpVersion }} @@ -147,7 +146,7 @@ jobs: needs: [build-libs] strategy: matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] uses: ./.github/workflows/build-step.yaml with: phpVersion: ${{ matrix.phpVersion }} @@ -157,20 +156,63 @@ jobs: needs: [] strategy: matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] uses: ./.github/workflows/build-step.yaml with: phpVersion: ${{ matrix.phpVersion }} libType: static + verify-sdl-dynamic: + name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-dynamic] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['dynamic'] + uses: ./.github/workflows/verify-sdl-step.yaml + with: + artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + verify-sdl-shared: + name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-shared] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['shared'] + uses: ./.github/workflows/verify-sdl-step.yaml + with: + artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + verify-sdl-static: + name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-static] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['static'] + uses: ./.github/workflows/verify-sdl-step.yaml + with: + artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + test-node-dynamic: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/dynamic libs needs: [build-php-dynamic] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['dynamic'] uses: ./.github/workflows/test-node-step.yaml @@ -184,8 +226,9 @@ jobs: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/shared libs needs: [build-php-shared] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['shared'] uses: ./.github/workflows/test-node-step.yaml @@ -199,8 +242,9 @@ jobs: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/static libs needs: [build-php-static] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['static'] uses: ./.github/workflows/test-node-step.yaml @@ -216,8 +260,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs needs: [build-php-dynamic] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['dynamic'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -229,8 +274,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs needs: [build-php-shared] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['shared'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -242,8 +288,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs needs: [build-php-static] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['static'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -253,18 +300,64 @@ jobs: + test-cgi-node-dynamic: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-dynamic] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['dynamic'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-uncompressed-*-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + test-cgi-node-shared: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-shared] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['shared'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-uncompressed-*-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + test-cgi-node-static: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs + needs: [build-php-static] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['static'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-uncompressed-*-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + + compress-dynamic-packages: name: Compress PHP w/${{ matrix.libType }} libs runs-on: ubuntu-latest needs: + - verify-sdl-dynamic - test-node-dynamic - test-browser-dynamic + - test-cgi-node-dynamic strategy: matrix: libType: ['dynamic'] steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -272,7 +365,7 @@ jobs: sudo dpkg-reconfigure man-db - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: php-uncompressed-*-${{ matrix.libType }} merge-multiple: true @@ -312,7 +405,7 @@ jobs: lib - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-compressed-${{ matrix.libType }} path: php-compressed-${{ matrix.libType }}.tar.gz @@ -322,14 +415,16 @@ jobs: name: Compress PHP w/${{ matrix.libType }} libs runs-on: ubuntu-latest needs: + - verify-sdl-shared - test-node-shared - test-browser-shared + - test-cgi-node-shared strategy: matrix: libType: ['shared'] steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -337,7 +432,7 @@ jobs: sudo dpkg-reconfigure man-db - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: php-uncompressed-*-${{ matrix.libType }} merge-multiple: true @@ -377,7 +472,7 @@ jobs: lib - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-compressed-${{ matrix.libType }} path: php-compressed-${{ matrix.libType }}.tar.gz @@ -387,14 +482,16 @@ jobs: name: Compress PHP w/${{ matrix.libType }} libs runs-on: ubuntu-latest needs: + - verify-sdl-static - test-node-static - test-browser-static + - test-cgi-node-static strategy: matrix: libType: ['static'] steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -402,7 +499,7 @@ jobs: sudo dpkg-reconfigure man-db - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: php-uncompressed-*-${{ matrix.libType }} merge-multiple: true @@ -442,7 +539,7 @@ jobs: lib - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-compressed-${{ matrix.libType }} path: php-compressed-${{ matrix.libType }}.tar.gz @@ -455,8 +552,9 @@ jobs: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-dynamic-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['dynamic'] uses: ./.github/workflows/test-node-step.yaml @@ -470,8 +568,9 @@ jobs: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-shared-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['shared'] uses: ./.github/workflows/test-node-step.yaml @@ -485,8 +584,9 @@ jobs: name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-static-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] testType: ['node', 'deno'] libType: ['static'] uses: ./.github/workflows/test-node-step.yaml @@ -502,8 +602,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-dynamic-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['dynamic'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -515,8 +616,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-shared-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['shared'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -528,8 +630,9 @@ jobs: name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) needs: [compress-static-packages] strategy: + fail-fast: false matrix: - phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0'] + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] libType: ['static'] uses: ./.github/workflows/test-browser-step.yaml with: @@ -537,17 +640,80 @@ jobs: phpVersion: ${{ matrix.phpVersion }} libType: ${{ matrix.libType }} + test-browser-sdl-compressed: + name: Test Browser 8.4 _sdl w/${{ matrix.libType }} libs (compressed) + needs: + - compress-dynamic-packages + - compress-shared-packages + - compress-static-packages + strategy: + fail-fast: false + matrix: + libType: ['dynamic', 'shared', 'static'] + uses: ./.github/workflows/test-browser-step.yaml + with: + artifactPattern: php-compressed-${{ matrix.libType }} + phpVersion: '8.4' + phpVariant: '_sdl' + libType: ${{ matrix.libType }} + + + + test-cgi-node-dynamic-compressed: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) + needs: [compress-dynamic-packages] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['dynamic'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-compressed-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + test-cgi-node-shared-compressed: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) + needs: [compress-shared-packages] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['shared'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-compressed-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + + test-cgi-node-static-compressed: + name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed) + needs: [compress-static-packages] + strategy: + fail-fast: false + matrix: + phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0'] + libType: ['static'] + uses: ./.github/workflows/test-cgi-node-step.yaml + with: + artifactPattern: php-compressed-${{ matrix.libType }} + phpVersion: ${{ matrix.phpVersion }} + libType: ${{ matrix.libType }} + index-packages: - name: Create HTML Indexes + name: Post nightly build to Cloudflare + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' runs-on: ubuntu-latest needs: - test-browser-dynamic-compressed - test-node-dynamic-compressed + - test-cgi-node-dynamic-compressed steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -555,7 +721,7 @@ jobs: sudo dpkg-reconfigure man-db - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: php-compressed-dynamic merge-multiple: true @@ -567,6 +733,9 @@ jobs: tar -xzf ${TAR} done; + - name: Install Brotli & GZip + run: sudo apt install brotli gzip + - name: Index Package Directories run: ./.github/bin/index-dirs.sh packages/ @@ -584,7 +753,7 @@ jobs: .cache - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: php-indexed-packages path: php-indexed-packages.tar.gz @@ -601,9 +770,9 @@ jobs: r2-account-id: ${{ secrets.R2_ACCOUNT_ID }} r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }} r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }} - r2-bucket: ${{ secrets.R2_BUCKET }} - source-dir: packages destination-dir: ${{ env.STAMP }}-${{ env.SHORT_SHA }}/ + r2-bucket: php-wasm + source-dir: packages - name: Install Wrangler run: npm install -g wrangler @@ -620,86 +789,79 @@ jobs: if: ${{ success() }} run: | curl -H "Content-Type: application/json" \ - -X POST \ - -d "{\"content\": \"New nightly build available: https://nightly.php-wasm.seanmorr.is/${{ env.STAMP }}-${{ env.SHORT_SHA }}/\"}" \ - ${{ secrets.DISCORD_WEBHOOK_URL }} + -X POST \ + -d "{\"content\": \"New nightly build available: https://nightly.php-wasm.seanmorr.is/${{ env.STAMP }}-${{ env.SHORT_SHA }}/\"}" \ + ${{ secrets.DISCORD_WEBHOOK_URL }} - build-demo: - name: Build Web Demo - runs-on: ubuntu-latest - needs: - - index-packages - steps: - - name: Check out repository code - uses: actions/checkout@v4 - - name: Disable man-db auto-update - run: | - echo "set man-db/auto-update false" | sudo debconf-communicate - sudo dpkg-reconfigure man-db - - name: Download Artifact - uses: actions/download-artifact@v4 - with: - pattern: php-compressed-dynamic - merge-multiple: true - path: ./ + build-demo-dynamic: + name: Build Web Demo w/dynamic libs + needs: + - test-browser-dynamic-compressed + - test-node-dynamic-compressed + - test-cgi-node-dynamic-compressed + uses: ./.github/workflows/build-demo-step.yaml + with: + libType: dynamic - - name: Extract Artifact - run: | - for TAR in php-compressed-*.tar.gz; do - tar -xzf ${TAR} - done; + build-demo-shared: + name: Build Web Demo w/shared libs + needs: + - test-browser-shared-compressed + - test-node-shared-compressed + - test-cgi-node-shared-compressed + uses: ./.github/workflows/build-demo-step.yaml + with: + libType: shared - - name: Download Index Artifact - uses: actions/download-artifact@v4 - with: - pattern: php-indexed-packages - merge-multiple: true - path: ./ + build-demo-static: + name: Build Web Demo w/static libs + needs: + - test-browser-static-compressed + - test-node-static-compressed + - test-cgi-node-static-compressed + uses: ./.github/workflows/build-demo-step.yaml + with: + libType: static - - name: Extract Artifact - run: | - for TAR in php-indexed-packages.tar.gz; do - tar -xzf ${TAR} - done; - - name: Ensure the demo uses local packages - run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..; - - name: Build Web Demo - run: cd demo-web; ./switch-packages.sh local; npm run build; cd ..; - env: - CI: '' + test-demo-web-dynamic: + name: Test demo-web artifact w/dynamic libs + needs: + - build-demo-dynamic + uses: ./.github/workflows/test-demo-web-step.yaml + with: + artifactName: php-demo-web-dynamic + libType: dynamic - - name: Copy packages into web demo - run: cp -rfv packages demo-web/build/nightly + test-demo-web-shared: + name: Test demo-web artifact w/shared libs + needs: + - build-demo-shared + uses: ./.github/workflows/test-demo-web-step.yaml + with: + artifactName: php-demo-web-shared + libType: shared + + test-demo-web-static: + name: Test demo-web artifact w/static libs + needs: + - build-demo-static + uses: ./.github/workflows/test-demo-web-step.yaml + with: + artifactName: php-demo-web-static + libType: static - - name: Take Snapshot - run: | - sudo chown -R ${USER}:${USER} . - sudo chmod -R u+rwX,go+rX . - tar --exclude=.git \ - --format=posix \ - --exclude='php-demo-web.tar.gz' \ - --ignore-failed-read \ - --warning=no-file-changed \ - -czf 'php-demo-web.tar.gz' \ - docs - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: php-demo-web - path: php-demo-web.tar.gz - compression-level: 0 - deploy-docs: + deploy-to-pages: name: Deploy Docs to GitHub Pages + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' runs-on: ubuntu-latest needs: - - build-demo - if: github.ref == 'refs/heads/master' + - test-demo-web-dynamic permissions: contents: read pages: write @@ -709,18 +871,18 @@ jobs: cancel-in-progress: true steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: - pattern: php-demo-web + pattern: php-demo-web-dynamic merge-multiple: true path: ./ - name: Extract Artifact run: | - for TAR in php-demo-web.tar.gz; do + for TAR in php-demo-web-dynamic.tar.gz; do tar -xzf ${TAR} done; diff --git a/.github/workflows/deploy-pages-function.yaml b/.github/workflows/deploy-pages-function.yaml new file mode 100644 index 000000000..cfdeba2c5 --- /dev/null +++ b/.github/workflows/deploy-pages-function.yaml @@ -0,0 +1,30 @@ +name: Deploy Cloudflare Pages Function + +on: + push: + paths: + - '.cloudflare/pages/functions/\[\[path\]\].js' + +permissions: + contents: read + pages: write + id-token: write + +jobs: + deploy-pages-function: + name: Deploy Cloudflare Pages Function + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + + - name: Install Wrangler + run: npm install -g wrangler + + - name: Deploy Cloudflare Pages Function + run: | + cd .cloudflare/pages + wrangler pages deploy --branch=main --project-name=php-wasm-nightly + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }} diff --git a/.github/workflows/test-browser-step.yaml b/.github/workflows/test-browser-step.yaml index 725d4adc3..3629aac87 100644 --- a/.github/workflows/test-browser-step.yaml +++ b/.github/workflows/test-browser-step.yaml @@ -12,6 +12,10 @@ on: artifactPattern: required: true type: string + phpVariant: + required: false + type: string + default: '' jobs: test: @@ -19,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Disable man-db auto-update run: | @@ -32,7 +36,7 @@ jobs: touch -d '1970-01-01 00:00:00 UTC' .env - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: ${{ inputs.artifactPattern }} merge-multiple: true @@ -44,14 +48,14 @@ jobs: tar -xzf ${TAR} done; + - name: Flatten mtimes after extraction + run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC' + - name: Install NPM packages run: npm ci - - name: Install Global NPM packages - run: npm install -g deno cv3-test netcat - - - name: Install docker-compose - run: sudo apt update && sudo apt install docker-compose -y + - name: Verify browser harness assets + run: node test/browser/verify-browser-assets.mjs - name: Install Chrome's APT key run: wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - @@ -62,11 +66,8 @@ jobs: - name: Install Chrome run: sudo apt-get update && sudo apt install -y software-properties-common google-chrome-stable - - name: Ensure the demo uses local packages - run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..; - - name: Run tests - run: BUILD_TYPE=${{ inputs.libType }} make --debug=basic test-browser + run: PHP_VERSION=${{ inputs.phpVersion }} PHP_VARIANT=${{ inputs.phpVariant }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-browser - name: Take Failure Snapshot if: ${{ failure() }} @@ -76,7 +77,7 @@ jobs: tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz . - name: Upload Failure Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: ${{ failure() }} with: name: failure-snapshot-browser-test-${{ inputs.phpVersion }}-${{ inputs.libType }} diff --git a/.github/workflows/test-cgi-node-step.yaml b/.github/workflows/test-cgi-node-step.yaml new file mode 100644 index 000000000..c13ddaee2 --- /dev/null +++ b/.github/workflows/test-cgi-node-step.yaml @@ -0,0 +1,72 @@ +name: Test CGI Node + +on: + workflow_call: + inputs: + phpVersion: + required: true + type: string + libType: + required: true + type: string + artifactPattern: + required: true + type: string + +jobs: + test: + name: Test Cgi Node ${{ inputs.phpVersion }} w/${{ inputs.libType }} libs + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + + - name: Disable man-db auto-update + run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + + - name: Import configuration + run: | + cp -p .github/.env_${{ inputs.phpVersion }}.${{ inputs.libType }}.ci .env + touch -d '1970-01-01 00:00:00 UTC' .env + + - name: Download Artifact + uses: actions/download-artifact@v8 + with: + pattern: ${{ inputs.artifactPattern }} + merge-multiple: true + path: ./ + + - name: Extract Artifact + run: | + for TAR in ${{ inputs.artifactPattern }}.tar.gz; do + tar -xzf ${TAR} + done; + + - name: Flatten mtimes after extraction + run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC' + + - name: Install NPM packages + run: | + npm ci + + - name: Run tests + run: | + PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-cgi-node + PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-cgi-node-cjs + + - name: Take Failure Snapshot + if: ${{ failure() }} + run: | + sudo chown -R ${USER}:${USER} . + sudo chmod -R u+rwX,go+rX . + tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz . + + - name: Upload Failure Artifact + uses: actions/upload-artifact@v6 + if: ${{ failure() }} + with: + name: failure-snapshot-cgi-node-test-${{ inputs.phpVersion }}-${{ inputs.libType }} + path: snapshot.tar.gz + compression-level: 0 diff --git a/.github/workflows/test-demo-web-step.yaml b/.github/workflows/test-demo-web-step.yaml new file mode 100644 index 000000000..cbae9e6ba --- /dev/null +++ b/.github/workflows/test-demo-web-step.yaml @@ -0,0 +1,73 @@ +name: Test Demo Web Artifact + +on: + workflow_call: + inputs: + artifactName: + required: true + type: string + libType: + required: true + type: string + +jobs: + test: + name: Test demo-web artifact w/${{ inputs.libType }} libs + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + + - name: Disable man-db auto-update + run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + + - name: Download Artifact + uses: actions/download-artifact@v8 + with: + name: ${{ inputs.artifactName }} + path: ./ + + - name: Extract Artifact + run: | + for TAR in php-demo-web-${{ inputs.libType }}.tar.gz; do + tar -xzf ${TAR} + done; + + - name: Install NPM packages + run: npm ci + + - name: Install Chrome's APT key + run: wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - + + - name: Install Chrome's APT source + run: sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' + + - name: Install Chrome + run: sudo apt-get update && sudo apt install -y software-properties-common google-chrome-stable + + - name: Run tests + run: LIB_TYPE=${{ inputs.libType }} DEMO_WEB_ARTIFACT_ROOT=docs make --debug=basic test-demo-web + + - name: Take Failure Snapshot + if: ${{ failure() }} + run: | + sudo chown -R ${USER}:${USER} . + sudo chmod -R u+rwX,go+rX . + tar --exclude=.git \ + --exclude='demo-web-artifact-failure.tar.gz' \ + --ignore-failed-read \ + --warning=no-file-changed \ + -czf demo-web-artifact-failure.tar.gz \ + php-demo-web-${{ inputs.libType }}.tar.gz \ + docs \ + test-results + + - name: Upload Failure Artifact + uses: actions/upload-artifact@v6 + if: ${{ failure() }} + with: + name: failure-snapshot-demo-web-test-${{ inputs.libType }} + path: demo-web-artifact-failure.tar.gz + compression-level: 0 diff --git a/.github/workflows/test-node-step.yaml b/.github/workflows/test-node-step.yaml index f26237266..88c32b8b1 100644 --- a/.github/workflows/test-node-step.yaml +++ b/.github/workflows/test-node-step.yaml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Import `.env` file run: | @@ -34,7 +34,7 @@ jobs: - name: Cache Docker image id: cache-docker-image - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: /tmp/builder-image.tar key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }} @@ -49,17 +49,16 @@ jobs: time make --debug=basic image docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest - - name: Install deps - run: sudo apt update && sudo apt install coreutils docker-compose -y + - name: Verify Docker Compose + run: docker compose version - name: npm install run: | npm ci - npm ci --prefix demo-node npm install -g deno@2.5.6 - name: Download Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: ${{ inputs.artifactPattern }} merge-multiple: true @@ -71,17 +70,27 @@ jobs: tar -xzf ${TAR} done; - - name: Spin up docker-network - run: docker network create phpwasm_default + - name: Re-flatten mtimes after extraction + run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC' - name: Apply executable cache run: | - ls ./.cache/executables-* | while read -r CACHE; do - cat ${CACHE} | xargs -I{} chmod +x {} + shopt -s nullglob + for CACHE in ./.cache/executables-*; do + xargs -r -a "${CACHE}" chmod +x done - name: Run tests - run: make --debug=basic test-${{ inputs.testType }} PHP_VERSION=${{ inputs.phpVersion }} + run: | + TARGET=test-${{ inputs.testType }} + + if [ "${{ inputs.testType }}" = "node" ]; then + make --debug=basic test-node-standard PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} + make --debug=basic test-node-cjs-standard PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} + exit 0 + fi + + make --debug=basic ${TARGET} PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} - name: Take Failure Snapshot if: ${{ failure() }} @@ -91,7 +100,7 @@ jobs: tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz . - name: Upload Failure Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: ${{ failure() }} with: name: failure-snapshot-${{ inputs.testType }}-test-${{ inputs.phpVersion }}-${{ inputs.libType }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0313408f9..e2ee913e4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,28 +1,49 @@ name: Test -on: [push] +on: + push: + paths-ignore: + - '.cloudflare/pages/functions/\[\[path\]\].js' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + SKIP_PACKAGING_TEST: 1 + jobs: + test-8-5-static: + name: Test 8.5 Static + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + - run: npm install + - run: npm install -g deno@2.5.6 + - run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + - run: docker compose version + - run: cp .circleci/.env_8.5.ci .env + - run: make image + - run: PHP_VERSION=8.5 make test + test-8-4-static: name: Test 8.4 Static runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.4.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.4 make test test-8-3-static: @@ -30,16 +51,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.3.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.3 make test test-8-2-static: @@ -47,16 +67,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.2.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.2 make test test-8-1-static: @@ -64,16 +83,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.1.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.1 make test test-8-0-static: @@ -81,34 +99,47 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.0.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.0 make test + test-8-5-dynamic: + name: Test 8.5 Dynamic + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + - run: npm install + - run: npm install -g deno@2.5.6 + - run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + - run: docker compose version + - run: cp .circleci/.env_8.5-dynamic.ci .env + - run: make image + - run: PHP_VERSION=8.5 make test test-8-4-dynamic: name: Test 8.4 Dynamic runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.4-dynamic.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.4 make test test-8-3-dynamic: @@ -116,16 +147,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.3-dynamic.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.3 make test test-8-2-dynamic: @@ -133,16 +163,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.2-dynamic.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.2 make test test-8-1-dynamic: @@ -150,16 +179,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.1-dynamic.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.1 make test test-8-0-dynamic: @@ -167,34 +195,47 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.0-dynamic.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.0 make test + test-8-5-shared: + name: Test 8.5 Shared + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + - run: npm install + - run: npm install -g deno@2.5.6 + - run: | + echo "set man-db/auto-update false" | sudo debconf-communicate + sudo dpkg-reconfigure man-db + - run: docker compose version + - run: cp .circleci/.env_8.5-shared.ci .env + - run: make image + - run: PHP_VERSION=8.5 make test test-8-4-shared: name: Test 8.4 Shared runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.4-shared.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.4 make test test-8-3-shared: @@ -202,16 +243,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.3-shared.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.3 make test test-8-2-shared: @@ -219,13 +259,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.2-shared.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.2 make test test-8-1-shared: @@ -233,16 +272,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.1-shared.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.1 make test test-8-0-shared: @@ -250,14 +288,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: npm install - run: npm install -g deno@2.5.6 - run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db - - run: sudo apt update && sudo apt install docker-compose -y + - run: docker compose version - run: cp .circleci/.env_8.0-shared.ci .env - run: make image - - run: docker network create phpwasm_default - run: PHP_VERSION=8.0 make test diff --git a/.github/workflows/verify-sdl-step.yaml b/.github/workflows/verify-sdl-step.yaml new file mode 100644 index 000000000..98596658e --- /dev/null +++ b/.github/workflows/verify-sdl-step.yaml @@ -0,0 +1,43 @@ +name: Verify SDL Step + +on: + workflow_call: + inputs: + phpVersion: + required: true + type: string + libType: + required: true + type: string + artifactPattern: + required: true + type: string + +jobs: + verify: + name: Verify SDL ${{ inputs.phpVersion }} ${{ inputs.libType }} + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v6 + + - name: Install wabt + run: | + sudo apt-get update + sudo apt-get install -y wabt + + - name: Download Artifact + uses: actions/download-artifact@v8 + with: + pattern: ${{ inputs.artifactPattern }} + merge-multiple: true + path: ./ + + - name: Extract Artifact + run: | + for TAR in ${{ inputs.artifactPattern }}.tar.gz; do + tar -xzf ${TAR} + done + + - name: Verify PHP (sdl variant) for Web + run: ./.github/bin/verify-sdl-main-module.sh ${{ inputs.phpVersion }} diff --git a/.gitignore b/.gitignore index 88b877291..142b1f8e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,63 +1,31 @@ -/php*.js -/php*.mjs -/php*.js.br -/php*.mjs.br -/php*.js.gz -/php*.mjs.gz -/php*.wasm -/php*.wat -/php-*.wasm.gz -/php-*.wasm.br -/php*.wasm.map -/php*.data -/php*.data.gz -/php*.data.br -docs-source/app/assets/php*.js -docs-source/app/assets/php*.wasm -docs-source/app/assets/php*.wasm.gz -docs-source/app/assets/php*.wasm.br -docs-source/app/assets/php*.wat -docs-source/app/assets/php*.wasm.map -docs-source/app/assets/php*.data -docs-source/app/assets/php*.data.gz -docs-source/app/assets/php*.data.br -/Php*.js -/Php*.mjs -/*.js -/*.mjs -/node_modules -configured +.DS_Store .env -/*-src/ -/docs/*.map -/.cache .env* -packages/**/*.so -packages/**/*.dat -emscripten/ -**.generated.mjs - -packages/php-wasm/*.map -packages/php-wasm/*.map.BAK -packages/php-wasm/build.log +configured -packages/php-cli-wasm/*.map -packages/php-cli-wasm/*.map.BAK -packages/php-cli-wasm/build.log +.cache/ +/docs/ +emscripten/ +node_modules/ -packages/php-cgi-wasm/*.map -packages/php-cgi-wasm/*.map.BAK -packages/php-cgi-wasm/build.log +packages/**/*.so +packages/**/*.dat +packages/**/*.map +packages/**/*.log +packages/**/*.BAK +packages/**/*.wasm packages/php-wasm/mapped packages/php-cli-wasm/mapped packages/php-cgi-wasm/mapped -docs/static/media/mapped/* -demo-web/public/static/media/mapped/* +demo-web/public/ +demo-web/build/ -.DS_Store packages/**/index.html packages/*.tar.gz -packages/dependencies.json +packages/**/*.generated.mjs + +*.gz +*.br diff --git a/CHANGELOG.md b/CHANGELOG.md index 198f9d85a..6fa670499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,22 @@ Changes -## v0.0.9 - Aiming for the (GitHub) Stars +## v0.1.0 - Aiming for the (GitHub) Stars + +* Rebuilt `demo-web` around Vite, reorganized it into `pages`, `components`, `lib`, and `assets`, and added the newer browser/e2e harnesses plus runtime path helpers for the worker and page builds. +* Added Quickbus-backed browser messaging, a richer `phpdbg` bus session, and a VSCode debugger bridge for the demo app and debugger workflow. +* Expanded runtime/build coverage across older targets, including `phpdbg`, SDL, and Vrzno support in PHP `8.0` builds. SDL now ships as the `_sdl` runtime variant instead of a separately loaded shared library. +* Added `version` and `variant` support to `php-tags`, making it possible to select non-default runtimes from static HTML. +* Standardized the maintained runtime sources on `.mjs` modules and expanded type/JSDoc coverage across `php-wasm`, `php-cgi-wasm`, `php-cli-wasm`, `php-dbg-wasm`, and the extension helper packages. +* Reworked shared and dynamic extension loading so built-in support libraries, ICU payloads, OpenSSL, libxml/XML, DOM, SimpleXML, XMLReader, and XMLWriter behave consistently across Node, browser, demo, and docs/test harnesses. +* Suppressed implicit `libxml2.so` loading when it is not provided in `sharedLibs`, which reduces startup download size for minimal runtime configurations. +* Broadened verification with vendored `php-wasm-site` docs fixtures, split docs/CGI coverage suites, deeper CLI-node PHPT coverage, richer XML/intl/tidy/iconv/sqlite smoke tests, and browser-test race-condition fixes. +* Tightened the build/test pipeline by preserving `BUILD_TYPE` through CI, adding a dynamic fallback when it is omitted, smoke-testing packaged demo artifacts, centralizing shared-lib resolution, and refreshing the workflow matrix for the newer runtime surface. +* Improved local workspace and release plumbing with symlink-aware package loading, action-artifact overlay support, and refreshed README/package docs around runtime defaults, versioned `.wasm` assets, extension wiring, interactive CLI/debugger behavior via `waitline`, and Cloudflare D1 setup through `pdo_cfd1`. + +## v0.0.9 - Here there be dragons + +*Version 0.0.9 is represented by a near endless stream of letter-tagged alpha releases and will be considered officially skipped. The changes in v0.1.0 mostly landed somewhere in this range, but since the API is not stable, here there be dragons.* * Adding PHP-CGI support! * Runtime extension loading! diff --git a/Makefile b/Makefile index 2b12a8bd9..335b387f1 100755 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ MAKEFLAGS += --no-builtin-rules --no-builtin-variables --warn-undefined-variable ENV_DIR?=. ENV_FILE?=.env -include ${ENV_FILE} +LIB_TYPE ?=$(shell basename '${ENV_FILE}' | sed -n 's/^\.env_[0-9][0-9.]*\.\([^.]*\)\.ci$$/\1/p') ## PHP Version PHP_VERSION_DEFAULT=8.4 @@ -38,6 +39,7 @@ WITH_SESSION ?=1 WITH_TOKENIZER?=1 SKIP_SHARED_LIBS?=0 +PRELOAD_ASSETS?= ifeq ($(filter ${WITH_BCMATH},0 1),) $(error WITH_BCMATH MUST BE 0 or 1. PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) @@ -93,8 +95,8 @@ ifeq ($(filter ${BROTLI},0 1),) $(error BROTLI MUST BE 0, 1. PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) endif -ifeq ($(filter ${PHP_VERSION},8.4 8.3 8.2 8.1 8.0),) -$(error PHP_VERSION MUST BE 8.4, 8.3, 8.2, 8.1 or 8.0. (got ${PHP_VERSION}) PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +ifeq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2 8.1 8.0),) +$(error PHP_VERSION MUST BE 8.5, 8.4, 8.3, 8.2, 8.1 or 8.0. (got ${PHP_VERSION}) PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) endif EXTRA_MODULES= @@ -132,9 +134,10 @@ SHELL=bash -euo pipefail PKG_CONFIG_PATH=/src/lib/lib/pkgconfig -DOCKER_COMPOSE?=docker-compose +DOCKER_COMPOSE?=docker compose CPU_COUNT=`nproc || echo 1` MAX_LOAD=$(shell echo $$(( `nproc` + $$(( `nproc` / 2 )) ))) +LTO_FLAG?=-flto DOCKER_ENV=PHP_DIST_DIR=$(realpath ${PHP_DIST_DIR}) ${DOCKER_COMPOSE} -p phpwasm run -T --rm -e PKG_CONFIG_PATH=${PKG_CONFIG_PATH} -e OUTER_UID=${UID} DOCKER_RUN=${DOCKER_ENV} emscripten-builder DOCKER_RUN_IN_PHP=${DOCKER_ENV} -w /src/third_party/php${PHP_VERSION}-src/ emscripten-builder @@ -153,12 +156,19 @@ ARCHIVES= SHARED_LIBS= PRE_JS_FILES=source/env.js EXTRA_PRE_JS_FILES?= +PRE_JS_CACHE?= PHPIZE=third_party/php${PHP_VERSION}-src/scripts/phpize PRE_JS_FILES+= ${EXTRA_PRE_JS_FILES} TEST_LIST?= +ifeq (${PHP_VERSION},8.5) +PHP_VERSION_FULL=8.5.2 +PHP_BRANCH=php-${PHP_VERSION_FULL} +PHP_AR=libphp +endif + ifeq (${PHP_VERSION},8.4) PHP_VERSION_FULL=8.4.1 PHP_BRANCH=php-${PHP_VERSION_FULL} @@ -203,10 +213,6 @@ PHP_ASSET_LIST= PHP_ASSET_DIR?=${PHP_DIST_DIR} SHARED_ASSET_PATHS=${PHP_ASSET_DIR} -ifneq (${PHP_ASSET_DIR},${PHP_DIST_DIR}) -PHP_ASSET_LIST+= -endif - PRELOAD_NAME=php NOTPARALLEL= @@ -336,6 +342,7 @@ third_party/php${PHP_VERSION}-src/configured: ${ENV_FILE} ${ARCHIVES} ${PHP_CONF --disable-all \ --disable-fiber-asm \ --disable-rpath \ + --disable-opcache-jit \ --without-pear \ --without-pcre-jit \ ${CONFIGURE_FLAGS} @@ -358,12 +365,13 @@ EXTRA_FLAGS+= --source-map-base ${SOURCE_MAP_BASE} endif ifneq (${PRE_JS_FILES},) -EXTRA_FLAGS+= --pre-js /src/.cache/pre.js +PRE_JS_CACHE:=.cache/pre.$(shell printf '%s\n' '${PRE_JS_FILES}' | sha1sum | cut -d' ' -f1).js +EXTRA_FLAGS+= --pre-js /src/${PRE_JS_CACHE} endif -.cache/pre.js: ${PRE_JS_FILES} +${PRE_JS_CACHE}: ${PRE_JS_FILES} ifneq (${PRE_JS_FILES},) - ${DOCKER_RUN} cat $(addprefix /src/,${PRE_JS_FILES}) > .cache/pre.js + ${DOCKER_RUN} cat $(addprefix /src/,${PRE_JS_FILES}) > ${PRE_JS_CACHE} endif WEB_FS_TYPE?=-lidbfs.js @@ -391,12 +399,13 @@ BUILD_FLAGS+=-f ../../php.mk \ SAPI_CGI_PATH='${SAPI_CGI_PATH}' \ SAPI_CLI_PATH='${SAPI_CLI_PATH}'\ BUILD_BINARY='${SAPI_PHPDBG_PATH}'\ + SAPI_PHPDBG_PATH='${SAPI_PHPDBG_PATH}'\ PHP_CLI_OBJS='${PHP_CLI_OBJS}' \ - EXTRA_CFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration -flto -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\ - EXTRA_CXXFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration -flto -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\ + EXTRA_CFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration ${LTO_FLAG} -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} -D HAVE_REALLOCARRAY=1 '\ + EXTRA_CXXFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration ${LTO_FLAG} -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\ EXTRA_LDFLAGS_PROGRAM='-O${OPTIMIZE} -static \ -Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152 -L/src/lib/lib \ - ${SYMBOL_FLAGS} -flto -fPIC \ + ${SYMBOL_FLAGS} ${LTO_FLAG} -fPIC \ -s EXPORTED_FUNCTIONS='\''["_malloc", "_free", "_main"]'\'' \ -s EXPORTED_RUNTIME_METHODS='\''["ccall", "UTF8ToString", "lengthBytesUTF8", "stringToUTF8", "getValue", "setValue", "lengthBytesUTF8", "FS", "ENV"]'\'' \ -s INITIAL_MEMORY=${INITIAL_MEMORY} \ @@ -429,7 +438,7 @@ BUILD_FLAGS+=-f ../../php.mk \ BUILD_TYPE ?=js ifneq (${PRE_JS_FILES},) -DEPENDENCIES+= .cache/pre.js +DEPENDENCIES+= ${PRE_JS_CACHE} endif HELPER_MJS=${PHP_DIST_DIR}/php-tags.mjs ${PHP_DIST_DIR}/php-tags.jsdelivr.mjs ${PHP_DIST_DIR}/php-tags.local.mjs ${PHP_DIST_DIR}/php-tags.unpkg.mjs @@ -479,27 +488,59 @@ ALL=${MJS} ${CJS} ${TAG_JS} tags: ${TAG_JS} +############### StdLibs ############### + +STDLIB_NODE_TARGET= +STDLIB_WEB_TARGET= +STDLIB_WORKER_TARGET= +STDLIB_WEBVIEW_TARGET= + +ifneq ($(filter ${WITH_LIBXML},dynamic),) +ifneq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2),) +STDLIB_NODE_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs +STDLIB_WEB_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs +STDLIB_WORKER_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs +STDLIB_WEBVIEW_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs +endif +endif + +stdlib: ${STDLIB_NODE_TARGET} ${STDLIB_WEB_TARGET} ${STDLIB_WORKER_TARGET} ${STDLIB_WEBVIEW_TARGET} + +packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs + node demo-node/get-symbols.mjs ${PHP_VERSION} Node > $@ + +packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs + node demo-node/get-symbols.mjs ${PHP_VERSION} Web > $@ + +packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs + node demo-node/get-symbols.mjs ${PHP_VERSION} Worker > $@ + +packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs + node demo-node/get-symbols.mjs ${PHP_VERSION} Webview > $@ + +# Single Builds + web-mjs: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS} $(MAKE) ${WEB_MJS} $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEB_MJS_ASSETS} +ifneq (${STDLIB_WEB_TARGET},) + ${MAKE} ${STDLIB_WEB_TARGET} +endif @ cat ico.ans >&2 web-js: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS} $(MAKE) ${WEB_JS} $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEB_JS_ASSETS} -ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),) - ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs -endif @ cat ico.ans >&2 worker-mjs: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS} $(MAKE) ${WORKER_MJS} $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WORKER_MJS_ASSETS} -ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),) - ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs +ifneq (${STDLIB_WORKER_TARGET},) + ${MAKE} ${STDLIB_WORKER_TARGET} endif @ cat ico.ans >&2 @@ -513,8 +554,8 @@ webview-mjs: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS} $(MAKE) ${WEBVIEW_MJS} $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEBVIEW_MJS_ASSETS} -ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),) - ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs +ifneq (${STDLIB_WEBVIEW_TARGET},) + ${MAKE} ${STDLIB_WEBVIEW_TARGET} endif @ cat ico.ans >&2 @@ -528,8 +569,8 @@ node-mjs: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS} $(MAKE) ${NODE_MJS} $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${NODE_MJS_ASSETS} -ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),) - ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs +ifneq (${STDLIB_NODE_TARGET},) + ${MAKE} ${STDLIB_NODE_TARGET} endif @ cat ico.ans >&2 @@ -539,7 +580,7 @@ node-js: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${NODE_JS_ASSETS} @ cat ico.ans >&2 -# You must have one of the above built to use the following step. +# You must have one of the above "Single Builds" done to use the following step. # Don't use it unless you're mad at your CPU cooler. fast-build: third_party/php${PHP_VERSION}-src/main/main.o $(MAKE) -j${CPU_COUNT} -l${CPU_COUNT} \ @@ -773,14 +814,13 @@ ${PHP_DIST_DIR}/php${PHP_SUFFIX}-webview.mjs.wasm.map.MAPPED: ${PHP_DIST_DIR}/ph ########## Package files ########### -${PHP_DIST_DIR}/%.js: source/%.js +${PHP_DIST_DIR}/%.js: source/%.mjs npx babel $< --out-dir ${PHP_DIST_DIR} - perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|' ${PHP_DIST_DIR}/$(notdir $@) - perl -pi -w -e 's|require\("(\..+?)"\)|require("\1.js")|' ${PHP_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|g' ${PHP_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|require\("(\..+?).mjs"\)|require("\1.js")|g' ${PHP_DIST_DIR}/$(notdir $@) -${PHP_DIST_DIR}/%.mjs: source/%.js +${PHP_DIST_DIR}/%.mjs: source/%.mjs cp $< $@; - perl -pi -w -e "s~\b(import.+ from )(['\"])(?!node\:)([^'\"]+)\2~\1\2\3.mjs\2~g" $@; ${PHP_DIST_DIR}/php-tags.mjs: source/php-tags.mjs cp $< $@; @@ -794,22 +834,6 @@ ${PHP_DIST_DIR}/php-tags.unpkg.mjs: source/php-tags.unpkg.mjs ${PHP_DIST_DIR}/php-tags.local.mjs: source/php-tags.local.mjs cp $< $@; -############### StdLibs ############### - -stdlib: packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs - -packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs - BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Node > $@ - -packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs - BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Web > $@ - -packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs - BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Worker > $@ - -packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs - BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Webview > $@ - ########### Clerical stuff. ########### ${ENV_FILE}: @@ -822,7 +846,6 @@ shared: $(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${SHARED_LIBS} assets: $(foreach P,$(sort ${SHARED_ASSET_PATHS}),$(addprefix ${P}/,${PHP_ASSET_LIST})) -# @ echo $(foreach P,$(sort ${SHARED_ASSET_PATHS}),$(addprefix ${P}/,${PHP_ASSET_LIST})) deps: ${MAKE} -j${CPU_COUNT} -l${MAX_LOAD} ${ARCHIVES} ${PHP_CONFIGURE_DEPS} @@ -843,6 +866,10 @@ third_party/php${PHP_VERSION}-src/scripts/phpize-built: ${DEPENDENCIES} | ${ORDE ${DOCKER_RUN_IN_PHP} chmod +x scripts/phpize ${DOCKER_RUN_IN_PHP} touch scripts/phpize-built +patch/php8.5.patch: + bash -c 'cd third_party/php8.5-src/ && git diff > ../../patch/php8.5.patch' + perl -pi -w -e 's|([ab])/|\1/third_party/php8.5-src/|g' ./patch/php8.5.patch + patch/php8.4.patch: bash -c 'cd third_party/php8.4-src/ && git diff > ../../patch/php8.4.patch' perl -pi -w -e 's|([ab])/|\1/third_party/php8.4-src/|g' ./patch/php8.4.patch @@ -879,12 +906,20 @@ php-clean: sapi/cli/php \ sapi/cgi/php-cgi' ${DOCKER_RUN} bash -c 'rm -f \ - packages/php-wasm/php-*.mjs \ - packages/php-cgi-wasm/php-*.mjs \ - packages/php-wasm/php-*.wasm \ - packages/php-cgi-wasm/php-*.wasm \ + packages/php-wasm/php${PHP_VERSION}-*.mjs \ + packages/php-cgi-wasm/php${PHP_VERSION}-*.mjs \ + packages/php-cli-wasm/php${PHP_VERSION}-*.mjs \ + packages/php-dbg-wasm/php${PHP_VERSION}-*.mjs \ + packages/php-wasm/php${PHP_VERSION}-*.wasm \ + packages/php-cgi-wasm/php${PHP_VERSION}-*.wasm \ + packages/php-cli-wasm/php${PHP_VERSION}-*.wasm \ + packages/php-dbg-wasm/php${PHP_VERSION}-*.wasm \ packages/php-wasm/Php*.mjs \ - packages/php-cgi-wasm/Php*.mjs' + packages/php-cgi-wasm/Php*.mjs' \ + packages/php-cli-wasm/Php*.mjs' \ + packages/php-dbg-wasm/Php*.mjs' + ${DOCKER_RUN} rm -rf lib/include/lexbor + ${DOCKER_RUN} rm -rf third_party/php${PHP_VERSION}-src/ext/yaml ${DOCKER_RUN} bash -c 'ls third_party/ | grep "php${PHP_VERSION}-.*" | while read DIR; do { \ cd "third_party/$${DIR}"; \ make clean; \ @@ -927,7 +962,7 @@ clean: packages/php-cli-wasm/*.mjs* \ third_party/php${PHP_VERSION}-src/configured \ third_party/preload \ - .cache/pre.js \ + .cache/pre*.js \ .cache/preload-collected ${MAKE} php-clean @@ -961,26 +996,127 @@ save-image: mkdir -p ./image docker image save seanmorris/php-emscripten-builder -o ./image/builder.tar +NPM_PUBLISH_TAG?=latest NPM_PUBLISH_DRY?=--dry-run publish: - npm publish ${NPM_PUBLISH_DRY} + ./publish-packages.sh ${NPM_PUBLISH_TAG} ${NPM_PUBLISH_DRY} test: ${MAKE} test-node -ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),) +ifneq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2),) ${MAKE} test-deno endif NODE_TEST_FLAGS= +DOC_TESTS= +DOC_TESTS_CJS= +PACKAGING_TESTS=test/packaging.test.mjs + +ifdef SKIP_PACKAGING_TEST +ifeq (${SKIP_PACKAGING_TEST},1) +PACKAGING_TESTS= +endif +endif + +ifeq (${LIB_TYPE},dynamic) +DOC_TESTS+=test/docs.test.mjs +DOC_TESTS+=test/docs-cgi.test.mjs +DOC_TESTS_CJS+=test/docs.test.cjs +endif + +test-node: node-mjs node-cgi-mjs + PHP_VERSION=${PHP_VERSION} \ + PHP_VARIANT=${PHP_VARIANT} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort` + +test-node-standard: node-mjs node-cgi-mjs node-cli-mjs node-dbg-mjs + PHP_VERSION=${PHP_VERSION} \ + PHP_VARIANT=${PHP_VARIANT} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} \ + `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort` \ + test/cli-node/cli-node.test.mjs \ + test/dbg-node/dbg-node.test.mjs + +test-node-cjs: node-js + PHP_VERSION=${PHP_VERSION} \ + PHP_VARIANT=${PHP_VARIANT} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS_CJS} `find test -maxdepth 1 -name '*.cjs' ! -name 'docs.test.cjs' ! -name 'docs-cgi.test.cjs' | sort` -test-node: node-mjs +test-node-cjs-standard: node-js node-cli-js node-dbg-js PHP_VERSION=${PHP_VERSION} \ PHP_VARIANT=${PHP_VARIANT} \ + LIB_TYPE=${LIB_TYPE} \ WITH_LIBXML=${WITH_LIBXML} \ WITH_LIBZIP=${WITH_LIBZIP} \ WITH_ICONV=${WITH_ICONV} \ - WITH_SQLITE=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ WITH_GD=${WITH_GD} \ WITH_PHAR=${WITH_PHAR} \ WITH_ZLIB=${WITH_ZLIB} \ @@ -990,21 +1126,27 @@ test-node: node-mjs WITH_DOM=${WITH_DOM} \ WITH_SIMPLEXML=${WITH_SIMPLEXML} \ WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ WITH_YAML=${WITH_YAML} \ WITH_TIDY=${WITH_TIDY} \ WITH_MBSTRING=${WITH_MBSTRING} \ WITH_ONIGURUMA=${WITH_ONIGURUMA} \ WITH_OPENSSL=${WITH_OPENSSL} \ WITH_SDL=${WITH_SDL} \ - WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} `ls test/*.mjs` + WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS_CJS} \ + `find test -maxdepth 1 -name '*.cjs' ! -name 'docs.test.cjs' ! -name 'docs-cgi.test.cjs' | sort` \ + test/cli-node/cli-node.test.cjs \ + test/dbg-node/dbg-node.test.cjs -test-deno: node-mjs +test-deno: node-mjs node-cgi-mjs PHP_VERSION=${PHP_VERSION} \ PHP_VARIANT=${PHP_VARIANT} \ + LIB_TYPE=${LIB_TYPE} \ WITH_LIBXML=${WITH_LIBXML} \ WITH_LIBZIP=${WITH_LIBZIP} \ WITH_ICONV=${WITH_ICONV} \ - WITH_SQLITE=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ WITH_GD=${WITH_GD} \ WITH_PHAR=${WITH_PHAR} \ WITH_ZLIB=${WITH_ZLIB} \ @@ -1014,24 +1156,137 @@ test-deno: node-mjs WITH_DOM=${WITH_DOM} \ WITH_SIMPLEXML=${WITH_SIMPLEXML} \ WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ WITH_YAML=${WITH_YAML} \ WITH_TIDY=${WITH_TIDY} \ WITH_MBSTRING=${WITH_MBSTRING} \ WITH_ONIGURUMA=${WITH_ONIGURUMA} \ WITH_OPENSSL=${WITH_OPENSSL} \ WITH_SDL=${WITH_SDL} \ - WITH_INTL=${WITH_INTL} deno test ${TEST_LIST} `ls test/*.mjs` --allow-read --allow-write --allow-env --allow-net --allow-sys + WITH_INTL=${WITH_INTL} deno test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort` --allow-read --allow-write --allow-env --allow-net --allow-sys --allow-run=npm test-browser: - PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} BUILD_TYPE=${BUILD_TYPE} REACT_APP_BUILD_TYPE=${BUILD_TYPE} test/browser-test.sh + PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} LIB_TYPE=${LIB_TYPE} test/browser-test.sh + +DEMO_WEB_PHP_VERSION ?= 8.4 + +test-demo-web: + PHP_VERSION=${DEMO_WEB_PHP_VERSION} LIB_TYPE=${LIB_TYPE} DEMO_WEB_ARTIFACT_ROOT=${DEMO_WEB_ARTIFACT_ROOT} test/demo-web-test.sh + +test-cgi-node: node-mjs node-cgi-mjs + PHP_VERSION=${PHP_VERSION} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} test/node-cgi-test.sh +ifeq (${LIB_TYPE},dynamic) + PHP_VERSION=${PHP_VERSION} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} node --test test/docs-cgi.test.mjs +endif + +test-cgi-node-cjs: node-js node-cgi-js + PHP_VERSION=${PHP_VERSION} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} \ + TEST_FORMAT=cjs test/node-cgi-test.sh +ifeq (${LIB_TYPE},dynamic) + PHP_VERSION=${PHP_VERSION} \ + LIB_TYPE=${LIB_TYPE} \ + WITH_LIBXML=${WITH_LIBXML} \ + WITH_LIBZIP=${WITH_LIBZIP} \ + WITH_ICONV=${WITH_ICONV} \ + WITH_SQLITE=${WITH_SQLITE} \ + WITH_GD=${WITH_GD} \ + WITH_PHAR=${WITH_PHAR} \ + WITH_ZLIB=${WITH_ZLIB} \ + WITH_LIBPNG=${WITH_LIBPNG} \ + WITH_FREETYPE=${WITH_FREETYPE} \ + WITH_LIBJPEG=${WITH_LIBJPEG} \ + WITH_DOM=${WITH_DOM} \ + WITH_SIMPLEXML=${WITH_SIMPLEXML} \ + WITH_XML=${WITH_XML} \ + WITH_XMLREADER=${WITH_XMLREADER} \ + WITH_XMLWRITER=${WITH_XMLWRITER} \ + WITH_YAML=${WITH_YAML} \ + WITH_TIDY=${WITH_TIDY} \ + WITH_MBSTRING=${WITH_MBSTRING} \ + WITH_ONIGURUMA=${WITH_ONIGURUMA} \ + WITH_OPENSSL=${WITH_OPENSSL} \ + WITH_SDL=${WITH_SDL} \ + WITH_INTL=${WITH_INTL} node --test test/docs-cgi.test.cjs +endif update-snapshots: - PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} BUILD_TYPE=${BUILD_TYPE} REACT_APP_BUILD_TYPE=${BUILD_TYPE} CV_UPDATE_SNAPSHOTS=1 test/browser-test.sh + PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} LIB_TYPE=${LIB_TYPE} UPDATE_SNAPSHOTS=1 test/browser-test.sh run: ${DOCKER_ENV} emscripten-builder bash all-versions: + ${MAKE} PHP_VERSION=8.5 ${MAKE} PHP_VERSION=8.4 ${MAKE} PHP_VERSION=8.3 ${MAKE} PHP_VERSION=8.2 @@ -1039,11 +1294,13 @@ all-versions: ${MAKE} PHP_VERSION=8.0 all-stdlibs: + ${MAKE} stdlib PHP_VERSION=8.5 ${MAKE} stdlib PHP_VERSION=8.4 ${MAKE} stdlib PHP_VERSION=8.3 ${MAKE} stdlib PHP_VERSION=8.2 test-all-versions: + ${MAKE} test PHP_VERSION=8.5 ${MAKE} test PHP_VERSION=8.4 ${MAKE} test PHP_VERSION=8.3 ${MAKE} test PHP_VERSION=8.2 @@ -1051,6 +1308,7 @@ test-all-versions: ${MAKE} test PHP_VERSION=8.0 x-all-versions: + ${MAKE} ${X} PHP_VERSION=8.5 ${MAKE} ${X} PHP_VERSION=8.4 ${MAKE} ${X} PHP_VERSION=8.3 ${MAKE} ${X} PHP_VERSION=8.2 @@ -1058,6 +1316,7 @@ x-all-versions: ${MAKE} ${X} PHP_VERSION=8.0 php-clean-all-versions: + ${MAKE} php-clean PHP_VERSION=8.5 ${MAKE} php-clean PHP_VERSION=8.4 ${MAKE} php-clean PHP_VERSION=8.3 ${MAKE} php-clean PHP_VERSION=8.2 @@ -1065,12 +1324,7 @@ php-clean-all-versions: ${MAKE} php-clean PHP_VERSION=8.0 demo-versions: - rm -f third_party/php8.4-src/configured - rm -f third_party/php8.3-src/configured - rm -f third_party/php8.2-src/configured - rm -f third_party/php8.1-src/configured - rm -f third_party/php8.0-src/configured - + ${MAKE} web-mjs PHP_VERSION=8.5 WITH_SDL=1 ${MAKE} web-mjs PHP_VERSION=8.4 WITH_SDL=1 ${MAKE} web-mjs PHP_VERSION=8.3 WITH_SDL=1 ${MAKE} web-mjs PHP_VERSION=8.2 WITH_SDL=1 @@ -1079,6 +1333,7 @@ demo-versions: ${MAKE} worker-cgi-mjs web-cli-mjs web-dbg-mjs PHP_VERSION=8.3 WITH_SDL=0 + ${MAKE} web-mjs PHP_VERSION=8.5 WITH_SDL=0 ${MAKE} web-mjs PHP_VERSION=8.4 WITH_SDL=0 ${MAKE} web-mjs PHP_VERSION=8.3 WITH_SDL=0 ${MAKE} web-mjs PHP_VERSION=8.2 WITH_SDL=0 @@ -1092,10 +1347,10 @@ reconfigure: rebuild: ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-src/configured -demo: web-mjs worker-cgi-mjs web-dbg-mjs packages/sdl/libSDL2.so +demo: web-mjs worker-cgi-mjs web-dbg-mjs npm run build --prefix ./demo-web -serve-demo: web-mjs worker-cgi-mjs web-dbg-mjs packages/sdl/libSDL2.so +serve-demo: web-mjs worker-cgi-mjs web-dbg-mjs npm run start --prefix ./demo-web -null: \ No newline at end of file +null: diff --git a/README.md b/README.md index e332e7c2e..df4511c55 100644 --- a/README.md +++ b/README.md @@ -6,61 +6,43 @@ _PHP in WebAssembly, npm not required._ -## [npm](https://npmjs.com/package/php-wasm) | [github](https://github.com/seanmorris/php-wasm) | [unpkg](https://unpkg.com/browse/php-wasm/) | [reddit](https://www.reddit.com/r/phpwasm) | [discord](https://discord.gg/j8VZzju7gJ) - +[npm](https://npmjs.com/package/php-wasm) | [github](https://github.com/seanmorris/php-wasm) | [unpkg](https://unpkg.com/browse/php-wasm/) | [reddit](https://www.reddit.com/r/phpwasm) | [discord](https://discord.gg/j8VZzju7gJ) + +## 📦 Current Packages -## 🌟 v0.0.9-alpha - Aiming for the (GitHub) Stars - -* Adding PHP-CGI & PH-DBG support! -* Faster build time! -* Runtime extension loading! -* libicu, freetype, zlib, gd, libpng, libjpeg, openssl, & phar support. -* php-wasm, php-cgi-wasm, & php-wasm-builder are now separate packages. -* [Vrzno](https://github.com/seanmorris/vrzno) now facilitates url fopen via the fetch() api. -* [pdo_cfd1](https://github.com/seanmorris/pdo-cfd1) is now a separate extension from Vrzno. -* [pdo_pglite](https://github.com/seanmorris/pdo-pglite) adds local Postgres support. -* SQLite is now using version 3.46. -* Demos for CodeIgniter, CakePHP, Laravel & Laminas. -* Drupal & all other demos now use standard build + zip install. -* Modules are now webpack-compatible out of the box. -* Exposing FS methods w/queueing & locking to sync files between tabs & workers. -* Fixed the bug with POST requests under Firefox. -* Adding support for PHP 8.3.11 & 8.4.1. -* Automatic CI testing for PHP 8.0, 8.1, 8.2, 8.3, & 8.4. +* `php-wasm`, `php-cgi-wasm`, `php-cli-wasm`, `php-dbg-wasm`, and `php-wasm-builder` are published separately. +* Published runtimes currently cover PHP `8.0` through `8.5`, depending on the package and entrypoint. +* `php-wasm`, `php-cgi-wasm`, and `php-dbg-wasm` currently default to PHP `8.4`; `php-cli-wasm` currently defaults to PHP `8.3`. Pass `version` explicitly when your asset filenames need to line up. +* Runtime-loadable libraries are available for `gd`, `iconv`, `intl`, `libxml`, `xml`, `dom`, `simplexml`, `yaml`, `zip`, `mbstring`, `openssl`, `phar`, `sqlite`, and `zlib`. +* [Vrzno](https://github.com/seanmorris/vrzno), [pdo_cfd1](https://github.com/seanmorris/pdo-cfd1), and [pdo_pglite](https://github.com/seanmorris/pdo-pglite) are maintained as separate packages. [changelog](https://raw.githubusercontent.com/seanmorris/php-wasm/master/CHANGELOG.md) -Installing php-wasm: - -```sh -$ npm i php-wasm@alpha -``` - -Installing php-cgi-wasm: - -```sh -$ npm i php-cgi-wasm@alpha -``` -Installing php-wasm-builder: +Install the packages you need: ```sh -$ npm i php-wasm-builder@alpha +$ npm i php-wasm +$ npm i php-cgi-wasm +$ npm i php-cli-wasm +$ npm i php-dbg-wasm +$ npm i php-wasm-builder ``` ## ☀️ Examples @@ -130,7 +112,7 @@ $ npm i php-wasm-builder@alpha ## 🎩 Introducing php-cgi-wasm! -Version 0.0.9 adds `php-cgi-wasm` to the mix. This allows you to run php in web-server mode, similar to how it runs under apache or nginx. Running within a Service Worker, it can intercept and respond to HTTP requests just like a normal webserver. This means the browser can simply navigate to a URL, and PHP will generate the page, and everything will work as-normal, AJAX and all. From the perspective of the webpage, its just making HTTP requests. Its not worried about whether the PHP runs on the server or in a Service Worker. +`php-cgi-wasm` runs PHP in web-server mode, similar to Apache or nginx. Running within a Service Worker, it can intercept and respond to HTTP requests just like a normal web server. This means the browser can simply navigate to a URL and let PHP generate the page, with AJAX and other in-page requests still flowing over normal HTTP. ### Install the php-cgi-wasm package @@ -163,9 +145,9 @@ self.addEventListener('fetch', event => php.handleFetchEvent(event)); self.addEventListener('message', event => php.handleMessageEvent(event)); ``` -You can see examples of php-cgi-wasm running in a service worker and nodejs in [`demo-web/src/cgi-worker.mjs`](demo-web/src/cgi-worker.mjs) & [`demo-node/index.mjs`](demo-node/index.mjs) respectively. +You can see examples of `php-cgi-wasm` running in a service worker and Node.js in [`demo-web/src/cgi-worker.mjs`](demo-web/src/cgi-worker.mjs) and [`demo-node/index.mjs`](demo-node/index.mjs) respectively. -***Note:*** `php-cgi-wasm` & `php-wasm` are separate packages. One "embeds" php right into your javascript, the other runs in "cgi-mode," just like php would under apache or nginx. +***Note:*** `php-cgi-wasm` and `php-wasm` are separate packages. One embeds PHP directly into your JavaScript runtime; the other runs in CGI mode, like PHP under Apache or nginx. You can find documentation specific to php-cgi-wasm [here](packages/php-cgi-wasm). @@ -177,14 +159,7 @@ Install php-wasm with npm: $ npm install php-wasm ``` -Include the module in your preferred format: - -### Common JS - -```javascript -const { PhpWeb } = require('php-wasm/PhpWeb.js'); -const php = new PhpWeb; -``` +Include the module: ### ESM @@ -207,33 +182,47 @@ const php = new PhpWeb; ##### unpkg ```javascript -const { PhpWeb } = await import('https://www.unpkg.com/php-wasm/php-wasm/PhpWeb.mjs'); +const { PhpWeb } = await import('https://unpkg.com/php-wasm/PhpWeb.mjs'); const php = new PhpWeb; ``` #### Pre-Packaged Static Assets: -If you're using a bundler, use the vendor's documentation to learn how to move the files matching the following pattern to your public directory: +If you're using a bundler, use the vendor's documentation to move the versioned `.wasm` file that matches the runtime, PHP version, and module format you import. For example: ```bash -node_modules/php-wasm/php-web.mjs.wasm -node_modules/php-wasm/php-worker.mjs.wasm # ONLY if you're running the standard build in a worker +node_modules/php-wasm/php8.4-web.mjs.wasm +node_modules/php-wasm/php8.4-worker.mjs.wasm # ONLY if you're running the standard build in a worker ``` -For php-cgi-wasm: +For `php-cgi-wasm`: + ```bash -node_modules/php-cgi-wasm/php-cgi-worker.mjs.wasm -node_modules/php-cgi-wasm/php-cgi-web.mjs.wasm # ONLY if you're running the cgi build in a page +node_modules/php-cgi-wasm/php8.4-cgi-node.mjs.wasm # ONLY if you're running the CGI build in Node.js +node_modules/php-cgi-wasm/php8.4-cgi-worker.mjs.wasm # ONLY if you're running the CGI build in a worker ``` +If you import a different runtime version, copy the matching `php8.x-*.mjs.wasm` file as well. + +Core Node runtimes support both ESM and CommonJS. + +For `0.1.0`, use the published entrypoints across the runtime packages: + +- `php-wasm/PhpNode` +- `php-cgi-wasm/PhpCgiNode` +- `php-cli-wasm/PhpCliNode` +- `php-dbg-wasm/PhpDbgNode` + +Browser/runtime helper entrypoints such as `PhpWeb` and `php-tags` remain ESM-first. + ## 🍎 Quickstart ### Inline PHP -Include the `php-tags.js` script from a CDN: +Include the `php-tags` module from a CDN: ```html - + ``` And run some PHP right in the page! @@ -245,10 +234,10 @@ And run some PHP right in the page!
``` -Inline php can use standard input, output and error with `data-` attributes. Just set the value of the attribute to a selector that will match that tag. +Inline PHP can use standard input, output, and error with `data-` attributes. Set each attribute value to a selector that matches the corresponding element. ```html - + @@ -265,7 +254,7 @@ The `src` attribute can be used on ` + @@ -281,19 +270,19 @@ The `src` attribute can be used on ` + ``` ##### Unpkg ```html - + ``` ## 🥤 Running PHP & Taking Output @@ -336,16 +325,18 @@ const exitCode = await php.run(' + ``` +The example above assumes the default `php-tags` runtime version (`8.4`). If you set `data-version` to something else, update the `php8.x-*.so` filenames to match. + ## ⚙️ Configuration You can pass in the `ini` property to the constructor to add lines to `/php.ini`: @@ -382,7 +373,7 @@ PHP will replace strings in INI files in the form `${ENVIRONMENT_VARIABLE}` with extension=php${PHP_VERSION}-phar.so ``` -Remember to correctly escape the `$` if you're supplying the INI from Javascript with ``backtics``: +Remember to correctly escape the `$` if you're supplying the INI from JavaScript with backticks: ```javascript const php = new PhpWeb({ini: ` @@ -395,12 +386,13 @@ const php = new PhpWeb({ini: ` ### Loading extensions at runtime -The following extensions may be loaded at runtime. This allows the shared extension & their dependencies to be cached, re-used, and selected a-la-carte for each application. +The following extensions may be loaded at runtime. This allows the shared extensions and their dependencies to be cached, reused, and selected a la carte for each application. * gd (https://www.npmjs.com/package/php-wasm-gd) * iconv (https://www.npmjs.com/package/php-wasm-iconv) * intl (https://www.npmjs.com/package/php-wasm-intl) -* xml (https://www.npmjs.com/package/php-wasm-libxml) +* libxml (https://www.npmjs.com/package/php-wasm-libxml) +* xml (https://www.npmjs.com/package/php-wasm-xml) * dom (https://www.npmjs.com/package/php-wasm-dom) * simplexml (https://www.npmjs.com/package/php-wasm-simplexml) * yaml (https://www.npmjs.com/package/php-wasm-libyaml) @@ -416,25 +408,27 @@ There are two ways to load extensions at runtime, using the `dl()` function or ` ```php `/my/static/path/${filename}`}); ### IDBFS (Web & Worker) -To use IDBFS in PhpWeb, pass a `persist` object with a `mountPath` key. +To use IDBFS in `PhpWeb`, pass a `persist` object with a `mountPath` key. `mountPath` will be used as the path to the persistent directory within the PHP environment. @@ -559,17 +589,23 @@ const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mj const php = new PhpWeb({persist: {mountPath: '/persist'}}); ``` -### NodeFS (NodeJS Only) +### NodeFS (Node.js Only) -To use NodeFS in PhpWeb, pass a `persist` object with `mountPath` & `localPath` keys. +To use NodeFS in `PhpNode`, pass a `persist` object with `mountPath` and `localPath` keys. `localPath` will be used as the path to the HOST directory to expose to PHP. `mountPath` will be used as the path to the persistent directory within the PHP environment. ```javascript -const { PhpNode } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpNode.mjs'); +import path from 'node:path'; +import { PhpNode } from 'php-wasm/PhpNode'; -const php = new PhpNode({persist: {mountPath: '/persist', localPath: '~/your-files'}}); +const php = new PhpNode({ + persist: { + mountPath: '/persist', + localPath: path.join(process.cwd(), 'persist'), + } +}); ``` ## 📁 Filesystem Operations @@ -595,7 +631,7 @@ await php.analyzePath(path); #### php.readdir -Get a list of files and folders in or directory. +Get a list of files and folders in a directory. ```javascript await php.readdir(path); @@ -642,7 +678,7 @@ await php.rmdir(path); Delete a file. ```javascript -await php.rmdir(path); +await php.unlink(path); ``` #### php.rename @@ -669,11 +705,11 @@ await php.writeFile(path, data, {encoding: 'utf8'}); **Web and Worker only!** -The web and worker build use `navigator.locks.request` to request a lock named `php-wasm-fs-lock` before performing filesystem operations. This ensure multiple tabs & the service worker can interact with the filesystem without overwriting eachother's work. Before any FS operation takes place, the entire FS is loaded from IDBFS, and before the lock is released, the entire FS is laoded BACK into IDBFS. +The web and worker builds use `navigator.locks.request` to request a lock named `php-wasm-fs-lock` before performing filesystem operations. This ensures multiple tabs and the service worker can interact with the filesystem without overwriting each other's work. Before any filesystem operation takes place, the entire FS is loaded from IDBFS, and before the lock is released, the entire FS is loaded back into IDBFS. -The operations are enqueued asyncronously, **so if multiple requests are generated before one transaction closes, they will be batched automatically.** This also applies to multiple requests generated before the lock is acquired. There is generally no need to take explicit control of FS mirroring. +The operations are enqueued asynchronously, **so if multiple requests are generated before one transaction closes, they will be batched automatically.** This also applies to multiple requests generated before the lock is acquired. There is generally no need to take explicit control of FS mirroring. -To suppress this behavior and take explicit control of the FS mirroring, you can pass the `{autoTransaction: false}` option to the constructor. Doing this will require you to call `php.startTransaction()` before any FS operations take place, and then`php.commitTransaction()` when you're done. **Using this incorrectly may leave your filesystem in a corrupted state.** +To suppress this behavior and take explicit control of FS mirroring, you can pass the `{autoTransaction: false}` option to the constructor. Doing this requires you to call `php.startTransaction()` before any FS operations take place, and then `php.commitTransaction()` when you're done. **Using this incorrectly may leave your filesystem in a corrupted state.** #### php.startTransaction @@ -689,9 +725,9 @@ await php.commitTransaction(); ### msg-bus -There is a `msg-bus` module supplied by `php-cgi-wasm` as a helper to communicate with php running inside a worker. The module exposes two functions: `sendMessageFor` and `onMessage`. +There is a `msg-bus` module supplied by `php-cgi-wasm` as a helper to communicate with PHP running inside a worker. The module exposes two functions: `sendMessageFor` and `onMessage`. -This allows you to simply `await` the result of calls to file system methods (see above) on the service worker: +This lets you simply `await` the result of calls to filesystem methods (see above) on the service worker: ```javascript const result = await sendMessage(methodName, [param, param, param]); @@ -703,7 +739,7 @@ const result = await sendMessage(methodName, [param, param, param]); * Use `sendMessageFor` to **GENERATE A FUNCTION** that you can use to send messages to your service worker. ```javascript -import { onMessage, sendMessageFor } from `php-cgi-wasm/msg-bus`; +import { onMessage, sendMessageFor } from 'php-cgi-wasm/msg-bus'; const SERVICE_WORKER_SCRIPT_URL = '/cgi-worker.mjs'; @@ -782,7 +818,7 @@ $ php-wasm-builder build web cgi mjs $ php-wasm-builder build worker cgi mjs ``` -This will build the package inside of the current directory (or in `PHP_DIST_DIR`, *see below for more info.*) +This will build the package inside the current directory (or in `PHP_DIST_DIR`, *see below for more info.*) ### .php-wasm-rc @@ -790,7 +826,7 @@ You can also create a `.php-wasm-rc` file in this directory to customize the bui ```make # Select a PHP version -PHP_VERSION=8.3 +PHP_VERSION=8.4 # Build the package to a directory other than the current one (RELATIVE path) PHP_DIST_DIR=./public @@ -816,7 +852,7 @@ INITIAL_MEMORY=2048MB ASSERTIONS=0 # Select the optimization level -OPTIMIZATION=3 +OPTIMIZE=3 # Build with extensions WITH_GD=1 @@ -833,19 +869,19 @@ The following options may appear in `.php-wasm-rc`. ##### PHP_VERSION -8.0|8.1|8.2|**8.3** +8.0|8.1|8.2|8.3|**8.4**|8.5 --- ##### PHP_DIST_DIR -This is the directory where javascript & wasm files will be built to, *relative to the current directory.* +This is the directory where JavaScript and wasm files will be built, *relative to the current directory.* --- ##### PHP_ASSET_DIR -This is the directory where shared libs, extension, `.data` files & other supporting files will be built to, *relative to the current directory.* Defaults to `PHP_DIST_DIR`. +This is the directory where preload `.data` / `.dat` files and other supporting assets will be built, *relative to the current directory.* Shared libraries and side modules remain in their owning packages. Defaults to `PHP_DIST_DIR`. --- @@ -857,7 +893,7 @@ The optimization level to use while compiling. --- -##### SUBOPTIMIZE +##### SUB_OPTIMIZE The optimization level to use while compiling libraries. Defaults to `OPTIMIZE`. @@ -887,7 +923,7 @@ As stated above, extensions may be compiled as `dynamic`, `shared`, or `static`. (defaults provided below in **bold**) -The following options are availavle for building static PHP extensions: +The following options are available for building static PHP extensions: ``` WITH_BCMATH # [0, 1] Enabled by default @@ -897,9 +933,10 @@ WITH_EXIF # [0, 1] Enabled by default WITH_FILTER # [0, 1] Enabled by default WITH_TOKENIZER # [0, 1] Enabled by default WITH_VRZNO # [0, 1] Enabled by default +WITH_WAITLINE # [0, 1] Disabled by default in raw custom builds ``` -The following extension may be compiled as static, shared or dynamic: +The following extensions may be compiled as static, shared, or dynamic: ``` WITH_PHAR # [0, 1, static, dynamic] @@ -937,9 +974,9 @@ When compiled as a `dynamic` extension, this will produce the extension file `ph static|**shared** -This actual `php-libxml` extension must be statically compiled, but `libxml` itself may be loaded as a shared library. +The `libxml` extension itself must be statically compiled, but `libxml2` may be loaded as a shared library. -When compiled as a `shared` library, it will produce the library `libxml.so`. +When compiled as a `shared` library, it will produce the library `libxml2.so`. --- @@ -947,7 +984,7 @@ When compiled as a `shared` library, it will produce the library `libxml.so`. static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-zip.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-zip.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libzip.so`. @@ -959,7 +996,7 @@ This extension depends on `zlib`. static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-iconv.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-iconv.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libiconv.so`. @@ -969,7 +1006,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extensions `php-8.x-sqlite.so`, & `php-8.x-pdo-sqlite.so`. +When compiled as a `dynamic` extension, this will produce the extensions `php8.x-sqlite.so` and `php8.x-pdo-sqlite.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libsqlite3.so`. @@ -979,9 +1016,9 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library static|**dynamic** -This extenstion makes use of `freetype`, `libjpeg`, `libpng`, & `zlib`. +This extension makes use of `freetype`, `libjpeg`, `libpng`, and `zlib`. -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-gd.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-gd.so`. ###### WITH_LIBPNG @@ -1013,7 +1050,7 @@ If WITH_GD is dynamic, then loading will be deferred until after gd is loaded. static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-zlib.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-zlib.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libz.so`. @@ -1023,7 +1060,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-yaml.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-yaml.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libyaml.so`. @@ -1033,7 +1070,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library static|shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-tidy.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-tidy.so`. When compiled as a `dynamic` or `shared` extension, it will produce the library `libtidy.so`. @@ -1043,7 +1080,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library static|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-mbstring.so`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-mbstring.so`. --- @@ -1053,7 +1090,7 @@ static|shared|**dynamic** Support library for `mbstring`. -When compiled as a `dynamic` or `shared ` library, this will produce the library `libonig.so`. +When compiled as a `dynamic` or `shared` library, this will produce the library `libonig.so`. If `WITH_MBSTRING` is `dynamic`, then loading will be deferred until after `mbstring` is loaded. @@ -1063,7 +1100,7 @@ If `WITH_MBSTRING` is `dynamic`, then loading will be deferred until after `mbst shared|**dynamic** -When compiled as a `dynamic` extension, this will produce the extension `php-8.x-openssl`. +When compiled as a `dynamic` extension, this will produce the extension `php8.x-openssl.so`. When compiled as a `dynamic` or `shared` extension, it will produce the libraries `libssl.so` & `libcrypto.so`. @@ -1071,7 +1108,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the librarie static|shared|**dynamic** -When compiled as a `dynamic`, or `shared` extension, this will produce the extension `php-8.x-intl.so` & the following libraries: +When compiled as a `dynamic` or `shared` extension, this will produce the extension `php8.x-intl.so` and the following libraries: * libicuuc.so * libicutu.so @@ -1087,7 +1124,7 @@ When compiled as a `dynamic`, or `shared` extension, this will produce the exten #### php-wasm-builder build -Use this to build custom version of php-wasm. Its recommended to build this to an empty directory using a `.php-wasm-rc` file. +Use this to build a custom version of `php-wasm`. It's recommended to build into an empty directory using a `.php-wasm-rc` file. ```bash npx php-wasm-builder build @@ -1103,7 +1140,7 @@ npx php-wasm-builder image #### php-wasm-builder copy-assets -This will scan the current package's node_modules directory for shared libraries & supporting files, and copy them to `PHP_ASSET_DIR`. +This will scan the current package's `node_modules` directory for supporting data files, and copy them to `PHP_ASSET_DIR`. You can use this with `.php-wasm-rc` to copy assets even if you're not using a custom build. @@ -1113,7 +1150,7 @@ npx php-wasm-builder copy-assets #### php-wasm-builder build-assets -Similar to `copy-assets`, but will actually compile the shared libaries, then copy them to `PHP_ASSET_DIR`. +Similar to `copy-assets`, but will build the supporting asset files described by `.php-wasm-rc`, then copy them to `PHP_ASSET_DIR`. You can use this with `.php-wasm-rc` to copy assets even if you're not using a custom build. diff --git a/bin/docs-snippet-report.js b/bin/docs-snippet-report.js new file mode 100644 index 000000000..72a2b4f64 --- /dev/null +++ b/bin/docs-snippet-report.js @@ -0,0 +1,10 @@ +#!/usr/bin/env node + +(async () => { + const { buildDocsCoverageReport } = await import('../test/docs/report.mjs'); + const report = await buildDocsCoverageReport(); + process.stdout.write(JSON.stringify(report, null, 2) + '\n'); +})().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/bin/translate-test.js b/bin/translate-test.js index 9d652ef4f..8e8af9e73 100644 --- a/bin/translate-test.js +++ b/bin/translate-test.js @@ -5,6 +5,7 @@ const { parseArgs } = require('node:util'); const parsedArgs = parseArgs({allowPositionals:true, options: { file: { type: 'string' } , phpVersion: { type: 'string' } + , libType: { type: 'string', default: 'shared' } , buildType: { type: 'string', default: 'shared' } }}).values; @@ -36,6 +37,7 @@ async function translate() console.log(`import { test } from 'node:test'; import { strict as assert } from 'node:assert'; import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { nodeRuntimeOptions } from '../../../test/lib/node-runtime-options.mjs'; test(${JSON.stringify(String(sections.TEST).trim())}, async () => { const sharedLibs = []; @@ -50,7 +52,7 @@ test(${JSON.stringify(String(sections.TEST).trim())}, async () => { const files = []; process.env.WITH_INTL === 'dynamic' && files.push({parent: '/preload/', name: 'icudt72l.dat', url: './node_modules/php-wasm-intl/icudt72l.dat'}); - const php = new PhpNode( { sharedLibs, files, persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } } ); + const php = new PhpNode(nodeRuntimeOptions({ sharedLibs, files, persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } })); let stdOut = '', stdErr = ''; diff --git a/demo-node/get-symbols.mjs b/demo-node/get-symbols.mjs index 7df069837..6400c512b 100644 --- a/demo-node/get-symbols.mjs +++ b/demo-node/get-symbols.mjs @@ -2,44 +2,8 @@ import { PhpNode } from 'php-wasm/PhpNode.mjs'; import fs from 'node:fs'; -const sharedLibs = []; -const buildType = process.env.BUILD_TYPE ?? 'dynamic'; - -if(buildType === 'static') -{ - sharedLibs.push( - {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)}, - {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)}, - ); -} -else if(buildType === 'shared') -{ - sharedLibs.push( - {name: 'libxml2.so', url: new URL('node_modules/php-wasm-libxml/libxml2.so', import.meta.url)}, - - {name: 'libz.so', url: new URL('node_modules/php-wasm-zlib/libz.so', import.meta.url)}, - {name: 'libzip.so', url: new URL('node_modules/php-wasm-libzip/libzip.so', import.meta.url)}, - {name: 'libfreetype.so', url: new URL('node_modules/php-wasm-gd/libfreetype.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('node_modules/php-wasm-gd/libjpeg.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('node_modules/php-wasm-gd/libwebp.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('node_modules/php-wasm-gd/libpng.so', import.meta.url)}, - {name: 'libiconv.so', url: new URL('node_modules/php-wasm-iconv/libiconv.so', import.meta.url)}, - {name: 'libicuuc.so', url: new URL('node_modules/php-wasm-intl/libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('node_modules/php-wasm-intl/libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('node_modules/php-wasm-intl/libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('node_modules/php-wasm-intl/libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('node_modules/php-wasm-intl/libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('node_modules/php-wasm-intl/libicudata.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)}, - {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)}, - {name: 'libonig.so', url: new URL('node_modules/php-wasm-mbstring/libonig.so', import.meta.url)}, - {name: 'libsqlite3.so', url: new URL('node_modules/php-wasm-sqlite/libsqlite3.so', import.meta.url)}, - {name: 'libtidy.so', url: new URL('node_modules/php-wasm-tidy/libtidy.so', import.meta.url)}, - {name: 'libyaml.so', url: new URL('node_modules/php-wasm-yaml/libyaml.so', import.meta.url)}, - ); -} const [version, envName] = process.argv.slice(2); -const php = new PhpNode({version, envName, sharedLibs, buildType}); +const php = new PhpNode({ version, envName }); php.addEventListener('output', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join(''))); php.addEventListener('error', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join(''))); diff --git a/demo-node/index.mjs b/demo-node/index.mjs index afc98db34..93d17d910 100755 --- a/demo-node/index.mjs +++ b/demo-node/index.mjs @@ -2,26 +2,59 @@ import http from 'node:http'; import { PhpCgiNode } from 'php-cgi-wasm/PhpCgiNode.mjs'; +const libType = process.env.LIB_TYPE ?? process.env.BUILD_TYPE ?? 'dynamic'; +const sharedLibs = []; + +if(libType === 'dynamic') +{ + sharedLibs.push( + await import('php-wasm-intl') + , await import('php-wasm-libxml') + , await import('php-wasm-phar') + , await import('php-wasm-mbstring') + , await import('php-wasm-openssl') + , await import('php-wasm-dom') + , await import('php-wasm-xml') + , await import('php-wasm-simplexml') + , await import('php-wasm-sqlite') + , await import('php-wasm-zlib') + , await import('php-wasm-gd') + ); +} +else if(libType === 'shared') +{ + sharedLibs.push( + {name: 'libxml2.so', url: new URL('node_modules/php-wasm-libxml/libxml2.so', import.meta.url)}, + {name: 'libz.so', url: new URL('node_modules/php-wasm-zlib/libz.so', import.meta.url)}, + {name: 'libzip.so', url: new URL('node_modules/php-wasm-libzip/libzip.so', import.meta.url)}, + {name: 'libfreetype.so', url: new URL('node_modules/php-wasm-gd/libfreetype.so', import.meta.url)}, + {name: 'libjpeg.so', url: new URL('node_modules/php-wasm-gd/libjpeg.so', import.meta.url)}, + {name: 'libwebp.so', url: new URL('node_modules/php-wasm-gd/libwebp.so', import.meta.url)}, + {name: 'libpng.so', url: new URL('node_modules/php-wasm-gd/libpng.so', import.meta.url)}, + {name: 'libiconv.so', url: new URL('node_modules/php-wasm-iconv/libiconv.so', import.meta.url)}, + {name: 'libicuuc.so', url: new URL('node_modules/php-wasm-intl/libicuuc.so', import.meta.url)}, + {name: 'libicutu.so', url: new URL('node_modules/php-wasm-intl/libicutu.so', import.meta.url)}, + {name: 'libicutest.so', url: new URL('node_modules/php-wasm-intl/libicutest.so', import.meta.url)}, + {name: 'libicuio.so', url: new URL('node_modules/php-wasm-intl/libicuio.so', import.meta.url)}, + {name: 'libicui18n.so', url: new URL('node_modules/php-wasm-intl/libicui18n.so', import.meta.url)}, + {name: 'libicudata.so', url: new URL('node_modules/php-wasm-intl/libicudata.so', import.meta.url)}, + {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)}, + {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)}, + {name: 'libonig.so', url: new URL('node_modules/php-wasm-mbstring/libonig.so', import.meta.url)}, + {name: 'libsqlite3.so', url: new URL('node_modules/php-wasm-sqlite/libsqlite3.so', import.meta.url)}, + {name: 'libtidy.so', url: new URL('node_modules/php-wasm-tidy/libtidy.so', import.meta.url)}, + {name: 'libyaml.so', url: new URL('node_modules/php-wasm-yaml/libyaml.so', import.meta.url)}, + ); +} const php = new PhpCgiNode({ - prefix: '/php-wasm/cgi-bin/' + version: process.env.PHP_VERSION ?? '8.3' + , sharedLibs + , prefix: '/php-wasm/cgi-bin/' , docroot: '/persist/www' , persist: [ {mountPath: '/persist' , localPath: './persist'} , {mountPath: '/config' , localPath: './config'} ] - , sharedLibs: [ - // await import('php-wasm-intl') - // , await import('php-wasm-libxml') - // , await import('php-wasm-phar') - // , await import('php-wasm-mbstring') - // , await import('php-wasm-openssl') - // , await import('php-wasm-dom') - // , await import('php-wasm-xml') - // , await import('php-wasm-simplexml') - // , await import('php-wasm-sqlite') - // , await import('php-wasm-zlib') - // , await import('php-wasm-gd') - ] , types: { jpeg: 'image/jpeg' , jpg: 'image/jpeg' diff --git a/demo-node/package-lock.json b/demo-node/package-lock.json index 733c3456c..3d52a8d17 100644 --- a/demo-node/package-lock.json +++ b/demo-node/package-lock.json @@ -31,30 +31,39 @@ } }, "../packages/dom": { + "name": "php-wasm-dom", "version": "0.0.9-alpha-33" }, "../packages/gd": { + "name": "php-wasm-gd", "version": "0.0.9-alpha-33" }, "../packages/iconv": { + "name": "php-wasm-iconv", "version": "0.0.9-alpha-33" }, "../packages/intl": { + "name": "php-wasm-intl", "version": "0.0.9-alpha-33" }, "../packages/libxml": { + "name": "php-wasm-libxml", "version": "0.0.9-alpha-33" }, "../packages/libyaml": { + "name": "php-wasm-yaml", "version": "0.0.9-alpha-33" }, "../packages/libzip": { + "name": "php-wasm-libzip", "version": "0.0.9-alpha-33" }, "../packages/mbstring": { + "name": "php-wasm-mbstring", "version": "0.0.9-alpha-33" }, "../packages/openssl": { + "name": "php-wasm-openssl", "version": "0.0.9-alpha-33" }, "../packages/pdo-pglite": { @@ -64,6 +73,7 @@ } }, "../packages/phar": { + "name": "php-wasm-phar", "version": "0.0.9-alpha-33" }, "../packages/php-cgi-wasm": { @@ -83,18 +93,23 @@ "license": "Apache-2.0" }, "../packages/simplexml": { + "name": "php-wasm-simplexml", "version": "0.0.9-alpha-33" }, "../packages/sqlite": { + "name": "php-wasm-sqlite", "version": "0.0.9-alpha-33" }, "../packages/tidy": { + "name": "php-wasm-tidy", "version": "0.0.9-alpha-33" }, "../packages/xml": { + "name": "php-wasm-xml", "version": "0.0.9-alpha-33" }, "../packages/zlib": { + "name": "php-wasm-zlib", "version": "0.0.9-alpha-33" }, "node_modules/pdo-pglite": { diff --git a/demo-node/persist/symbols.php b/demo-node/persist/symbols.php index 5a2a6cd45..72a7362f6 100644 --- a/demo-node/persist/symbols.php +++ b/demo-node/persist/symbols.php @@ -1,11 +1,5 @@ import { Php } from '../Php.mjs'; -const sharedLibs = [ - - {name: 'libcrypto.so', url: new URL('php-wasm-openssl/libcrypto.so', import.meta.url)}, - {name: 'libssl.so', url: new URL('php-wasm-openssl/libssl.so', import.meta.url)}, - -]; -const php = new Php({version: '', sharedLibs, ini: `error_reporting = E_ALL ^ E_DEPRECATED`}); +const php = new Php({version: '', ini: `error_reporting = E_ALL ^ E_DEPRECATED`}); php.addEventListener('output', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join(''))); php.addEventListener('error', event => console.error(event.detail.map(line => line.replace(/\s+$/, '')).join(''))); $val): diff --git a/demo-node/persist/www/index.php b/demo-node/persist/www/index.php index b834b1b2e..7394d45f8 100644 --- a/demo-node/persist/www/index.php +++ b/demo-node/persist/www/index.php @@ -42,6 +42,8 @@
More:
phpinfo
+
version
+
extensions
diff --git a/demo-node/persist/www/test/extensions.php b/demo-node/persist/www/test/extensions.php new file mode 100644 index 000000000..aa562d2cb --- /dev/null +++ b/demo-node/persist/www/test/extensions.php @@ -0,0 +1 @@ +> build/index.html; +NODE_OPTIONS='--max_old_space_size=8192' npm run build:worker; +NODE_OPTIONS='--max_old_space_size=8192' npm run build:app; -cp build/index.html build/404.html; -cp build/index.html build/code-editor.html; -cp build/index.html build/dbg-preview.html; -cp build/index.html build/cli-preview.html; -cp build/index.html build/embedded-php.html; -cp build/index.html build/home.html; -cp build/index.html build/install-demo.html; -cp build/index.html build/select-framework.html; -cp build/index.html build/vscode.html; +node ./scripts/generate-html-aliases.cjs; # git add \ # ../docs/*.js \ diff --git a/demo-web/npm-start.sh b/demo-web/npm-start.sh index 421f3e634..845b657bd 100755 --- a/demo-web/npm-start.sh +++ b/demo-web/npm-start.sh @@ -2,6 +2,9 @@ set -eux; +export VITE_LIB_TYPE="${VITE_LIB_TYPE:-${LIB_TYPE:-${VITE_BUILD_TYPE:-${BUILD_TYPE:-}}}}" +export VITE_BUILD_TYPE="${VITE_BUILD_TYPE:-${VITE_LIB_TYPE}}" + mkdir -p public/static/media if [ -d 'public/static/media/mapped' ]; then { @@ -47,7 +50,9 @@ rm -f public/*.data; rm -f public/*.so; rm -f public/*.dat; rm -f public/*.map; +rm -rf public/worker-assets; +rm -f public/assets/php*-web.mjs public/assets/php*-web.mjs.wasm || true -NODE_OPTIONS=--max_old_space_size=4096 npx webpack --config service-worker-dev.config.ts; +NODE_OPTIONS=--max_old_space_size=4096 npm run build:worker; -react-scripts start --no-cache +npx vite --host 0.0.0.0 diff --git a/demo-web/package-lock.json b/demo-web/package-lock.json index 20bf36dad..1cf1aefea 100644 --- a/demo-web/package-lock.json +++ b/demo-web/package-lock.json @@ -9,9 +9,10 @@ "version": "0.0.0", "dependencies": { "@electric-sql/pglite": "0.2.17", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "ace-builds": "^1.43.6", "ansi-to-html": "^0.7.2", "pdo-pglite": "../packages/pdo-pglite", "php-cgi-wasm": "../packages/php-cgi-wasm", @@ -27,112 +28,142 @@ "php-wasm-mbstring": "../packages/mbstring", "php-wasm-openssl": "../packages/openssl", "php-wasm-phar": "../packages/phar", - "php-wasm-sdl": "../packages/sdl", "php-wasm-simplexml": "../packages/simplexml", "php-wasm-sqlite": "../packages/sqlite", "php-wasm-tidy": "../packages/tidy", "php-wasm-xml": "../packages/xml", + "php-wasm-xmlreader": "../packages/xmlreader", + "php-wasm-xmlwriter": "../packages/xmlwriter", "php-wasm-yaml": "../packages/libyaml", "php-wasm-zlib": "../packages/zlib", - "quickbus": "^0.0.0", - "react": "^18.3.1", - "react-ace-builds": "^7.4.1", - "react-dom": "^18.3.1", + "quickbus": "^1.0.1", + "react": "^19.2.0", + "react-ace": "^14.0.1", + "react-dom": "^19.2.0", "react-router-dom": "^6.23.0", - "react-scripts": "5.0.1", - "vscode-react": "^0.1.5", + "vscode-react": "^0.2.2", "web-vitals": "^2.1.4" }, "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "webpack-cli": "^5.1.4" + "@eslint/js": "^9.39.1", + "@vitejs/plugin-react": "^5.2.0", + "babel-loader": "10.1.0", + "baseline-browser-mapping": "^2.9.11", + "eslint": "^9.39.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "globals": "^17.5.0", + "jsdom": "^27.0.1", + "sm-no-saccade-style": "^0.1.1", + "vite": "^7.3.2", + "vitest": "^4.1.5", + "webpack": "5.102.1", + "webpack-cli": "5.1.4" } }, "../packages/dom": { "name": "php-wasm-dom", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/gd": { "name": "php-wasm-gd", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/iconv": { "name": "php-wasm-iconv", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/intl": { "name": "php-wasm-intl", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/libxml": { "name": "php-wasm-libxml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/libyaml": { "name": "php-wasm-yaml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/libzip": { "name": "php-wasm-libzip", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/mbstring": { "name": "php-wasm-mbstring", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/openssl": { "name": "php-wasm-openssl", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/pdo-pglite": { - "version": "0.0.9-alpha-33", + "version": "0.1.0", "optionalDependencies": { "@electric-sql/pglite": "^0.2.7" } }, "../packages/phar": { "name": "php-wasm-phar", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/php-cgi-wasm": { - "version": "0.0.9-alpha-33", - "license": "Apache-2.0" + "version": "0.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=24.5.0" + } }, "../packages/php-cli-wasm": { - "version": "0.0.9-alpha-32", + "version": "0.1.0", "license": "Apache-2.0" }, "../packages/php-dbg-wasm": { - "version": "0.0.9-alpha-33", - "license": "Apache-2.0" + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "php-wasm": "^0.1.0" + } }, "../packages/php-wasm": { - "version": "0.0.9-alpha-33", + "version": "0.1.0", "license": "Apache-2.0" }, - "../packages/sdl": { - "name": "php-wasm-sdl", - "version": "0.0.9-alpha-33" - }, "../packages/simplexml": { "name": "php-wasm-simplexml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/sqlite": { "name": "php-wasm-sqlite", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/tidy": { "name": "php-wasm-tidy", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "../packages/xml": { "name": "php-wasm-xml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" + }, + "../packages/xmlreader": { + "name": "php-wasm-xmlreader", + "version": "0.1.0" + }, + "../packages/xmlwriter": { + "name": "php-wasm-xmlwriter", + "version": "0.1.0" }, "../packages/zlib": { "name": "php-wasm-zlib", - "version": "0.0.9-alpha-33" + "version": "0.1.0" + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" }, "node_modules/@adobe/css-tools": { "version": "4.4.4", @@ -140,25 +171,89 @@ "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "license": "MIT" }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "dev": true, "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, + "node_modules/@asamuzakjp/dom-selector/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -167,29 +262,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -205,41 +302,15 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", - "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/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==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -248,25 +319,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -276,104 +336,40 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -382,70 +378,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, "engines": { "node": ">=6.9.0" } @@ -454,15 +392,16 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -472,45 +411,34 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -519,26 +447,27 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -547,2709 +476,2758 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "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.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" - }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.19.0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "node_modules/@csstools/css-calc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", + "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "license": "MIT", + "node_modules/@csstools/css-color-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.19.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "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, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10.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==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@electric-sql/pglite": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.17.tgz", + "integrity": "sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw==", + "license": "Apache-2.0" }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "license": "MIT", + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", - "license": "MIT", + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@eslint/core": "^0.17.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "license": "MIT", + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "node_modules/@eslint/eslintrc/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, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "argparse": "^2.0.1" }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "license": "MIT", + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@noble/hashes": "^1.8.0 || ^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@humanfs/types": "^0.15.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "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, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": ">=8.40.0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "node_modules/@stylistic/eslint-plugin/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "18 || 20 || >=22" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "18 || 20 || >=22" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "license": "MIT", + "node_modules/@stylistic/eslint-plugin/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=6.9.0" + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "node_modules/@stylistic/eslint-plugin/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", - "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12", + "npm": ">=6" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/types": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-typescript": { + "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/types": "^7.28.2" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "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, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", + "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "undici-types": "~7.14.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "optional": true, + "peer": true }, - "node_modules/@babel/preset-env/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==", + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "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==", + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, + "optional": true, + "peer": true, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@types/react": "^18.0.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "debug": "^4.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "node_modules/@vitest/expect": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", + "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "node_modules/@vitest/mocker": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", + "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "license": "MIT" - }, - "node_modules/@csstools/normalize.css": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", - "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", - "license": "CC0-1.0" - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@vitest/spy": "4.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, - "peerDependencies": { - "postcss": "^8.2" + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "license": "CC0-1.0", + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@types/estree": "^1.0.0" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "license": "CC0-1.0", + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "license": "CC0-1.0", + "node_modules/@vitest/pretty-format": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", + "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "tinyrainbow": "^3.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "license": "CC0-1.0", + "node_modules/@vitest/runner": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", + "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@vitest/utils": "4.1.5", + "pathe": "^2.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "license": "CC0-1.0", + "node_modules/@vitest/snapshot": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", + "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "license": "CC0-1.0", + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/@vitest/spy": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", + "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", + "dev": true, + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "license": "CC0-1.0", + "node_modules/@vitest/utils": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", + "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@vitest/pretty-format": "4.1.5", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "license": "CC0-1.0", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "license": "CC0-1.0", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/@electric-sql/pglite": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.17.tgz", - "integrity": "sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw==", - "license": "Apache-2.0" + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "license": "MIT", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", "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" + "@xtuc/long": "4.2.2" } }, - "node_modules/@eslint/eslintrc/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==", - "license": "Python-2.0" + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@eslint/eslintrc/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==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "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==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "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, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "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, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "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, "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "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, + "license": "BSD-3-Clause" + }, + "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, + "license": "Apache-2.0" + }, + "node_modules/ace-builds": { + "version": "1.43.6", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.6.tgz", + "integrity": "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg==", + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "node": ">=10.13.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "acorn": "^8.14.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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, "license": "MIT", - "engines": { - "node": ">=6" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "ajv": "^8.0.0" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jest/console/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" }, - "node_modules/@jest/console/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "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==", "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, + "peer": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "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, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "node_modules/ansi-to-html": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "entities": "^2.2.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "bin": { + "ansi-to-html": "bin/ansi-to-html" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8.0.0" } }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", "dependencies": { - "@types/yargs-parser": "*" + "dequal": "^2.0.3" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@jest/environment/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/environment/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" } }, - "node_modules/@jest/fake-timers/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-loader": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.0.tgz", + "integrity": "sha512-5HTUZa013O4SWEYlJDHexrqSIYkWatfA9w/ZZQa7V2nMc0dRWkfu/0pmioC7XMYm8M7Z/3+q42NWj6e+fAT0MQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.12.0 || ^8.0.0-beta.1", + "@rspack/core": "^1.0.0 || ^2.0.0-0", + "webpack": ">=5.61.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@jest/fake-timers/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.24", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", + "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "require-from-string": "^2.0.2" } }, - "node_modules/@jest/fake-timers/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "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" + } + ], "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@jest/fake-timers/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" } }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "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, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6" } }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "dev": true, + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=18" } }, - "node_modules/@jest/globals/node_modules/chalk": { + "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, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3262,14541 +3240,2745 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/globals/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.0" } }, - "node_modules/@jest/globals/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "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, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6" } }, - "node_modules/@jest/globals/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "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, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "color-name": "~1.1.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=7.0.0" } }, - "node_modules/@jest/globals/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } + "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, + "license": "MIT" + }, + "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, + "license": "MIT" }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "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, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8" } }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=20" } }, - "node_modules/@jest/reporters/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/cssstyle/node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", - "engines": { - "node": ">=8" + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } } }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/cssstyle/node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/@jest/reporters/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "20 || >=22" } }, - "node_modules/@jest/reporters/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "node_modules/cssstyle/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } + "optional": true, + "peer": true }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=20" } }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=20" } }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/test-result/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "ms": "^2.1.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/transform/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/@jest/transform/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@jest/transform/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", - "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", - "license": "MIT", - "dependencies": { - "ansi-html": "^0.0.9", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^4.2.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x || 5.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "license": "MIT", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.14.0.tgz", - "integrity": "sha512-WJFej426qe4RWOm9MMtP4V3CV4AucXolQty+GRgAWLgQXmpCuwzs7hEpxxhSc/znXUSxum9d/P/32MW0FlAAlA==", - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "license": "Apache-2.0", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "license": "MIT", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", - "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.14.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", - "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", - "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", - "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "license": "MIT", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/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==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "Apache-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "license": "BSD-3-Clause" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ace-builds": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.31.1.tgz", - "integrity": "sha512-3DnE5bZF6Ji+l4F5acoLk+rV7mxrUt1C4r61Xy9owp5rVM4lj5NL8GJfoX6Jnnbhx6kKV7Vdpb+Tco+0ORTvhg==", - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "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==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.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==", - "license": "MIT", - "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-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", - "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-to-html": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", - "license": "MIT", - "dependencies": { - "entities": "^2.2.0" - }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", - "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "is-string": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "license": "MIT", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/babel-loader": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", - "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.4", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "license": "MIT", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "license": "MIT" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", - "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.17.tgz", - "integrity": "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/bfj": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", - "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "license": "MIT", - "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "license": "BSD-2-Clause" - }, - "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/check-types": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "license": "MIT", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/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==", - "license": "MIT" - }, - "node_modules/coa/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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "license": "MIT" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.26.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", - "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", - "hasInstallScript": true, - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "license": "MIT", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "license": "CC0-1.0", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "license": "MIT" - }, - "node_modules/cssdb": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", - "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "CC0-1.0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "license": "MIT", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/csso/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT", - "peer": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "license": "BSD-2-Clause" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "license": "MIT" - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "license": "Apache-2.0" - }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "license": "BSD-2-Clause" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.237", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", - "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==" - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", - "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/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==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "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-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "license": "BSD-3-Clause", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "license": "MIT", - "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/eslint-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.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==", - "license": "BSD-2-Clause", - "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==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "license": "MIT", - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/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==", - "license": "Python-2.0" - }, - "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==", - "license": "MIT", - "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/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==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/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==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "BSD-2-Clause", - "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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "license": "BSD-3-Clause", - "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==", - "license": "BSD-2-Clause", - "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==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/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==", - "license": "MIT", - "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/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "BSD-3-Clause", - "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==", - "license": "MIT", - "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.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "license": "Unlicense" - }, - "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==", - "license": "ISC" - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "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": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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==", - "license": "BSD-2-Clause" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "license": "MIT" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "license": "(Apache-2.0 OR MPL-1.1)" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/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==", - "license": "MIT", - "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/hpack.js/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==", - "license": "MIT" - }, - "node_modules/hpack.js/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", - "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "license": "MIT", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "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==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "license": "MIT", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-changed-files/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-circus/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "license": "MIT", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-cli/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-diff/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-each/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-jsdom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-environment-jsdom/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-node/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-environment-node/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-haste-map/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-haste-map/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-haste-map/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-jasmine2/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "license": "MIT", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-matcher-utils/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-message-util/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-resolve-dependencies/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-resolve/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-runner/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-runtime/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-snapshot/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "license": "MIT", - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "license": "MIT" - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-watch-typeahead/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "license": "MIT", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", - "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "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/jest-watcher/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "license": "MIT", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", - "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", - "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "license": "MIT", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "license": "MIT", - "dependencies": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pdo-pglite": { - "resolved": "../packages/pdo-pglite", - "link": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/php-cgi-wasm": { - "resolved": "../packages/php-cgi-wasm", - "link": true - }, - "node_modules/php-cli-wasm": { - "resolved": "../packages/php-cli-wasm", - "link": true - }, - "node_modules/php-dbg-wasm": { - "resolved": "../packages/php-dbg-wasm", - "link": true - }, - "node_modules/php-wasm": { - "resolved": "../packages/php-wasm", - "link": true - }, - "node_modules/php-wasm-dom": { - "resolved": "../packages/dom", - "link": true - }, - "node_modules/php-wasm-gd": { - "resolved": "../packages/gd", - "link": true - }, - "node_modules/php-wasm-iconv": { - "resolved": "../packages/iconv", - "link": true - }, - "node_modules/php-wasm-intl": { - "resolved": "../packages/intl", - "link": true - }, - "node_modules/php-wasm-libxml": { - "resolved": "../packages/libxml", - "link": true - }, - "node_modules/php-wasm-libzip": { - "resolved": "../packages/libzip", - "link": true - }, - "node_modules/php-wasm-mbstring": { - "resolved": "../packages/mbstring", - "link": true - }, - "node_modules/php-wasm-openssl": { - "resolved": "../packages/openssl", - "link": true - }, - "node_modules/php-wasm-phar": { - "resolved": "../packages/phar", - "link": true - }, - "node_modules/php-wasm-sdl": { - "resolved": "../packages/sdl", - "link": true - }, - "node_modules/php-wasm-simplexml": { - "resolved": "../packages/simplexml", - "link": true - }, - "node_modules/php-wasm-sqlite": { - "resolved": "../packages/sqlite", - "link": true - }, - "node_modules/php-wasm-tidy": { - "resolved": "../packages/tidy", - "link": true - }, - "node_modules/php-wasm-xml": { - "resolved": "../packages/xml", - "link": true - }, - "node_modules/php-wasm-yaml": { - "resolved": "../packages/libyaml", - "link": true - }, - "node_modules/php-wasm-zlib": { - "resolved": "../packages/zlib", - "link": true - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "peer": true }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } + "node_modules/electron-to-chromium": { + "version": "1.5.345", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz", + "integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==", + "dev": true, + "license": "ISC" }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "dev": true, "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10.13.0" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "license": "CC0-1.0", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "bin": { + "envinfo": "dist/cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=4" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">= 0.4" } }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.4" } }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.4" } }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "es-errors": "^1.3.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">= 0.4" } }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">= 0.4" } }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "hasown": "^2.0.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">= 0.4" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "license": "CC0-1.0", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "esbuild": "bin/esbuild" }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.2.15" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6" } }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "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, "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "license": "CC0-1.0", + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "postcss": "^8.2" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "license": "CC0-1.0", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=4.0" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.4" + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "license": "CC0-1.0", + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=4" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "license": "CC0-1.0", + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "license": "CC0-1.0", - "engines": { - "node": "^12 || ^14 || >=16" + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "postcss": "^8.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "license": "CC0-1.0", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "postcss-value-parser": "^4.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "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, + "license": "Apache-2.0", "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.0" + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "camelcase-css": "^2.0.1" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12 || ^14 || >= 16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4.21" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-lab-function": { + "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "license": "MIT", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "node": ">=0.10" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "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, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "license": "CC0-1.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, + "license": "BSD-2-Clause", "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=4.0" } }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "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, "license": "MIT", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.8.x" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" } }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "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, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 4.9.1" } }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=12.0.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=16.0.0" } }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "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, "license": "MIT", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "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, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=16" } }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "is-callable": "^1.2.7" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.4" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "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==", + "dev": true, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">= 0.4" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "license": "CC0-1.0", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "license": "CC0-1.0", + "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, + "license": "ISC", "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" + "node": ">=10.13.0" } }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "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, + "license": "BSD-2-Clause" }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "node_modules/globals": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "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, + "license": "ISC" }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "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, "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "es-define-property": "^1.0.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "dunder-proto": "^1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "license": "CC0-1.0", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "function-bind": "^1.1.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">= 0.4" } }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "license": "CC0-1.0", + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "hermes-estree": "0.25.1" } }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "license": "CC0-1.0", + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "@exodus/bytes": "^1.6.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 14" } }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 14" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" + "engines": { + "node": ">= 4" } }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/import-fresh/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, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { "node": ">=4" } }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=8" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=0.8.19" } }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/postcss-svgo/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==", - "license": "BSD-3-Clause", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "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, "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, "engines": { "node": ">=10.13.0" } }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?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==", - "license": "MIT" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.6" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "hasown": "^2.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" + "node": ">=0.10.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quickbus": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/quickbus/-/quickbus-0.0.0.tgz", - "integrity": "sha512-rXndHN7mtJgBsZTLYs4gH2d0tPhuOt4+DEs25pORT5ZSHjVqPSdAxclMefVRHYhp5ZjKQFspBMeFa5/0K/mW6A==" - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "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==", + "dev": true, "license": "MIT", "dependencies": { - "performance-now": "^2.1.0" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "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, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-ace-builds": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/react-ace-builds/-/react-ace-builds-7.4.1.tgz", - "integrity": "sha512-pvzBDp7Fc0Jv6NDKThF0DziFfClVO/X+YO6qZhhCkHDlQqJOJtxvW1Vq1PVMh+BZa5rUR7nZDvNnMVDk9DfKbg==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, "license": "MIT", - "dependencies": { - "ace-builds": "1.31.1", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, "license": "MIT", "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/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==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/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==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/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==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/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==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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, "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-error-overlay": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", - "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", - "license": "MIT" - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/react-router": { - "version": "6.30.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", - "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "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, "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" + "node": ">= 10.13.0" } }, - "node_modules/react-router-dom": { - "version": "6.30.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", - "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "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, "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0", - "react-router": "6.30.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "bin": { - "react-scripts": "bin/react-scripts.js" + "jiti": "bin/jiti.js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { - "typescript": { + "canvas": { "optional": true } } }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", - "dependencies": { - "pify": "^2.3.0" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "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==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": ">= 6" + "node": ">=4.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "json-buffer": "3.0.1" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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, "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.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==", + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "language-subtag-registry": "^0.3.20" }, "engines": { - "node": ">= 10.13.0" + "node": ">=0.10" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "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, "license": "MIT", "dependencies": { - "minimatch": "^3.0.5" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.8.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "license": "MIT", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regex-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", - "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" + "node": ">= 12.0.0" }, - "bin": { - "regjsparser": "bin/parser" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "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, "license": "MIT", "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "license": "MIT" }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "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, + "license": "MIT" }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "license": "MIT", - "engines": { - "node": ">=10" + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "license": "MIT", - "engines": { - "node": ">= 4" + "peer": true, + "bin": { + "lz-string": "bin/bin.js" } }, - "node_modules/reusify": { + "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "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, + "license": "MIT" }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "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, "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 0.6" } }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "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, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" + "mime-db": "1.52.0" }, - "peerDependencies": { - "rollup": "^2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=4" } }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "license": "BSD-3-Clause", + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "randombytes": "^2.1.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "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==", + "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, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "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, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -17804,930 +5986,825 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", - "license": "CC0-1.0" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, "license": "MIT", "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "license": "ISC" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "license": "ISC", + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" + "node": ">= 0.4" } }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], "license": "MIT" }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "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.5" }, "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">= 0.8.0" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "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, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "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, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "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, "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "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, "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "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==", + "dev": true, + "license": "MIT" }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, "license": "MIT" }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" + "node_modules/pdo-pglite": { + "resolved": "../packages/pdo-pglite", + "link": true }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/php-cgi-wasm": { + "resolved": "../packages/php-cgi-wasm", + "link": true }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } + "node_modules/php-cli-wasm": { + "resolved": "../packages/php-cli-wasm", + "link": true }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/php-dbg-wasm": { + "resolved": "../packages/php-dbg-wasm", + "link": true + }, + "node_modules/php-wasm": { + "resolved": "../packages/php-wasm", + "link": true + }, + "node_modules/php-wasm-dom": { + "resolved": "../packages/dom", + "link": true + }, + "node_modules/php-wasm-gd": { + "resolved": "../packages/gd", + "link": true + }, + "node_modules/php-wasm-iconv": { + "resolved": "../packages/iconv", + "link": true + }, + "node_modules/php-wasm-intl": { + "resolved": "../packages/intl", + "link": true + }, + "node_modules/php-wasm-libxml": { + "resolved": "../packages/libxml", + "link": true + }, + "node_modules/php-wasm-libzip": { + "resolved": "../packages/libzip", + "link": true + }, + "node_modules/php-wasm-mbstring": { + "resolved": "../packages/mbstring", + "link": true + }, + "node_modules/php-wasm-openssl": { + "resolved": "../packages/openssl", + "link": true + }, + "node_modules/php-wasm-phar": { + "resolved": "../packages/phar", + "link": true + }, + "node_modules/php-wasm-simplexml": { + "resolved": "../packages/simplexml", + "link": true + }, + "node_modules/php-wasm-sqlite": { + "resolved": "../packages/sqlite", + "link": true + }, + "node_modules/php-wasm-tidy": { + "resolved": "../packages/tidy", + "link": true + }, + "node_modules/php-wasm-xml": { + "resolved": "../packages/xml", + "link": true + }, + "node_modules/php-wasm-xmlreader": { + "resolved": "../packages/xmlreader", + "link": true + }, + "node_modules/php-wasm-xmlwriter": { + "resolved": "../packages/xmlwriter", + "link": true + }, + "node_modules/php-wasm-yaml": { + "resolved": "../packages/libyaml", + "link": true + }, + "node_modules/php-wasm-zlib": { + "resolved": "../packages/zlib", + "link": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "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, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "find-up": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "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, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "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==", + "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, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "p-locate": "^4.1.0" }, "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==", + "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, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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, "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/postcss": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10 || ^12 || >=14" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "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, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "license": "MIT", + "peer": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "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, "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=6" } }, - "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==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "node_modules/quickbus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quickbus/-/quickbus-1.0.1.tgz", + "integrity": "sha512-wUY8xt+bLKY53hqPTjWfyEMEbz7Qmz7nVnojicyRGFoHM2wprOfF9bB/xOaJtzVo1I+G3+4vGeAvyaOeXxMghA==", + "license": "Apache-2.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==", - "license": "BSD-3-Clause", + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "license": "MIT" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/react-ace": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-14.0.1.tgz", + "integrity": "sha512-z6YAZ20PNf/FqmYEic//G/UK6uw0rn21g58ASgHJHl9rfE4nITQLqthr9rHMVQK4ezwohJbp2dGrZpkq979PYQ==", "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "ace-builds": "^1.36.3", + "diff-match-patch": "^1.0.5", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.8.1" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "license": "MIT" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } + "peer": true }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", "license": "MIT", "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "@remix-run/router": "1.23.0" }, "engines": { - "node": ">=4.0" + "node": ">=14.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "peerDependencies": { + "react": ">=16.8" } }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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, "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/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==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "license": "MIT" - }, - "node_modules/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==", + "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, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "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==", + "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, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/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==", - "license": "MIT" - }, - "node_modules/string-width/node_modules/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==", - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" + "@types/estree": "1.0.8" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { "node": ">= 0.4" @@ -18736,15 +6813,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -18753,587 +6831,688 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=v12.22.7" } }, - "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==", + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "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, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "kind-of": "^6.0.2" }, "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==", + "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, "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "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, "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=8" } }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sm-no-saccade-style": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sm-no-saccade-style/-/sm-no-saccade-style-0.1.1.tgz", + "integrity": "sha512-oZkNiX437kNkAk1CiiyCpgPMdSiBaXOpXSAmaZKCbuq+RXXKB44WFnhkzrQ4EVE4N57BT0f5rQKZlI0SrJaISg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stylistic/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^8.46.2" } }, - "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==", + "node_modules/sm-no-saccade-style/node_modules/@typescript-eslint/parser": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/sm-no-saccade-style/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/sm-no-saccade-style/node_modules/@typescript-eslint/types": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/svgo/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==", + "node_modules/sm-no-saccade-style/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/svgo/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==", + "node_modules/sm-no-saccade-style/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/svgo/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==", + "node_modules/sm-no-saccade-style/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/svgo/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==", - "license": "MIT" - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "license": "BSD-2-Clause", + "node_modules/sm-no-saccade-style/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "license": "BSD-2-Clause", + "node_modules/sm-no-saccade-style/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 6" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://opencollective.com/eslint" } }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "license": "MIT", + "node_modules/sm-no-saccade-style/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "node_modules/sm-no-saccade-style/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/svgo/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==", - "license": "MIT", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/svgo/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==", + "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==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/svgo/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==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" } }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 14.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "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, "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { "version": "5.44.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -19349,15 +7528,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -19386,200 +7565,117 @@ "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==", + "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, "license": "MIT" }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "dev": true, "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "license": "MIT" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" - }, - "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==", + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "node": ">=12.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=14.0.0" } }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/tldts": { + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.29.tgz", + "integrity": "sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "tldts-core": "^7.0.29" }, - "engines": { - "node": ">=8" + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "node_modules/tldts-core": { + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.29.tgz", + "integrity": "sha512-W99NuU7b1DcG3uJ3v9k9VztCH3WialNbBkBft5wCs8V8mexu0XQqaZEYb9l9RNNzK8+3EJ9PKWB0/RUtTQ/o+Q==", + "dev": true, "license": "MIT" }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "license": "MIT", + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "punycode": "^2.3.1" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=20" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, "engines": { - "node": ">= 6" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.8.4" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, "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, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -19588,44 +7684,11 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -19640,6 +7703,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -19659,6 +7723,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -19680,6 +7745,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -19696,19 +7762,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, "license": "Apache-2.0", "peer": true, "bin": { @@ -19716,129 +7774,40 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "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==", - "license": "MIT", - "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.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "node": ">=4.2.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, "license": "MIT" }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -19869,139 +7838,217 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.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==", - "license": "MIT" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/vitest": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", + "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "license": "ISC", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">=10.12.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@vitest/coverage-istanbul": "4.1.5", + "@vitest/coverage-v8": "4.1.5", + "@vitest/ui": "4.1.5", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/vscode-react": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/vscode-react/-/vscode-react-0.1.5.tgz", - "integrity": "sha512-me/87BpMpHYhjGbViqq43GhyLoGiwA0yCp8m6LMxQh1iOu2jXlx28c5D/O3QrxndbysSp7v1sGdXtXFf7PgrdQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/vscode-react/-/vscode-react-0.2.2.tgz", + "integrity": "sha512-Eym6nNee98ZgOLaL/cJclk+/0kNJCPtnkKrBoeB1f6AsLVYd5WKBn9XCTs+DWWHokc54W+lIGZf6tQFgJxT9+w==", + "license": "Apache-2.0", + "dependencies": { + "quickbus": "^1.0.0" + }, "peerDependencies": { - "quickbus": "*", "react": ">=18.0.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, "license": "MIT", "dependencies": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" + "node": ">=18" } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -20011,15 +8058,6 @@ "node": ">=10.13.0" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/web-vitals": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", @@ -20027,18 +8065,20 @@ "license": "Apache-2.0" }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=10.4" + "node": ">=20" } }, "node_modules/webpack": { - "version": "5.99.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.6.tgz", - "integrity": "sha512-TJOLrJ6oeccsGWPl7ujCYuc0pIq2cNsuD6GZDma8i5o5Npvcco/z+NKvZSFsP0/x6SShVb0+X2JK/JHUjKY9dQ==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -20129,157 +8169,6 @@ } } }, - "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, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "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/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "license": "MIT", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -20296,18 +8185,27 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "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, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -20321,85 +8219,41 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "license": "MIT" - }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" }, "engines": { - "node": ">=10" + "node": ">=20" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -20415,6 +8269,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", @@ -20434,6 +8289,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -20461,6 +8317,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.3", @@ -20479,6 +8336,7 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -20496,6 +8354,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -20507,399 +8382,24 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "license": "MIT", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "license": "MIT", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "license": "MIT", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "deprecated": "The work that was done in this beta branch won't be included in future versions", - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "license": "BSD-2-Clause" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", - "license": "MIT" - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "license": "MIT", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", - "license": "MIT", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "license": "MIT", - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", - "license": "MIT" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", - "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "license": "MIT", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -20911,72 +8411,52 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "license": "Apache-2.0" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, "license": "MIT" }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "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, "license": "MIT", "engines": { "node": ">=10" @@ -20984,6 +8464,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.1.tgz", + "integrity": "sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/demo-web/package.json b/demo-web/package.json index e05f23386..6626b6938 100644 --- a/demo-web/package.json +++ b/demo-web/package.json @@ -3,11 +3,12 @@ "version": "0.0.0", "private": true, "dependencies": { - "ansi-to-html": "^0.7.2", "@electric-sql/pglite": "0.2.17", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "ace-builds": "^1.43.6", + "ansi-to-html": "^0.7.2", "pdo-pglite": "../packages/pdo-pglite", "php-cgi-wasm": "../packages/php-cgi-wasm", "php-cli-wasm": "../packages/php-cli-wasm", @@ -22,35 +23,33 @@ "php-wasm-mbstring": "../packages/mbstring", "php-wasm-openssl": "../packages/openssl", "php-wasm-phar": "../packages/phar", - "php-wasm-sdl": "../packages/sdl", "php-wasm-simplexml": "../packages/simplexml", "php-wasm-sqlite": "../packages/sqlite", "php-wasm-tidy": "../packages/tidy", "php-wasm-xml": "../packages/xml", + "php-wasm-xmlreader": "../packages/xmlreader", + "php-wasm-xmlwriter": "../packages/xmlwriter", "php-wasm-yaml": "../packages/libyaml", "php-wasm-zlib": "../packages/zlib", - "quickbus": "^0.0.0", - "react": "^18.3.1", - "react-ace-builds": "^7.4.1", - "react-dom": "^18.3.1", + "quickbus": "^1.0.1", + "react": "^19.2.0", + "react-ace": "^14.0.1", + "react-dom": "^19.2.0", "react-router-dom": "^6.23.0", - "react-scripts": "5.0.1", - "vscode-react": "^0.1.5", + "vscode-react": "^0.2.2", "web-vitals": "^2.1.4" }, "scripts": { "start": "bash ./npm-start.sh", "build": "bash ./npm-build.sh", - "test": "react-scripts test", - "eject": "react-scripts eject", + "build:app": "vite build", + "build:worker": "node ./scripts/build-worker.cjs", + "test": "vitest run", + "test:watch": "vitest", + "lint": "eslint eslint.config.mjs vite.config.mjs vite.worker.config.mjs src", + "lint:fix": "eslint eslint.config.mjs vite.config.mjs vite.worker.config.mjs src --fix", "clean": "" }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, "browserslist": { "production": [ ">0.2%", @@ -64,7 +63,20 @@ ] }, "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "webpack-cli": "^5.1.4" + "@eslint/js": "^9.39.1", + "@vitejs/plugin-react": "^5.2.0", + "babel-loader": "10.1.0", + "baseline-browser-mapping": "^2.9.11", + "eslint": "^9.39.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "globals": "^17.5.0", + "jsdom": "^27.0.1", + "sm-no-saccade-style": "^0.1.1", + "vite": "^7.3.2", + "vitest": "^4.1.5", + "webpack": "5.102.1", + "webpack-cli": "5.1.4" } } diff --git a/demo-web/package.local.json b/demo-web/package.local.json index 693deb2c5..b00137209 100644 --- a/demo-web/package.local.json +++ b/demo-web/package.local.json @@ -14,7 +14,6 @@ "php-wasm-mbstring": "../packages/mbstring", "php-wasm-openssl": "../packages/openssl", "php-wasm-phar": "../packages/phar", - "php-wasm-sdl": "../packages/sdl", "php-wasm-simplexml": "../packages/simplexml", "php-wasm-sqlite": "../packages/sqlite", "php-wasm-tidy": "../packages/tidy", @@ -22,4 +21,4 @@ "php-wasm-yaml": "../packages/libyaml", "php-wasm-zlib": "../packages/zlib" } -} \ No newline at end of file +} diff --git a/demo-web/public/.gitignore b/demo-web/public/.gitignore index 6bc4538ec..396b8f4a2 100644 --- a/demo-web/public/.gitignore +++ b/demo-web/public/.gitignore @@ -2,9 +2,5 @@ !.gitignore !/backups/ !/backups/* -!/php-wasm/ -!/php-wasm/* -!/public/ -!/public/* !/scripts/ !/scripts/* diff --git a/demo-web/public/6a6af95f67e70830cb39.data b/demo-web/public/6a6af95f67e70830cb39.data deleted file mode 100644 index 4e6041ff5..000000000 Binary files a/demo-web/public/6a6af95f67e70830cb39.data and /dev/null differ diff --git a/demo-web/public/882a4fc4178bf2b803a6.wasm b/demo-web/public/882a4fc4178bf2b803a6.wasm deleted file mode 100644 index d1659fca9..000000000 Binary files a/demo-web/public/882a4fc4178bf2b803a6.wasm and /dev/null differ diff --git a/demo-web/public/cgi-worker.js b/demo-web/public/cgi-worker.js deleted file mode 100644 index 5d2780caf..000000000 --- a/demo-web/public/cgi-worker.js +++ /dev/null @@ -1,1835 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "../packages/php-cgi-wasm lazy recursive ^\\.\\/php.*\\-cgi\\-worker\\.mjs$": -/*!********************************************************************************************!*\ - !*** ../packages/php-cgi-wasm/ lazy ^\.\/php.*\-cgi\-worker\.mjs$ strict namespace object ***! - \********************************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var map = { - "./php8.3-cgi-worker.mjs": [ - "../packages/php-cgi-wasm/php8.3-cgi-worker.mjs", - "packages_php-cgi-wasm_php8_3-cgi-worker_mjs" - ] -}; -function webpackAsyncContext(req) { - if(!__webpack_require__.o(map, req)) { - return Promise.resolve().then(() => { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - - var ids = map[req], id = ids[0]; - return __webpack_require__.e(ids[1]).then(() => { - return __webpack_require__(id); - }); -} -webpackAsyncContext.keys = () => (Object.keys(map)); -webpackAsyncContext.id = "../packages/php-cgi-wasm lazy recursive ^\\.\\/php.*\\-cgi\\-worker\\.mjs$"; -module.exports = webpackAsyncContext; - -/***/ }), - -/***/ "../packages/php-cgi-wasm/PhpCgiBase.mjs": -/*!***********************************************!*\ - !*** ../packages/php-cgi-wasm/PhpCgiBase.mjs ***! - \***********************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PhpCgiBase: () => (/* binding */ PhpCgiBase) -/* harmony export */ }); -/* harmony import */ var _parseResponse_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parseResponse.mjs */ "../packages/php-cgi-wasm/parseResponse.mjs"); -/* harmony import */ var _breakoutRequest_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./breakoutRequest.mjs */ "../packages/php-cgi-wasm/breakoutRequest.mjs"); -/* harmony import */ var _fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fsOps.mjs */ "../packages/php-cgi-wasm/fsOps.mjs"); -/* harmony import */ var _resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./resolveDependencies.mjs */ "../packages/php-cgi-wasm/resolveDependencies.mjs"); - - - - - -/** - * An object representing a dynamically loaded data file. - * @typedef {string|object} FileDef - * @property {string} url - * @property {string} path - * @property {string} parent - */ - -/** - * A string or object representing a dynamically loaded shared library. - * @typedef {string|object} LibDef - * @property {string} name - * @property {string} url - * @property {boolean} ini - * @property {function():libDef[]} getLibs - * @property {function():fileDef[]} getFiles - */ - -const STR = 'string'; -const NUM = 'number'; -const putEnv = (php, key, value) => php.ccall('wasm_sapi_cgi_putenv', 'number', ['string', 'string'], [key, value]); -const requestTimes = new WeakMap(); -const noTrailingSlash = s => s.slice(-1) !== '/' ? s : s.slice(0, -1); -const noLeadingSlash = s => s.slice(0, 1) !== '/' ? s : s.slice(1); -const joinPaths = (...args) => [noTrailingSlash(args[0]), -// Don't strip the leading slash on the first segment... -...args.slice(1).map(a => noLeadingSlash(noTrailingSlash(a)))].join('/'); -class CookieJar { - cookies = new Map(); - store(rawCookie) { - let name = null; - const cookie = { - created: Date.now(), - raw: rawCookie - }; - const parts = rawCookie.split(';').map(p => p.trim()); - for (const part of parts) { - const equal = part.indexOf('='); - const key = part.substr(0, equal); - const value = part.substr(1 + equal); - const lowerKey = key.toLowerCase(); - if (!name) { - name = key; - cookie.name = key; - cookie.value = value; - } else if (lowerKey === 'expires') { - cookie[lowerKey] = new Date(value).getTime(); - } else if (lowerKey === 'max-age') { - cookie[lowerKey] = 1000 * Number(value); - } else { - cookie[lowerKey] = value; - } - } - if (cookie.expires && cookie.created >= cookie.expires) { - this.cookies.delete(cookie.name); - } else { - this.cookies.set(cookie.name, cookie); - } - } - retrieve(path = null) { - const cookies = []; - const now = Date.now(); - for (const cookie of this.cookies.values()) { - if (cookie.expires && cookie.expires <= now) { - this.cookies.delete(cookie.name); - continue; - } - if (cookie['max-age'] && cookie['max-age'] >= now - cookie.created) { - this.cookies.delete(cookie.name); - continue; - } - if (path === null || !cookie.path || cookie.path === path.substr(0, cookie.path.length)) { - cookies.push(cookie); - } - } - return cookies; - } - dump(path = null) { - return this.retrieve(path).map(c => c.raw).join('\n'); - } - load(rawCookies) { - rawCookies.trim().split('\n').map(line => this.store(line)); - } - toEnv(path = null) { - return this.retrieve(path).map(e => `${e.name}=${e.value}`).join(';'); - } -} -class PhpCgiBase { - docroot = null; - prefix = '/php-wasm'; - exclude = []; - rewrite = path => path; - cookies = null; - types = {}; - onRequest = () => {}; - notFound = () => {}; - sharedLibs = []; - files = []; - phpArgs = {}; - maxRequestAge = 0; - staticCacheTime = 60_000; - dynamicCacheTime = 0; - vHosts = []; - php = null; - input = []; - output = []; - error = []; - count = 0; - queue = []; - - /** - * Creates a new PHP instance (async) - * @param {*} binLoader - * @param {string} options.prefix The URL path prefix to look for when routing to PHP. - * @param {string} options.docroot The internal directory to use as the public document root. - * @param {string[]} options.exclude Array of URL prefixes to exclude from routing to PHP. - * @param {Array.<{pathPrefix: string, directory: string, entrypoint: string}>} options.vHosts A list of prefixes, directories and entrypoints to serve multiple PHP applications by URL prefix. - * @param {string} options.entrypoint Path to PHP file under docroot to serve as an entrypoint - * @param {function(string):string} options.rewrite Function to rewrite URLs - * @param {object} options.types Mapping of file extensions to mime types to populate the `Content-type` header. - * @param {function()} options.onRequest Function to be executed on each request. - * @param {function(Request):Response|string} options.notFound Function to handle 404s. - * @param {LibDef[]} options.sharedLibs Dynamically load shared libraries with LibDefs - * @param {LibDef[]} options.dynamicLibs Similar to sharedLibs but will NEVER use the ini based loader. - * @param {FileDef[]} options.files Dynamically load files with FileDefs - * @param {boolean} options.autoTransaction Automatically handle FS transactions on each request - * @param {number} options.maxRequestAge Oldest request to process (ms) - * @param {number} options.staticCacheTime Static cache time (ms) - * @param {number} options.dynamicCacheTime Dynamic cache time (ms) - * @param {object} options.env Mapping of environment variable names to values to set inside the server. - */ - constructor(phpBinLoader, { - version, - docroot, - prefix, - exclude, - rewrite, - entrypoint, - cookies, - types, - onRequest, - notFound, - sharedLibs, - dynamicLibs, - actions, - files, - ...args - } = {}) { - this.binLoader = phpBinLoader; - this.phpVersion = version; - this.docroot = docroot || this.docroot; - this.prefix = prefix || this.prefix; - this.exclude = exclude || this.exclude; - this.rewrite = rewrite || this.rewrite; - this.entrypoint = entrypoint || this.entrypoint; - this.cookieJar = new CookieJar(cookies); - this.types = types || this.types; - this.onRequest = onRequest || this.onRequest; - this.notFound = notFound || this.notFound; - this.sharedLibs = sharedLibs || this.sharedLibs; - this.dynamicLibs = dynamicLibs || this.dynamicLibs; - this.files = files || this.files; - this.extraActions = actions || {}; - this.phpArgs = args; - this.autoTransaction = 'autoTransaction' in args ? args.autoTransaction : true; - this.transactionStarted = false; - this.maxRequestAge = args.maxRequestAge || this.maxRequestAge; - this.staticCacheTime = args.staticCacheTime || this.staticCacheTime; - this.dynamicCacheTime = args.dynamicCacheTime || this.dynamicCacheTime; - this.vHosts = args.vHosts || []; - this.env = {}; - Object.assign(this.env, args.env || {}); - this.refresh(); - } - handleInstallEvent(event) { - return event.waitUntil(self.skipWaiting()); - } - handleActivateEvent(event) { - return event.waitUntil(self.clients.claim()); - } - async handleMessageEvent(event) { - const { - data, - source - } = event; - const { - action, - token, - params = [] - } = data; - const actions = ['analyzePath', 'readdir', 'readFile', 'stat', 'mkdir', 'rmdir', 'writeFile', 'rename', 'unlink', 'putEnv', 'refresh', 'getSettings', 'setSettings', 'getEnvs', 'setEnvs', 'storeInit']; - await this.binary; - if (actions.includes(action)) { - let result, error; - try { - result = await this[action](...params); - } catch (_error) { - error = JSON.parse(JSON.stringify(_error)); - console.warn(_error); - } finally { - source.postMessage({ - re: token, - result, - error - }); - } - } else if (action in this.extraActions) { - let result, error; - try { - result = await this.extraActions[action](this, ...params); - } catch (_error) { - error = JSON.parse(JSON.stringify(_error)); - console.warn(_error); - } finally { - source.postMessage({ - re: token, - result, - error - }); - } - } - } - handleFetchEvent(event) { - const url = new URL(event.request.url); - const prefix = this.prefix; - const { - files: sharedLibFiles, - urlLibs: sharedLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_3__.resolveDependencies)(this.sharedLibs, this); - const { - files: dynamicLibFiles, - urlLibs: dynamicLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_3__.resolveDependencies)(this.dynamicLibs, this); - let isWhitelisted = false; - let isBlacklisted = false; - if (globalThis.location) { - const libFiles = [...sharedLibFiles, ...dynamicLibFiles]; - const libUrls = { - ...sharedLibUrls, - ...dynamicLibUrls - }; - const staticUrls = [self.location.pathname, ...libFiles.map(file => file.url), ...Object.values(libUrls)].map(url => new URL(url, self.location.origin)).filter(url => url.origin === self.location.origin).map(url => url.pathname); - isWhitelisted = url.pathname.substr(0, prefix.length) === prefix && url.hostname === self.location.hostname; - isBlacklisted = url.pathname.match(/\.wasm$/i) || staticUrls.includes(url.pathname) || this.exclude.findIndex(exclude => url.pathname.substr(0, exclude.length) === exclude) > -1 || false; - } else { - isWhitelisted = url.pathname.substr(0, prefix.length) === prefix; - isBlacklisted = url.pathname.match(/\.wasm$/i) || this.exclude.findIndex(exclude => url.pathname.substr(0, exclude.length) === exclude) > -1 || false; - } - if (isWhitelisted && !isBlacklisted) { - requestTimes.set(event.request, Date.now()); - const response = this.request(event.request); - return event.respondWith(response); - } - } - async _enqueue(callback, params = [], readOnly = false) { - let accept, reject; - const coordinator = new Promise((a, r) => [accept, reject] = [a, r]); - this.queue.push([callback, params, accept, reject]); - if (!this.queue.length) { - return; - } - while (this.queue.length) { - const [callback, params, accept, reject] = this.queue.shift(); - await callback(...params).then(accept).catch(reject); - } - return coordinator; - } - refresh() { - // const {files, libs, urlLibs} = resolveDependencies(this.sharedLibs, this); - const { - files: sharedLibFiles, - libs: sharedLibs, - urlLibs: sharedLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_3__.resolveDependencies)(this.sharedLibs, this); - const { - files: dynamicLibFiles, - libs: dynamicLibs, - urlLibs: dynamicLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_3__.resolveDependencies)(this.dynamicLibs, this); - const files = [...sharedLibFiles, ...dynamicLibFiles]; - const userLocateFile = this.phpArgs.locateFile || (() => undefined); - const locateFile = (path, directory) => { - let located = userLocateFile(path, directory); - if (located !== undefined) { - return located; - } - if (sharedLibUrls[path]) { - if (sharedLibUrls[path].protocol === 'file:') { - return sharedLibUrls[path].pathname; - } - return String(sharedLibUrls[path]); - } - if (dynamicLibUrls[path]) { - if (dynamicLibUrls[path].protocol === 'file:') { - return dynamicLibUrls[path].pathname; - } - return String(dynamicLibUrls[path]); - } - }; - const phpArgs = { - persist: [{ - mountPath: '/persist' - }, { - mountPath: '/config' - }], - ...this.phpArgs, - stdin: () => this.input ? String(this.input.shift()).charCodeAt(0) : null, - stdout: x => this.output.push(x), - stderr: x => this.error.push(x), - locateFile - }; - return this.binary = this.binLoader.then({ - default: PHP - }).then(async php => { - await php.ccall('pib_storage_init', NUM, [], [], { - async: true - }); - if (!php.FS.analyzePath('/preload').exists) { - php.FS.mkdir('/preload'); - } - const allFiles = this.files.concat(files).concat(sharedLibFiles).concat(dynamicLibFiles); - - // Make sure folder structure exists before preloading files - allFiles.forEach(fileDef => { - const segments = fileDef.parent.split('/'); - let currentPath = ''; - for (const segment of segments) { - if (!segment) continue; - currentPath += segment + '/'; - if (!php.FS.analyzePath(currentPath).exists) { - php.FS.mkdir(currentPath); - } - } - }); - await Promise.all(allFiles.map(fileDef => php.FS.createPreloadedFile(fileDef.parent, fileDef.name, userLocateFile(fileDef.url) ?? fileDef.url, true, false))); - const iniLines = sharedLibs.map(lib => { - if (typeof lib === 'string' || lib instanceof URL) { - return `extension=${lib}`; - } else if (typeof lib === 'object' && lib.ini) { - return `extension=${String(lib.url).split('/').pop()}`; - } - }); - this.phpArgs.ini && iniLines.push(this.phpArgs.ini.replace(/\n\s+/g, '\n')); - php.FS.writeFile('/php.ini', iniLines.join("\n") + "\n", { - encoding: 'utf8' - }); - await php.ccall('wasm_sapi_cgi_init', 'number', [], [], { - async: true - }); - const cookieStat = php.FS.analyzePath('/config/.cookies'); - if (cookieStat.exists) { - this.cookieJar.load(php.FS.readFile('/config/.cookies', { - encoding: 'utf8' - })); - } - this.loadInit(php); - return php; - }); - } - async _beforeRequest() {} - async _afterRequest() {} - async request(request) { - const { - url, - method = 'GET', - get, - post, - contentType - } = await (0,_breakoutRequest_mjs__WEBPACK_IMPORTED_MODULE_1__.breakoutRequest)(request); - if (globalThis.caches) { - const cache = await caches.open('static-v1'); - const cached = await cache.match(url); - if (cached) { - const cacheTime = Number(cached.headers.get('x-php-wasm-cache-time')); - if (this.staticCacheTime > 0 && this.staticCacheTime > Date.now() - cacheTime) { - this.onRequest(request, cached); - return cached; - } - } - } - const php = await this.binary; - await this._beforeRequest(); - let docroot = this.docroot; - let vHostEntrypoint, - vHostPrefix = this.prefix; - for (const { - pathPrefix, - directory, - entrypoint - } of this.vHosts) { - if (pathPrefix === url.pathname.substr(0, pathPrefix.length)) { - docroot = directory; - vHostEntrypoint = entrypoint; - vHostPrefix = pathPrefix; - break; - } - } - const rewrite = this.rewrite(url.pathname); - let scriptName, path; - if (typeof rewrite === 'object') { - scriptName = rewrite.scriptName; - path = docroot + rewrite.path; - } else { - path = joinPaths(docroot, rewrite.substr((vHostPrefix || this.prefix).length)); - scriptName = path; - } - const aboutPath = php.FS.analyzePath(path); - if (vHostEntrypoint) { - if (!aboutPath.exists || aboutPath.object.isFolder) - // Rewrite SCRIPT_NAME to the entrypoint if we don't have a php file... - { - scriptName = joinPaths(vHostPrefix, vHostEntrypoint); - } else { - scriptName = joinPaths(vHostPrefix, rewrite.substr(vHostPrefix.length)); - } - } - let originalPath = url.pathname; - const extension = path.split('.').pop(); - if (extension !== 'php' && extension !== 'phar') { - if (aboutPath.exists && php.FS.isFile(aboutPath.object.mode)) { - // Return static file - const response = new Response(php.FS.readFile(path, { - encoding: 'binary', - url - }), {}); - response.headers.append('x-php-wasm-cache-time', new Date().getTime()); - if (extension in this.types) { - response.headers.append('Content-type', this.types[extension]); - } - if (globalThis.caches) { - const cache = await caches.open('static-v1'); - cache.put(url, response.clone()); - } - this.onRequest(request, response); - return response; - } else if (aboutPath.exists && php.FS.isDir(aboutPath.object.mode) && '/' !== originalPath[-1 + originalPath.length]) { - originalPath += '/'; - } - - // Rewrite to entrypoint or index.php - path = joinPaths(docroot, vHostEntrypoint ?? 'index.php'); - } - - // Ensure query parameters are preserved. - originalPath += url.search; - if (this.maxRequestAge > 0 && Date.now() - requestTimes.get(request) > this.maxRequestAge) { - const response = new Response('408: Request Timed Out.', { - status: 408 - }); - this.onRequest(request, response); - return response; - } - - // path may have changed, so re-check it: - if (!php.FS.analyzePath(path).exists) { - const rawResponse = this.notFound ? this.notFound(request) : '404 - Not Found.'; - if (rawResponse) { - return rawResponse instanceof Response ? rawResponse : new Response(rawResponse, { - status: 404 - }); - } - } - let exitCode = -1; - try { - // We need "return await" otherwise the finally block will run before the lock releases. - return await navigator.locks.request('php-wasm-request-lock', async () => { - this.input = ['POST', 'PUT', 'PATCH'].includes(method) ? post.split('') : []; - this.output = []; - this.error = []; - const selfUrl = new URL(globalThis.location || request.url); - putEnv(php, 'PHP_VERSION', this.phpVersion); - putEnv(php, 'PHP_INI_SCAN_DIR', `/config:/preload:${docroot}`); - putEnv(php, 'PHPRC', '/php.ini'); - for (const [name, value] of Object.entries(this.env)) { - putEnv(php, name, value); - } - const protocol = selfUrl.protocol.substr(0, selfUrl.protocol.length - 1); - putEnv(php, 'SERVER_SOFTWARE', globalThis.navigator ? globalThis.navigator.userAgent : globalThis.process ? 'Node ' + globalThis.process.version : 'Javascript - Unknown'); - putEnv(php, 'REQUEST_METHOD', method); - putEnv(php, 'REMOTE_ADDR', '127.0.0.1'); - putEnv(php, 'HTTP_HOST', selfUrl.host); - putEnv(php, 'REQUEST_SCHEME', protocol); - putEnv(php, 'HTTPS', protocol === 'https' ? 'on' : 'off'); - putEnv(php, 'DOCUMENT_ROOT', docroot); - putEnv(php, 'REQUEST_URI', originalPath); - putEnv(php, 'SCRIPT_NAME', scriptName); - putEnv(php, 'SCRIPT_FILENAME', path); - putEnv(php, 'PATH_TRANSLATED', path); - putEnv(php, 'QUERY_STRING', get); - putEnv(php, 'HTTP_COOKIE', this.cookieJar.toEnv()); - putEnv(php, 'REDIRECT_STATUS', '200'); - putEnv(php, 'CONTENT_TYPE', contentType); - putEnv(php, 'CONTENT_LENGTH', String(this.input.length)); - this.output = []; - exitCode = await php.ccall('main', 'number', ['number', 'string'], [], { - async: true - }); - ++this.count; - const parsedResponse = (0,_parseResponse_mjs__WEBPACK_IMPORTED_MODULE_0__.parseResponse)(this.output); - let status = 200; - if (parsedResponse.headers.has('Status')) { - status = parsedResponse.headers.get('Status').substr(0, 3); - } - for (const rawCookie of parsedResponse.headers.getSetCookie()) { - this.cookieJar.store(rawCookie); - } - php.FS.writeFile('/config/.cookies', this.cookieJar.dump()); - const headers = new Headers(parsedResponse.headers); - if (!headers.has('Content-type')) { - if (extension in this.types) { - headers.set('Content-type', this.types[extension]); - } else { - headers.set('Content-type', 'text/html; charset=utf-8'); - } - } - if (parsedResponse.headers.has('Location')) { - headers.set('Location', parsedResponse.headers.get('Location')); - } - const response = new Response(parsedResponse.body || '', { - status, - headers, - url - }); - this.onRequest(request, response); - return response; - }); - } catch (error) { - console.error(error); - const response = new Response(`500: Internal Server Error.\n` + `=`.repeat(80) + `\n\n` + `Stacktrace:\n${error.stack}\n` + `=`.repeat(80) + `\n\n` + `STDERR:\n${new TextDecoder().decode(new Uint8Array(this.error).buffer)}\n` + `=`.repeat(80) + `\n\n` + `STDOUT:\n${new TextDecoder().decode(new Uint8Array(this.output).buffer)}\n` + `=`.repeat(80) + `\n\n`, { - status: 500 - }); - this.onRequest(request, response); - this.refresh(); - return response; - } finally { - if (exitCode === 0) { - this._afterRequest(); - } else { - console.warn(new TextDecoder().decode(new Uint8Array(this.output).buffer)); - console.error(new TextDecoder().decode(new Uint8Array(this.error).buffer)); - this.refresh(); - } - } - } - analyzePath(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.analyzePath, [this.binary, path]); - } - readdir(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.readdir, [this.binary, path]); - } - readFile(path, options) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.readFile, [this.binary, path, options]); - } - stat(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.stat, [this.binary, path]); - } - mkdir(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.mkdir, [this.binary, path]); - } - rmdir(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.rmdir, [this.binary, path]); - } - rename(path, newPath) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.rename, [this.binary, path, newPath]); - } - writeFile(path, data, options) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.writeFile, [this.binary, path, data, options]); - } - unlink(path) { - return this._enqueue(_fsOps_mjs__WEBPACK_IMPORTED_MODULE_2__.fsOps.unlink, [this.binary, path]); - } - async putEnv(name, value) { - return (await this.binary).ccall('wasm_sapi_cgi_putenv', 'number', ['string', 'string'], [name, value]); - } - async getSettings() { - return { - docroot: this.docroot, - maxRequestAge: this.maxRequestAge, - staticCacheTime: this.staticCacheTime, - dynamicCacheTime: this.dynamicCacheTime, - vHosts: this.vHosts - }; - } - setSettings({ - docroot, - maxRequestAge, - staticCacheTime, - dynamicCacheTime, - vHosts - }) { - this.docroot = docroot ?? this.docroot; - this.maxRequestAge = maxRequestAge ?? this.maxRequestAge; - this.staticCacheTime = staticCacheTime ?? this.staticCacheTime; - this.dynamicCacheTime = dynamicCacheTime ?? this.dynamicCacheTime; - this.vHosts = vHosts ?? this.vHosts; - } - async getEnvs() { - return { - ...this.env - }; - } - setEnvs(env) { - for (const key of Object.keys(this.env)) { - this.env[key] = undefined; - } - Object.assign(this.env, env); - } - async storeInit() { - const settings = await this.getSettings(); - const env = await this.getEnvs(); - await this.writeFile('/config/init.json', JSON.stringify({ - settings, - env - }, null, 4), { - encoding: 'utf8' - }); - } - loadInit(binary) { - const initPath = '/config/init.json'; - const check = binary.FS.analyzePath(initPath); - if (!check.exists) { - return; - } - const initJson = binary.FS.readFile(initPath, { - encoding: 'utf8' - }); - const init = JSON.parse(initJson || '{}'); - const { - settings, - env - } = init; - this.setSettings(settings); - this.setEnvs(env); - } -} - -/***/ }), - -/***/ "../packages/php-cgi-wasm/PhpCgiWebBase.mjs": -/*!**************************************************!*\ - !*** ../packages/php-cgi-wasm/PhpCgiWebBase.mjs ***! - \**************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PhpCgiWebBase: () => (/* binding */ PhpCgiWebBase) -/* harmony export */ }); -/* harmony import */ var _PhpCgiBase_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PhpCgiBase.mjs */ "../packages/php-cgi-wasm/PhpCgiBase.mjs"); -/* harmony import */ var _webTransactions_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webTransactions.mjs */ "../packages/php-cgi-wasm/webTransactions.mjs"); -/* harmony import */ var _resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./resolveDependencies.mjs */ "../packages/php-cgi-wasm/resolveDependencies.mjs"); - - - -const STR = 'string'; -const NUM = 'number'; -class PhpCgiWebBase extends _PhpCgiBase_mjs__WEBPACK_IMPORTED_MODULE_0__.PhpCgiBase { - startTransaction() { - return (0,_webTransactions_mjs__WEBPACK_IMPORTED_MODULE_1__.startTransaction)(this); - } - commitTransaction(readOnly = false) { - return (0,_webTransactions_mjs__WEBPACK_IMPORTED_MODULE_1__.commitTransaction)(this, readOnly); - } - async _beforeRequest() { - if (!this.initialized) { - const php = await this.binary; - this.loadInit(php); - await navigator.locks.request('php-wasm-fs-lock', () => { - return new Promise((accept, reject) => php.FS.syncfs(true, err => { - if (err) reject(err);else accept(); - })); - }); - } - this.initialized = true; - } - async _afterRequest() { - if (this.phpArgs.staticFS) { - return; - } - const php = await this.binary; - await navigator.locks.request('php-wasm-fs-lock', () => { - return new Promise((accept, reject) => php.FS.syncfs(false, err => { - if (err) reject(err);else accept(); - })); - }); - } - refresh() { - const { - files: sharedLibFiles, - libs: sharedLibs, - urlLibs: sharedLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_2__.resolveDependencies)(this.sharedLibs, this); - const { - files: dynamicLibFiles, - libs: dynamicLibs, - urlLibs: dynamicLibUrls - } = (0,_resolveDependencies_mjs__WEBPACK_IMPORTED_MODULE_2__.resolveDependencies)(this.dynamicLibs, this); - const userLocateFile = this.phpArgs.locateFile || (() => undefined); - const locateFile = path => { - let located = userLocateFile(path); - if (located !== undefined) { - return located; - } - if (sharedLibUrls[path]) { - return sharedLibUrls[path]; - } - if (dynamicLibUrls[path]) { - return dynamicLibUrls[path]; - } - }; - const phpArgs = { - persist: [{ - mountPath: '/persist' - }, { - mountPath: '/config' - }], - ...this.phpArgs, - stdin: () => this.input ? String(this.input.shift()).charCodeAt(0) : null, - stdout: x => this.output.push(x), - stderr: x => this.error.push(x), - locateFile - }; - this.binary = navigator.locks.request('php-wasm-fs-lock', async () => { - const { - default: PHP - } = await this.binLoader; - const php = await new PHP(phpArgs); - await php.ccall('pib_storage_init', NUM, [], [], { - async: true - }); - if (!php.FS.analyzePath('/preload').exists) { - php.FS.mkdir('/preload'); - } - const allFiles = this.files.concat(sharedLibFiles, dynamicLibFiles); - - // Make sure folder structure exists before preloading files - allFiles.forEach(fileDef => { - const segments = fileDef.parent.split('/'); - let currentPath = ''; - for (const segment of segments) { - if (!segment) continue; - currentPath += segment + '/'; - if (!php.FS.analyzePath(currentPath).exists) { - php.FS.mkdir(currentPath); - } - } - }); - await Promise.all(allFiles.map(fileDef => php.FS.createPreloadedFile(fileDef.parent, fileDef.name, fileDef.url, true, false))); - const iniLines = sharedLibs.map(lib => { - if (typeof lib === 'string' || lib instanceof URL) { - return `extension=${lib}`; - } else if (typeof lib === 'object' && lib.ini) { - return `extension=${String(lib.url).split('/').pop()}`; - } - }); - this.phpArgs.ini && iniLines.push(this.phpArgs.ini.replace(/\n\s+/g, '\n')); - php.FS.writeFile('/php.ini', iniLines.join("\n") + "\n", { - encoding: 'utf8' - }); - await new Promise((accept, reject) => { - php.FS.syncfs(true, error => { - if (error) reject(error);else accept(); - }); - }); - await php.ccall('wasm_sapi_cgi_init', 'number', [], [], { - async: true - }); - const cookieStat = php.FS.analyzePath('/config/.cookies'); - if (cookieStat.exists) { - this.cookieJar.load(php.FS.readFile('/config/.cookies', { - encoding: 'utf8' - })); - } - this.loadInit(php); - return php; - }); - } - async _enqueue(callback, params = [], readOnly = false) { - let accept, reject; - const coordinator = new Promise((a, r) => [accept, reject] = [a, r]); - this.queue.push([callback, params, accept, reject]); - navigator.locks.request('php-wasm-fs-lock', async () => { - if (!this.queue.length) { - return; - } - await (this.autoTransaction ? this.startTransaction() : Promise.resolve()); - do { - const [callback, params, accept, reject] = this.queue.shift(); - await callback(...params).then(accept).catch(reject); - let lockChecks = 5; - while (!this.queue.length && lockChecks--) { - await new Promise(a => setTimeout(a, 5)); - } - } while (this.queue.length); - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - return coordinator; - } -} - -/***/ }), - -/***/ "../packages/php-cgi-wasm/PhpCgiWorker.mjs": -/*!*************************************************!*\ - !*** ../packages/php-cgi-wasm/PhpCgiWorker.mjs ***! - \*************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PhpCgiWorker: () => (/* binding */ PhpCgiWorker) -/* harmony export */ }); -/* harmony import */ var _PhpCgiWebBase_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PhpCgiWebBase.mjs */ "../packages/php-cgi-wasm/PhpCgiWebBase.mjs"); - -const defaultVersion = '8.4'; -class PhpCgiWorker extends _PhpCgiWebBase_mjs__WEBPACK_IMPORTED_MODULE_0__.PhpCgiWebBase { - constructor({ - version, - docroot, - prefix, - rewrite, - cookies, - types, - onRequest, - notFound, - ...args - } = {}) { - super(__webpack_require__("../packages/php-cgi-wasm lazy recursive ^\\.\\/php.*\\-cgi\\-worker\\.mjs$")(`./php${version ?? defaultVersion}-cgi-worker.mjs`), { - version, - docroot, - prefix, - rewrite, - cookies, - types, - onRequest, - notFound, - ...args - }); - } -} - -/***/ }), - -/***/ "../packages/php-cgi-wasm/breakoutRequest.mjs": -/*!****************************************************!*\ - !*** ../packages/php-cgi-wasm/breakoutRequest.mjs ***! - \****************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ breakoutRequest: () => (/* binding */ breakoutRequest) -/* harmony export */ }); -const breakoutRequest = request => { - let getPost = Promise.resolve(''); - if (request.body) { - getPost = new Promise(accept => { - const reader = request.body.getReader(); - const postBody = []; - const processBody = ({ - done, - value - }) => { - if (value) { - postBody.push([...value].map(x => String.fromCharCode(x)).join('')); - } - if (!done) { - return reader.read().then(processBody); - } - accept(postBody.join('')); - }; - return reader.read().then(processBody); - }); - } else if (request.arrayBuffer) { - getPost = request.arrayBuffer().then(buffer => [...new Uint8Array(buffer)].map(x => String.fromCharCode(x)).join('')); - } else if (request.on) { - getPost = new Promise(accept => { - let body = []; - request.on('data', chunk => body.push(chunk)); - request.on('end', () => accept([...new Uint8Array(Buffer.concat(body))].map(x => String.fromCharCode(x)).join(''))); - }); - } - const url = new URL(request.url); - return getPost.then(post => ({ - url, - method: request.method, - get: url.search ? url.search.substr(1) : '', - post: request.method === 'POST' ? post : null, - contentType: request.method === 'POST' ? request.headers && request.headers.get('Content-Type') || 'application/x-www-form-urlencoded' : null - })); -}; - -/***/ }), - -/***/ "../packages/php-cgi-wasm/fsOps.mjs": -/*!******************************************!*\ - !*** ../packages/php-cgi-wasm/fsOps.mjs ***! - \******************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ fsOps: () => (/* binding */ fsOps) -/* harmony export */ }); -class fsOps { - static async analyzePath(binary, path) { - const result = (await binary).FS.analyzePath(path); - if (!result.object) { - return { - exists: false - }; - } - const object = { - exists: true, - id: result.object.id, - mode: result.object.mode, - mount: { - mountpoint: result.object.mount.mountpoint, - mounts: result.object.mount.mounts.map(m => m.mountpoint) - }, - isDevice: result.object.isDevice, - isFolder: result.object.isFolder, - read: result.object.read, - write: result.object.write - }; - return { - ...result, - object, - parentObject: undefined - }; - } - static async readdir(binary, path) { - return (await binary).FS.readdir(path); - } - static async readFile(binary, path, options) { - return (await binary).FS.readFile(path, options); - } - static async stat(binary, path) { - return (await binary).FS.stat(path); - } - static async mkdir(binary, path) { - const php = await binary; - const _result = php.FS.mkdir(path); - return { - id: _result.id, - mode: _result.mode, - mount: { - mountpoint: _result.mount.mountpoint, - mounts: _result.mount.mounts.map(m => m.mountpoint) - }, - isDevice: _result.isDevice, - isFolder: _result.isFolder, - read: _result.read, - write: _result.write - }; - } - static async rmdir(binary, path) { - return (await binary).FS.rmdir(path); - } - static async rename(binary, path, newPath) { - return (await binary).FS.rename(path, newPath); - } - static async writeFile(binary, path, data, options) { - const bin = await binary; - const about = bin.FS.analyzePath(path); - let forced = false; - if (about.object && about.object.mode) { - if (!(about.object.mode & 0o200)) { - await bin.FS.chmod(path, about.object.mode | 0o200); - } - } - const result = bin.FS.writeFile(path, data, options); - if (forced) { - await bin.FS.chmod(path, about.object.mode); - } - return result; - } - static async unlink(binary, path) { - return (await binary).FS.unlink(path); - } - static async chmod(binary, mode) { - return (await binary).FS.chmod(mode); - } -} - -/***/ }), - -/***/ "../packages/php-cgi-wasm/parseResponse.mjs": -/*!**************************************************!*\ - !*** ../packages/php-cgi-wasm/parseResponse.mjs ***! - \**************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ parseResponse: () => (/* binding */ parseResponse) -/* harmony export */ }); -const parseResponse = response => { - const headers = new Headers(); - const line = []; - const decoder = new TextDecoder(); - let i = 0; - for (; i < response.length; i++) { - if (response[i] === 0xD && response[i + 1] === 0xA) - // We're at a CRLF - { - if (line.length) { - const header = decoder.decode(new Uint8Array(line).buffer); - const colon = header.indexOf(':'); - if (colon < 0) { - headers.append(header, true); - } else { - headers.append(header.substring(0, colon), header.substring(colon + 2)); - } - line.length = 0; - i++; - continue; - } else { - i++; - break; - } - } - line.push(response[i]); - } - return { - headers, - body: new Uint8Array(response.slice(1 + i)).buffer - }; -}; - -/***/ }), - -/***/ "../packages/php-cgi-wasm/resolveDependencies.mjs": -/*!********************************************************!*\ - !*** ../packages/php-cgi-wasm/resolveDependencies.mjs ***! - \********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ resolveDependencies: () => (/* binding */ resolveDependencies) -/* harmony export */ }); -/** - * An object representing files, libs and urlLibs for a shared library. - * @typedef {object} ResolvedDependencies - * @property {FileDef[]} files - * @property {LibDef[]} libs - * @property {Object} urlLibs mapping of resource names to URLs - */ - -/** - * Resolves dependencies related to dynamically loaded shared libs. - * Normalizes LibDefs & FileDefs, and extracts URLs to specified resources. - * @param {LibDef[]} sharedLibs List of LibDefs to resolve dependencies for. - * @param {object} wrapper PHP Object to resolve depencencies for. - * @returns {ResolvedDependencies} Normalized LibDefs, FileDefs, and their URLs. - */ -const resolveDependencies = (sharedLibs, wrapper) => { - const _files = []; - const _libs = []; - (sharedLibs || []).flat().forEach(libDef => { - if (typeof libDef === 'object') { - if (typeof libDef.getLibs === 'function') { - _libs.push(...libDef.getLibs(wrapper)); - } else { - _libs.push(libDef); - } - if (typeof libDef.getFiles === 'function') { - _files.push(...libDef.getFiles(wrapper)); - } - } else { - _libs.push(libDef); - } - }); - const files = _files.map(fileDef => { - const url = new URL(fileDef.url).href; - const path = fileDef.path; - const name = fileDef.name || path.split('/').pop(); - const parent = path.substr(0, path.length - name.length); - return { - parent, - name, - url - }; - }); - const urlLibs = {}; - const libs = _libs.map(libDef => { - if (typeof libDef === 'string' || libDef instanceof URL) { - libDef = String(libDef); - if (libDef.substr(0, 1) == '/' || libDef.substr(0, 2) == './' || libDef.substr(0, 2) == '../' || libDef.substr(0, 8) == 'https://' || libDef.substr(0, 7) == 'http://' || libDef.substr(0, 7) == 'file://') { - const name = libDef.split('/').pop(); - const url = libDef; - urlLibs[name] = url; - return { - name, - url, - ini: true - }; - } - return libDef; - } else if (typeof libDef === 'object') { - const name = libDef.name ?? String(libDef.url).split('/').pop(); - urlLibs[name] = String(libDef.url); - libDef.url = String(libDef.url); - return libDef; - } - }); - return { - files, - libs, - urlLibs - }; -}; - -/***/ }), - -/***/ "../packages/php-cgi-wasm/webTransactions.mjs": -/*!****************************************************!*\ - !*** ../packages/php-cgi-wasm/webTransactions.mjs ***! - \****************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ commitTransaction: () => (/* binding */ commitTransaction), -/* harmony export */ startTransaction: () => (/* binding */ startTransaction) -/* harmony export */ }); -async function startTransaction(wrapper) { - const php = await wrapper.binary; - if (wrapper.transactionStarted || !php.persist) { - return wrapper.transactionStarted; - } - wrapper.transactionStarted = new Promise((accept, reject) => { - return php.FS.syncfs(true, error => { - if (error) { - reject(error); - } else { - accept(); - } - }); - }); - return await wrapper.transactionStarted; -} -async function commitTransaction(wrapper, readOnly = false) { - const php = await wrapper.binary; - if (!php.persist) { - return; - } - if (!wrapper.transactionStarted) { - throw new Error('No transaction initialized.'); - } - if (readOnly) { - wrapper.transactionStarted = false; - return Promise.resolve(); - } - return await new Promise((accept, reject) => { - return php.FS.syncfs(false, error => { - if (error) { - reject(error); - } else { - wrapper.transactionStarted = false; - accept(); - } - }); - }); -} - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/chunk-A7RFOIQ7.js": -/*!******************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/chunk-A7RFOIQ7.js ***! - \******************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ a: () => (/* binding */ z) -/* harmony export */ }); -/* harmony import */ var _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunk-EADU5A67.js */ "./node_modules/@electric-sql/pglite/dist/chunk-EADU5A67.js"); -/* harmony import */ var _chunk_STOZMFXW_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chunk-STOZMFXW.js */ "./node_modules/@electric-sql/pglite/dist/chunk-STOZMFXW.js"); -/* harmony import */ var _chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./chunk-BTBUZ646.js */ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js"); -(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.j)();var b,u,r,l,g,h,R,z=class{constructor(){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.f)(this,r);this.serializers={..._chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.b};this.parsers={..._chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.a};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.f)(this,b,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.f)(this,u,!1)}async _initArrayTypes({force:t=!1}={}){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.e)(this,b)&&!t)return;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.g)(this,b,!0);let e=await this.query(` - SELECT b.oid, b.typarray - FROM pg_catalog.pg_type a - LEFT JOIN pg_catalog.pg_type b ON b.oid = a.typelem - WHERE a.typcategory = 'A' - GROUP BY b.oid, b.typarray - ORDER BY b.oid - `);for(let s of e.rows)this.serializers[s.typarray]=i=>(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.c)(i,this.serializers[s.oid],s.typarray),this.parsers[s.typarray]=i=>(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.d)(i,this.parsers[s.oid],s.typarray)}async refreshArrayTypes(){await this._initArrayTypes({force:!0})}async query(t,e,s){return await this._checkReady(),await this._runExclusiveTransaction(async()=>await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,g).call(this,t,e,s))}async sql(t,...e){let{query:s,params:i}=(0,_chunk_STOZMFXW_js__WEBPACK_IMPORTED_MODULE_1__.d)(t,...e);return await this.query(s,i)}async exec(t,e){return await this._checkReady(),await this._runExclusiveTransaction(async()=>await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,t,e))}async describeQuery(t,e){try{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.parse({text:t,types:e?.paramTypes}),e);let s=await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.describe({type:"S"}),e),i=s.messages.find(n=>n.name==="parameterDescription"),c=s.messages.find(n=>n.name==="rowDescription"),y=i?.dataTypeIDs.map(n=>({dataTypeID:n,serializer:this.serializers[n]}))??[],m=c?.fields.map(n=>({name:n.name,dataTypeID:n.dataTypeID,parser:this.parsers[n.dataTypeID]}))??[];return{queryParams:y,resultFields:m}}finally{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.sync(),e)}}async transaction(t){return await this._checkReady(),await this._runExclusiveTransaction(async()=>{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,"BEGIN"),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.g)(this,u,!0);let e=!1,s=()=>{if(e)throw new Error("Transaction is closed")},i={query:async(c,y,m)=>(s(),await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,g).call(this,c,y,m)),sql:async(c,...y)=>{let{query:m,params:n}=(0,_chunk_STOZMFXW_js__WEBPACK_IMPORTED_MODULE_1__.d)(c,...y);return await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,g).call(this,m,n)},exec:async(c,y)=>(s(),await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,c,y)),rollback:async()=>{s(),await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,"ROLLBACK"),e=!0},get closed(){return e}};try{let c=await t(i);return e||(e=!0,await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,"COMMIT")),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.g)(this,u,!1),c}catch(c){throw e||await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,h).call(this,"ROLLBACK"),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.g)(this,u,!1),c}})}async runExclusive(t){return await this._runExclusiveQuery(t)}};b=new WeakMap,u=new WeakMap,r=new WeakSet,l=async function(t,e={}){return await this.execProtocol(t,{...e,syncToFs:!1})},g=async function(t,e=[],s){return await this._runExclusiveQuery(async()=>{(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,R).call(this,"runQuery",t,e,s),await this._handleBlob(s?.blob);let i;try{let{messages:y}=await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.parse({text:t,types:s?.paramTypes}),s),m=(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.g)((await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.describe({type:"S"}),s)).messages),n=e.map((T,B)=>{let x=m[B];if(T==null)return null;let _=s?.serializers?.[x]??this.serializers[x];return _?_(T):T.toString()});i=[...y,...(await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.bind({values:n}),s)).messages,...(await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.describe({type:"P"}),s)).messages,...(await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.execute({}),s)).messages]}finally{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.sync(),s)}await this._cleanupBlob(),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.e)(this,u)||await this.syncToFs();let c=await this._getWrittenBlob();return (0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.f)(i,this.parsers,s,c)[0]})},h=async function(t,e){return await this._runExclusiveQuery(async()=>{(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,R).call(this,"runExec",t,e),await this._handleBlob(e?.blob);let s;try{s=(await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.query(t),e)).messages}finally{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.h)(this,r,l).call(this,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.i.sync(),e)}this._cleanupBlob(),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_2__.e)(this,u)||await this.syncToFs();let i=await this._getWrittenBlob();return (0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_0__.f)(s,this.parsers,e,i)})},R=function(...t){this.debug>0&&console.log(...t)}; -//# sourceMappingURL=chunk-A7RFOIQ7.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js": -/*!******************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js ***! - \******************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ a: () => (/* binding */ D), -/* harmony export */ b: () => (/* binding */ F), -/* harmony export */ c: () => (/* binding */ L), -/* harmony export */ d: () => (/* binding */ P), -/* harmony export */ e: () => (/* binding */ h), -/* harmony export */ f: () => (/* binding */ R), -/* harmony export */ g: () => (/* binding */ x), -/* harmony export */ h: () => (/* binding */ T), -/* harmony export */ i: () => (/* binding */ U), -/* harmony export */ j: () => (/* binding */ u) -/* harmony export */ }); -var p=Object.create;var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty;var a=t=>{throw TypeError(t)};var _=(t,e,o)=>e in t?i(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var d=(t,e)=>()=>(t&&(e=t(t=0)),e);var D=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),F=(t,e)=>{for(var o in e)i(t,o,{get:e[o],enumerable:!0})},g=(t,e,o,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of f(e))!s.call(t,r)&&r!==o&&i(t,r,{get:()=>e[r],enumerable:!(m=c(e,r))||m.enumerable});return t};var L=(t,e,o)=>(o=t!=null?p(l(t)):{},g(e||!t||!t.__esModule?i(o,"default",{value:t,enumerable:!0}):o,t));var P=(t,e,o)=>_(t,typeof e!="symbol"?e+"":e,o),n=(t,e,o)=>e.has(t)||a("Cannot "+o);var h=(t,e,o)=>(n(t,e,"read from private field"),o?o.call(t):e.get(t)),R=(t,e,o)=>e.has(t)?a("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,o),x=(t,e,o,m)=>(n(t,e,"write to private field"),m?m.call(t,o):e.set(t,o),o),T=(t,e,o)=>(n(t,e,"access private method"),o);var U=(t,e,o,m)=>({set _(r){x(t,e,r,o)},get _(){return h(t,e,m)}});var u=d(()=>{"use strict"}); -//# sourceMappingURL=chunk-BTBUZ646.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/chunk-EADU5A67.js": -/*!******************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/chunk-EADU5A67.js ***! - \******************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ a: () => (/* binding */ ln), -/* harmony export */ b: () => (/* binding */ cn), -/* harmony export */ c: () => (/* binding */ Ke), -/* harmony export */ d: () => (/* binding */ yn), -/* harmony export */ e: () => (/* binding */ hn), -/* harmony export */ f: () => (/* binding */ bn), -/* harmony export */ g: () => (/* binding */ De), -/* harmony export */ h: () => (/* binding */ wn), -/* harmony export */ i: () => (/* binding */ O), -/* harmony export */ j: () => (/* binding */ E), -/* harmony export */ k: () => (/* binding */ X), -/* harmony export */ l: () => (/* binding */ ee), -/* harmony export */ m: () => (/* binding */ ne), -/* harmony export */ n: () => (/* binding */ Ue), -/* harmony export */ o: () => (/* binding */ ye), -/* harmony export */ p: () => (/* binding */ zn), -/* harmony export */ q: () => (/* binding */ Fe), -/* harmony export */ r: () => (/* binding */ Rr), -/* harmony export */ s: () => (/* binding */ Tr), -/* harmony export */ t: () => (/* binding */ Er), -/* harmony export */ u: () => (/* binding */ Cr), -/* harmony export */ v: () => (/* binding */ Pr), -/* harmony export */ w: () => (/* binding */ Ur), -/* harmony export */ x: () => (/* binding */ Nr) -/* harmony export */ }); -/* harmony import */ var _chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunk-BTBUZ646.js */ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js"); -var hn={};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.b)(hn,{ABSTIME:()=>Et,ACLITEM:()=>Vt,BIT:()=>Wt,BOOL:()=>be,BPCHAR:()=>_e,BYTEA:()=>ge,CHAR:()=>gt,CID:()=>St,CIDR:()=>Tt,CIRCLE:()=>Ut,DATE:()=>He,FLOAT4:()=>je,FLOAT8:()=>Qe,GTSVECTOR:()=>rn,INET:()=>kt,INT2:()=>ve,INT4:()=>Ge,INT8:()=>we,INTERVAL:()=>vt,JSON:()=>Ae,JSONB:()=>Ye,MACADDR:()=>Ot,MACADDR8:()=>Nt,MONEY:()=>Lt,NUMERIC:()=>Qt,OID:()=>We,PATH:()=>Mt,PG_DEPENDENCIES:()=>en,PG_LSN:()=>Xt,PG_NDISTINCT:()=>Zt,PG_NODE_TREE:()=>Bt,POLYGON:()=>Rt,REFCURSOR:()=>_t,REGCLASS:()=>Yt,REGCONFIG:()=>sn,REGDICTIONARY:()=>an,REGNAMESPACE:()=>on,REGOPER:()=>Ht,REGOPERATOR:()=>qt,REGPROC:()=>wt,REGPROCEDURE:()=>zt,REGROLE:()=>un,REGTYPE:()=>$t,RELTIME:()=>Ct,SMGR:()=>It,TEXT:()=>F,TID:()=>At,TIME:()=>Ft,TIMESTAMP:()=>qe,TIMESTAMPTZ:()=>xe,TIMETZ:()=>Gt,TINTERVAL:()=>Pt,TSQUERY:()=>nn,TSVECTOR:()=>tn,TXID_SNAPSHOT:()=>Jt,UUID:()=>Kt,VARBIT:()=>jt,VARCHAR:()=>ze,XID:()=>xt,XML:()=>Dt,arrayParser:()=>yn,arraySerializer:()=>Ke,parseType:()=>ue,parsers:()=>ln,serializers:()=>cn,types:()=>$e});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var ht=globalThis.JSON.parse,bt=globalThis.JSON.stringify,be=16,ge=17,gt=18,we=20,ve=21,Ge=23,wt=24,F=25,We=26,At=27,xt=28,St=29,Ae=114,Dt=142,Bt=194,It=210,Mt=602,Rt=604,Tt=650,je=700,Qe=701,Et=702,Ct=703,Pt=704,Ut=718,Nt=774,Lt=790,Ot=829,kt=869,Vt=1033,_e=1042,ze=1043,He=1082,Ft=1083,qe=1114,xe=1184,vt=1186,Gt=1266,Wt=1560,jt=1562,Qt=1700,_t=1790,zt=2202,Ht=2203,qt=2204,Yt=2205,$t=2206,Kt=2950,Jt=2970,Xt=3220,Zt=3361,en=3402,tn=3614,nn=3615,rn=3642,sn=3734,an=3769,Ye=3802,on=4089,un=4096,$e={string:{to:F,from:[F,ze,_e],serialize:e=>{if(typeof e=="string")return e;if(typeof e=="number")return e.toString();throw new Error("Invalid input for string type")},parse:e=>e},number:{to:0,from:[ve,Ge,We,je,Qe],serialize:e=>e.toString(),parse:e=>+e},bigint:{to:we,from:[we],serialize:e=>e.toString(),parse:e=>{let t=BigInt(e);return tNumber.MAX_SAFE_INTEGER?t:Number(t)}},json:{to:Ae,from:[Ae,Ye],serialize:e=>typeof e=="string"?e:bt(e),parse:e=>ht(e)},boolean:{to:be,from:[be],serialize:e=>{if(typeof e!="boolean")throw new Error("Invalid input for boolean type");return e?"t":"f"},parse:e=>e==="t"},date:{to:xe,from:[He,qe,xe],serialize:e=>{if(typeof e=="string")return e;if(typeof e=="number")return new Date(e).toISOString();if(e instanceof Date)return e.toISOString();throw new Error("Invalid input for date type")},parse:e=>new Date(e)},bytea:{to:ge,from:[ge],serialize:e=>{if(!(e instanceof Uint8Array))throw new Error("Invalid input for bytea type");return"\\x"+Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")},parse:e=>{let t=e.slice(2);return Uint8Array.from({length:t.length/2},(n,r)=>parseInt(t.substring(r*2,(r+1)*2),16))}}},Se=pn($e),ln=Se.parsers,cn=Se.serializers;function ue(e,t,n){if(e===null)return null;let r=n?.[t]??Se.parsers[t];return r?r(e,t):e}function pn(e){return Object.keys(e).reduce(({parsers:t,serializers:n},r)=>{let{to:i,from:a,serialize:u,parse:d}=e[r];return n[i]=u,n[r]=u,t[r]=d,Array.isArray(a)?a.forEach(c=>{t[c]=d,n[c]=u}):(t[a]=d,n[a]=u),{parsers:t,serializers:n}},{parsers:{},serializers:{}})}var dn=/\\/g,fn=/"/g;function mn(e){return e.replace(dn,"\\\\").replace(fn,'\\"')}function Ke(e,t,n){if(Array.isArray(e)===!1)return e;if(!e.length)return"{}";let r=e[0],i=n===1020?";":",";return Array.isArray(r)?`{${e.map(a=>Ke(a,t,n)).join(i)}}`:`{${e.map(a=>(a===void 0&&(a=null),a===null?"null":'"'+mn(t?t(a):a.toString())+'"')).join(i)}}`}var he={i:0,char:null,str:"",quoted:!1,last:0,p:null};function yn(e,t,n){return he.i=he.last=0,Je(he,e,t,n)[0]}function Je(e,t,n,r){let i=[],a=r===1020?";":",";for(;e.iDe,parseResults:()=>bn});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();function bn(e,t,n,r){let i=[],a={rows:[],fields:[]},u=0,d={...t,...n?.parsers};return e.forEach(c=>{switch(c.name){case"rowDescription":{let V=c;a.fields=V.fields.map(T=>({name:T.name,dataTypeID:T.dataTypeID}));break}case"dataRow":{if(!a)break;let V=c;n?.rowMode==="array"?a.rows.push(V.fields.map((T,ie)=>ue(T,a.fields[ie].dataTypeID,d))):a.rows.push(Object.fromEntries(V.fields.map((T,ie)=>[a.fields[ie].name,ue(T,a.fields[ie].dataTypeID,d)])));break}case"commandComplete":{u+=gn(c),i.push({...a,affectedRows:u,...r?{blob:r}:{}}),a={rows:[],fields:[]};break}}}),i.length===0&&i.push({affectedRows:0,rows:[],fields:[]}),i}function gn(e){let t=e.text.split(" ");switch(t[0]){case"INSERT":return parseInt(t[2],10);case"UPDATE":case"DELETE":case"COPY":return parseInt(t[1],10);default:return 0}}function De(e){let t=e.find(n=>n.name==="parameterDescription");return t?t.dataTypeIDs:[]}var Ue={};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.b)(Ue,{AuthenticationCleartextPassword:()=>G,AuthenticationMD5Password:()=>W,AuthenticationOk:()=>v,AuthenticationSASL:()=>j,AuthenticationSASLContinue:()=>Q,AuthenticationSASLFinal:()=>_,BackendKeyDataMessage:()=>J,CommandCompleteMessage:()=>ee,CopyDataMessage:()=>z,CopyResponse:()=>H,DataRowMessage:()=>te,DatabaseError:()=>E,Field:()=>q,NoticeMessage:()=>ne,NotificationResponseMessage:()=>X,ParameterDescriptionMessage:()=>$,ParameterStatusMessage:()=>K,ReadyForQueryMessage:()=>Z,RowDescriptionMessage:()=>Y,bindComplete:()=>Ie,closeComplete:()=>Me,copyDone:()=>Pe,emptyQuery:()=>Ce,noData:()=>Re,parseComplete:()=>Be,portalSuspended:()=>Te,replicationStart:()=>Ee});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var Be={name:"parseComplete",length:5},Ie={name:"bindComplete",length:5},Me={name:"closeComplete",length:5},Re={name:"noData",length:5},Te={name:"portalSuspended",length:5},Ee={name:"replicationStart",length:4},Ce={name:"emptyQuery",length:4},Pe={name:"copyDone",length:4},v=class{constructor(t){this.length=t;this.name="authenticationOk"}},G=class{constructor(t){this.length=t;this.name="authenticationCleartextPassword"}},W=class{constructor(t,n){this.length=t;this.salt=n;this.name="authenticationMD5Password"}},j=class{constructor(t,n){this.length=t;this.mechanisms=n;this.name="authenticationSASL"}},Q=class{constructor(t,n){this.length=t;this.data=n;this.name="authenticationSASLContinue"}},_=class{constructor(t,n){this.length=t;this.data=n;this.name="authenticationSASLFinal"}},E=class extends Error{constructor(n,r,i){super(n);this.length=r;this.name=i}},z=class{constructor(t,n){this.length=t;this.chunk=n;this.name="copyData"}},H=class{constructor(t,n,r,i){this.length=t;this.name=n;this.binary=r;this.columnTypes=new Array(i)}},q=class{constructor(t,n,r,i,a,u,d){this.name=t;this.tableID=n;this.columnID=r;this.dataTypeID=i;this.dataTypeSize=a;this.dataTypeModifier=u;this.format=d}},Y=class{constructor(t,n){this.length=t;this.fieldCount=n;this.name="rowDescription";this.fields=new Array(this.fieldCount)}},$=class{constructor(t,n){this.length=t;this.parameterCount=n;this.name="parameterDescription";this.dataTypeIDs=new Array(this.parameterCount)}},K=class{constructor(t,n,r){this.length=t;this.parameterName=n;this.parameterValue=r;this.name="parameterStatus"}},J=class{constructor(t,n,r){this.length=t;this.processID=n;this.secretKey=r;this.name="backendKeyData"}},X=class{constructor(t,n,r,i){this.length=t;this.processId=n;this.channel=r;this.payload=i;this.name="notification"}},Z=class{constructor(t,n){this.length=t;this.status=n;this.name="readyForQuery"}},ee=class{constructor(t,n){this.length=t;this.text=n;this.name="commandComplete"}},te=class{constructor(t,n){this.length=t;this.fields=n;this.name="dataRow";this.fieldCount=n.length}},ne=class{constructor(t,n){this.length=t;this.message=n;this.name="notice"}};var zn={};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.b)(zn,{Parser:()=>ye,messages:()=>Ue,serialize:()=>O});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();function C(e){let t=e.length;for(let n=e.length-1;n>=0;n--){let r=e.charCodeAt(n);r>127&&r<=2047?t++:r>2047&&r<=65535&&(t+=2),r>=56320&&r<=57343&&n--}return t}var b,g,U,ce,N,x,le,P,Xe,R=class{constructor(t=256){this.size=t;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,x);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,b);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,g,5);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,U,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,ce,new TextEncoder);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,N,0);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,b,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,le).call(this,t))}addInt32(t){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,P).call(this,4),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).setInt32((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g),t,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,U)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,g,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)+4),this}addInt16(t){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,P).call(this,2),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).setInt16((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g),t,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,U)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,g,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)+2),this}addCString(t){return t&&this.addString(t),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,P).call(this,1),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).setUint8((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g),0),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.i)(this,g)._++,this}addString(t=""){let n=C(t);return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,P).call(this,n),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,ce).encodeInto(t,new Uint8Array((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).buffer,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g))),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,g,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)+n),this}add(t){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,P).call(this,t.byteLength),new Uint8Array((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).buffer).set(new Uint8Array(t),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,g,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)+t.byteLength),this}flush(t){let n=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,Xe).call(this,t);return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,g,5),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,b,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,le).call(this,this.size)),new Uint8Array(n)}};b=new WeakMap,g=new WeakMap,U=new WeakMap,ce=new WeakMap,N=new WeakMap,x=new WeakSet,le=function(t){return new DataView(new ArrayBuffer(t))},P=function(t){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).byteLength-(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)>1)+t;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,b,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,x,le).call(this,i)),new Uint8Array((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).buffer).set(new Uint8Array(r))}},Xe=function(t){if(t){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).setUint8((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,N),t);let n=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g)-((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,N)+1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).setInt32((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,N)+1,n,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,U))}return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,b).buffer.slice(t?0:5,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,g))};var m=new R,An=e=>{m.addInt16(3).addInt16(0);for(let r of Object.keys(e))m.addCString(r).addCString(e[r]);m.addCString("client_encoding").addCString("UTF8");let t=m.addCString("").flush(),n=t.byteLength+4;return new R().addInt32(n).add(t).flush()},xn=()=>{let e=new DataView(new ArrayBuffer(8));return e.setInt32(0,8,!1),e.setInt32(4,80877103,!1),new Uint8Array(e.buffer)},Sn=e=>m.addCString(e).flush(112),Dn=(e,t)=>(m.addCString(e).addInt32(C(t)).addString(t),m.flush(112)),Bn=e=>m.addString(e).flush(112),In=e=>m.addCString(e).flush(81),Mn=[],Rn=e=>{let t=e.name??"";t.length>63&&(console.error("Warning! Postgres only supports 63 characters for query names."),console.error("You supplied %s (%s)",t,t.length),console.error("This can cause conflicts and silent errors executing queries"));let n=m.addCString(t).addCString(e.text).addInt16(e.types?.length??0);return e.types?.forEach(r=>n.addInt32(r)),m.flush(80)},L=new R;var Tn=(e,t)=>{for(let n=0;n{let t=e.portal??"",n=e.statement??"",r=e.binary??!1,i=e.values??Mn,a=i.length;return m.addCString(t).addCString(n),m.addInt16(a),Tn(i,e.valueMapper),m.addInt16(a),m.add(L.flush()),m.addInt16(r?1:0),m.flush(66)},Cn=new Uint8Array([69,0,0,0,9,0,0,0,0,0]),Pn=e=>{if(!e||!e.portal&&!e.rows)return Cn;let t=e.portal??"",n=e.rows??0,r=C(t),i=4+r+1+4,a=new DataView(new ArrayBuffer(1+i));return a.setUint8(0,69),a.setInt32(1,i,!1),new TextEncoder().encodeInto(t,new Uint8Array(a.buffer,5)),a.setUint8(r+5,0),a.setUint32(a.byteLength-4,n,!1),new Uint8Array(a.buffer)},Un=(e,t)=>{let n=new DataView(new ArrayBuffer(16));return n.setInt32(0,16,!1),n.setInt16(4,1234,!1),n.setInt16(6,5678,!1),n.setInt32(8,e,!1),n.setInt32(12,t,!1),new Uint8Array(n.buffer)},Ne=(e,t)=>{let n=new R;return n.addCString(t),n.flush(e)},Nn=m.addCString("P").flush(68),Ln=m.addCString("S").flush(68),On=e=>e.name?Ne(68,`${e.type}${e.name??""}`):e.type==="P"?Nn:Ln,kn=e=>{let t=`${e.type}${e.name??""}`;return Ne(67,t)},Vn=e=>m.add(e).flush(100),Fn=e=>Ne(102,e),pe=e=>new Uint8Array([e,0,0,0,4]),vn=pe(72),Gn=pe(83),Wn=pe(88),jn=pe(99),O={startup:An,password:Sn,requestSsl:xn,sendSASLInitialResponseMessage:Dn,sendSCRAMClientFinalMessage:Bn,query:In,parse:Rn,bind:En,execute:Pn,describe:On,close:kn,flush:()=>vn,sync:()=>Gn,end:()=>Wn,copyData:Vn,copyDone:()=>jn,copyFail:Fn,cancel:Un};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var Le={text:0,binary:1};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var Qn=new ArrayBuffer(0),M,w,fe,me,re,de=class{constructor(t=0){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,M,new DataView(Qn));(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,w);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,fe,"utf-8");(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,me,new TextDecoder((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,fe)));(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,re,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,t)}setBuffer(t,n){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,t),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,M,new DataView(n))}int16(){let t=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,M).getInt16((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,re));return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w)+2),t}byte(){let t=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,M).getUint8((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w));return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.i)(this,w)._++,t}int32(){let t=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,M).getInt32((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,re));return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w)+4),t}string(t){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,me).decode(this.bytes(t))}cstring(){let t=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w),n=t;for(;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,M).getUint8(n++)!==0;);let r=this.string(n-t-1);return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,n),r}bytes(t){let n=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,M).buffer.slice((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w)+t);return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,w,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,w)+t),new Uint8Array(n)}};M=new WeakMap,w=new WeakMap,fe=new WeakMap,me=new WeakMap,re=new WeakMap;var Oe=1,_n=4,Ze=Oe+_n,et=new ArrayBuffer(0);var A,S,D,o,l,tt,nt,rt,st,it,at,ot,ke,ut,lt,ct,pt,dt,ft,mt,yt,Ve,ye=class{constructor(){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,l);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,A,new DataView(et));(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,S,0);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,D,0);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.f)(this,o,new de)}parse(t,n){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,tt).call(this,ArrayBuffer.isView(t)?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength):t);let r=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D)+(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S),i=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D);for(;i+Ze<=r;){let a=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).getUint8(i),u=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).getUint32(i+Oe,!1),d=Oe+u;if(d+i<=r){let c=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,nt).call(this,i+Ze,a,u,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).buffer);n(c),i+=d}else break}i===r?((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,A,new DataView(et)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,S,0),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,D,0)):((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,S,r-i),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,D,i))}};A=new WeakMap,S=new WeakMap,D=new WeakMap,o=new WeakMap,l=new WeakSet,tt=function(t){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S)>0){let n=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S)+t.byteLength;if(n+(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D)>(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).byteLength){let i;if(n<=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).byteLength&&(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D)>=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S))i=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).buffer;else{let a=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).byteLength*2;for(;n>=a;)a*=2;i=new ArrayBuffer(a)}new Uint8Array(i).set(new Uint8Array((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).buffer,(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S))),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,A,new DataView(i)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,D,0)}new Uint8Array((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,A).buffer).set(new Uint8Array(t),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,D)+(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,S)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,S,n)}else (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,A,new DataView(t)),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,D,0),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.g)(this,S,t.byteLength)},nt=function(t,n,r,i){switch(n){case 50:return Ie;case 49:return Be;case 51:return Me;case 110:return Re;case 115:return Te;case 99:return Pe;case 87:return Ee;case 73:return Ce;case 68:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,dt).call(this,t,r,i);case 67:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,st).call(this,t,r,i);case 90:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,rt).call(this,t,r,i);case 65:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,ut).call(this,t,r,i);case 82:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,yt).call(this,t,r,i);case 83:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,ft).call(this,t,r,i);case 75:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,mt).call(this,t,r,i);case 69:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,Ve).call(this,t,r,i,"error");case 78:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,Ve).call(this,t,r,i,"notice");case 84:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,lt).call(this,t,r,i);case 116:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,pt).call(this,t,r,i);case 71:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,at).call(this,t,r,i);case 72:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,ot).call(this,t,r,i);case 100:return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,it).call(this,t,r,i);default:return new E("received invalid response: "+n.toString(16),r,"error")}},rt=function(t,n,r){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).setBuffer(t,r);let i=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).string(1);return new Z(n,i)},st=function(t,n,r){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).setBuffer(t,r);let i=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).cstring();return new ee(n,i)},it=function(t,n,r){let i=r.slice(t,t+(n-4));return new z(n,new Uint8Array(i))},at=function(t,n,r){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,ke).call(this,t,n,r,"copyInResponse")},ot=function(t,n,r){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.h)(this,l,ke).call(this,t,n,r,"copyOutResponse")},ke=function(t,n,r,i){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).setBuffer(t,r);let a=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).byte()!==0,u=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.e)(this,o).int16(),d=new H(n,i,a,u);for(let c=0;c{if(globalThis.crypto?.randomUUID)return globalThis.crypto.randomUUID();let e=new Uint8Array(16);if(globalThis.crypto?.getRandomValues)globalThis.crypto.getRandomValues(e);else for(let n=0;n{t.push(n.toString(16).padStart(2,"0"))}),t.slice(0,4).join("")+"-"+t.slice(4,6).join("")+"-"+t.slice(6,8).join("")+"-"+t.slice(8,10).join("")+"-"+t.slice(10).join("")};async function Pr(e,t,n,r){if(!n||n.length===0)return t;r=r??e;let i;try{await e.execProtocol(O.parse({text:t}),{syncToFs:!1}),i=De((await e.execProtocol(O.describe({type:"S"}),{syncToFs:!1})).messages)}finally{await e.execProtocol(O.sync(),{syncToFs:!1})}let a=t.replace(/\$([0-9]+)/g,(d,c)=>"%"+c+"L");return(await r.query(`SELECT format($1, ${n.map((d,c)=>`$${c+2}`).join(", ")}) as query`,[a,...n],{paramTypes:[F,...i]})).rows[0].query}function Ur(e){let t,n=!1,r=async()=>{if(!t){n=!1;return}n=!0;let{args:i,resolve:a,reject:u}=t;t=void 0;try{let d=await e(...i);a(d)}catch(d){u(d)}finally{r()}};return async(...i)=>{t&&t.resolve(void 0);let a=new Promise((u,d)=>{t={args:i,resolve:u,reject:d}});return n||r(),a}}function Nr(e){let t;return e.startsWith('"')&&e.endsWith('"')?t=e.substring(1,e.length-1):t=e.toLowerCase(),t} -//# sourceMappingURL=chunk-EADU5A67.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/chunk-STOZMFXW.js": -/*!******************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/chunk-STOZMFXW.js ***! - \******************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ a: () => (/* binding */ y), -/* harmony export */ b: () => (/* binding */ c), -/* harmony export */ c: () => (/* binding */ m), -/* harmony export */ d: () => (/* binding */ g) -/* harmony export */ }); -/* harmony import */ var _chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunk-BTBUZ646.js */ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js"); -(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var o={part:"part",container:"container"};function s(t,r,...e){let a=t.length-1,p=e.length-1;if(p!==-1){if(p===0){t[a]=t[a]+e[0]+r;return}t[a]=t[a]+e[0],t.push(...e.slice(1,p)),t.push(e[p]+r)}}function y(t,...r){let e=[t[0]];e.raw=[t.raw[0]];let a=[];for(let p=0;p[`$${n+1}`,e[n+1]])].join(""),params:a}} -//# sourceMappingURL=chunk-STOZMFXW.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/chunk-WGR4JCLS.js": -/*!******************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/chunk-WGR4JCLS.js ***! - \******************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ a: () => (/* binding */ or), -/* harmony export */ b: () => (/* binding */ ce), -/* harmony export */ c: () => (/* binding */ Vr), -/* harmony export */ d: () => (/* binding */ C), -/* harmony export */ e: () => (/* binding */ ur), -/* harmony export */ f: () => (/* binding */ cr), -/* harmony export */ g: () => (/* binding */ pr) -/* harmony export */ }); -/* harmony import */ var _chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunk-BTBUZ646.js */ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js"); -var w=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.a)(($r,l)=>{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var j=9007199254740991,B=function(r){return r}();function mr(r){return r===B}function q(r){return typeof r=="string"||Object.prototype.toString.call(r)=="[object String]"}function lr(r){return Object.prototype.toString.call(r)=="[object Date]"}function N(r){return r!==null&&typeof r=="object"}function U(r){return typeof r=="function"}function fr(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=j}function yr(r){return Object.prototype.toString.call(r)=="[object Array]"}function Y(r){return N(r)&&!U(r)&&fr(r.length)}function D(r){return Object.prototype.toString.call(r)=="[object ArrayBuffer]"}function gr(r,e){return Array.prototype.map.call(r,e)}function hr(r,e){var t=B;return U(e)&&Array.prototype.every.call(r,function(s,a,n){var o=e(s,a,n);return o&&(t=s),!o}),t}function Sr(r){return Object.assign.apply(null,arguments)}function W(r){var e,t,s;if(q(r)){for(t=r.length,s=new Uint8Array(t),e=0;e{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var M="\0";X.exports={NULL_CHAR:M,TMAGIC:"ustar"+M+"00",OLDGNU_MAGIC:"ustar "+M,REGTYPE:0,LNKTYPE:1,SYMTYPE:2,CHRTYPE:3,BLKTYPE:4,DIRTYPE:5,FIFOTYPE:6,CONTTYPE:7,TSUID:parseInt("4000",8),TSGID:parseInt("2000",8),TSVTX:parseInt("1000",8),TUREAD:parseInt("0400",8),TUWRITE:parseInt("0200",8),TUEXEC:parseInt("0100",8),TGREAD:parseInt("0040",8),TGWRITE:parseInt("0020",8),TGEXEC:parseInt("0010",8),TOREAD:parseInt("0004",8),TOWRITE:parseInt("0002",8),TOEXEC:parseInt("0001",8),TPERMALL:parseInt("0777",8),TPERMMASK:parseInt("0777",8)}});var L=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.a)((ee,f)=>{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var K=w(),p=x(),Fr=512,I=p.TPERMALL,V=0,Z=0,_=[["name",100,0,function(r,e){return v(r[e[0]],e[1])},function(r,e,t){return A(r.slice(e,e+t[1]))}],["mode",8,100,function(r,e){var t=r[e[0]]||I;return t=t&p.TPERMMASK,P(t,e[1],I)},function(r,e,t){var s=S(r.slice(e,e+t[1]));return s&=p.TPERMMASK,s}],["uid",8,108,function(r,e){return P(r[e[0]],e[1],V)},function(r,e,t){return S(r.slice(e,e+t[1]))}],["gid",8,116,function(r,e){return P(r[e[0]],e[1],Z)},function(r,e,t){return S(r.slice(e,e+t[1]))}],["size",12,124,function(r,e){return P(r.data.length,e[1])},function(r,e,t){return S(r.slice(e,e+t[1]))}],["modifyTime",12,136,function(r,e){return k(r[e[0]],e[1])},function(r,e,t){return z(r.slice(e,e+t[1]))}],["checksum",8,148,function(r,e){return" "},function(r,e,t){return S(r.slice(e,e+t[1]))}],["type",1,156,function(r,e){return""+(parseInt(r[e[0]],10)||0)%8},function(r,e,t){return(parseInt(String.fromCharCode(r[e]),10)||0)%8}],["linkName",100,157,function(r,e){return""},function(r,e,t){return A(r.slice(e,e+t[1]))}],["ustar",8,257,function(r,e){return p.TMAGIC},function(r,e,t){return br(A(r.slice(e,e+t[1]),!0))},function(r,e){return r[e[0]]==p.TMAGIC||r[e[0]]==p.OLDGNU_MAGIC}],["owner",32,265,function(r,e){return v(r[e[0]],e[1])},function(r,e,t){return A(r.slice(e,e+t[1]))}],["group",32,297,function(r,e){return v(r[e[0]],e[1])},function(r,e,t){return A(r.slice(e,e+t[1]))}],["majorNumber",8,329,function(r,e){return""},function(r,e,t){return S(r.slice(e,e+t[1]))}],["minorNumber",8,337,function(r,e){return""},function(r,e,t){return S(r.slice(e,e+t[1]))}],["prefix",131,345,function(r,e){return v(r[e[0]],e[1])},function(r,e,t){return A(r.slice(e,e+t[1]))}],["accessTime",12,476,function(r,e){return k(r[e[0]],e[1])},function(r,e,t){return z(r.slice(e,e+t[1]))}],["createTime",12,488,function(r,e){return k(r[e[0]],e[1])},function(r,e,t){return z(r.slice(e,e+t[1]))}]],$=function(r){var e=r[r.length-1];return e[2]+e[1]}(_);function br(r){if(r.length==8){var e=r.split("");if(e[5]==p.NULL_CHAR)return(e[6]==" "||e[6]==p.NULL_CHAR)&&(e[6]="0"),(e[7]==" "||e[7]==p.NULL_CHAR)&&(e[7]="0"),e=e.join(""),e==p.TMAGIC?e:r;if(e[7]==p.NULL_CHAR)return e[5]==p.NULL_CHAR&&(e[5]=" "),e[6]==p.NULL_CHAR&&(e[6]=" "),e==p.OLDGNU_MAGIC?e:r}return r}function v(r,e){return e-=1,K.isUndefined(r)&&(r=""),r=(""+r).substr(0,e),r+p.NULL_CHAR}function P(r,e,t){for(t=parseInt(t)||0,e-=1,r=(parseInt(r)||t).toString(8).substr(-e,e);r.length=0?t.substr(0,s):t}function S(r){var e=String.fromCharCode.apply(null,r);return parseInt(e.replace(/^0+$/g,""),8)||0}function z(r){return r.length==0||r[0]==0?null:new Date(1e3*S(r))}function Tr(r,e,t){var s=parseInt(e,10)||0,a=Math.min(s+$,r.length),n=0,o=0,i=0;t&&_.every(function(y){return y[0]=="checksum"?(o=s+y[2],i=o+y[1],!1):!0});for(var u=32,c=s;c=o&&c{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var Ar=x(),O=w(),F=L();function J(r){return F.recordSize}function Q(r){return Math.ceil(r.data.length/F.recordSize)*F.recordSize}function Er(r){var e=0;return r.forEach(function(t){e+=J(t)+Q(t)}),e+=F.recordSize*2,new Uint8Array(e)}function Pr(r,e,t){t=parseInt(t)||0;var s=t;F.posixHeader.forEach(function(u){for(var c=u[3](e,u),m=c.length,y=0;y{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var vr=x(),G=w(),h=L(),Nr={extractData:!0,checkHeader:!0,checkChecksum:!0,checkFileSize:!0},Ur={size:!0,checksum:!0,ustar:!0},R={unexpectedEndOfFile:"Unexpected end of file.",fileCorrupted:"File is corrupted.",checksumCheckFailed:"Checksum check failed."};function kr(r){return h.recordSize}function zr(r){return Math.ceil(r/h.recordSize)*h.recordSize}function Or(r,e){for(var t=e,s=Math.min(r.length,e+h.recordSize*2),a=t;a=h.recordSize;){r=G.toUint8Array(r);var n=Cr(r,s,e);if(!n)break;s+=kr(n);var o=Dr(r,s,n,e);if(t.push(Mr(n,o)),s+=zr(n.size),Or(r,s))break}return t}tr.exports.untar=Ir});var or=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.a)((se,ir)=>{"use strict";(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var _r=w(),Lr=x(),Rr=er(),Gr=nr();_r.extend(ir.exports,Rr,Gr,Lr)});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.j)();var g=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_0__.c)(or(),1);async function H(r,e,t="pgdata",s="auto"){let a=Br(r,e),[n,o]=await qr(a,s),i=t+(o?".tar.gz":".tar"),u=o?"application/x-gzip":"application/x-tar";return typeof File<"u"?new File([n],i,{type:u}):new Blob([n],{type:u})}var Hr=["application/x-gtar","application/x-tar+gzip","application/x-gzip","application/gzip"];async function ce(r,e,t){let s=new Uint8Array(await e.arrayBuffer()),a=typeof File<"u"&&e instanceof File?e.name:void 0;(Hr.includes(e.type)||a?.endsWith(".tgz")||a?.endsWith(".tar.gz"))&&(s=await ar(s));let o;try{o=(0,g.untar)(s)}catch(i){if(i instanceof Error&&i.message.includes("File is corrupted"))s=await ar(s),o=(0,g.untar)(s);else throw i}for(let i of o){let u=t+i.name,c=u.split("/").slice(0,-1);for(let m=1;m<=c.length;m++){let y=c.slice(0,m).join("/");r.analyzePath(y).exists||r.mkdir(y)}i.type===g.REGTYPE?(r.writeFile(u,i.data),r.utime(u,sr(i.modifyTime),sr(i.modifyTime))):i.type===g.DIRTYPE&&r.mkdir(u)}}function jr(r,e){let t=[],s=a=>{r.readdir(a).forEach(o=>{if(o==="."||o==="..")return;let i=a+"/"+o,u=r.stat(i),c=r.isFile(u.mode)?r.readFile(i,{encoding:"binary"}):new Uint8Array(0);t.push({name:i.substring(e.length),mode:u.mode,size:u.size,type:r.isFile(u.mode)?g.REGTYPE:g.DIRTYPE,modifyTime:u.mtime,data:c}),r.isDir(u.mode)&&s(i)})};return s(e),t}function Br(r,e){let t=jr(r,e);return(0,g.tar)(t)}async function qr(r,e="auto"){if(e==="none")return[r,!1];if(typeof CompressionStream<"u")return[await Yr(r),!0];if(typeof process<"u"&&process.versions&&process.versions.node)return[await Wr(r),!0];if(e==="auto")return[r,!1];throw new Error("Compression not supported in this environment")}async function Yr(r){let e=new CompressionStream("gzip"),t=e.writable.getWriter(),s=e.readable.getReader();t.write(r),t.close();let a=[];for(;;){let{value:i,done:u}=await s.read();if(u)break;i&&a.push(i)}let n=new Uint8Array(a.reduce((i,u)=>i+u.length,0)),o=0;return a.forEach(i=>{n.set(i,o),o+=i.length}),n}async function Wr(r){let{promisify:e}=await __webpack_require__.e(/*! import() */ "_c78c").then(__webpack_require__.t.bind(__webpack_require__, /*! util */ "?c78c", 19)),{gzip:t}=await __webpack_require__.e(/*! import() */ "_4971").then(__webpack_require__.t.bind(__webpack_require__, /*! zlib */ "?4971", 19));return await e(t)(r)}async function ar(r){if(typeof CompressionStream<"u")return await Xr(r);if(typeof process<"u"&&process.versions&&process.versions.node)return await Kr(r);throw new Error("Unsupported environment for decompression")}async function Xr(r){let e=new DecompressionStream("gzip"),t=e.writable.getWriter(),s=e.readable.getReader();t.write(r),t.close();let a=[];for(;;){let{value:i,done:u}=await s.read();if(u)break;i&&a.push(i)}let n=new Uint8Array(a.reduce((i,u)=>i+u.length,0)),o=0;return a.forEach(i=>{n.set(i,o),o+=i.length}),n}async function Kr(r){let{promisify:e}=await __webpack_require__.e(/*! import() */ "_c78c").then(__webpack_require__.t.bind(__webpack_require__, /*! util */ "?c78c", 19)),{gunzip:t}=await __webpack_require__.e(/*! import() */ "_4971").then(__webpack_require__.t.bind(__webpack_require__, /*! zlib */ "?4971", 19));return await e(t)(r)}function sr(r){return r?typeof r=="number"?r:Math.floor(r.getTime()/1e3):Math.floor(Date.now()/1e3)}var Vr="/tmp/pglite",C=Vr+"/base",ur=class{constructor(e){this.dataDir=e}async init(e,t){return this.pg=e,{emscriptenOpts:t}}async syncToFs(e){}async initialSyncFs(){}async closeFs(){}async dumpTar(e,t){return H(this.pg.Module.FS,C,e,t)}},cr=class{constructor(e,{debug:t=!1}={}){this.dataDir=e,this.debug=t}async syncToFs(e){}async initialSyncFs(){}async closeFs(){}async dumpTar(e,t){return H(this.pg.Module.FS,C,e,t)}async init(e,t){return this.pg=e,{emscriptenOpts:{...t,preRun:[...t.preRun||[],a=>{let n=Zr(a,this);a.FS.mkdir(C),a.FS.mount(n,{},C)}]}}}},pr={EBADF:8,EBADFD:127,EEXIST:20,EINVAL:28,EISDIR:31,ENODEV:43,ENOENT:44,ENOTDIR:54,ENOTEMPTY:55},Zr=(r,e)=>{let t=r.FS,s=e.debug?console.log:null,a={tryFSOperation(n){try{return n()}catch(o){throw o.code?o.code==="UNKNOWN"?new t.ErrnoError(pr.EINVAL):new t.ErrnoError(o.code):o}},mount(n){return a.createNode(null,"/",16895,0)},syncfs(n,o,i){},createNode(n,o,i,u){if(!t.isDir(i)&&!t.isFile(i))throw new t.ErrnoError(28);let c=t.createNode(n,o,i);return c.node_ops=a.node_ops,c.stream_ops=a.stream_ops,c},getMode:function(n){return s?.("getMode",n),a.tryFSOperation(()=>e.lstat(n).mode)},realPath:function(n){let o=[];for(;n.parent!==n;)o.push(n.name),n=n.parent;return o.push(n.mount.opts.root),o.reverse(),o.join("/")},node_ops:{getattr(n){s?.("getattr",a.realPath(n));let o=a.realPath(n);return a.tryFSOperation(()=>{let i=e.lstat(o);return{...i,dev:0,ino:n.id,nlink:1,rdev:n.rdev,atime:new Date(i.atime),mtime:new Date(i.mtime),ctime:new Date(i.ctime)}})},setattr(n,o){s?.("setattr",a.realPath(n),o);let i=a.realPath(n);a.tryFSOperation(()=>{o.mode!==void 0&&e.chmod(i,o.mode),o.size!==void 0&&e.truncate(i,o.size),o.timestamp!==void 0&&e.utimes(i,o.timestamp,o.timestamp),o.size!==void 0&&e.truncate(i,o.size)})},lookup(n,o){s?.("lookup",a.realPath(n),o);let i=[a.realPath(n),o].join("/"),u=a.getMode(i);return a.createNode(n,o,u)},mknod(n,o,i,u){s?.("mknod",a.realPath(n),o,i,u);let c=a.createNode(n,o,i,u),m=a.realPath(c);return a.tryFSOperation(()=>(t.isDir(c.mode)?e.mkdir(m,{mode:i}):e.writeFile(m,"",{mode:i}),c))},rename(n,o,i){s?.("rename",a.realPath(n),a.realPath(o),i);let u=a.realPath(n),c=[a.realPath(o),i].join("/");a.tryFSOperation(()=>{e.rename(u,c)}),n.name=i},unlink(n,o){s?.("unlink",a.realPath(n),o);let i=[a.realPath(n),o].join("/");try{e.unlink(i)}catch{}},rmdir(n,o){s?.("rmdir",a.realPath(n),o);let i=[a.realPath(n),o].join("/");return a.tryFSOperation(()=>{e.rmdir(i)})},readdir(n){s?.("readdir",a.realPath(n));let o=a.realPath(n);return a.tryFSOperation(()=>e.readdir(o))},symlink(n,o,i){throw s?.("symlink",a.realPath(n),o,i),new t.ErrnoError(63)},readlink(n){throw s?.("readlink",a.realPath(n)),new t.ErrnoError(63)}},stream_ops:{open(n){s?.("open stream",a.realPath(n.node));let o=a.realPath(n.node);return a.tryFSOperation(()=>{t.isFile(n.node.mode)&&(n.shared.refcount=1,n.nfd=e.open(o))})},close(n){return s?.("close stream",a.realPath(n.node)),a.tryFSOperation(()=>{t.isFile(n.node.mode)&&n.nfd&&--n.shared.refcount===0&&e.close(n.nfd)})},dup(n){s?.("dup stream",a.realPath(n.node)),n.shared.refcount++},read(n,o,i,u,c){return s?.("read stream",a.realPath(n.node),i,u,c),u===0?0:a.tryFSOperation(()=>e.read(n.nfd,o,i,u,c))},write(n,o,i,u,c){return s?.("write stream",a.realPath(n.node),i,u,c),a.tryFSOperation(()=>e.write(n.nfd,o.buffer,i,u,c))},llseek(n,o,i){s?.("llseek stream",a.realPath(n.node),o,i);let u=o;if(i===1?u+=n.position:i===2&&t.isFile(n.node.mode)&&a.tryFSOperation(()=>{let c=e.fstat(n.nfd);u+=c.size}),u<0)throw new t.ErrnoError(28);return u},mmap(n,o,i,u,c){if(s?.("mmap stream",a.realPath(n.node),o,i,u,c),!t.isFile(n.node.mode))throw new t.ErrnoError(pr.ENODEV);let m=r.mmapAlloc(o);return a.stream_ops.read(n,r.HEAP8,m,o,i),{ptr:m,allocated:!0}},msync(n,o,i,u,c){return s?.("msync stream",a.realPath(n.node),i,u,c),a.stream_ops.write(n,o,0,u,i),0}}};return a}; -//# sourceMappingURL=chunk-WGR4JCLS.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/index.js": -/*!*********************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/index.js ***! - \*********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IdbFs: () => (/* binding */ ee), -/* harmony export */ MemoryFS: () => (/* binding */ te), -/* harmony export */ Mutex: () => (/* binding */ H), -/* harmony export */ PGlite: () => (/* binding */ Ue), -/* harmony export */ formatQuery: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.v), -/* harmony export */ messages: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.n), -/* harmony export */ parse: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.h), -/* harmony export */ protocol: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.p), -/* harmony export */ types: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.e), -/* harmony export */ uuid: () => (/* reexport safe */ _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.u) -/* harmony export */ }); -/* harmony import */ var _chunk_A7RFOIQ7_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunk-A7RFOIQ7.js */ "./node_modules/@electric-sql/pglite/dist/chunk-A7RFOIQ7.js"); -/* harmony import */ var _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chunk-EADU5A67.js */ "./node_modules/@electric-sql/pglite/dist/chunk-EADU5A67.js"); -/* harmony import */ var _chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./chunk-WGR4JCLS.js */ "./node_modules/@electric-sql/pglite/dist/chunk-WGR4JCLS.js"); -/* harmony import */ var _chunk_STOZMFXW_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./chunk-STOZMFXW.js */ "./node_modules/@electric-sql/pglite/dist/chunk-STOZMFXW.js"); -/* harmony import */ var _chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chunk-BTBUZ646.js */ "./node_modules/@electric-sql/pglite/dist/chunk-BTBUZ646.js"); -(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();var Ye=new Error("timeout while waiting for mutex to become available"),Je=new Error("mutex already locked"),He=new Error("request for lock canceled"),We=function(e,t,r,a){function o(s){return s instanceof r?s:new r(function(l){l(s)})}return new(r||(r=Promise))(function(s,l){function n(p){try{m(a.next(p))}catch(d){l(d)}}function _(p){try{m(a.throw(p))}catch(d){l(d)}}function m(p){p.done?s(p.value):o(p.value).then(n,_)}m((a=a.apply(e,t||[])).next())})},ce=class{constructor(t,r=He){this._value=t,this._cancelError=r,this._weightedQueues=[],this._weightedWaiters=[]}acquire(t=1){if(t<=0)throw new Error(`invalid weight ${t}: must be positive`);return new Promise((r,a)=>{this._weightedQueues[t-1]||(this._weightedQueues[t-1]=[]),this._weightedQueues[t-1].push({resolve:r,reject:a}),this._dispatch()})}runExclusive(t,r=1){return We(this,void 0,void 0,function*(){let[a,o]=yield this.acquire(r);try{return yield t(a)}finally{o()}})}waitForUnlock(t=1){if(t<=0)throw new Error(`invalid weight ${t}: must be positive`);return new Promise(r=>{this._weightedWaiters[t-1]||(this._weightedWaiters[t-1]=[]),this._weightedWaiters[t-1].push(r),this._dispatch()})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(t){this._value=t,this._dispatch()}release(t=1){if(t<=0)throw new Error(`invalid weight ${t}: must be positive`);this._value+=t,this._dispatch()}cancel(){this._weightedQueues.forEach(t=>t.forEach(r=>r.reject(this._cancelError))),this._weightedQueues=[]}_dispatch(){var t;for(let r=this._value;r>0;r--){let a=(t=this._weightedQueues[r-1])===null||t===void 0?void 0:t.shift();if(!a)continue;let o=this._value,s=r;this._value-=r,r=this._value+1,a.resolve([o,this._newReleaser(s)])}this._drainUnlockWaiters()}_newReleaser(t){let r=!1;return()=>{r||(r=!0,this.release(t))}}_drainUnlockWaiters(){for(let t=this._value;t>0;t--)this._weightedWaiters[t-1]&&(this._weightedWaiters[t-1].forEach(r=>r()),this._weightedWaiters[t-1]=[])}},je=function(e,t,r,a){function o(s){return s instanceof r?s:new r(function(l){l(s)})}return new(r||(r=Promise))(function(s,l){function n(p){try{m(a.next(p))}catch(d){l(d)}}function _(p){try{m(a.throw(p))}catch(d){l(d)}}function m(p){p.done?s(p.value):o(p.value).then(n,_)}m((a=a.apply(e,t||[])).next())})},H=class{constructor(t){this._semaphore=new ce(1,t)}acquire(){return je(this,void 0,void 0,function*(){let[,t]=yield this._semaphore.acquire();return t})}runExclusive(t){return this._semaphore.runExclusive(()=>t())}isLocked(){return this._semaphore.isLocked()}waitForUnlock(){return this._semaphore.waitForUnlock()}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();var Ie=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.c)((0,_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.a)(),1);async function ge(e){if(_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.q){let t=await __webpack_require__.e(/*! import() */ "_8414").then(__webpack_require__.t.bind(__webpack_require__, /*! fs */ "?8414", 19)),r=await __webpack_require__.e(/*! import() */ "_4971").then(__webpack_require__.t.bind(__webpack_require__, /*! zlib */ "?4971", 19)),{Writable:a}=await __webpack_require__.e(/*! import() */ "_5cd3").then(__webpack_require__.t.bind(__webpack_require__, /*! stream */ "?5cd3", 19)),{pipeline:o}=await __webpack_require__.e(/*! import() */ "_ae24").then(__webpack_require__.t.bind(__webpack_require__, /*! stream/promises */ "?ae24", 19));if(!t.existsSync(e))throw new Error(`Extension bundle not found: ${e}`);let s=r.createGunzip(),l=[];return await o(t.createReadStream(e),s,new a({write(n,_,m){l.push(n),m()}})),new Blob(l)}else{let t=await fetch(e.toString());if(!t.ok||!t.body)return null;if(t.headers.get("Content-Encoding")==="gzip")return t.blob();{let r=new DecompressionStream("gzip");return new Response(t.body.pipeThrough(r)).blob()}}}async function Pe(e,t){for(let r in e.pg_extensions){let a;try{a=await e.pg_extensions[r]}catch(o){console.error("Failed to fetch extension:",r,o);continue}if(a){let o=new Uint8Array(await a.arrayBuffer());Ve(e,r,o,t)}else console.error("Could not get binary data for extension:",r)}}function Ve(e,t,r,a){Ie.default.untar(r).forEach(s=>{if(!s.name.startsWith(".")){let l=e.WASM_PREFIX+"/"+s.name;if(s.name.endsWith(".so")){let n=(...m)=>{a("pgfs:ext OK",l,m)},_=(...m)=>{a("pgfs:ext FAIL",l,m)};e.FS.createPreloadedFile(Ke(l),s.name.split("/").pop().slice(0,-3),s.data,!0,!0,n,_,!1)}else e.FS.writeFile(l,s.data)}})}function Ke(e){let t=e.lastIndexOf("/");return t>0?e.slice(0,t):e}(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();var ee=class extends _chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.e{async init(t,r){return this.pg=t,{emscriptenOpts:{...r,preRun:[...r.preRun||[],o=>{let s=o.FS.filesystems.IDBFS;o.FS.mkdir("/pglite"),o.FS.mkdir(`/pglite/${this.dataDir}`),o.FS.mount(s,{},`/pglite/${this.dataDir}`),o.FS.symlink(`/pglite/${this.dataDir}`,_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.d)}]}}}initialSyncFs(){return new Promise((t,r)=>{this.pg.Module.FS.syncfs(!0,a=>{a?r(a):t()})})}syncToFs(t){return new Promise((r,a)=>{this.pg.Module.FS.syncfs(!1,o=>{o?a(o):r()})})}async closeFs(){let t=this.pg.Module.FS.filesystems.IDBFS.dbs[this.dataDir];t&&t.close(),this.pg.Module.FS.quit()}};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();var te=class extends _chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.e{async closeFs(){this.pg.Module.FS.quit()}};function Fe(e){let t;if(e?.startsWith("file://")){if(e=e.slice(7),!e)throw new Error("Invalid dataDir, must be a valid path");t="nodefs"}else e?.startsWith("idb://")?(e=e.slice(6),t="idbfs"):e?.startsWith("opfs-ahp://")?(e=e.slice(11),t="opfs-ahp"):!e||e?.startsWith("memory://")?t="memoryfs":t="nodefs";return{dataDir:e,fsType:t}}async function Ae(e,t){let r;if(e&&t==="nodefs"){let{NodeFS:a}=await __webpack_require__.e(/*! import() */ "node_modules_electric-sql_pglite_dist_fs_nodefs_js").then(__webpack_require__.bind(__webpack_require__, /*! ./fs/nodefs.js */ "./node_modules/@electric-sql/pglite/dist/fs/nodefs.js"));r=new a(e)}else if(e&&t==="idbfs")r=new ee(e);else if(e&&t==="opfs-ahp"){let{OpfsAhpFS:a}=await __webpack_require__.e(/*! import() */ "vendors-node_modules_electric-sql_pglite_dist_fs_opfs-ahp_js").then(__webpack_require__.bind(__webpack_require__, /*! ./fs/opfs-ahp.js */ "./node_modules/@electric-sql/pglite/dist/fs/opfs-ahp.js"));r=new a(e)}else r=new te;return r}(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)();var Qe=(()=>{var _scriptName="file:///home/sean/projects/php-wasm/demo-web/node_modules/@electric-sql/pglite/dist/index.js";return async function(moduleArg={}){var moduleRtn,Module=moduleArg,readyPromiseResolve,readyPromiseReject,readyPromise=new Promise((e,t)=>{readyPromiseResolve=e,readyPromiseReject=t}),ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope<"u",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){let{createRequire:e}=await __webpack_require__.e(/*! import() */ "_b1c1").then(__webpack_require__.t.bind(__webpack_require__, /*! module */ "?b1c1", 19)),t="file:///home/sean/projects/php-wasm/demo-web/node_modules/@electric-sql/pglite/dist/index.js";t.startsWith("data:")&&(t="/");var require=e(t)}Module.expectedDataFileDownloads??(Module.expectedDataFileDownloads=0),Module.expectedDataFileDownloads++,(()=>{var e=typeof ENVIRONMENT_IS_PTHREAD<"u"&&ENVIRONMENT_IS_PTHREAD,t=typeof ENVIRONMENT_IS_WASM_WORKER<"u"&&ENVIRONMENT_IS_WASM_WORKER;if(e||t)return;var r=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";function a(o){var s="";typeof window=="object"?s=window.encodeURIComponent(window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/"):typeof process>"u"&&typeof location<"u"&&(s=encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/"));var l="postgres.data",n="postgres.data",_=Module.locateFile?Module.locateFile(n,""):n,m=o.remote_package_size;function p(u,w,h,S){if(r){require("fs").readFile(u,(M,y)=>{M?S(M):h(y.buffer)});return}Module.dataFileDownloads??(Module.dataFileDownloads={}),fetch(u).catch(M=>Promise.reject(new Error(`Network Error: ${u}`,{cause:M}))).then(M=>{if(!M.ok)return Promise.reject(new Error(`${M.status}: ${M.url}`));if(!M.body&&M.arrayBuffer)return M.arrayBuffer().then(h);let y=M.body.getReader(),x=()=>y.read().then(X).catch(R=>Promise.reject(new Error(`Unexpected error while handling : ${M.url} ${R}`,{cause:R}))),E=[],b=M.headers,T=Number(b.get("Content-Length")??w),D=0,X=({done:R,value:z})=>{if(R){let P=new Uint8Array(E.map(A=>A.length).reduce((A,Re)=>A+Re,0)),U=0;for(let A of E)P.set(A,U),U+=A.length;h(P.buffer)}else{E.push(z),D+=z.length,Module.dataFileDownloads[u]={loaded:D,total:T};let P=0,U=0;for(let A of Object.values(Module.dataFileDownloads))P+=A.loaded,U+=A.total;return Module.setStatus?.(`Downloading data... (${P}/${U})`),x()}};return Module.setStatus?.("Downloading data..."),x()})}function d(u){console.error("package error:",u)}var g=null,c=Module.getPreloadedPackage?Module.getPreloadedPackage(_,m):null;c||p(_,m,u=>{g?(g(u),g=null):c=u},d);function f(u){function w(x,E){if(!x)throw E+new Error().stack}u.FS_createPath("/","home",!0,!0),u.FS_createPath("/home","web_user",!0,!0),u.FS_createPath("/","tmp",!0,!0),u.FS_createPath("/tmp","pglite",!0,!0),u.FS_createPath("/tmp/pglite","bin",!0,!0),u.FS_createPath("/tmp/pglite","lib",!0,!0),u.FS_createPath("/tmp/pglite/lib","postgresql",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql","pgxs",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs","config",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs","src",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs/src","makefiles",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs/src","test",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs/src/test","isolation",!0,!0),u.FS_createPath("/tmp/pglite/lib/postgresql/pgxs/src/test","regress",!0,!0),u.FS_createPath("/tmp/pglite","share",!0,!0),u.FS_createPath("/tmp/pglite/share","postgresql",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql","extension",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql","timezone",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Africa",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","America",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone/America","Argentina",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone/America","Indiana",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone/America","Kentucky",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone/America","North_Dakota",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Antarctica",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Arctic",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Asia",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Atlantic",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Australia",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Brazil",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Canada",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Chile",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Etc",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Europe",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Indian",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Mexico",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","Pacific",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql/timezone","US",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql","timezonesets",!0,!0),u.FS_createPath("/tmp/pglite/share/postgresql","tsearch_data",!0,!0);function h(x,E,b){this.start=x,this.end=E,this.audio=b}h.prototype={requests:{},open:function(x,E){this.name=E,this.requests[E]=this,u.addRunDependency(`fp ${this.name}`)},send:function(){},onload:function(){var x=this.byteArray.subarray(this.start,this.end);this.finish(x)},finish:function(x){var E=this;u.FS_createDataFile(this.name,null,x,!0,!0,!0),u.removeRunDependency(`fp ${E.name}`),this.requests[this.name]=null}};for(var S=o.files,M=0;M{throw t},scriptDirectory="";function locateFile(e){return Module.locateFile?Module.locateFile(e,scriptDirectory):scriptDirectory+e}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs"),nodePath=require("path");"file:///home/sean/projects/php-wasm/demo-web/node_modules/@electric-sql/pglite/dist/index.js".startsWith("data:")||(scriptDirectory=nodePath.dirname(require("url").fileURLToPath("file:///home/sean/projects/php-wasm/demo-web/node_modules/@electric-sql/pglite/dist/index.js"))+"/"),readBinary=e=>{e=isFileURI(e)?new URL(e):e;var t=fs.readFileSync(e);return t},readAsync=async(e,t=!0)=>{e=isFileURI(e)?new URL(e):e;var r=fs.readFileSync(e,t?void 0:"utf8");return r},!Module.thisProgram&&process.argv.length>1&&(thisProgram=process.argv[1].replace(/\\/g,"/")),arguments_=process.argv.slice(2),quit_=(e,t)=>{throw process.exitCode=e,t}}else(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&(ENVIRONMENT_IS_WORKER?scriptDirectory=self.location.href:typeof document<"u"&&document.currentScript&&(scriptDirectory=document.currentScript.src),_scriptName&&(scriptDirectory=_scriptName),scriptDirectory.startsWith("blob:")?scriptDirectory="":scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1),readAsync=async e=>{var t=await fetch(e,{credentials:"same-origin"});if(t.ok)return t.arrayBuffer();throw new Error(t.status+" : "+t.url)});var out=Module.print||console.log.bind(console),err=Module.printErr||console.error.bind(console);Object.assign(Module,moduleOverrides),moduleOverrides=null,Module.arguments&&(arguments_=Module.arguments),Module.thisProgram&&(thisProgram=Module.thisProgram);var dynamicLibraries=Module.dynamicLibraries||[],wasmBinary=Module.wasmBinary;function intArrayFromBase64(e){if(typeof ENVIRONMENT_IS_NODE<"u"&&ENVIRONMENT_IS_NODE){var t=Buffer.from(e,"base64");return new Uint8Array(t.buffer,t.byteOffset,t.length)}for(var r=atob(e),a=new Uint8Array(r.length),o=0;oe.startsWith(dataURIPrefix),isFileURI=e=>e.startsWith("file://");function findWasmBinary(){if(Module.locateFile){var e="postgres.wasm";return isDataURI(e)?e:locateFile(e)}return new URL(/* asset import */ __webpack_require__(/*! postgres.wasm */ "./node_modules/@electric-sql/pglite/dist/postgres.wasm"), __webpack_require__.b).href}var wasmBinaryFile;function getBinarySync(e){if(e==wasmBinaryFile&&wasmBinary)return new Uint8Array(wasmBinary);if(readBinary)return readBinary(e);throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(e){if(!wasmBinary)try{var t=await readAsync(e);return new Uint8Array(t)}catch{}return getBinarySync(e)}async function instantiateArrayBuffer(e,t){try{var r=await getWasmBinary(e),a=await WebAssembly.instantiate(r,t);return a}catch(o){err(`failed to asynchronously prepare wasm: ${o}`),abort(o)}}async function instantiateAsync(e,t,r){if(!e&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(t)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function")try{var a=fetch(t,{credentials:"same-origin"}),o=await WebAssembly.instantiateStreaming(a,r);return o}catch(s){err(`wasm streaming compile failed: ${s}`),err("falling back to ArrayBuffer instantiation")}return instantiateArrayBuffer(t,r)}function getWasmImports(){return{env:wasmImports,wasi_snapshot_preview1:wasmImports,"GOT.mem":new Proxy(wasmImports,GOTHandler),"GOT.func":new Proxy(wasmImports,GOTHandler)}}async function createWasm(){function e(o,s){wasmExports=o.exports,wasmExports=relocateExports(wasmExports,16777216);var l=getDylinkMetadata(s);return l.neededDynlibs&&(dynamicLibraries=l.neededDynlibs.concat(dynamicLibraries)),mergeLibSymbols(wasmExports,"main"),LDSO.init(),loadDylibs(),addOnInit(wasmExports.__wasm_call_ctors),__RELOC_FUNCS__.push(wasmExports.__wasm_apply_data_relocs),removeRunDependency("wasm-instantiate"),wasmExports}addRunDependency("wasm-instantiate");function t(o){e(o.instance,o.module)}var r=getWasmImports();if(Module.instantiateWasm)try{return Module.instantiateWasm(r,e)}catch(o){err(`Module.instantiateWasm callback failed with error: ${o}`),readyPromiseReject(o)}wasmBinaryFile??(wasmBinaryFile=findWasmBinary());try{var a=await instantiateAsync(wasmBinary,wasmBinaryFile,r);return t(a),a}catch(o){readyPromiseReject(o);return}}var ASM_CONSTS={18792944:e=>{Module.is_worker=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Module.FD_BUFFER_MAX=e,Module.emscripten_copy_to=console.warn},18793117:()=>{Module.postMessage=function(t){console.log("# 1252: onCustomMessage:",__FILE__,t)}},18793242:()=>{if(Module.is_worker){let t=function(r){console.log("onCustomMessage:",r)};var e=t;Module.onCustomMessage=t}else Module.postMessage=function(r){switch(r.type){case"raw":{stringToUTF8(r.data,shm_rawinput,Module.FD_BUFFER_MAX);break}case"stdin":{stringToUTF8(r.data,1,Module.FD_BUFFER_MAX);break}case"rcon":{stringToUTF8(r.data,shm_rcon,Module.FD_BUFFER_MAX);break}default:console.warn("custom_postMessage?",r)}}}};function is_web_env(){try{if(window)return 1}catch{return 0}}is_web_env.sig="i";class ExitStatus{constructor(t){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"name","ExitStatus");this.message=`Program terminated with exit(${t})`,this.status=t}}var GOT={},currentModuleWeakSymbols=new Set([]),GOTHandler={get(e,t){var r=GOT[t];return r||(r=GOT[t]=new WebAssembly.Global({value:"i32",mutable:!0})),currentModuleWeakSymbols.has(t)||(r.required=!0),r}},callRuntimeCallbacks=e=>{for(;e.length>0;)e.shift()(Module)},UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder:void 0,UTF8ArrayToString=(e,t=0,r=NaN)=>{for(var a=t+r,o=t;e[o]&&!(o>=a);)++o;if(o-t>16&&e.buffer&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(t,o));for(var s="";t>10,56320|m&1023)}}return s},getDylinkMetadata=e=>{var t=0,r=0;function a(){return e[t++]}function o(){for(var P=0,U=1;;){var A=e[t++];if(P+=(A&127)*U,U*=128,!(A&128))break}return P}function s(){var P=o();return t+=P,UTF8ArrayToString(e,t-P,P)}function l(P,U){if(P)throw new Error(U)}var n="dylink.0";if(e instanceof WebAssembly.Module){var _=WebAssembly.Module.customSections(e,n);_.length===0&&(n="dylink",_=WebAssembly.Module.customSections(e,n)),l(_.length===0,"need dylink section"),e=new Uint8Array(_[0]),r=e.length}else{var m=new Uint32Array(new Uint8Array(e.subarray(0,24)).buffer),p=m[0]==1836278016;l(!p,"need to see wasm magic number"),l(e[8]!==0,"need the dylink section to be first"),t=9;var d=o();r=t+d,n=s()}var g={neededDynlibs:[],tlsExports:new Set,weakImports:new Set};if(n=="dylink"){g.memorySize=o(),g.memoryAlign=o(),g.tableSize=o(),g.tableAlign=o();for(var c=o(),f=0;f>1];case"i32":return HEAP32[e>>2];case"i64":return HEAP64[e>>3];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];case"*":return HEAPU32[e>>2];default:abort(`invalid type for getValue: ${t}`)}}var newDSO=(e,t,r)=>{var a={refcount:1/0,name:e,exports:r,global:!0};return LDSO.loadedLibsByName[e]=a,t!=null&&(LDSO.loadedLibsByHandle[t]=a),a},LDSO={loadedLibsByName:{},loadedLibsByHandle:{},init(){newDSO("__main__",0,wasmImports)}},___heap_base=23144432,alignMemory=(e,t)=>Math.ceil(e/t)*t,getMemory=e=>{if(runtimeInitialized)return _calloc(e,1);var t=___heap_base,r=t+alignMemory(e,16);return ___heap_base=r,GOT.__heap_base.value=r,t},isInternalSym=e=>["__cpp_exception","__c_longjmp","__wasm_apply_data_relocs","__dso_handle","__tls_size","__tls_align","__set_stack_limits","_emscripten_tls_init","__wasm_init_tls","__wasm_call_ctors","__start_em_asm","__stop_em_asm","__start_em_js","__stop_em_js"].includes(e)||e.startsWith("__em_js__"),uleb128Encode=(e,t)=>{e<128?t.push(e):t.push(e%128|128,e>>7)},sigToWasmTypes=e=>{for(var t={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"},r={parameters:[],results:e[0]=="v"?[]:[t[e[0]]]},a=1;a{var r=e.slice(0,1),a=e.slice(1),o={i:127,p:127,j:126,f:125,d:124,e:111};t.push(96),uleb128Encode(a.length,t);for(var s=0;s{if(typeof WebAssembly.Function=="function")return new WebAssembly.Function(sigToWasmTypes(t),e);var r=[1];generateFuncType(t,r);var a=[0,97,115,109,1,0,0,0,1];uleb128Encode(r.length,a),a.push(...r),a.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var o=new WebAssembly.Module(new Uint8Array(a)),s=new WebAssembly.Instance(o,{e:{f:e}}),l=s.exports.f;return l},wasmTableMirror=[],wasmTable=new WebAssembly.Table({initial:5360,element:"anyfunc"}),getWasmTableEntry=e=>{var t=wasmTableMirror[e];return t||(e>=wasmTableMirror.length&&(wasmTableMirror.length=e+1),wasmTableMirror[e]=t=wasmTable.get(e)),t},updateTableMap=(e,t)=>{if(functionsInTableMap)for(var r=e;r(functionsInTableMap||(functionsInTableMap=new WeakMap,updateTableMap(0,wasmTable.length)),functionsInTableMap.get(e)||0),freeTableIndexes=[],getEmptyTableSlot=()=>{if(freeTableIndexes.length)return freeTableIndexes.pop();try{wasmTable.grow(1)}catch(e){throw e instanceof RangeError?"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.":e}return wasmTable.length-1},setWasmTableEntry=(e,t)=>{wasmTable.set(e,t),wasmTableMirror[e]=wasmTable.get(e)},addFunction=(e,t)=>{var r=getFunctionAddress(e);if(r)return r;var a=getEmptyTableSlot();try{setWasmTableEntry(a,e)}catch(s){if(!(s instanceof TypeError))throw s;var o=convertJsFunctionToWasm(e,t);setWasmTableEntry(a,o)}return functionsInTableMap.set(e,a),a},updateGOT=(e,t)=>{for(var r in e)if(!isInternalSym(r)){var a=e[r];GOT[r]||(GOT[r]=new WebAssembly.Global({value:"i32",mutable:!0})),(t||GOT[r].value==0)&&(typeof a=="function"?GOT[r].value=addFunction(a):typeof a=="number"?GOT[r].value=a:err(`unhandled export type for '${r}': ${typeof a}`))}},relocateExports=(e,t,r)=>{var a={};for(var o in e){var s=e[o];typeof s=="object"&&(s=s.value),typeof s=="number"&&(s+=t),a[o]=s}return updateGOT(a,r),a},isSymbolDefined=e=>{var t=wasmImports[e];return!(!t||t.stub)},dynCall=(e,t,r=[])=>{var a=getWasmTableEntry(t)(...r);return a},stackSave=()=>_emscripten_stack_get_current(),stackRestore=e=>__emscripten_stack_restore(e),createInvokeFunction=e=>(t,...r)=>{var a=stackSave();try{return dynCall(e,t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;if(_setThrew(1,0),e[0]=="j")return 0n}},resolveGlobalSymbol=(e,t=!1)=>{var r;return isSymbolDefined(e)?r=wasmImports[e]:e.startsWith("invoke_")&&(r=wasmImports[e]=createInvokeFunction(e.split("_")[1])),{sym:r,name:e}},UTF8ToString=(e,t)=>e?UTF8ArrayToString(HEAPU8,e,t):"",loadWebAssemblyModule=(binary,flags,libName,localScope,handle)=>{var metadata=getDylinkMetadata(binary);currentModuleWeakSymbols=metadata.weakImports;function loadModule(){var firstLoad=!handle||!HEAP8[handle+8];if(firstLoad){var memAlign=Math.pow(2,metadata.memoryAlign),memoryBase=metadata.memorySize?alignMemory(getMemory(metadata.memorySize+memAlign),memAlign):0,tableBase=metadata.tableSize?wasmTable.length:0;handle&&(HEAP8[handle+8]=1,HEAPU32[handle+12>>2]=memoryBase,HEAP32[handle+16>>2]=metadata.memorySize,HEAPU32[handle+20>>2]=tableBase,HEAP32[handle+24>>2]=metadata.tableSize)}else memoryBase=HEAPU32[handle+12>>2],tableBase=HEAPU32[handle+20>>2];var tableGrowthNeeded=tableBase+metadata.tableSize-wasmTable.length;tableGrowthNeeded>0&&wasmTable.grow(tableGrowthNeeded);var moduleExports;function resolveSymbol(e){var t=resolveGlobalSymbol(e).sym;return!t&&localScope&&(t=localScope[e]),t||(t=moduleExports[e]),t}var proxyHandler={get(e,t){switch(t){case"__memory_base":return memoryBase;case"__table_base":return tableBase}if(t in wasmImports&&!wasmImports[t].stub)return wasmImports[t];if(!(t in e)){var r;e[t]=(...a)=>(r||(r=resolveSymbol(t)),r(...a))}return e[t]}},proxy=new Proxy({},proxyHandler),info={"GOT.mem":new Proxy({},GOTHandler),"GOT.func":new Proxy({},GOTHandler),env:proxy,wasi_snapshot_preview1:proxy};function postInstantiation(module,instance){updateTableMap(tableBase,metadata.tableSize),moduleExports=relocateExports(instance.exports,memoryBase),flags.allowUndefined||reportUndefinedSymbols();function addEmAsm(addr,body){for(var args=[],arity=0;arity<16&&body.indexOf("$"+arity)!=-1;arity++)args.push("$"+arity);args=args.join(",");var func=`(${args}) => { ${body} };`;ASM_CONSTS[start]=eval(func)}if("__start_em_asm"in moduleExports)for(var start=moduleExports.__start_em_asm,stop=moduleExports.__stop_em_asm;start ${body};`;moduleExports[name]=eval(func)}for(var name in moduleExports)if(name.startsWith("__em_js__")){var start=moduleExports[name],jsString=UTF8ToString(start),parts=jsString.split("<::>");addEmJs(name.replace("__em_js__",""),parts[0],parts[1]),delete moduleExports[name]}var applyRelocs=moduleExports.__wasm_apply_data_relocs;applyRelocs&&(runtimeInitialized?applyRelocs():__RELOC_FUNCS__.push(applyRelocs));var init=moduleExports.__wasm_call_ctors;return init&&(runtimeInitialized?init():__ATINIT__.push(init)),moduleExports}if(flags.loadAsync){if(binary instanceof WebAssembly.Module){var instance=new WebAssembly.Instance(binary,info);return Promise.resolve(postInstantiation(binary,instance))}return WebAssembly.instantiate(binary,info).then(e=>postInstantiation(e.module,e.instance))}var module=binary instanceof WebAssembly.Module?binary:new WebAssembly.Module(binary),instance=new WebAssembly.Instance(module,info);return postInstantiation(module,instance)}return flags.loadAsync?metadata.neededDynlibs.reduce((e,t)=>e.then(()=>loadDynamicLibrary(t,flags,localScope)),Promise.resolve()).then(loadModule):(metadata.neededDynlibs.forEach(e=>loadDynamicLibrary(e,flags,localScope)),loadModule())},mergeLibSymbols=(e,t)=>{for(var[r,a]of Object.entries(e)){let o=l=>{isSymbolDefined(l)||(wasmImports[l]=a)};o(r);let s="__main_argc_argv";r=="main"&&o(s),r==s&&o("main")}},asyncLoad=async e=>{var t=await readAsync(e);return new Uint8Array(t)},preloadPlugins=Module.preloadPlugins||[],registerWasmPlugin=()=>{var e={promiseChainEnd:Promise.resolve(),canHandle:t=>!Module.noWasmDecoding&&t.endsWith(".so"),handle:(t,r,a,o)=>{e.promiseChainEnd=e.promiseChainEnd.then(()=>loadWebAssemblyModule(t,{loadAsync:!0,nodelete:!0},r,{})).then(s=>{preloadedWasm[r]=s,a(t)},s=>{err(`failed to instantiate wasm: ${r}: ${s}`),o()})}};preloadPlugins.push(e)},preloadedWasm={};function loadDynamicLibrary(e,t={global:!0,nodelete:!0},r,a){var o=LDSO.loadedLibsByName[e];if(o)return t.global?o.global||(o.global=!0,mergeLibSymbols(o.exports,e)):r&&Object.assign(r,o.exports),t.nodelete&&o.refcount!==1/0&&(o.refcount=1/0),o.refcount++,a&&(LDSO.loadedLibsByHandle[a]=o),t.loadAsync?Promise.resolve(!0):!0;o=newDSO(e,a,"loading"),o.refcount=t.nodelete?1/0:1,o.global=t.global;function s(){if(a){var _=HEAPU32[a+28>>2],m=HEAPU32[a+32>>2];if(_&&m){var p=HEAP8.slice(_,_+m);return t.loadAsync?Promise.resolve(p):p}}var d=locateFile(e);if(t.loadAsync)return asyncLoad(d);if(!readBinary)throw new Error(`${d}: file not found, and synchronous loading of external files is not available`);return readBinary(d)}function l(){var _=preloadedWasm[e];return _?t.loadAsync?Promise.resolve(_):_:t.loadAsync?s().then(m=>loadWebAssemblyModule(m,t,e,r,a)):loadWebAssemblyModule(s(),t,e,r,a)}function n(_){o.global?mergeLibSymbols(_,e):r&&Object.assign(r,_),o.exports=_}return t.loadAsync?l().then(_=>(n(_),!0)):(n(l()),!0)}var reportUndefinedSymbols=()=>{for(var[e,t]of Object.entries(GOT))if(t.value==0){var r=resolveGlobalSymbol(e,!0).sym;if(!r&&!t.required)continue;if(typeof r=="function")t.value=addFunction(r,r.sig);else if(typeof r=="number")t.value=r;else throw new Error(`bad export type for '${e}': ${typeof r}`)}},loadDylibs=()=>{if(!dynamicLibraries.length){reportUndefinedSymbols();return}addRunDependency("loadDylibs"),dynamicLibraries.reduce((e,t)=>e.then(()=>loadDynamicLibrary(t,{loadAsync:!0,global:!0,nodelete:!0,allowUndefined:!0})),Promise.resolve()).then(()=>{reportUndefinedSymbols(),removeRunDependency("loadDylibs")})},noExitRuntime=Module.noExitRuntime||!0;function setValue(e,t,r="i8"){switch(r.endsWith("*")&&(r="*"),r){case"i1":HEAP8[e]=t;break;case"i8":HEAP8[e]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":HEAP64[e>>3]=BigInt(t);break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;case"*":HEAPU32[e>>2]=t;break;default:abort(`invalid type for setValue: ${r}`)}}var ___assert_fail=(e,t,r,a)=>abort(`Assertion failed: ${UTF8ToString(e)}, at: `+[t?UTF8ToString(t):"unknown filename",r,a?UTF8ToString(a):"unknown function"]);___assert_fail.sig="vppip";var ___call_sighandler=(e,t)=>getWasmTableEntry(e)(t);___call_sighandler.sig="vpi";var ___memory_base=new WebAssembly.Global({value:"i32",mutable:!1},16777216),___stack_pointer=new WebAssembly.Global({value:"i32",mutable:!0},23144432),PATH={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var r=0,a=e.length-1;a>=0;a--){var o=e[a];o==="."?e.splice(a,1):o===".."?(e.splice(a,1),r++):r&&(e.splice(a,1),r--)}if(t)for(;r;r--)e.unshift("..");return e},normalize:e=>{var t=PATH.isAbs(e),r=e.substr(-1)==="/";return e=PATH.normalizeArray(e.split("/").filter(a=>!!a),!t).join("/"),!e&&!t&&(e="."),e&&r&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=PATH.splitPath(e),r=t[0],a=t[1];return!r&&!a?".":(a&&(a=a.substr(0,a.length-1)),r+a)},basename:e=>{if(e==="/")return"/";e=PATH.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>PATH.normalize(e.join("/")),join2:(e,t)=>PATH.normalize(e+"/"+t)},initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return a=>crypto.getRandomValues(a);if(ENVIRONMENT_IS_NODE)try{var e=require("crypto"),t=e.randomFillSync;if(t)return a=>e.randomFillSync(a);var r=e.randomBytes;return a=>(a.set(r(a.byteLength)),a)}catch{}abort("initRandomDevice")},randomFill=e=>(randomFill=initRandomFill())(e),PATH_FS={resolve:(...e)=>{for(var t="",r=!1,a=e.length-1;a>=-1&&!r;a--){var o=a>=0?e[a]:FS.cwd();if(typeof o!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!o)return"";t=o+"/"+t,r=PATH.isAbs(o)}return t=PATH.normalizeArray(t.split("/").filter(s=>!!s),!r).join("/"),(r?"/":"")+t||"."},relative:(e,t)=>{e=PATH_FS.resolve(e).substr(1),t=PATH_FS.resolve(t).substr(1);function r(m){for(var p=0;p=0&&m[d]==="";d--);return p>d?[]:m.slice(p,d-p+1)}for(var a=r(e.split("/")),o=r(t.split("/")),s=Math.min(a.length,o.length),l=s,n=0;n{for(var t=0,r=0;r=55296&&a<=57343?(t+=4,++r):t+=3}return t},stringToUTF8Array=(e,t,r,a)=>{if(!(a>0))return 0;for(var o=r,s=r+a-1,l=0;l=55296&&n<=57343){var _=e.charCodeAt(++l);n=65536+((n&1023)<<10)|_&1023}if(n<=127){if(r>=s)break;t[r++]=n}else if(n<=2047){if(r+1>=s)break;t[r++]=192|n>>6,t[r++]=128|n&63}else if(n<=65535){if(r+2>=s)break;t[r++]=224|n>>12,t[r++]=128|n>>6&63,t[r++]=128|n&63}else{if(r+3>=s)break;t[r++]=240|n>>18,t[r++]=128|n>>12&63,t[r++]=128|n>>6&63,t[r++]=128|n&63}}return t[r]=0,r-o};function intArrayFromString(e,t,r){var a=r>0?r:lengthBytesUTF8(e)+1,o=new Array(a),s=stringToUTF8Array(e,o,0,o.length);return t&&(o.length=s),o}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var e=null;if(ENVIRONMENT_IS_NODE){var t=256,r=Buffer.alloc(t),a=0,o=process.stdin.fd;try{a=fs.readSync(o,r,0,t)}catch(s){if(s.toString().includes("EOF"))a=0;else throw s}a>0&&(e=r.slice(0,a).toString("utf-8"))}else typeof window<"u"&&typeof window.prompt=="function"&&(e=window.prompt("Input: "),e!==null&&(e+=` -`));if(!e)return null;FS_stdin_getChar_buffer=intArrayFromString(e,!0)}return FS_stdin_getChar_buffer.shift()},TTY={ttys:[],init(){},shutdown(){},register(e,t){TTY.ttys[e]={input:[],output:[],ops:t},FS.registerDevice(e,TTY.stream_ops)},stream_ops:{open(e){var t=TTY.ttys[e.node.rdev];if(!t)throw new FS.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,r,a,o){if(!e.tty||!e.tty.ops.get_char)throw new FS.ErrnoError(60);for(var s=0,l=0;l0&&(out(UTF8ArrayToString(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,r){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(err(UTF8ArrayToString(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(err(UTF8ArrayToString(e.output)),e.output=[])}}},zeroMemory=(e,t)=>{HEAPU8.fill(0,e,e+t)},mmapAlloc=e=>{e=alignMemory(e,65536);var t=_emscripten_builtin_memalign(65536,e);return t&&zeroMemory(t,e),t},MEMFS={ops_table:null,mount(e){return MEMFS.createNode(null,"/",16895,0)},createNode(e,t,r,a){if(FS.isBlkdev(r)||FS.isFIFO(r))throw new FS.ErrnoError(63);MEMFS.ops_table||(MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}});var o=FS.createNode(e,t,r,a);return FS.isDir(o.mode)?(o.node_ops=MEMFS.ops_table.dir.node,o.stream_ops=MEMFS.ops_table.dir.stream,o.contents={}):FS.isFile(o.mode)?(o.node_ops=MEMFS.ops_table.file.node,o.stream_ops=MEMFS.ops_table.file.stream,o.usedBytes=0,o.contents=null):FS.isLink(o.mode)?(o.node_ops=MEMFS.ops_table.link.node,o.stream_ops=MEMFS.ops_table.link.stream):FS.isChrdev(o.mode)&&(o.node_ops=MEMFS.ops_table.chrdev.node,o.stream_ops=MEMFS.ops_table.chrdev.stream),o.atime=o.mtime=o.ctime=Date.now(),e&&(e.contents[t]=o,e.atime=e.mtime=e.ctime=o.atime),o},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var r=e.contents?e.contents.length:0;if(!(r>=t)){var a=1024*1024;t=Math.max(t,r*(r>>0),r!=0&&(t=Math.max(t,256));var o=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(o.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var r=e.contents;e.contents=new Uint8Array(t),r&&e.contents.set(r.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=FS.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,FS.isDir(e.mode)?t.size=4096:FS.isFile(e.mode)?t.size=e.usedBytes:FS.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.atime),t.mtime=new Date(e.mtime),t.ctime=new Date(e.ctime),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){for(let r of["mode","atime","mtime","ctime"])t[r]&&(e[r]=t[r]);t.size!==void 0&&MEMFS.resizeFileStorage(e,t.size)},lookup(e,t){throw MEMFS.doesNotExistError},mknod(e,t,r,a){return MEMFS.createNode(e,t,r,a)},rename(e,t,r){var a;try{a=FS.lookupNode(t,r)}catch{}if(a){if(FS.isDir(e.mode))for(var o in a.contents)throw new FS.ErrnoError(55);FS.hashRemoveNode(a)}delete e.parent.contents[e.name],t.contents[r]=e,e.name=r,t.ctime=t.mtime=e.parent.ctime=e.parent.mtime=Date.now()},unlink(e,t){delete e.contents[t],e.ctime=e.mtime=Date.now()},rmdir(e,t){var r=FS.lookupNode(e,t);for(var a in r.contents)throw new FS.ErrnoError(55);delete e.contents[t],e.ctime=e.mtime=Date.now()},readdir(e){return[".","..",...Object.keys(e.contents)]},symlink(e,t,r){var a=MEMFS.createNode(e,t,41471,0);return a.link=r,a},readlink(e){if(!FS.isLink(e.mode))throw new FS.ErrnoError(28);return e.link}},stream_ops:{read(e,t,r,a,o){var s=e.node.contents;if(o>=e.node.usedBytes)return 0;var l=Math.min(e.node.usedBytes-o,a);if(l>8&&s.subarray)t.set(s.subarray(o,o+l),r);else for(var n=0;n0||r+t{FS.createDataFile(e,t,r,a,o,s)},FS_handledByPreloadPlugin=(e,t,r,a)=>{typeof Browser<"u"&&Browser.init();var o=!1;return preloadPlugins.forEach(s=>{o||s.canHandle(t)&&(s.handle(e,t,r,a),o=!0)}),o},FS_createPreloadedFile=(e,t,r,a,o,s,l,n,_,m)=>{var p=t?PATH_FS.resolve(PATH.join2(e,t)):e,d=`cp ${p}`;function g(c){function f(u){m?.(),n||FS_createDataFile(e,t,u,a,o,_),s?.(),removeRunDependency(d)}FS_handledByPreloadPlugin(c,p,f,()=>{l?.(),removeRunDependency(d)})||f(c)}addRunDependency(d),typeof r=="string"?asyncLoad(r).then(g,l):g(r)},FS_modeStringToFlags=e=>{var t={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},r=t[e];if(typeof r>"u")throw new Error(`Unknown file open mode: ${e}`);return r},FS_getMode=(e,t)=>{var r=0;return e&&(r|=365),t&&(r|=146),r},IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB<"u")return indexedDB;var e=null;return typeof window=="object"&&(e=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB),e},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",queuePersist:e=>{function t(){e.idbPersistState==="again"?r():e.idbPersistState=0}function r(){e.idbPersistState="idb",IDBFS.syncfs(e,!1,t)}e.idbPersistState?e.idbPersistState==="idb"&&(e.idbPersistState="again"):e.idbPersistState=setTimeout(r,0)},mount:e=>{var t=MEMFS.mount(e);if(e?.opts?.autoPersist){t.idbPersistState=0;var r=t.node_ops;t.node_ops=Object.assign({},t.node_ops),t.node_ops.mknod=(a,o,s,l)=>{var n=r.mknod(a,o,s,l);return n.node_ops=t.node_ops,n.idbfs_mount=t.mount,n.memfs_stream_ops=n.stream_ops,n.stream_ops=Object.assign({},n.stream_ops),n.stream_ops.write=(_,m,p,d,g,c)=>(_.node.isModified=!0,n.memfs_stream_ops.write(_,m,p,d,g,c)),n.stream_ops.close=_=>{var m=_.node;if(m.isModified&&(IDBFS.queuePersist(m.idbfs_mount),m.isModified=!1),m.memfs_stream_ops.close)return m.memfs_stream_ops.close(_)},n},t.node_ops.mkdir=(...a)=>(IDBFS.queuePersist(t.mount),r.mkdir(...a)),t.node_ops.rmdir=(...a)=>(IDBFS.queuePersist(t.mount),r.rmdir(...a)),t.node_ops.symlink=(...a)=>(IDBFS.queuePersist(t.mount),r.symlink(...a)),t.node_ops.unlink=(...a)=>(IDBFS.queuePersist(t.mount),r.unlink(...a)),t.node_ops.rename=(...a)=>(IDBFS.queuePersist(t.mount),r.rename(...a))}return t},syncfs:(e,t,r)=>{IDBFS.getLocalSet(e,(a,o)=>{if(a)return r(a);IDBFS.getRemoteSet(e,(s,l)=>{if(s)return r(s);var n=t?l:o,_=t?o:l;IDBFS.reconcile(n,_,r)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(e=>e.close()),IDBFS.dbs={}},getDB:(e,t)=>{var r=IDBFS.dbs[e];if(r)return t(null,r);var a;try{a=IDBFS.indexedDB().open(e,IDBFS.DB_VERSION)}catch(o){return t(o)}if(!a)return t("Unable to connect to IndexedDB");a.onupgradeneeded=o=>{var s=o.target.result,l=o.target.transaction,n;s.objectStoreNames.contains(IDBFS.DB_STORE_NAME)?n=l.objectStore(IDBFS.DB_STORE_NAME):n=s.createObjectStore(IDBFS.DB_STORE_NAME),n.indexNames.contains("timestamp")||n.createIndex("timestamp","timestamp",{unique:!1})},a.onsuccess=()=>{r=a.result,IDBFS.dbs[e]=r,t(null,r)},a.onerror=o=>{t(o.target.error),o.preventDefault()}},getLocalSet:(e,t)=>{var r={};function a(_){return _!=="."&&_!==".."}function o(_){return m=>PATH.join2(_,m)}for(var s=FS.readdir(e.mountpoint).filter(a).map(o(e.mountpoint));s.length;){var l=s.pop(),n;try{n=FS.stat(l)}catch(_){return t(_)}FS.isDir(n.mode)&&s.push(...FS.readdir(l).filter(a).map(o(l))),r[l]={timestamp:n.mtime}}return t(null,{type:"local",entries:r})},getRemoteSet:(e,t)=>{var r={};IDBFS.getDB(e.mountpoint,(a,o)=>{if(a)return t(a);try{var s=o.transaction([IDBFS.DB_STORE_NAME],"readonly");s.onerror=_=>{t(_.target.error),_.preventDefault()};var l=s.objectStore(IDBFS.DB_STORE_NAME),n=l.index("timestamp");n.openKeyCursor().onsuccess=_=>{var m=_.target.result;if(!m)return t(null,{type:"remote",db:o,entries:r});r[m.primaryKey]={timestamp:m.key},m.continue()}}catch(_){return t(_)}})},loadLocalEntry:(e,t)=>{var r,a;try{var o=FS.lookupPath(e);a=o.node,r=FS.stat(e)}catch(s){return t(s)}return FS.isDir(r.mode)?t(null,{timestamp:r.mtime,mode:r.mode}):FS.isFile(r.mode)?(a.contents=MEMFS.getFileDataAsTypedArray(a),t(null,{timestamp:r.mtime,mode:r.mode,contents:a.contents})):t(new Error("node type not supported"))},storeLocalEntry:(e,t,r)=>{try{if(FS.isDir(t.mode))FS.mkdirTree(e,t.mode);else if(FS.isFile(t.mode))FS.writeFile(e,t.contents,{canOwn:!0});else return r(new Error("node type not supported"));FS.chmod(e,t.mode),FS.utime(e,t.timestamp,t.timestamp)}catch(a){return r(a)}r(null)},removeLocalEntry:(e,t)=>{try{var r=FS.stat(e);FS.isDir(r.mode)?FS.rmdir(e):FS.isFile(r.mode)&&FS.unlink(e)}catch(a){return t(a)}t(null)},loadRemoteEntry:(e,t,r)=>{var a=e.get(t);a.onsuccess=o=>r(null,o.target.result),a.onerror=o=>{r(o.target.error),o.preventDefault()}},storeRemoteEntry:(e,t,r,a)=>{try{var o=e.put(r,t)}catch(s){a(s);return}o.onsuccess=s=>a(),o.onerror=s=>{a(s.target.error),s.preventDefault()}},removeRemoteEntry:(e,t,r)=>{var a=e.delete(t);a.onsuccess=o=>r(),a.onerror=o=>{r(o.target.error),o.preventDefault()}},reconcile:(e,t,r)=>{var a=0,o=[];Object.keys(e.entries).forEach(d=>{var g=e.entries[d],c=t.entries[d];(!c||g.timestamp.getTime()!=c.timestamp.getTime())&&(o.push(d),a++)});var s=[];if(Object.keys(t.entries).forEach(d=>{e.entries[d]||(s.push(d),a++)}),!a)return r(null);var l=!1,n=e.type==="remote"?e.db:t.db,_=n.transaction([IDBFS.DB_STORE_NAME],"readwrite"),m=_.objectStore(IDBFS.DB_STORE_NAME);function p(d){if(d&&!l)return l=!0,r(d)}_.onerror=_.onabort=d=>{p(d.target.error),d.preventDefault()},_.oncomplete=d=>{l||r(null)},o.sort().forEach(d=>{t.type==="local"?IDBFS.loadRemoteEntry(m,d,(g,c)=>{if(g)return p(g);IDBFS.storeLocalEntry(d,c,p)}):IDBFS.loadLocalEntry(d,(g,c)=>{if(g)return p(g);IDBFS.storeRemoteEntry(m,d,c,p)})}),s.sort().reverse().forEach(d=>{t.type==="local"?IDBFS.removeLocalEntry(d,p):IDBFS.removeRemoteEntry(m,d,p)})}},ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135},NODEFS={isWindows:!1,staticInit(){NODEFS.isWindows=!!process.platform.match(/^win/);var e=process.binding("constants");e.fs&&(e=e.fs),NODEFS.flagsForNodeMap={1024:e.O_APPEND,64:e.O_CREAT,128:e.O_EXCL,256:e.O_NOCTTY,0:e.O_RDONLY,2:e.O_RDWR,4096:e.O_SYNC,512:e.O_TRUNC,1:e.O_WRONLY,131072:e.O_NOFOLLOW}},convertNodeCode(e){var t=e.code;return ERRNO_CODES[t]},tryFSOperation(e){try{return e()}catch(t){throw t.code?t.code==="UNKNOWN"?new FS.ErrnoError(28):new FS.ErrnoError(NODEFS.convertNodeCode(t)):t}},mount(e){return NODEFS.createNode(null,"/",NODEFS.getMode(e.opts.root),0)},createNode(e,t,r,a){if(!FS.isDir(r)&&!FS.isFile(r)&&!FS.isLink(r))throw new FS.ErrnoError(28);var o=FS.createNode(e,t,r);return o.node_ops=NODEFS.node_ops,o.stream_ops=NODEFS.stream_ops,o},getMode(e){return NODEFS.tryFSOperation(()=>{var t=fs.lstatSync(e).mode;return NODEFS.isWindows&&(t|=(t&292)>>2),t})},realPath(e){for(var t=[];e.parent!==e;)t.push(e.name),e=e.parent;return t.push(e.mount.opts.root),t.reverse(),PATH.join(...t)},flagsForNode(e){e&=-2097153,e&=-2049,e&=-32769,e&=-524289,e&=-65537;var t=0;for(var r in NODEFS.flagsForNodeMap)e&r&&(t|=NODEFS.flagsForNodeMap[r],e^=r);if(e)throw new FS.ErrnoError(28);return t},node_ops:{getattr(e){var t=NODEFS.realPath(e),r;return NODEFS.tryFSOperation(()=>r=fs.lstatSync(t)),NODEFS.isWindows&&(r.blksize||(r.blksize=4096),r.blocks||(r.blocks=(r.size+r.blksize-1)/r.blksize|0),r.mode|=(r.mode&292)>>2),{dev:r.dev,ino:r.ino,mode:r.mode,nlink:r.nlink,uid:r.uid,gid:r.gid,rdev:r.rdev,size:r.size,atime:r.atime,mtime:r.mtime,ctime:r.ctime,blksize:r.blksize,blocks:r.blocks}},setattr(e,t){var r=NODEFS.realPath(e);NODEFS.tryFSOperation(()=>{if(t.mode!==void 0){var a=t.mode;NODEFS.isWindows&&(a&=384),fs.chmodSync(r,a),e.mode=t.mode}if(t.atime||t.mtime){var o=t.atime&&new Date(t.atime),s=t.mtime&&new Date(t.mtime);fs.utimesSync(r,o,s)}t.size!==void 0&&fs.truncateSync(r,t.size)})},lookup(e,t){var r=PATH.join2(NODEFS.realPath(e),t),a=NODEFS.getMode(r);return NODEFS.createNode(e,t,a)},mknod(e,t,r,a){var o=NODEFS.createNode(e,t,r,a),s=NODEFS.realPath(o);return NODEFS.tryFSOperation(()=>{FS.isDir(o.mode)?fs.mkdirSync(s,o.mode):fs.writeFileSync(s,"",{mode:o.mode})}),o},rename(e,t,r){var a=NODEFS.realPath(e),o=PATH.join2(NODEFS.realPath(t),r);try{FS.unlink(o)}catch{}NODEFS.tryFSOperation(()=>fs.renameSync(a,o)),e.name=r},unlink(e,t){var r=PATH.join2(NODEFS.realPath(e),t);NODEFS.tryFSOperation(()=>fs.unlinkSync(r))},rmdir(e,t){var r=PATH.join2(NODEFS.realPath(e),t);NODEFS.tryFSOperation(()=>fs.rmdirSync(r))},readdir(e){var t=NODEFS.realPath(e);return NODEFS.tryFSOperation(()=>fs.readdirSync(t))},symlink(e,t,r){var a=PATH.join2(NODEFS.realPath(e),t);NODEFS.tryFSOperation(()=>fs.symlinkSync(r,a))},readlink(e){var t=NODEFS.realPath(e);return NODEFS.tryFSOperation(()=>fs.readlinkSync(t))},statfs(e){var t=NODEFS.tryFSOperation(()=>fs.statfsSync(e));return t.frsize=t.bsize,t}},stream_ops:{open(e){var t=NODEFS.realPath(e.node);NODEFS.tryFSOperation(()=>{FS.isFile(e.node.mode)&&(e.shared.refcount=1,e.nfd=fs.openSync(t,NODEFS.flagsForNode(e.flags)))})},close(e){NODEFS.tryFSOperation(()=>{FS.isFile(e.node.mode)&&e.nfd&&--e.shared.refcount===0&&fs.closeSync(e.nfd)})},dup(e){e.shared.refcount++},read(e,t,r,a,o){return a===0?0:NODEFS.tryFSOperation(()=>fs.readSync(e.nfd,new Int8Array(t.buffer,r,a),0,a,o))},write(e,t,r,a,o){return NODEFS.tryFSOperation(()=>fs.writeSync(e.nfd,new Int8Array(t.buffer,r,a),0,a,o))},llseek(e,t,r){var a=t;if(r===1?a+=e.position:r===2&&FS.isFile(e.node.mode)&&NODEFS.tryFSOperation(()=>{var o=fs.fstatSync(e.nfd);a+=o.size}),a<0)throw new FS.ErrnoError(28);return a},mmap(e,t,r,a,o){if(!FS.isFile(e.node.mode))throw new FS.ErrnoError(43);var s=mmapAlloc(t);return NODEFS.stream_ops.read(e,HEAP8,s,t,r),{ptr:s,allocated:!0}},msync(e,t,r,a,o){return NODEFS.stream_ops.write(e,t,0,a,r,!1),0}}},FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"name","ErrnoError");this.errno=e}},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{constructor(){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"shared",{})}get object(){return this.node}set object(e){this.node=e}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e}get position(){return this.shared.position}set position(e){this.shared.position=e}},FSNode:class{constructor(e,t,r,a){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"node_ops",{});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"stream_ops",{});(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"readMode",365);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"writeMode",146);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.d)(this,"mounted",null);e||(e=this),this.parent=e,this.mount=e.mount,this.id=FS.nextInode++,this.name=t,this.mode=r,this.rdev=a,this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(e){e?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(e){e?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(e,t={}){if(!e)return{path:"",node:null};t.follow_mount??(t.follow_mount=!0),PATH.isAbs(e)||(e=FS.cwd()+"/"+e);e:for(var r=0;r<40;r++){for(var a=e.split("/").filter(m=>!!m&&m!=="."),o=FS.root,s="/",l=0;l>>0)%FS.nameTable.length},hashAddNode(e){var t=FS.hashName(e.parent.id,e.name);e.name_next=FS.nameTable[t],FS.nameTable[t]=e},hashRemoveNode(e){var t=FS.hashName(e.parent.id,e.name);if(FS.nameTable[t]===e)FS.nameTable[t]=e.name_next;else for(var r=FS.nameTable[t];r;){if(r.name_next===e){r.name_next=e.name_next;break}r=r.name_next}},lookupNode(e,t){var r=FS.mayLookup(e);if(r)throw new FS.ErrnoError(r);for(var a=FS.hashName(e.id,t),o=FS.nameTable[a];o;o=o.name_next){var s=o.name;if(o.parent.id===e.id&&s===t)return o}return FS.lookup(e,t)},createNode(e,t,r,a){var o=new FS.FSNode(e,t,r,a);return FS.hashAddNode(o),o},destroyNode(e){FS.hashRemoveNode(e)},isRoot(e){return e===e.parent},isMountpoint(e){return!!e.mounted},isFile(e){return(e&61440)===32768},isDir(e){return(e&61440)===16384},isLink(e){return(e&61440)===40960},isChrdev(e){return(e&61440)===8192},isBlkdev(e){return(e&61440)===24576},isFIFO(e){return(e&61440)===4096},isSocket(e){return(e&49152)===49152},flagsToPermissionString(e){var t=["r","w","rw"][e&3];return e&512&&(t+="w"),t},nodePermissions(e,t){return FS.ignorePermissions?0:t.includes("r")&&!(e.mode&292)||t.includes("w")&&!(e.mode&146)||t.includes("x")&&!(e.mode&73)?2:0},mayLookup(e){if(!FS.isDir(e.mode))return 54;var t=FS.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate(e,t){if(!FS.isDir(e.mode))return 54;try{var r=FS.lookupNode(e,t);return 20}catch{}return FS.nodePermissions(e,"wx")},mayDelete(e,t,r){var a;try{a=FS.lookupNode(e,t)}catch(s){return s.errno}var o=FS.nodePermissions(e,"wx");if(o)return o;if(r){if(!FS.isDir(a.mode))return 54;if(FS.isRoot(a)||FS.getPath(a)===FS.cwd())return 10}else if(FS.isDir(a.mode))return 31;return 0},mayOpen(e,t){return e?FS.isLink(e.mode)?32:FS.isDir(e.mode)&&(FS.flagsToPermissionString(t)!=="r"||t&512)?31:FS.nodePermissions(e,FS.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd(){for(var e=0;e<=FS.MAX_OPEN_FDS;e++)if(!FS.streams[e])return e;throw new FS.ErrnoError(33)},getStreamChecked(e){var t=FS.getStream(e);if(!t)throw new FS.ErrnoError(8);return t},getStream:e=>FS.streams[e],createStream(e,t=-1){return e=Object.assign(new FS.FSStream,e),t==-1&&(t=FS.nextfd()),e.fd=t,FS.streams[t]=e,e},closeStream(e){FS.streams[e]=null},dupStream(e,t=-1){var r=FS.createStream(e,t);return r.stream_ops?.dup?.(r),r},chrdev_stream_ops:{open(e){var t=FS.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open?.(e)},llseek(){throw new FS.ErrnoError(70)}},major:e=>e>>8,minor:e=>e&255,makedev:(e,t)=>e<<8|t,registerDevice(e,t){FS.devices[e]={stream_ops:t}},getDevice:e=>FS.devices[e],getMounts(e){for(var t=[],r=[e];r.length;){var a=r.pop();t.push(a),r.push(...a.mounts)}return t},syncfs(e,t){typeof e=="function"&&(t=e,e=!1),FS.syncFSRequests++,FS.syncFSRequests>1&&err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var r=FS.getMounts(FS.root.mount),a=0;function o(l){return FS.syncFSRequests--,t(l)}function s(l){if(l)return s.errored?void 0:(s.errored=!0,o(l));++a>=r.length&&o(null)}r.forEach(l=>{if(!l.type.syncfs)return s(null);l.type.syncfs(l,e,s)})},mount(e,t,r){var a=r==="/",o=!r,s;if(a&&FS.root)throw new FS.ErrnoError(10);if(!a&&!o){var l=FS.lookupPath(r,{follow_mount:!1});if(r=l.path,s=l.node,FS.isMountpoint(s))throw new FS.ErrnoError(10);if(!FS.isDir(s.mode))throw new FS.ErrnoError(54)}var n={type:e,opts:t,mountpoint:r,mounts:[]},_=e.mount(n);return _.mount=n,n.root=_,a?FS.root=_:s&&(s.mounted=n,s.mount&&s.mount.mounts.push(n)),_},unmount(e){var t=FS.lookupPath(e,{follow_mount:!1});if(!FS.isMountpoint(t.node))throw new FS.ErrnoError(28);var r=t.node,a=r.mounted,o=FS.getMounts(a);Object.keys(FS.nameTable).forEach(l=>{for(var n=FS.nameTable[l];n;){var _=n.name_next;o.includes(n.mount)&&FS.destroyNode(n),n=_}}),r.mounted=null;var s=r.mount.mounts.indexOf(a);r.mount.mounts.splice(s,1)},lookup(e,t){return e.node_ops.lookup(e,t)},mknod(e,t,r){var a=FS.lookupPath(e,{parent:!0}),o=a.node,s=PATH.basename(e);if(!s||s==="."||s==="..")throw new FS.ErrnoError(28);var l=FS.mayCreate(o,s);if(l)throw new FS.ErrnoError(l);if(!o.node_ops.mknod)throw new FS.ErrnoError(63);return o.node_ops.mknod(o,s,t,r)},statfs(e){var t={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255},r=FS.lookupPath(e,{follow:!0}).node;return r?.node_ops.statfs&&Object.assign(t,r.node_ops.statfs(r.mount.opts.root)),t},create(e,t=438){return t&=4095,t|=32768,FS.mknod(e,t,0)},mkdir(e,t=511){return t&=1023,t|=16384,FS.mknod(e,t,0)},mkdirTree(e,t){for(var r=e.split("/"),a="",o=0;o"u"&&(r=t,t=438),t|=8192,FS.mknod(e,t,r)},symlink(e,t){if(!PATH_FS.resolve(e))throw new FS.ErrnoError(44);var r=FS.lookupPath(t,{parent:!0}),a=r.node;if(!a)throw new FS.ErrnoError(44);var o=PATH.basename(t),s=FS.mayCreate(a,o);if(s)throw new FS.ErrnoError(s);if(!a.node_ops.symlink)throw new FS.ErrnoError(63);return a.node_ops.symlink(a,o,e)},rename(e,t){var r=PATH.dirname(e),a=PATH.dirname(t),o=PATH.basename(e),s=PATH.basename(t),l,n,_;if(l=FS.lookupPath(e,{parent:!0}),n=l.node,l=FS.lookupPath(t,{parent:!0}),_=l.node,!n||!_)throw new FS.ErrnoError(44);if(n.mount!==_.mount)throw new FS.ErrnoError(75);var m=FS.lookupNode(n,o),p=PATH_FS.relative(e,a);if(p.charAt(0)!==".")throw new FS.ErrnoError(28);if(p=PATH_FS.relative(t,r),p.charAt(0)!==".")throw new FS.ErrnoError(55);var d;try{d=FS.lookupNode(_,s)}catch{}if(m!==d){var g=FS.isDir(m.mode),c=FS.mayDelete(n,o,g);if(c)throw new FS.ErrnoError(c);if(c=d?FS.mayDelete(_,s,g):FS.mayCreate(_,s),c)throw new FS.ErrnoError(c);if(!n.node_ops.rename)throw new FS.ErrnoError(63);if(FS.isMountpoint(m)||d&&FS.isMountpoint(d))throw new FS.ErrnoError(10);if(_!==n&&(c=FS.nodePermissions(n,"w"),c))throw new FS.ErrnoError(c);FS.hashRemoveNode(m);try{n.node_ops.rename(m,_,s),m.parent=_}catch(f){throw f}finally{FS.hashAddNode(m)}}},rmdir(e){var t=FS.lookupPath(e,{parent:!0}),r=t.node,a=PATH.basename(e),o=FS.lookupNode(r,a),s=FS.mayDelete(r,a,!0);if(s)throw new FS.ErrnoError(s);if(!r.node_ops.rmdir)throw new FS.ErrnoError(63);if(FS.isMountpoint(o))throw new FS.ErrnoError(10);r.node_ops.rmdir(r,a),FS.destroyNode(o)},readdir(e){var t=FS.lookupPath(e,{follow:!0}),r=t.node;if(!r.node_ops.readdir)throw new FS.ErrnoError(54);return r.node_ops.readdir(r)},unlink(e){var t=FS.lookupPath(e,{parent:!0}),r=t.node;if(!r)throw new FS.ErrnoError(44);var a=PATH.basename(e),o=FS.lookupNode(r,a),s=FS.mayDelete(r,a,!1);if(s)throw new FS.ErrnoError(s);if(!r.node_ops.unlink)throw new FS.ErrnoError(63);if(FS.isMountpoint(o))throw new FS.ErrnoError(10);r.node_ops.unlink(r,a),FS.destroyNode(o)},readlink(e){var t=FS.lookupPath(e),r=t.node;if(!r)throw new FS.ErrnoError(44);if(!r.node_ops.readlink)throw new FS.ErrnoError(28);return r.node_ops.readlink(r)},stat(e,t){var r=FS.lookupPath(e,{follow:!t}),a=r.node;if(!a)throw new FS.ErrnoError(44);if(!a.node_ops.getattr)throw new FS.ErrnoError(63);return a.node_ops.getattr(a)},lstat(e){return FS.stat(e,!0)},chmod(e,t,r){var a;if(typeof e=="string"){var o=FS.lookupPath(e,{follow:!r});a=o.node}else a=e;if(!a.node_ops.setattr)throw new FS.ErrnoError(63);a.node_ops.setattr(a,{mode:t&4095|a.mode&-4096,ctime:Date.now()})},lchmod(e,t){FS.chmod(e,t,!0)},fchmod(e,t){var r=FS.getStreamChecked(e);FS.chmod(r.node,t)},chown(e,t,r,a){var o;if(typeof e=="string"){var s=FS.lookupPath(e,{follow:!a});o=s.node}else o=e;if(!o.node_ops.setattr)throw new FS.ErrnoError(63);o.node_ops.setattr(o,{timestamp:Date.now()})},lchown(e,t,r){FS.chown(e,t,r,!0)},fchown(e,t,r){var a=FS.getStreamChecked(e);FS.chown(a.node,t,r)},truncate(e,t){if(t<0)throw new FS.ErrnoError(28);var r;if(typeof e=="string"){var a=FS.lookupPath(e,{follow:!0});r=a.node}else r=e;if(!r.node_ops.setattr)throw new FS.ErrnoError(63);if(FS.isDir(r.mode))throw new FS.ErrnoError(31);if(!FS.isFile(r.mode))throw new FS.ErrnoError(28);var o=FS.nodePermissions(r,"w");if(o)throw new FS.ErrnoError(o);r.node_ops.setattr(r,{size:t,timestamp:Date.now()})},ftruncate(e,t){var r=FS.getStreamChecked(e);if(!(r.flags&2097155))throw new FS.ErrnoError(28);FS.truncate(r.node,t)},utime(e,t,r){var a=FS.lookupPath(e,{follow:!0}),o=a.node;o.node_ops.setattr(o,{atime:t,mtime:r})},open(e,t,r=438){if(e==="")throw new FS.ErrnoError(44);t=typeof t=="string"?FS_modeStringToFlags(t):t,t&64?r=r&4095|32768:r=0;var a;if(typeof e=="object")a=e;else{var o=FS.lookupPath(e,{follow:!(t&131072),noent_okay:!0});a=o.node,e=o.path}var s=!1;if(t&64)if(a){if(t&128)throw new FS.ErrnoError(20)}else a=FS.mknod(e,r,0),s=!0;if(!a)throw new FS.ErrnoError(44);if(FS.isChrdev(a.mode)&&(t&=-513),t&65536&&!FS.isDir(a.mode))throw new FS.ErrnoError(54);if(!s){var l=FS.mayOpen(a,t);if(l)throw new FS.ErrnoError(l)}t&512&&!s&&FS.truncate(a,0),t&=-131713;var n=FS.createStream({node:a,path:FS.getPath(a),flags:t,seekable:!0,position:0,stream_ops:a.stream_ops,ungotten:[],error:!1});return n.stream_ops.open&&n.stream_ops.open(n),Module.logReadFiles&&!(t&1)&&(e in FS.readFiles||(FS.readFiles[e]=1)),n},close(e){if(FS.isClosed(e))throw new FS.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(t){throw t}finally{FS.closeStream(e.fd)}e.fd=null},isClosed(e){return e.fd===null},llseek(e,t,r){if(FS.isClosed(e))throw new FS.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new FS.ErrnoError(70);if(r!=0&&r!=1&&r!=2)throw new FS.ErrnoError(28);return e.position=e.stream_ops.llseek(e,t,r),e.ungotten=[],e.position},read(e,t,r,a,o){if(a<0||o<0)throw new FS.ErrnoError(28);if(FS.isClosed(e))throw new FS.ErrnoError(8);if((e.flags&2097155)===1)throw new FS.ErrnoError(8);if(FS.isDir(e.node.mode))throw new FS.ErrnoError(31);if(!e.stream_ops.read)throw new FS.ErrnoError(28);var s=typeof o<"u";if(!s)o=e.position;else if(!e.seekable)throw new FS.ErrnoError(70);var l=e.stream_ops.read(e,t,r,a,o);return s||(e.position+=l),l},write(e,t,r,a,o,s){if(a<0||o<0)throw new FS.ErrnoError(28);if(FS.isClosed(e))throw new FS.ErrnoError(8);if(!(e.flags&2097155))throw new FS.ErrnoError(8);if(FS.isDir(e.node.mode))throw new FS.ErrnoError(31);if(!e.stream_ops.write)throw new FS.ErrnoError(28);e.seekable&&e.flags&1024&&FS.llseek(e,0,2);var l=typeof o<"u";if(!l)o=e.position;else if(!e.seekable)throw new FS.ErrnoError(70);var n=e.stream_ops.write(e,t,r,a,o,s);return l||(e.position+=n),n},allocate(e,t,r){if(FS.isClosed(e))throw new FS.ErrnoError(8);if(t<0||r<=0)throw new FS.ErrnoError(28);if(!(e.flags&2097155))throw new FS.ErrnoError(8);if(!FS.isFile(e.node.mode)&&!FS.isDir(e.node.mode))throw new FS.ErrnoError(43);if(!e.stream_ops.allocate)throw new FS.ErrnoError(138);e.stream_ops.allocate(e,t,r)},mmap(e,t,r,a,o){if(a&2&&!(o&2)&&(e.flags&2097155)!==2)throw new FS.ErrnoError(2);if((e.flags&2097155)===1)throw new FS.ErrnoError(2);if(!e.stream_ops.mmap)throw new FS.ErrnoError(43);if(!t)throw new FS.ErrnoError(28);return e.stream_ops.mmap(e,t,r,a,o)},msync(e,t,r,a,o){return e.stream_ops.msync?e.stream_ops.msync(e,t,r,a,o):0},ioctl(e,t,r){if(!e.stream_ops.ioctl)throw new FS.ErrnoError(59);return e.stream_ops.ioctl(e,t,r)},readFile(e,t={}){if(t.flags=t.flags||0,t.encoding=t.encoding||"binary",t.encoding!=="utf8"&&t.encoding!=="binary")throw new Error(`Invalid encoding type "${t.encoding}"`);var r,a=FS.open(e,t.flags),o=FS.stat(e),s=o.size,l=new Uint8Array(s);return FS.read(a,l,0,s,0),t.encoding==="utf8"?r=UTF8ArrayToString(l):t.encoding==="binary"&&(r=l),FS.close(a),r},writeFile(e,t,r={}){r.flags=r.flags||577;var a=FS.open(e,r.flags,r.mode);if(typeof t=="string"){var o=new Uint8Array(lengthBytesUTF8(t)+1),s=stringToUTF8Array(t,o,0,o.length);FS.write(a,o,0,s,void 0,r.canOwn)}else if(ArrayBuffer.isView(t))FS.write(a,t,0,t.byteLength,void 0,r.canOwn);else throw new Error("Unsupported data type");FS.close(a)},cwd:()=>FS.currentPath,chdir(e){var t=FS.lookupPath(e,{follow:!0});if(t.node===null)throw new FS.ErrnoError(44);if(!FS.isDir(t.node.mode))throw new FS.ErrnoError(54);var r=FS.nodePermissions(t.node,"x");if(r)throw new FS.ErrnoError(r);FS.currentPath=t.path},createDefaultDirectories(){FS.mkdir("/tmp"),FS.mkdir("/home"),FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev"),FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(a,o,s,l,n)=>l,llseek:()=>0}),FS.mkdev("/dev/null",FS.makedev(1,3)),TTY.register(FS.makedev(5,0),TTY.default_tty_ops),TTY.register(FS.makedev(6,0),TTY.default_tty1_ops),FS.mkdev("/dev/tty",FS.makedev(5,0)),FS.mkdev("/dev/tty1",FS.makedev(6,0));var e=new Uint8Array(1024),t=0,r=()=>(t===0&&(t=randomFill(e).byteLength),e[--t]);FS.createDevice("/dev","random",r),FS.createDevice("/dev","urandom",r),FS.mkdir("/dev/shm"),FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var e=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd"),FS.mount({mount(){var t=FS.createNode(e,"fd",16895,73);return t.stream_ops={llseek:MEMFS.stream_ops.llseek},t.node_ops={lookup(r,a){var o=+a,s=FS.getStreamChecked(o),l={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>s.path},id:o+1};return l.parent=l,l},readdir(){return Array.from(FS.streams.entries()).filter(([r,a])=>a).map(([r,a])=>r.toString())}},t}},{},"/proc/self/fd")},createStandardStreams(e,t,r){e?FS.createDevice("/dev","stdin",e):FS.symlink("/dev/tty","/dev/stdin"),t?FS.createDevice("/dev","stdout",null,t):FS.symlink("/dev/tty","/dev/stdout"),r?FS.createDevice("/dev","stderr",null,r):FS.symlink("/dev/tty1","/dev/stderr");var a=FS.open("/dev/stdin",0),o=FS.open("/dev/stdout",1),s=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096),FS.mount(MEMFS,{},"/"),FS.createDefaultDirectories(),FS.createDefaultDevices(),FS.createSpecialDirectories(),FS.filesystems={MEMFS,IDBFS,NODEFS}},init(e,t,r){FS.initialized=!0,e??(e=Module.stdin),t??(t=Module.stdout),r??(r=Module.stderr),FS.createStandardStreams(e,t,r)},quit(){FS.initialized=!1,_fflush(0);for(var e=0;ethis.length-1||c<0)){var f=c%this.chunkSize,u=c/this.chunkSize|0;return this.getter(u)[f]}}setDataGetter(c){this.getter=c}cacheLength(){var c=new XMLHttpRequest;if(c.open("HEAD",r,!1),c.send(null),!(c.status>=200&&c.status<300||c.status===304))throw new Error("Couldn't load "+r+". Status: "+c.status);var f=Number(c.getResponseHeader("Content-length")),u,w=(u=c.getResponseHeader("Accept-Ranges"))&&u==="bytes",h=(u=c.getResponseHeader("Content-Encoding"))&&u==="gzip",S=1024*1024;w||(S=f);var M=(x,E)=>{if(x>E)throw new Error("invalid range ("+x+", "+E+") or no bytes requested!");if(E>f-1)throw new Error("only "+f+" bytes available! programmer error!");var b=new XMLHttpRequest;if(b.open("GET",r,!1),f!==S&&b.setRequestHeader("Range","bytes="+x+"-"+E),b.responseType="arraybuffer",b.overrideMimeType&&b.overrideMimeType("text/plain; charset=x-user-defined"),b.send(null),!(b.status>=200&&b.status<300||b.status===304))throw new Error("Couldn't load "+r+". Status: "+b.status);return b.response!==void 0?new Uint8Array(b.response||[]):intArrayFromString(b.responseText||"",!0)},y=this;y.setDataGetter(x=>{var E=x*S,b=(x+1)*S-1;if(b=Math.min(b,f-1),typeof y.chunks[x]>"u"&&(y.chunks[x]=M(E,b)),typeof y.chunks[x]>"u")throw new Error("doXHR failed!");return y.chunks[x]}),(h||!f)&&(S=f=1,f=this.getter(0).length,S=f,out("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=f,this._chunkSize=S,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var l=new s,n={isDevice:!1,contents:l}}else var n={isDevice:!1,url:r};var _=FS.createFile(e,t,n,a,o);n.contents?_.contents=n.contents:n.url&&(_.contents=null,_.url=n.url),Object.defineProperties(_,{usedBytes:{get:function(){return this.contents.length}}});var m={},p=Object.keys(_.stream_ops);p.forEach(g=>{var c=_.stream_ops[g];m[g]=(...f)=>(FS.forceLoadFile(_),c(...f))});function d(g,c,f,u,w){var h=g.node.contents;if(w>=h.length)return 0;var S=Math.min(h.length-w,u);if(h.slice)for(var M=0;M(FS.forceLoadFile(_),d(g,c,f,u,w)),m.mmap=(g,c,f,u,w)=>{FS.forceLoadFile(_);var h=mmapAlloc(c);if(!h)throw new FS.ErrnoError(48);return d(g,HEAP8,h,c,f),{ptr:h,allocated:!0}},_.stream_ops=m,_}},SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(e,t,r){if(PATH.isAbs(t))return t;var a;if(e===-100)a=FS.cwd();else{var o=SYSCALLS.getStreamFromFD(e);a=o.path}if(t.length==0){if(!r)throw new FS.ErrnoError(44);return a}return a+"/"+t},doStat(e,t,r){var a=e(t);HEAP32[r>>2]=a.dev,HEAP32[r+4>>2]=a.mode,HEAPU32[r+8>>2]=a.nlink,HEAP32[r+12>>2]=a.uid,HEAP32[r+16>>2]=a.gid,HEAP32[r+20>>2]=a.rdev,HEAP64[r+24>>3]=BigInt(a.size),HEAP32[r+32>>2]=4096,HEAP32[r+36>>2]=a.blocks;var o=a.atime.getTime(),s=a.mtime.getTime(),l=a.ctime.getTime();return HEAP64[r+40>>3]=BigInt(Math.floor(o/1e3)),HEAPU32[r+48>>2]=o%1e3*1e3*1e3,HEAP64[r+56>>3]=BigInt(Math.floor(s/1e3)),HEAPU32[r+64>>2]=s%1e3*1e3*1e3,HEAP64[r+72>>3]=BigInt(Math.floor(l/1e3)),HEAPU32[r+80>>2]=l%1e3*1e3*1e3,HEAP64[r+88>>3]=BigInt(a.ino),0},doMsync(e,t,r,a,o){if(!FS.isFile(t.node.mode))throw new FS.ErrnoError(43);if(a&2)return 0;var s=HEAPU8.slice(e,e+r);FS.msync(t,s,o,r,a)},getStreamFromFD(e){var t=FS.getStreamChecked(e);return t},varargs:void 0,getStr(e){var t=UTF8ToString(e);return t}},___syscall__newselect=function(e,t,r,a,o){try{for(var s=0,l=t?HEAP32[t>>2]:0,n=t?HEAP32[t+4>>2]:0,_=r?HEAP32[r>>2]:0,m=r?HEAP32[r+4>>2]:0,p=a?HEAP32[a>>2]:0,d=a?HEAP32[a+4>>2]:0,g=0,c=0,f=0,u=0,w=0,h=0,S=(t?HEAP32[t>>2]:0)|(r?HEAP32[r>>2]:0)|(a?HEAP32[a>>2]:0),M=(t?HEAP32[t+4>>2]:0)|(r?HEAP32[r+4>>2]:0)|(a?HEAP32[a+4>>2]:0),y=(z,P,U,A)=>z<32?P&A:U&A,x=0;x>2]:0,R=t?HEAP32[o+4>>2]:0;D=(X+R/1e6)*1e3}T=b.stream_ops.poll(b,D)}T&1&&y(x,l,n,E)&&(x<32?g=g|E:c=c|E,s++),T&4&&y(x,_,m,E)&&(x<32?f=f|E:u=u|E,s++),T&2&&y(x,p,d,E)&&(x<32?w=w|E:h=h|E,s++)}}return t&&(HEAP32[t>>2]=g,HEAP32[t+4>>2]=c),r&&(HEAP32[r>>2]=f,HEAP32[r+4>>2]=u),a&&(HEAP32[a>>2]=w,HEAP32[a+4>>2]=h),s}catch(z){if(typeof FS>"u"||z.name!=="ErrnoError")throw z;return-z.errno}};___syscall__newselect.sig="iipppp";var SOCKFS={websocketArgs:{},callbacks:{},on(e,t){SOCKFS.callbacks[e]=t},emit(e,t){SOCKFS.callbacks[e]?.(t)},mount(e){return SOCKFS.websocketArgs=Module.websocket||{},(Module.websocket??(Module.websocket={})).on=SOCKFS.on,FS.createNode(null,"/",16895,0)},createSocket(e,t,r){t&=-526337;var a=t==1;if(a&&r&&r!=6)throw new FS.ErrnoError(66);var o={family:e,type:t,protocol:r,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops},s=SOCKFS.nextname(),l=FS.createNode(SOCKFS.root,s,49152,0);l.sock=o;var n=FS.createStream({path:s,node:l,flags:2,seekable:!1,stream_ops:SOCKFS.stream_ops});return o.stream=n,o},getSocket(e){var t=FS.getStream(e);return!t||!FS.isSocket(t.node.mode)?null:t.node.sock},stream_ops:{poll(e){var t=e.node.sock;return t.sock_ops.poll(t)},ioctl(e,t,r){var a=e.node.sock;return a.sock_ops.ioctl(a,t,r)},read(e,t,r,a,o){var s=e.node.sock,l=s.sock_ops.recvmsg(s,a);return l?(t.set(l.buffer,r),l.buffer.length):0},write(e,t,r,a,o){var s=e.node.sock;return s.sock_ops.sendmsg(s,t,r,a)},close(e){var t=e.node.sock;t.sock_ops.close(t)}},nextname(){return SOCKFS.nextname.current||(SOCKFS.nextname.current=0),`socket[${SOCKFS.nextname.current++}]`},websocket_sock_ops:{createPeer(e,t,r){var a;if(typeof t=="object"&&(a=t,t=null,r=null),a)if(a._socket)t=a._socket.remoteAddress,r=a._socket.remotePort;else{var o=/ws[s]?:\/\/([^:]+):(\d+)/.exec(a.url);if(!o)throw new Error("WebSocket URL must be in the format ws(s)://address:port");t=o[1],r=parseInt(o[2],10)}else try{var s="ws:#".replace("#","//"),l="binary",n=void 0;if(SOCKFS.websocketArgs.url&&(s=SOCKFS.websocketArgs.url),SOCKFS.websocketArgs.subprotocol?l=SOCKFS.websocketArgs.subprotocol:SOCKFS.websocketArgs.subprotocol===null&&(l="null"),s==="ws://"||s==="wss://"){var _=t.split("/");s=s+_[0]+":"+r+"/"+_.slice(1).join("/")}l!=="null"&&(l=l.replace(/^ +| +$/g,"").split(/ *, */),n=l);var m;ENVIRONMENT_IS_NODE?m=require("ws"):m=WebSocket,a=new m(s,n),a.binaryType="arraybuffer"}catch{throw new FS.ErrnoError(23)}var p={addr:t,port:r,socket:a,msg_send_queue:[]};return SOCKFS.websocket_sock_ops.addPeer(e,p),SOCKFS.websocket_sock_ops.handlePeerEvents(e,p),e.type===2&&typeof e.sport<"u"&&p.msg_send_queue.push(new Uint8Array([255,255,255,255,112,111,114,116,(e.sport&65280)>>8,e.sport&255])),p},getPeer(e,t,r){return e.peers[t+":"+r]},addPeer(e,t){e.peers[t.addr+":"+t.port]=t},removePeer(e,t){delete e.peers[t.addr+":"+t.port]},handlePeerEvents(e,t){var r=!0,a=function(){e.connecting=!1,SOCKFS.emit("open",e.stream.fd);try{for(var s=t.msg_send_queue.shift();s;)t.socket.send(s),s=t.msg_send_queue.shift()}catch{t.socket.close()}};function o(s){if(typeof s=="string"){var l=new TextEncoder;s=l.encode(s)}else{if(assert(s.byteLength!==void 0),s.byteLength==0)return;s=new Uint8Array(s)}var n=r;if(r=!1,n&&s.length===10&&s[0]===255&&s[1]===255&&s[2]===255&&s[3]===255&&s[4]===112&&s[5]===111&&s[6]===114&&s[7]===116){var _=s[8]<<8|s[9];SOCKFS.websocket_sock_ops.removePeer(e,t),t.port=_,SOCKFS.websocket_sock_ops.addPeer(e,t);return}e.recv_queue.push({addr:t.addr,port:t.port,data:s}),SOCKFS.emit("message",e.stream.fd)}ENVIRONMENT_IS_NODE?(t.socket.on("open",a),t.socket.on("message",function(s,l){l&&o(new Uint8Array(s).buffer)}),t.socket.on("close",function(){SOCKFS.emit("close",e.stream.fd)}),t.socket.on("error",function(s){e.error=14,SOCKFS.emit("error",[e.stream.fd,e.error,"ECONNREFUSED: Connection refused"])})):(t.socket.onopen=a,t.socket.onclose=function(){SOCKFS.emit("close",e.stream.fd)},t.socket.onmessage=function(l){o(l.data)},t.socket.onerror=function(s){e.error=14,SOCKFS.emit("error",[e.stream.fd,e.error,"ECONNREFUSED: Connection refused"])})},poll(e){if(e.type===1&&e.server)return e.pending.length?65:0;var t=0,r=e.type===1?SOCKFS.websocket_sock_ops.getPeer(e,e.daddr,e.dport):null;return(e.recv_queue.length||!r||r&&r.socket.readyState===r.socket.CLOSING||r&&r.socket.readyState===r.socket.CLOSED)&&(t|=65),(!r||r&&r.socket.readyState===r.socket.OPEN)&&(t|=4),(r&&r.socket.readyState===r.socket.CLOSING||r&&r.socket.readyState===r.socket.CLOSED)&&(e.connecting?t|=4:t|=16),t},ioctl(e,t,r){switch(t){case 21531:var a=0;return e.recv_queue.length&&(a=e.recv_queue[0].data.length),HEAP32[r>>2]=a,0;default:return 28}},close(e){if(e.server){try{e.server.close()}catch{}e.server=null}for(var t=Object.keys(e.peers),r=0;r{var t=SOCKFS.getSocket(e);if(!t)throw new FS.ErrnoError(8);return t},inetNtop4=e=>(e&255)+"."+(e>>8&255)+"."+(e>>16&255)+"."+(e>>24&255),inetNtop6=e=>{var t="",r=0,a=0,o=0,s=0,l=0,n=0,_=[e[0]&65535,e[0]>>16,e[1]&65535,e[1]>>16,e[2]&65535,e[2]>>16,e[3]&65535,e[3]>>16],m=!0,p="";for(n=0;n<5;n++)if(_[n]!==0){m=!1;break}if(m){if(p=inetNtop4(_[6]|_[7]<<16),_[5]===-1)return t="::ffff:",t+=p,t;if(_[5]===0)return t="::",p==="0.0.0.0"&&(p=""),p==="0.0.0.1"&&(p="1"),t+=p,t}for(r=0;r<8;r++)_[r]===0&&(r-o>1&&(l=0),o=r,l++),l>a&&(a=l,s=r-a+1);for(r=0;r<8;r++){if(a>1&&_[r]===0&&r>=s&&r{var r=HEAP16[e>>1],a=_ntohs(HEAPU16[e+2>>1]),o;switch(r){case 2:if(t!==16)return{errno:28};o=HEAP32[e+4>>2],o=inetNtop4(o);break;case 10:if(t!==28)return{errno:28};o=[HEAP32[e+8>>2],HEAP32[e+12>>2],HEAP32[e+16>>2],HEAP32[e+20>>2]],o=inetNtop6(o);break;default:return{errno:5}}return{family:r,addr:o,port:a}},inetPton4=e=>{for(var t=e.split("."),r=0;r<4;r++){var a=Number(t[r]);if(isNaN(a))return null;t[r]=a}return(t[0]|t[1]<<8|t[2]<<16|t[3]<<24)>>>0},jstoi_q=e=>parseInt(e),inetPton6=e=>{var t,r,a,o,s=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i,l=[];if(!s.test(e))return null;if(e==="::")return[0,0,0,0,0,0,0,0];for(e.startsWith("::")?e=e.replace("::","Z:"):e=e.replace("::",":Z:"),e.indexOf(".")>0?(e=e.replace(new RegExp("[.]","g"),":"),t=e.split(":"),t[t.length-4]=jstoi_q(t[t.length-4])+jstoi_q(t[t.length-3])*256,t[t.length-3]=jstoi_q(t[t.length-2])+jstoi_q(t[t.length-1])*256,t=t.slice(0,t.length-2)):t=e.split(":"),a=0,o=0,r=0;r{var r=readSockaddr(e,t);if(r.errno)throw new FS.ErrnoError(r.errno);return r.addr=DNS.lookup_addr(r.addr)||r.addr,r};function ___syscall_bind(e,t,r,a,o,s){try{var l=getSocketFromFD(e),n=getSocketAddress(t,r);return l.sock_ops.bind(l,n.addr,n.port),0}catch(_){if(typeof FS>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}___syscall_bind.sig="iippiii";function ___syscall_chdir(e){try{return e=SYSCALLS.getStr(e),FS.chdir(e),0}catch(t){if(typeof FS>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}___syscall_chdir.sig="ip";function ___syscall_chmod(e,t){try{return e=SYSCALLS.getStr(e),FS.chmod(e,t),0}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_chmod.sig="ipi";function ___syscall_connect(e,t,r,a,o,s){try{var l=getSocketFromFD(e),n=getSocketAddress(t,r);return l.sock_ops.connect(l,n.addr,n.port),0}catch(_){if(typeof FS>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}___syscall_connect.sig="iippiii";function ___syscall_dup(e){try{var t=SYSCALLS.getStreamFromFD(e);return FS.dupStream(t).fd}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_dup.sig="ii";function ___syscall_dup3(e,t,r){try{var a=SYSCALLS.getStreamFromFD(e);if(a.fd===t)return-28;if(t<0||t>=FS.MAX_OPEN_FDS)return-8;var o=FS.getStream(t);return o&&FS.close(o),FS.dupStream(a,t).fd}catch(s){if(typeof FS>"u"||s.name!=="ErrnoError")throw s;return-s.errno}}___syscall_dup3.sig="iiii";function ___syscall_faccessat(e,t,r,a){try{if(t=SYSCALLS.getStr(t),t=SYSCALLS.calculateAt(e,t),r&-8)return-28;var o=FS.lookupPath(t,{follow:!0}),s=o.node;if(!s)return-44;var l="";return r&4&&(l+="r"),r&2&&(l+="w"),r&1&&(l+="x"),l&&FS.nodePermissions(s,l)?-2:0}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}___syscall_faccessat.sig="iipii";var ___syscall_fadvise64=(e,t,r,a)=>0;___syscall_fadvise64.sig="iijji";var INT53_MAX=9007199254740992,INT53_MIN=-9007199254740992,bigintToI53Checked=e=>eINT53_MAX?NaN:Number(e);function ___syscall_fallocate(e,t,r,a){r=bigintToI53Checked(r),a=bigintToI53Checked(a);try{if(isNaN(r))return 61;var o=SYSCALLS.getStreamFromFD(e);return FS.allocate(o,r,a),0}catch(s){if(typeof FS>"u"||s.name!=="ErrnoError")throw s;return-s.errno}}___syscall_fallocate.sig="iiijj";var syscallGetVarargI=()=>{var e=HEAP32[+SYSCALLS.varargs>>2];return SYSCALLS.varargs+=4,e},syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(e,t,r){SYSCALLS.varargs=r;try{var a=SYSCALLS.getStreamFromFD(e);switch(t){case 0:{var o=syscallGetVarargI();if(o<0)return-28;for(;FS.streams[o];)o++;var s;return s=FS.dupStream(a,o),s.fd}case 1:case 2:return 0;case 3:return a.flags;case 4:{var o=syscallGetVarargI();return a.flags|=o,0}case 12:{var o=syscallGetVarargP(),l=0;return HEAP16[o+l>>1]=2,0}case 13:case 14:return 0}return-28}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}___syscall_fcntl64.sig="iiip";function ___syscall_fdatasync(e){try{var t=SYSCALLS.getStreamFromFD(e);return 0}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_fdatasync.sig="ii";function ___syscall_fstat64(e,t){try{var r=SYSCALLS.getStreamFromFD(e);return SYSCALLS.doStat(FS.stat,r.path,t)}catch(a){if(typeof FS>"u"||a.name!=="ErrnoError")throw a;return-a.errno}}___syscall_fstat64.sig="iip";function ___syscall_ftruncate64(e,t){t=bigintToI53Checked(t);try{return isNaN(t)?61:(FS.ftruncate(e,t),0)}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_ftruncate64.sig="iij";var stringToUTF8=(e,t,r)=>stringToUTF8Array(e,HEAPU8,t,r);function ___syscall_getcwd(e,t){try{if(t===0)return-28;var r=FS.cwd(),a=lengthBytesUTF8(r)+1;return t"u"||o.name!=="ErrnoError")throw o;return-o.errno}}___syscall_getcwd.sig="ipp";function ___syscall_getdents64(e,t,r){try{var a=SYSCALLS.getStreamFromFD(e);a.getdents||(a.getdents=FS.readdir(a.path));for(var o=280,s=0,l=FS.llseek(a,0,1),n=Math.floor(l/o),_=Math.min(a.getdents.length,n+Math.floor(r/o)),m=n;m<_;m++){var p,d,g=a.getdents[m];if(g===".")p=a.node.id,d=4;else if(g===".."){var c=FS.lookupPath(a.path,{parent:!0});p=c.node.id,d=4}else{var f;try{f=FS.lookupNode(a.node,g)}catch(u){if(u?.errno===28)continue;throw u}p=f.id,d=FS.isChrdev(f.mode)?2:FS.isDir(f.mode)?4:FS.isLink(f.mode)?10:8}HEAP64[t+s>>3]=BigInt(p),HEAP64[t+s+8>>3]=BigInt((m+1)*o),HEAP16[t+s+16>>1]=280,HEAP8[t+s+18]=d,stringToUTF8(g,t+s+19,256),s+=o}return FS.llseek(a,m*o,0),s}catch(u){if(typeof FS>"u"||u.name!=="ErrnoError")throw u;return-u.errno}}___syscall_getdents64.sig="iipp";var writeSockaddr=(e,t,r,a,o)=>{switch(t){case 2:r=inetPton4(r),zeroMemory(e,16),o&&(HEAP32[o>>2]=16),HEAP16[e>>1]=t,HEAP32[e+4>>2]=r,HEAP16[e+2>>1]=_htons(a);break;case 10:r=inetPton6(r),zeroMemory(e,28),o&&(HEAP32[o>>2]=28),HEAP32[e>>2]=t,HEAP32[e+8>>2]=r[0],HEAP32[e+12>>2]=r[1],HEAP32[e+16>>2]=r[2],HEAP32[e+20>>2]=r[3],HEAP16[e+2>>1]=_htons(a);break;default:return 5}return 0};function ___syscall_getsockname(e,t,r,a,o,s){try{var l=getSocketFromFD(e),n=writeSockaddr(t,l.family,DNS.lookup_name(l.saddr||"0.0.0.0"),l.sport,r);return 0}catch(_){if(typeof FS>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}___syscall_getsockname.sig="iippiii";function ___syscall_getsockopt(e,t,r,a,o,s){try{var l=getSocketFromFD(e);return t===1&&r===4?(HEAP32[a>>2]=l.error,HEAP32[o>>2]=4,l.error=null,0):-50}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}___syscall_getsockopt.sig="iiiippi";function ___syscall_ioctl(e,t,r){SYSCALLS.varargs=r;try{var a=SYSCALLS.getStreamFromFD(e);switch(t){case 21509:return a.tty?0:-59;case 21505:{if(!a.tty)return-59;if(a.tty.ops.ioctl_tcgets){var o=a.tty.ops.ioctl_tcgets(a),s=syscallGetVarargP();HEAP32[s>>2]=o.c_iflag||0,HEAP32[s+4>>2]=o.c_oflag||0,HEAP32[s+8>>2]=o.c_cflag||0,HEAP32[s+12>>2]=o.c_lflag||0;for(var l=0;l<32;l++)HEAP8[s+l+17]=o.c_cc[l]||0;return 0}return 0}case 21510:case 21511:case 21512:return a.tty?0:-59;case 21506:case 21507:case 21508:{if(!a.tty)return-59;if(a.tty.ops.ioctl_tcsets){for(var s=syscallGetVarargP(),n=HEAP32[s>>2],_=HEAP32[s+4>>2],m=HEAP32[s+8>>2],p=HEAP32[s+12>>2],d=[],l=0;l<32;l++)d.push(HEAP8[s+l+17]);return a.tty.ops.ioctl_tcsets(a.tty,t,{c_iflag:n,c_oflag:_,c_cflag:m,c_lflag:p,c_cc:d})}return 0}case 21519:{if(!a.tty)return-59;var s=syscallGetVarargP();return HEAP32[s>>2]=0,0}case 21520:return a.tty?-28:-59;case 21531:{var s=syscallGetVarargP();return FS.ioctl(a,t,s)}case 21523:{if(!a.tty)return-59;if(a.tty.ops.ioctl_tiocgwinsz){var g=a.tty.ops.ioctl_tiocgwinsz(a.tty),s=syscallGetVarargP();HEAP16[s>>1]=g[0],HEAP16[s+2>>1]=g[1]}return 0}case 21524:return a.tty?0:-59;case 21515:return a.tty?0:-59;default:return-28}}catch(c){if(typeof FS>"u"||c.name!=="ErrnoError")throw c;return-c.errno}}___syscall_ioctl.sig="iiip";function ___syscall_lstat64(e,t){try{return e=SYSCALLS.getStr(e),SYSCALLS.doStat(FS.lstat,e,t)}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_lstat64.sig="ipp";function ___syscall_mkdirat(e,t,r){try{return t=SYSCALLS.getStr(t),t=SYSCALLS.calculateAt(e,t),FS.mkdir(t,r,0),0}catch(a){if(typeof FS>"u"||a.name!=="ErrnoError")throw a;return-a.errno}}___syscall_mkdirat.sig="iipi";function ___syscall_newfstatat(e,t,r,a){try{t=SYSCALLS.getStr(t);var o=a&256,s=a&4096;return a=a&-6401,t=SYSCALLS.calculateAt(e,t,s),SYSCALLS.doStat(o?FS.lstat:FS.stat,t,r)}catch(l){if(typeof FS>"u"||l.name!=="ErrnoError")throw l;return-l.errno}}___syscall_newfstatat.sig="iippi";function ___syscall_openat(e,t,r,a){SYSCALLS.varargs=a;try{t=SYSCALLS.getStr(t),t=SYSCALLS.calculateAt(e,t);var o=a?syscallGetVarargI():0;return FS.open(t,r,o).fd}catch(s){if(typeof FS>"u"||s.name!=="ErrnoError")throw s;return-s.errno}}___syscall_openat.sig="iipip";var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount(e){return FS.createNode(null,"/",16895,0)},createPipe(){var e={buckets:[],refcnt:2};e.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var t=PIPEFS.nextname(),r=PIPEFS.nextname(),a=FS.createNode(PIPEFS.root,t,4096,0),o=FS.createNode(PIPEFS.root,r,4096,0);a.pipe=e,o.pipe=e;var s=FS.createStream({path:t,node:a,flags:0,seekable:!1,stream_ops:PIPEFS.stream_ops});a.stream=s;var l=FS.createStream({path:r,node:o,flags:1,seekable:!1,stream_ops:PIPEFS.stream_ops});return o.stream=l,{readable_fd:s.fd,writable_fd:l.fd}},stream_ops:{poll(e){var t=e.node.pipe;if((e.flags&2097155)===1)return 260;if(t.buckets.length>0)for(var r=0;r0)return 65}return 0},ioctl(e,t,r){return 28},fsync(e){return 28},read(e,t,r,a,o){for(var s=e.node.pipe,l=0,n=0;n=n)return _.buffer.set(l,_.offset),_.offset+=n,n;m>0&&(_.buffer.set(l.subarray(0,m),_.offset),_.offset+=m,l=l.subarray(m,l.byteLength));for(var p=l.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0,d=l.byteLength%PIPEFS.BUCKET_BUFFER_SIZE,g=0;g0){var c={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:l.byteLength,roffset:0};s.buckets.push(c),c.buffer.set(l)}return n},close(e){var t=e.node.pipe;t.refcnt--,t.refcnt===0&&(t.buckets=null)}},nextname(){return PIPEFS.nextname.current||(PIPEFS.nextname.current=0),"pipe["+PIPEFS.nextname.current+++"]"}};function ___syscall_pipe(e){try{if(e==0)throw new FS.ErrnoError(21);var t=PIPEFS.createPipe();return HEAP32[e>>2]=t.readable_fd,HEAP32[e+4>>2]=t.writable_fd,0}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_pipe.sig="ip";function ___syscall_poll(e,t,r){try{for(var a=0,o=0;o>2],n=HEAP16[s+4>>1],_=32,m=FS.getStream(l);m&&(_=SYSCALLS.DEFAULT_POLLMASK,m.stream_ops.poll&&(_=m.stream_ops.poll(m,-1))),_&=n|8|16,_&&a++,HEAP16[s+6>>1]=_}return a}catch(p){if(typeof FS>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}___syscall_poll.sig="ipii";function ___syscall_readlinkat(e,t,r,a){try{if(t=SYSCALLS.getStr(t),t=SYSCALLS.calculateAt(e,t),a<=0)return-28;var o=FS.readlink(t),s=Math.min(a,lengthBytesUTF8(o)),l=HEAP8[r+s];return stringToUTF8(o,r,a+1),HEAP8[r+s]=l,s}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}___syscall_readlinkat.sig="iippp";function ___syscall_recvfrom(e,t,r,a,o,s){try{var l=getSocketFromFD(e),n=l.sock_ops.recvmsg(l,r);if(!n)return 0;if(o)var _=writeSockaddr(o,l.family,DNS.lookup_name(n.addr),n.port,s);return HEAPU8.set(n.buffer,t),n.buffer.byteLength}catch(m){if(typeof FS>"u"||m.name!=="ErrnoError")throw m;return-m.errno}}___syscall_recvfrom.sig="iippipp";function ___syscall_renameat(e,t,r,a){try{return t=SYSCALLS.getStr(t),a=SYSCALLS.getStr(a),t=SYSCALLS.calculateAt(e,t),a=SYSCALLS.calculateAt(r,a),FS.rename(t,a),0}catch(o){if(typeof FS>"u"||o.name!=="ErrnoError")throw o;return-o.errno}}___syscall_renameat.sig="iipip";function ___syscall_rmdir(e){try{return e=SYSCALLS.getStr(e),FS.rmdir(e),0}catch(t){if(typeof FS>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}___syscall_rmdir.sig="ip";function ___syscall_sendto(e,t,r,a,o,s){try{var l=getSocketFromFD(e);if(!o)return FS.write(l.stream,HEAP8,t,r);var n=getSocketAddress(o,s);return l.sock_ops.sendmsg(l,HEAP8,t,r,n.addr,n.port)}catch(_){if(typeof FS>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}___syscall_sendto.sig="iippipp";function ___syscall_socket(e,t,r){try{var a=SOCKFS.createSocket(e,t,r);return a.stream.fd}catch(o){if(typeof FS>"u"||o.name!=="ErrnoError")throw o;return-o.errno}}___syscall_socket.sig="iiiiiii";function ___syscall_stat64(e,t){try{return e=SYSCALLS.getStr(e),SYSCALLS.doStat(FS.stat,e,t)}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_stat64.sig="ipp";function ___syscall_symlinkat(e,t,r){try{return e=SYSCALLS.getStr(e),r=SYSCALLS.getStr(r),r=SYSCALLS.calculateAt(t,r),FS.symlink(e,r),0}catch(a){if(typeof FS>"u"||a.name!=="ErrnoError")throw a;return-a.errno}}___syscall_symlinkat.sig="ipip";function ___syscall_truncate64(e,t){t=bigintToI53Checked(t);try{return isNaN(t)?61:(e=SYSCALLS.getStr(e),FS.truncate(e,t),0)}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}___syscall_truncate64.sig="ipj";function ___syscall_unlinkat(e,t,r){try{return t=SYSCALLS.getStr(t),t=SYSCALLS.calculateAt(e,t),r===0?FS.unlink(t):r===512?FS.rmdir(t):abort("Invalid flags passed to unlinkat"),0}catch(a){if(typeof FS>"u"||a.name!=="ErrnoError")throw a;return-a.errno}}___syscall_unlinkat.sig="iipi";var ___table_base=new WebAssembly.Global({value:"i32",mutable:!1},1),__abort_js=()=>abort("");__abort_js.sig="v";var ENV={},stackAlloc=e=>__emscripten_stack_alloc(e),stringToUTF8OnStack=e=>{var t=lengthBytesUTF8(e)+1,r=stackAlloc(t);return stringToUTF8(e,r,t),r},dlSetError=e=>{var t=stackSave(),r=stringToUTF8OnStack(e);___dl_seterr(r,0),stackRestore(t)},dlopenInternal=(e,t)=>{var r=UTF8ToString(e+36),a=HEAP32[e+4>>2];r=PATH.normalize(r);var o=!!(a&256),s=o?null:{},l={global:o,nodelete:!!(a&4096),loadAsync:t.loadAsync};if(t.loadAsync)return loadDynamicLibrary(r,l,s,e);try{return loadDynamicLibrary(r,l,s,e)}catch(n){return dlSetError(`Could not load dynamic lib: ${r} -${n}`),0}},__dlopen_js=e=>dlopenInternal(e,{loadAsync:!1});__dlopen_js.sig="pp";var __dlsym_js=(e,t,r)=>{t=UTF8ToString(t);var a,o,s=LDSO.loadedLibsByHandle[e];if(!s.exports.hasOwnProperty(t)||s.exports[t].stub)return dlSetError(`Tried to lookup unknown symbol "${t}" in dynamic lib: ${s.name}`),0;if(o=Object.keys(s.exports).indexOf(t),a=s.exports[t],typeof a=="function"){var l=getFunctionAddress(a);l?a=l:(a=addFunction(a,a.sig),HEAPU32[r>>2]=o)}return a};__dlsym_js.sig="pppp";var __emscripten_memcpy_js=(e,t,r)=>HEAPU8.copyWithin(e,t,t+r);__emscripten_memcpy_js.sig="vppp";var runtimeKeepaliveCounter=0,__emscripten_runtime_keepalive_clear=()=>{noExitRuntime=!1,runtimeKeepaliveCounter=0};__emscripten_runtime_keepalive_clear.sig="v";var __emscripten_system=e=>{if(ENVIRONMENT_IS_NODE){if(!e)return 1;var t=UTF8ToString(e);if(!t.length)return 0;var r=require("child_process"),a=r.spawnSync(t,[],{shell:!0,stdio:"inherit"}),o=(l,n)=>l<<8|n;if(a.status===null){var s=l=>{switch(l){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return o(0,s(a.signal))}return o(a.status,0)}return e?-52:0};__emscripten_system.sig="ip";var __emscripten_throw_longjmp=()=>{throw 1/0};__emscripten_throw_longjmp.sig="v";function __gmtime_js(e,t){e=bigintToI53Checked(e);var r=new Date(e*1e3);HEAP32[t>>2]=r.getUTCSeconds(),HEAP32[t+4>>2]=r.getUTCMinutes(),HEAP32[t+8>>2]=r.getUTCHours(),HEAP32[t+12>>2]=r.getUTCDate(),HEAP32[t+16>>2]=r.getUTCMonth(),HEAP32[t+20>>2]=r.getUTCFullYear()-1900,HEAP32[t+24>>2]=r.getUTCDay();var a=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),o=(r.getTime()-a)/(1e3*60*60*24)|0;HEAP32[t+28>>2]=o}__gmtime_js.sig="vjp";var isLeapYear=e=>e%4===0&&(e%100!==0||e%400===0),MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335],MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334],ydayFromDate=e=>{var t=isLeapYear(e.getFullYear()),r=t?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE,a=r[e.getMonth()]+e.getDate()-1;return a};function __localtime_js(e,t){e=bigintToI53Checked(e);var r=new Date(e*1e3);HEAP32[t>>2]=r.getSeconds(),HEAP32[t+4>>2]=r.getMinutes(),HEAP32[t+8>>2]=r.getHours(),HEAP32[t+12>>2]=r.getDate(),HEAP32[t+16>>2]=r.getMonth(),HEAP32[t+20>>2]=r.getFullYear()-1900,HEAP32[t+24>>2]=r.getDay();var a=ydayFromDate(r)|0;HEAP32[t+28>>2]=a,HEAP32[t+36>>2]=-(r.getTimezoneOffset()*60);var o=new Date(r.getFullYear(),0,1),s=new Date(r.getFullYear(),6,1).getTimezoneOffset(),l=o.getTimezoneOffset(),n=(s!=l&&r.getTimezoneOffset()==Math.min(l,s))|0;HEAP32[t+32>>2]=n}__localtime_js.sig="vjp";function __mmap_js(e,t,r,a,o,s,l){o=bigintToI53Checked(o);try{if(isNaN(o))return 61;var n=SYSCALLS.getStreamFromFD(a),_=FS.mmap(n,e,o,t,r),m=_.ptr;return HEAP32[s>>2]=_.allocated,HEAPU32[l>>2]=m,0}catch(p){if(typeof FS>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}__mmap_js.sig="ipiiijpp";function __munmap_js(e,t,r,a,o,s){s=bigintToI53Checked(s);try{var l=SYSCALLS.getStreamFromFD(o);r&2&&SYSCALLS.doMsync(e,l,t,a,s)}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}__munmap_js.sig="ippiiij";var timers={},handleException=e=>{if(e instanceof ExitStatus||e=="unwind")return EXITSTATUS;quit_(1,e)},keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0,_proc_exit=e=>{EXITSTATUS=e,keepRuntimeAlive()||(Module.onExit?.(e),ABORT=!0),quit_(e,new ExitStatus(e))};_proc_exit.sig="vi";var exitJS=(e,t)=>{EXITSTATUS=e,_proc_exit(e)},_exit=exitJS;_exit.sig="vi";var maybeExit=()=>{if(!keepRuntimeAlive())try{_exit(EXITSTATUS)}catch(e){handleException(e)}},callUserCallback=e=>{if(!ABORT)try{e(),maybeExit()}catch(t){handleException(t)}},_emscripten_get_now=()=>performance.now();_emscripten_get_now.sig="d";var __setitimer_js=(e,t)=>{if(timers[e]&&(clearTimeout(timers[e].id),delete timers[e]),!t)return 0;var r=setTimeout(()=>{delete timers[e],callUserCallback(()=>__emscripten_timeout(e,_emscripten_get_now()))},t);return timers[e]={id:r,timeout_ms:t},0};__setitimer_js.sig="iid";var __tzset_js=(e,t,r,a)=>{var o=new Date().getFullYear(),s=new Date(o,0,1),l=new Date(o,6,1),n=s.getTimezoneOffset(),_=l.getTimezoneOffset(),m=Math.max(n,_);HEAPU32[e>>2]=m*60,HEAP32[t>>2]=+(n!=_);var p=c=>{var f=c>=0?"-":"+",u=Math.abs(c),w=String(Math.floor(u/60)).padStart(2,"0"),h=String(u%60).padStart(2,"0");return`UTC${f}${w}${h}`},d=p(n),g=p(_);_Date.now();_emscripten_date_now.sig="d";var nowIsMonotonic=1,checkWasiClock=e=>e>=0&&e<=3;function _clock_time_get(e,t,r){if(t=bigintToI53Checked(t),!checkWasiClock(e))return 28;var a;if(e===0)a=_emscripten_date_now();else if(nowIsMonotonic)a=_emscripten_get_now();else return 52;var o=Math.round(a*1e3*1e3);return HEAP64[r>>3]=BigInt(o),0}_clock_time_get.sig="iijp";var readEmAsmArgsArray=[],readEmAsmArgs=(e,t)=>{readEmAsmArgsArray.length=0;for(var r;r=HEAPU8[e++];){var a=r!=105;a&=r!=112,t+=a&&t%8?4:0,readEmAsmArgsArray.push(r==112?HEAPU32[t>>2]:r==106?HEAP64[t>>3]:r==105?HEAP32[t>>2]:HEAPF64[t>>3]),t+=a?8:4}return readEmAsmArgsArray},runEmAsmFunction=(e,t,r)=>{var a=readEmAsmArgs(t,r);return ASM_CONSTS[e](...a)},_emscripten_asm_const_int=(e,t,r)=>runEmAsmFunction(e,t,r);_emscripten_asm_const_int.sig="ippp";var _emscripten_force_exit=e=>{__emscripten_runtime_keepalive_clear(),_exit(e)};_emscripten_force_exit.sig="vi";var getHeapMax=()=>2147483648,growMemory=e=>{var t=wasmMemory.buffer,r=(e-t.byteLength+65535)/65536|0;try{return wasmMemory.grow(r),updateMemoryViews(),1}catch{}},_emscripten_resize_heap=e=>{var t=HEAPU8.length;e>>>=0;var r=getHeapMax();if(e>r)return!1;for(var a=1;a<=4;a*=2){var o=t*(1+.2/a);o=Math.min(o,e+100663296);var s=Math.min(r,alignMemory(Math.max(e,o),65536)),l=growMemory(s);if(l)return!0}return!1};_emscripten_resize_heap.sig="ip";var _emscripten_set_main_loop_timing=(e,t)=>{if(MainLoop.timingMode=e,MainLoop.timingValue=t,!MainLoop.func)return 1;if(MainLoop.running||(MainLoop.running=!0),e==0)MainLoop.scheduler=function(){var l=Math.max(0,MainLoop.tickStartTime+t-_emscripten_get_now())|0;setTimeout(MainLoop.runner,l)},MainLoop.method="timeout";else if(e==1)MainLoop.scheduler=function(){MainLoop.requestAnimationFrame(MainLoop.runner)},MainLoop.method="rAF";else if(e==2){if(typeof MainLoop.setImmediate>"u")if(typeof setImmediate>"u"){var r=[],a="setimmediate",o=s=>{(s.data===a||s.data.target===a)&&(s.stopPropagation(),r.shift()())};addEventListener("message",o,!0),MainLoop.setImmediate=s=>{r.push(s),ENVIRONMENT_IS_WORKER?(Module.setImmediates??(Module.setImmediates=[]),Module.setImmediates.push(s),postMessage({target:a})):postMessage(a,"*")}}else MainLoop.setImmediate=setImmediate;MainLoop.scheduler=function(){MainLoop.setImmediate(MainLoop.runner)},MainLoop.method="immediate"}return 0};_emscripten_set_main_loop_timing.sig="iii";var MainLoop={running:!1,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],preMainLoop:[],postMainLoop:[],pause(){MainLoop.scheduler=null,MainLoop.currentlyRunningMainloop++},resume(){MainLoop.currentlyRunningMainloop++;var e=MainLoop.timingMode,t=MainLoop.timingValue,r=MainLoop.func;MainLoop.func=null,setMainLoop(r,0,!1,MainLoop.arg,!0),_emscripten_set_main_loop_timing(e,t),MainLoop.scheduler()},updateStatus(){if(Module.setStatus){var e=Module.statusMessage||"Please wait...",t=MainLoop.remainingBlockers??0,r=MainLoop.expectedBlockers??0;t?t=MainLoop.nextRAF;)MainLoop.nextRAF+=1e3/60;var r=Math.max(MainLoop.nextRAF-t,0);setTimeout(e,r)},requestAnimationFrame(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(e);return}var t=MainLoop.fakeRequestAnimationFrame;t(e)}},setMainLoop=(e,t,r,a,o)=>{MainLoop.func=e,MainLoop.arg=a;var s=MainLoop.currentlyRunningMainloop;function l(){return s0){var _=Date.now(),m=MainLoop.queue.shift();if(m.func(m.arg),MainLoop.remainingBlockers){var p=MainLoop.remainingBlockers,d=p%1==0?p-1:Math.floor(p);m.counted?MainLoop.remainingBlockers=d:(d=d+.5,MainLoop.remainingBlockers=(8*p+d)/9)}if(MainLoop.updateStatus(),!l())return;setTimeout(MainLoop.runner,0);return}if(l()){if(MainLoop.currentFrameNumber=MainLoop.currentFrameNumber+1|0,MainLoop.timingMode==1&&MainLoop.timingValue>1&&MainLoop.currentFrameNumber%MainLoop.timingValue!=0){MainLoop.scheduler();return}else MainLoop.timingMode==0&&(MainLoop.tickStartTime=_emscripten_get_now());MainLoop.runIter(e),l()&&MainLoop.scheduler()}}},o||(t&&t>0?_emscripten_set_main_loop_timing(0,1e3/t):_emscripten_set_main_loop_timing(1,1),MainLoop.scheduler()),r)throw"unwind"},_emscripten_set_main_loop=(e,t,r)=>{var a=getWasmTableEntry(e);setMainLoop(a,t,r)};_emscripten_set_main_loop.sig="vpii";var getExecutableName=()=>thisProgram||"./this.program",getEnvStrings=()=>{if(!getEnvStrings.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:getExecutableName()};for(var r in ENV)ENV[r]===void 0?delete t[r]:t[r]=ENV[r];var a=[];for(var r in t)a.push(`${r}=${t[r]}`);getEnvStrings.strings=a}return getEnvStrings.strings},stringToAscii=(e,t)=>{for(var r=0;r{var r=0;return getEnvStrings().forEach((a,o)=>{var s=t+r;HEAPU32[e+o*4>>2]=s,stringToAscii(a,s),r+=a.length+1}),0};_environ_get.sig="ipp";var _environ_sizes_get=(e,t)=>{var r=getEnvStrings();HEAPU32[e>>2]=r.length;var a=0;return r.forEach(o=>a+=o.length+1),HEAPU32[t>>2]=a,0};_environ_sizes_get.sig="ipp";function _fd_close(e){try{var t=SYSCALLS.getStreamFromFD(e);return FS.close(t),0}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return r.errno}}_fd_close.sig="ii";function _fd_fdstat_get(e,t){try{var r=0,a=0,o=0,s=SYSCALLS.getStreamFromFD(e),l=s.tty?2:FS.isDir(s.mode)?3:FS.isLink(s.mode)?7:4;return HEAP8[t]=l,HEAP16[t+2>>1]=o,HEAP64[t+8>>3]=BigInt(r),HEAP64[t+16>>3]=BigInt(a),0}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return n.errno}}_fd_fdstat_get.sig="iip";var doReadv=(e,t,r,a)=>{for(var o=0,s=0;s>2],n=HEAPU32[t+4>>2];t+=8;var _=FS.read(e,HEAP8,l,n,a);if(_<0)return-1;if(o+=_,_>2]=l,0}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return n.errno}}_fd_pread.sig="iippjp";var doWritev=(e,t,r,a)=>{for(var o=0,s=0;s>2],n=HEAPU32[t+4>>2];t+=8;var _=FS.write(e,HEAP8,l,n,a);if(_<0)return-1;if(o+=_,_>2]=l,0}catch(n){if(typeof FS>"u"||n.name!=="ErrnoError")throw n;return n.errno}}_fd_pwrite.sig="iippjp";function _fd_read(e,t,r,a){try{var o=SYSCALLS.getStreamFromFD(e),s=doReadv(o,t,r);return HEAPU32[a>>2]=s,0}catch(l){if(typeof FS>"u"||l.name!=="ErrnoError")throw l;return l.errno}}_fd_read.sig="iippp";function _fd_seek(e,t,r,a){t=bigintToI53Checked(t);try{if(isNaN(t))return 61;var o=SYSCALLS.getStreamFromFD(e);return FS.llseek(o,t,r),HEAP64[a>>3]=BigInt(o.position),o.getdents&&t===0&&r===0&&(o.getdents=null),0}catch(s){if(typeof FS>"u"||s.name!=="ErrnoError")throw s;return s.errno}}_fd_seek.sig="iijip";function _fd_sync(e){try{var t=SYSCALLS.getStreamFromFD(e);return t.stream_ops?.fsync?t.stream_ops.fsync(t):0}catch(r){if(typeof FS>"u"||r.name!=="ErrnoError")throw r;return r.errno}}_fd_sync.sig="ii";function _fd_write(e,t,r,a){try{var o=SYSCALLS.getStreamFromFD(e),s=doWritev(o,t,r);return HEAPU32[a>>2]=s,0}catch(l){if(typeof FS>"u"||l.name!=="ErrnoError")throw l;return l.errno}}_fd_write.sig="iippp";var _getaddrinfo=(e,t,r,a)=>{var o=0,s=0,l=0,n=0,_=0,m=0,p;function d(g,c,f,u,w,h){var S,M,y,x;return M=g===10?28:16,w=g===10?inetNtop6(w):inetNtop4(w),S=_malloc(M),x=writeSockaddr(S,g,w,h),assert(!x),y=_malloc(32),HEAP32[y+4>>2]=g,HEAP32[y+8>>2]=c,HEAP32[y+12>>2]=f,HEAPU32[y+24>>2]=u,HEAPU32[y+20>>2]=S,g===10?HEAP32[y+16>>2]=28:HEAP32[y+16>>2]=16,HEAP32[y+28>>2]=0,y}if(r&&(l=HEAP32[r>>2],n=HEAP32[r+4>>2],_=HEAP32[r+8>>2],m=HEAP32[r+12>>2]),_&&!m&&(m=_===2?17:6),!_&&m&&(_=m===17?2:1),m===0&&(m=6),_===0&&(_=1),!e&&!t)return-2;if(l&-1088||r!==0&&HEAP32[r>>2]&2&&!e)return-1;if(l&32)return-2;if(_!==0&&_!==1&&_!==2)return-7;if(n!==0&&n!==2&&n!==10)return-6;if(t&&(t=UTF8ToString(t),s=parseInt(t,10),isNaN(s)))return l&1024?-2:-8;if(!e)return n===0&&(n=2),l&1||(n===2?o=_htonl(2130706433):o=[0,0,0,_htonl(1)]),p=d(n,_,m,null,o,s),HEAPU32[a>>2]=p,0;if(e=UTF8ToString(e),o=inetPton4(e),o!==null)if(n===0||n===2)n=2;else if(n===10&&l&8)o=[0,0,_htonl(65535),o],n=10;else return-2;else if(o=inetPton6(e),o!==null)if(n===0||n===10)n=10;else return-2;return o!=null?(p=d(n,_,m,e,o,s),HEAPU32[a>>2]=p,0):l&4?-2:(e=DNS.lookup_name(e),o=inetPton4(e),n===0?n=2:n===10&&(o=[0,0,_htonl(65535),o]),p=d(n,_,m,null,o,s),HEAPU32[a>>2]=p,0)};_getaddrinfo.sig="ipppp";var _getnameinfo=(e,t,r,a,o,s,l)=>{var n=readSockaddr(e,t);if(n.errno)return-6;var _=n.port,m=n.addr,p=!1;if(r&&a){var d;if(l&1||!(d=DNS.lookup_addr(m))){if(l&8)return-2}else m=d;var g=stringToUTF8(m,r,a);g+1>=a&&(p=!0)}if(o&&s){_=""+_;var g=stringToUTF8(_,o,s);g+1>=s&&(p=!0)}return p?-12:0};_getnameinfo.sig="ipipipii";var stringToNewUTF8=e=>{var t=lengthBytesUTF8(e)+1,r=_malloc(t);return r&&stringToUTF8(e,r,t),r},getCFunc=e=>{var t=Module["_"+e];return t},writeArrayToMemory=(e,t)=>{HEAP8.set(e,t)},ccall=(e,t,r,a,o)=>{var s={string:f=>{var u=0;return f!=null&&f!==0&&(u=stringToUTF8OnStack(f)),u},array:f=>{var u=stackAlloc(f.length);return writeArrayToMemory(f,u),u}};function l(f){return t==="string"?UTF8ToString(f):t==="boolean"?!!f:f}var n=getCFunc(e),_=[],m=0;if(a)for(var p=0;p{var o=!r||r.every(l=>l==="number"||l==="boolean"),s=t!=="string";return s&&o&&!a?getCFunc(e):(...l)=>ccall(e,t,r,l,a)},FS_createPath=FS.createPath,FS_unlink=e=>FS.unlink(e),FS_createLazyFile=FS.createLazyFile,FS_createDevice=FS.createDevice,setTempRet0=e=>__emscripten_tempret_set(e),_setTempRet0=setTempRet0;Module._setTempRet0=_setTempRet0;var getTempRet0=e=>__emscripten_tempret_get(),_getTempRet0=getTempRet0;Module._getTempRet0=_getTempRet0,registerWasmPlugin(),FS.createPreloadedFile=FS_createPreloadedFile,FS.staticInit(),Module.FS_createPath=FS.createPath,Module.FS_createDataFile=FS.createDataFile,Module.FS_createPreloadedFile=FS.createPreloadedFile,Module.FS_unlink=FS.unlink,Module.FS_createLazyFile=FS.createLazyFile,Module.FS_createDevice=FS.createDevice,MEMFS.doesNotExistError=new FS.ErrnoError(44),MEMFS.doesNotExistError.stack="",ENVIRONMENT_IS_NODE&&NODEFS.staticInit(),Module.requestAnimationFrame=MainLoop.requestAnimationFrame,Module.pauseMainLoop=MainLoop.pause,Module.resumeMainLoop=MainLoop.resume,MainLoop.init();var wasmImports={__assert_fail:___assert_fail,__call_sighandler:___call_sighandler,__heap_base:___heap_base,__indirect_function_table:wasmTable,__memory_base:___memory_base,__stack_pointer:___stack_pointer,__syscall__newselect:___syscall__newselect,__syscall_bind:___syscall_bind,__syscall_chdir:___syscall_chdir,__syscall_chmod:___syscall_chmod,__syscall_connect:___syscall_connect,__syscall_dup:___syscall_dup,__syscall_dup3:___syscall_dup3,__syscall_faccessat:___syscall_faccessat,__syscall_fadvise64:___syscall_fadvise64,__syscall_fallocate:___syscall_fallocate,__syscall_fcntl64:___syscall_fcntl64,__syscall_fdatasync:___syscall_fdatasync,__syscall_fstat64:___syscall_fstat64,__syscall_ftruncate64:___syscall_ftruncate64,__syscall_getcwd:___syscall_getcwd,__syscall_getdents64:___syscall_getdents64,__syscall_getsockname:___syscall_getsockname,__syscall_getsockopt:___syscall_getsockopt,__syscall_ioctl:___syscall_ioctl,__syscall_lstat64:___syscall_lstat64,__syscall_mkdirat:___syscall_mkdirat,__syscall_newfstatat:___syscall_newfstatat,__syscall_openat:___syscall_openat,__syscall_pipe:___syscall_pipe,__syscall_poll:___syscall_poll,__syscall_readlinkat:___syscall_readlinkat,__syscall_recvfrom:___syscall_recvfrom,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_sendto:___syscall_sendto,__syscall_socket:___syscall_socket,__syscall_stat64:___syscall_stat64,__syscall_symlinkat:___syscall_symlinkat,__syscall_truncate64:___syscall_truncate64,__syscall_unlinkat:___syscall_unlinkat,__table_base:___table_base,_abort_js:__abort_js,_dlopen_js:__dlopen_js,_dlsym_js:__dlsym_js,_emscripten_memcpy_js:__emscripten_memcpy_js,_emscripten_runtime_keepalive_clear:__emscripten_runtime_keepalive_clear,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mmap_js:__mmap_js,_munmap_js:__munmap_js,_setitimer_js:__setitimer_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_asm_const_int:_emscripten_asm_const_int,emscripten_date_now:_emscripten_date_now,emscripten_force_exit:_emscripten_force_exit,emscripten_get_now:_emscripten_get_now,emscripten_resize_heap:_emscripten_resize_heap,emscripten_set_main_loop:_emscripten_set_main_loop,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_fdstat_get:_fd_fdstat_get,fd_pread:_fd_pread,fd_pwrite:_fd_pwrite,fd_read:_fd_read,fd_seek:_fd_seek,fd_sync:_fd_sync,fd_write:_fd_write,getTempRet0:_getTempRet0,getaddrinfo:_getaddrinfo,getnameinfo:_getnameinfo,invoke_di,invoke_i,invoke_id,invoke_ii,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiii,invoke_iiiiiiiiii,invoke_iiiiiiiiiiiiiiiii,invoke_iiiiiji,invoke_iiiij,invoke_iiiijii,invoke_iiij,invoke_iiji,invoke_ij,invoke_ijiiiii,invoke_ijiiiiii,invoke_ji,invoke_jii,invoke_jiiii,invoke_jiiiii,invoke_jiiiiiiii,invoke_v,invoke_vi,invoke_vid,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiiiii,invoke_viiij,invoke_viij,invoke_viiji,invoke_viijii,invoke_viijiiii,invoke_vij,invoke_viji,invoke_vijiji,invoke_vj,invoke_vji,is_web_env,memory:wasmMemory,proc_exit:_proc_exit,setTempRet0:_setTempRet0},wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports.__wasm_call_ctors)(),_ScanKeywordLookup=Module._ScanKeywordLookup=(e,t)=>(_ScanKeywordLookup=Module._ScanKeywordLookup=wasmExports.ScanKeywordLookup)(e,t),_pg_snprintf=Module._pg_snprintf=(e,t,r,a)=>(_pg_snprintf=Module._pg_snprintf=wasmExports.pg_snprintf)(e,t,r,a),_strlen=Module._strlen=e=>(_strlen=Module._strlen=wasmExports.strlen)(e),_memset=Module._memset=(e,t,r)=>(_memset=Module._memset=wasmExports.memset)(e,t,r),_strchr=Module._strchr=(e,t)=>(_strchr=Module._strchr=wasmExports.strchr)(e,t),_PQserverVersion=Module._PQserverVersion=e=>(_PQserverVersion=Module._PQserverVersion=wasmExports.PQserverVersion)(e),_strstr=Module._strstr=(e,t)=>(_strstr=Module._strstr=wasmExports.strstr)(e,t),_pg_fprintf=Module._pg_fprintf=(e,t,r)=>(_pg_fprintf=Module._pg_fprintf=wasmExports.pg_fprintf)(e,t,r),_strspn=Module._strspn=(e,t)=>(_strspn=Module._strspn=wasmExports.strspn)(e,t),_malloc=Module._malloc=e=>(_malloc=Module._malloc=wasmExports.malloc)(e),_pg_strcasecmp=Module._pg_strcasecmp=(e,t)=>(_pg_strcasecmp=Module._pg_strcasecmp=wasmExports.pg_strcasecmp)(e,t),_strcmp=Module._strcmp=(e,t)=>(_strcmp=Module._strcmp=wasmExports.strcmp)(e,t),_free=Module._free=e=>(_free=Module._free=wasmExports.free)(e),_pg_tolower=Module._pg_tolower=e=>(_pg_tolower=Module._pg_tolower=wasmExports.pg_tolower)(e),_memchr=Module._memchr=(e,t,r)=>(_memchr=Module._memchr=wasmExports.memchr)(e,t,r),_getenv=Module._getenv=e=>(_getenv=Module._getenv=wasmExports.getenv)(e),_fileno=Module._fileno=e=>(_fileno=Module._fileno=wasmExports.fileno)(e),_isatty=Module._isatty=e=>(_isatty=Module._isatty=wasmExports.isatty)(e),_strdup=Module._strdup=e=>(_strdup=Module._strdup=wasmExports.strdup)(e),___errno_location=Module.___errno_location=()=>(___errno_location=Module.___errno_location=wasmExports.__errno_location)(),_fflush=Module._fflush=e=>(_fflush=Module._fflush=wasmExports.fflush)(e),_pg_vsnprintf=Module._pg_vsnprintf=(e,t,r,a)=>(_pg_vsnprintf=Module._pg_vsnprintf=wasmExports.pg_vsnprintf)(e,t,r,a),_pg_malloc_extended=Module._pg_malloc_extended=(e,t)=>(_pg_malloc_extended=Module._pg_malloc_extended=wasmExports.pg_malloc_extended)(e,t),_PageInit=Module._PageInit=(e,t,r)=>(_PageInit=Module._PageInit=wasmExports.PageInit)(e,t,r),_pg_checksum_page=Module._pg_checksum_page=(e,t)=>(_pg_checksum_page=Module._pg_checksum_page=wasmExports.pg_checksum_page)(e,t),_errstart=Module._errstart=(e,t)=>(_errstart=Module._errstart=wasmExports.errstart)(e,t),_errcode=Module._errcode=e=>(_errcode=Module._errcode=wasmExports.errcode)(e),_errmsg=Module._errmsg=(e,t)=>(_errmsg=Module._errmsg=wasmExports.errmsg)(e,t),_errfinish=Module._errfinish=(e,t,r)=>(_errfinish=Module._errfinish=wasmExports.errfinish)(e,t,r),_PageAddItemExtended=Module._PageAddItemExtended=(e,t,r,a,o)=>(_PageAddItemExtended=Module._PageAddItemExtended=wasmExports.PageAddItemExtended)(e,t,r,a,o),_errstart_cold=Module._errstart_cold=(e,t)=>(_errstart_cold=Module._errstart_cold=wasmExports.errstart_cold)(e,t),_puts=Module._puts=e=>(_puts=Module._puts=wasmExports.puts)(e),_errmsg_internal=Module._errmsg_internal=(e,t)=>(_errmsg_internal=Module._errmsg_internal=wasmExports.errmsg_internal)(e,t),_memmove=Module._memmove=(e,t,r)=>(_memmove=Module._memmove=wasmExports.memmove)(e,t,r),_memcpy=Module._memcpy=(e,t,r)=>(_memcpy=Module._memcpy=wasmExports.memcpy)(e,t,r),_palloc=Module._palloc=e=>(_palloc=Module._palloc=wasmExports.palloc)(e),_pfree=Module._pfree=e=>(_pfree=Module._pfree=wasmExports.pfree)(e),_PageGetFreeSpace=Module._PageGetFreeSpace=e=>(_PageGetFreeSpace=Module._PageGetFreeSpace=wasmExports.PageGetFreeSpace)(e),_PageGetExactFreeSpace=Module._PageGetExactFreeSpace=e=>(_PageGetExactFreeSpace=Module._PageGetExactFreeSpace=wasmExports.PageGetExactFreeSpace)(e),_PageGetHeapFreeSpace=Module._PageGetHeapFreeSpace=e=>(_PageGetHeapFreeSpace=Module._PageGetHeapFreeSpace=wasmExports.PageGetHeapFreeSpace)(e),_PageIndexMultiDelete=Module._PageIndexMultiDelete=(e,t,r)=>(_PageIndexMultiDelete=Module._PageIndexMultiDelete=wasmExports.PageIndexMultiDelete)(e,t,r),_PageIndexTupleOverwrite=Module._PageIndexTupleOverwrite=(e,t,r,a)=>(_PageIndexTupleOverwrite=Module._PageIndexTupleOverwrite=wasmExports.PageIndexTupleOverwrite)(e,t,r,a),_ItemPointerEquals=Module._ItemPointerEquals=(e,t)=>(_ItemPointerEquals=Module._ItemPointerEquals=wasmExports.ItemPointerEquals)(e,t),_ItemPointerCompare=Module._ItemPointerCompare=(e,t)=>(_ItemPointerCompare=Module._ItemPointerCompare=wasmExports.ItemPointerCompare)(e,t),_add_size=Module._add_size=(e,t)=>(_add_size=Module._add_size=wasmExports.add_size)(e,t),_ShmemInitStruct=Module._ShmemInitStruct=(e,t,r)=>(_ShmemInitStruct=Module._ShmemInitStruct=wasmExports.ShmemInitStruct)(e,t,r),_s_init_lock_sema=Module._s_init_lock_sema=(e,t)=>(_s_init_lock_sema=Module._s_init_lock_sema=wasmExports.s_init_lock_sema)(e,t),_LWLockAcquire=Module._LWLockAcquire=(e,t)=>(_LWLockAcquire=Module._LWLockAcquire=wasmExports.LWLockAcquire)(e,t),_LWLockRelease=Module._LWLockRelease=e=>(_LWLockRelease=Module._LWLockRelease=wasmExports.LWLockRelease)(e),_on_shmem_exit=Module._on_shmem_exit=(e,t)=>(_on_shmem_exit=Module._on_shmem_exit=wasmExports.on_shmem_exit)(e,t),_tas_sema=Module._tas_sema=e=>(_tas_sema=Module._tas_sema=wasmExports.tas_sema)(e),_s_lock=Module._s_lock=(e,t,r,a)=>(_s_lock=Module._s_lock=wasmExports.s_lock)(e,t,r,a),_s_unlock_sema=Module._s_unlock_sema=e=>(_s_unlock_sema=Module._s_unlock_sema=wasmExports.s_unlock_sema)(e),_StartTransactionCommand=Module._StartTransactionCommand=()=>(_StartTransactionCommand=Module._StartTransactionCommand=wasmExports.StartTransactionCommand)(),_CommitTransactionCommand=Module._CommitTransactionCommand=()=>(_CommitTransactionCommand=Module._CommitTransactionCommand=wasmExports.CommitTransactionCommand)(),_WaitLatch=Module._WaitLatch=(e,t,r,a)=>(_WaitLatch=Module._WaitLatch=wasmExports.WaitLatch)(e,t,r,a),_ResetLatch=Module._ResetLatch=e=>(_ResetLatch=Module._ResetLatch=wasmExports.ResetLatch)(e),_ProcessInterrupts=Module._ProcessInterrupts=()=>(_ProcessInterrupts=Module._ProcessInterrupts=wasmExports.ProcessInterrupts)(),_MemoryContextAlloc=Module._MemoryContextAlloc=(e,t)=>(_MemoryContextAlloc=Module._MemoryContextAlloc=wasmExports.MemoryContextAlloc)(e,t),_AllocateDir=Module._AllocateDir=e=>(_AllocateDir=Module._AllocateDir=wasmExports.AllocateDir)(e),_ReadDir=Module._ReadDir=(e,t)=>(_ReadDir=Module._ReadDir=wasmExports.ReadDir)(e,t),_strncmp=Module._strncmp=(e,t,r)=>(_strncmp=Module._strncmp=wasmExports.strncmp)(e,t,r),_unlink=Module._unlink=e=>(_unlink=Module._unlink=wasmExports.unlink)(e),_errcode_for_file_access=Module._errcode_for_file_access=()=>(_errcode_for_file_access=Module._errcode_for_file_access=wasmExports.errcode_for_file_access)(),_FreeDir=Module._FreeDir=e=>(_FreeDir=Module._FreeDir=wasmExports.FreeDir)(e),_pg_prng_uint32=Module._pg_prng_uint32=e=>(_pg_prng_uint32=Module._pg_prng_uint32=wasmExports.pg_prng_uint32)(e),_dsm_create=Module._dsm_create=(e,t)=>(_dsm_create=Module._dsm_create=wasmExports.dsm_create)(e,t),_dsm_attach=Module._dsm_attach=e=>(_dsm_attach=Module._dsm_attach=wasmExports.dsm_attach)(e),_dsm_detach=Module._dsm_detach=e=>(_dsm_detach=Module._dsm_detach=wasmExports.dsm_detach)(e),_dsm_segment_address=Module._dsm_segment_address=e=>(_dsm_segment_address=Module._dsm_segment_address=wasmExports.dsm_segment_address)(e),_dsm_segment_handle=Module._dsm_segment_handle=e=>(_dsm_segment_handle=Module._dsm_segment_handle=wasmExports.dsm_segment_handle)(e),_MemoryContextAllocZero=Module._MemoryContextAllocZero=(e,t)=>(_MemoryContextAllocZero=Module._MemoryContextAllocZero=wasmExports.MemoryContextAllocZero)(e,t),_read=Module._read=(e,t,r)=>(_read=Module._read=wasmExports.read)(e,t,r),_hash_create=Module._hash_create=(e,t,r,a)=>(_hash_create=Module._hash_create=wasmExports.hash_create)(e,t,r,a),_hash_destroy=Module._hash_destroy=e=>(_hash_destroy=Module._hash_destroy=wasmExports.hash_destroy)(e),_hash_seq_init=Module._hash_seq_init=(e,t)=>(_hash_seq_init=Module._hash_seq_init=wasmExports.hash_seq_init)(e,t),_hash_seq_search=Module._hash_seq_search=e=>(_hash_seq_search=Module._hash_seq_search=wasmExports.hash_seq_search)(e),_hash_search=Module._hash_search=(e,t,r,a)=>(_hash_search=Module._hash_search=wasmExports.hash_search)(e,t,r,a),_initStringInfo=Module._initStringInfo=e=>(_initStringInfo=Module._initStringInfo=wasmExports.initStringInfo)(e),_appendStringInfo=Module._appendStringInfo=(e,t,r)=>(_appendStringInfo=Module._appendStringInfo=wasmExports.appendStringInfo)(e,t,r),_GetCurrentTimestamp=Module._GetCurrentTimestamp=()=>(_GetCurrentTimestamp=Module._GetCurrentTimestamp=wasmExports.GetCurrentTimestamp)(),_pg_usleep=Module._pg_usleep=e=>(_pg_usleep=Module._pg_usleep=wasmExports.pg_usleep)(e),_errdetail=Module._errdetail=(e,t)=>(_errdetail=Module._errdetail=wasmExports.errdetail)(e,t),_TransactionIdDidCommit=Module._TransactionIdDidCommit=e=>(_TransactionIdDidCommit=Module._TransactionIdDidCommit=wasmExports.TransactionIdDidCommit)(e),_TransactionIdPrecedes=Module._TransactionIdPrecedes=(e,t)=>(_TransactionIdPrecedes=Module._TransactionIdPrecedes=wasmExports.TransactionIdPrecedes)(e,t),_XLogBeginInsert=Module._XLogBeginInsert=()=>(_XLogBeginInsert=Module._XLogBeginInsert=wasmExports.XLogBeginInsert)(),_XLogRegisterData=Module._XLogRegisterData=(e,t)=>(_XLogRegisterData=Module._XLogRegisterData=wasmExports.XLogRegisterData)(e,t),_XLogInsert=Module._XLogInsert=(e,t)=>(_XLogInsert=Module._XLogInsert=wasmExports.XLogInsert)(e,t),_ConditionVariableInit=Module._ConditionVariableInit=e=>(_ConditionVariableInit=Module._ConditionVariableInit=wasmExports.ConditionVariableInit)(e),_ConditionVariableCancelSleep=Module._ConditionVariableCancelSleep=()=>(_ConditionVariableCancelSleep=Module._ConditionVariableCancelSleep=wasmExports.ConditionVariableCancelSleep)(),_ConditionVariableSleep=Module._ConditionVariableSleep=(e,t)=>(_ConditionVariableSleep=Module._ConditionVariableSleep=wasmExports.ConditionVariableSleep)(e,t),___wasm_setjmp=Module.___wasm_setjmp=(e,t,r)=>(___wasm_setjmp=Module.___wasm_setjmp=wasmExports.__wasm_setjmp)(e,t,r),___wasm_setjmp_test=Module.___wasm_setjmp_test=(e,t)=>(___wasm_setjmp_test=Module.___wasm_setjmp_test=wasmExports.__wasm_setjmp_test)(e,t),_pg_re_throw=Module._pg_re_throw=()=>(_pg_re_throw=Module._pg_re_throw=wasmExports.pg_re_throw)(),_emscripten_longjmp=Module._emscripten_longjmp=(e,t)=>(_emscripten_longjmp=Module._emscripten_longjmp=wasmExports.emscripten_longjmp)(e,t),_procsignal_sigusr1_handler=Module._procsignal_sigusr1_handler=e=>(_procsignal_sigusr1_handler=Module._procsignal_sigusr1_handler=wasmExports.procsignal_sigusr1_handler)(e),_close=Module._close=e=>(_close=Module._close=wasmExports.close)(e),_ReleaseExternalFD=Module._ReleaseExternalFD=()=>(_ReleaseExternalFD=Module._ReleaseExternalFD=wasmExports.ReleaseExternalFD)(),_fcntl=Module._fcntl=(e,t,r)=>(_fcntl=Module._fcntl=wasmExports.fcntl)(e,t,r),_pqsignal=Module._pqsignal=(e,t)=>(_pqsignal=Module._pqsignal=wasmExports.pqsignal)(e,t),_write=Module._write=(e,t,r)=>(_write=Module._write=wasmExports.write)(e,t,r),_AddWaitEventToSet=Module._AddWaitEventToSet=(e,t,r,a,o)=>(_AddWaitEventToSet=Module._AddWaitEventToSet=wasmExports.AddWaitEventToSet)(e,t,r,a,o),_clock_gettime=Module._clock_gettime=(e,t)=>(_clock_gettime=Module._clock_gettime=wasmExports.clock_gettime)(e,t),_poll=Module._poll=(e,t,r)=>(_poll=Module._poll=wasmExports.poll)(e,t,r),_WaitLatchOrSocket=Module._WaitLatchOrSocket=(e,t,r,a,o)=>(_WaitLatchOrSocket=Module._WaitLatchOrSocket=wasmExports.WaitLatchOrSocket)(e,t,r,a,o),_GetNumRegisteredWaitEvents=Module._GetNumRegisteredWaitEvents=e=>(_GetNumRegisteredWaitEvents=Module._GetNumRegisteredWaitEvents=wasmExports.GetNumRegisteredWaitEvents)(e),_ShmemInitHash=Module._ShmemInitHash=(e,t,r,a,o)=>(_ShmemInitHash=Module._ShmemInitHash=wasmExports.ShmemInitHash)(e,t,r,a,o),_InitMaterializedSRF=Module._InitMaterializedSRF=(e,t)=>(_InitMaterializedSRF=Module._InitMaterializedSRF=wasmExports.InitMaterializedSRF)(e,t),_cstring_to_text=Module._cstring_to_text=e=>(_cstring_to_text=Module._cstring_to_text=wasmExports.cstring_to_text)(e),_Int64GetDatum=Module._Int64GetDatum=e=>(_Int64GetDatum=Module._Int64GetDatum=wasmExports.Int64GetDatum)(e),_tuplestore_putvalues=Module._tuplestore_putvalues=(e,t,r,a)=>(_tuplestore_putvalues=Module._tuplestore_putvalues=wasmExports.tuplestore_putvalues)(e,t,r,a),_shm_toc_allocate=Module._shm_toc_allocate=(e,t)=>(_shm_toc_allocate=Module._shm_toc_allocate=wasmExports.shm_toc_allocate)(e,t),_shm_toc_insert=Module._shm_toc_insert=(e,t,r)=>(_shm_toc_insert=Module._shm_toc_insert=wasmExports.shm_toc_insert)(e,t,r),_shm_toc_lookup=Module._shm_toc_lookup=(e,t,r)=>(_shm_toc_lookup=Module._shm_toc_lookup=wasmExports.shm_toc_lookup)(e,t,r),_superuser_arg=Module._superuser_arg=e=>(_superuser_arg=Module._superuser_arg=wasmExports.superuser_arg)(e),_superuser=Module._superuser=()=>(_superuser=Module._superuser=wasmExports.superuser)(),_GetUserId=Module._GetUserId=()=>(_GetUserId=Module._GetUserId=wasmExports.GetUserId)(),_has_privs_of_role=Module._has_privs_of_role=(e,t)=>(_has_privs_of_role=Module._has_privs_of_role=wasmExports.has_privs_of_role)(e,t),_errmsg_plural=Module._errmsg_plural=(e,t,r,a)=>(_errmsg_plural=Module._errmsg_plural=wasmExports.errmsg_plural)(e,t,r,a),_errhint=Module._errhint=(e,t)=>(_errhint=Module._errhint=wasmExports.errhint)(e,t),_fstat=Module._fstat=(e,t)=>(_fstat=Module._fstat=wasmExports.fstat)(e,t),_ftruncate=Module._ftruncate=(e,t)=>(_ftruncate=Module._ftruncate=wasmExports.ftruncate)(e,t),_RequestAddinShmemSpace=Module._RequestAddinShmemSpace=e=>(_RequestAddinShmemSpace=Module._RequestAddinShmemSpace=wasmExports.RequestAddinShmemSpace)(e),_hash_estimate_size=Module._hash_estimate_size=(e,t)=>(_hash_estimate_size=Module._hash_estimate_size=wasmExports.hash_estimate_size)(e,t),_pg_sprintf=Module._pg_sprintf=(e,t,r)=>(_pg_sprintf=Module._pg_sprintf=wasmExports.pg_sprintf)(e,t,r),_SetConfigOption=Module._SetConfigOption=(e,t,r,a)=>(_SetConfigOption=Module._SetConfigOption=wasmExports.SetConfigOption)(e,t,r,a),_pg_printf=Module._pg_printf=(e,t)=>(_pg_printf=Module._pg_printf=wasmExports.pg_printf)(e,t),_before_shmem_exit=Module._before_shmem_exit=(e,t)=>(_before_shmem_exit=Module._before_shmem_exit=wasmExports.before_shmem_exit)(e,t),_cancel_before_shmem_exit=Module._cancel_before_shmem_exit=(e,t)=>(_cancel_before_shmem_exit=Module._cancel_before_shmem_exit=wasmExports.cancel_before_shmem_exit)(e,t),_pg_qsort=Module._pg_qsort=(e,t,r,a)=>(_pg_qsort=Module._pg_qsort=wasmExports.pg_qsort)(e,t,r,a),_TransactionIdIsInProgress=Module._TransactionIdIsInProgress=e=>(_TransactionIdIsInProgress=Module._TransactionIdIsInProgress=wasmExports.TransactionIdIsInProgress)(e),_TransactionIdIsCurrentTransactionId=Module._TransactionIdIsCurrentTransactionId=e=>(_TransactionIdIsCurrentTransactionId=Module._TransactionIdIsCurrentTransactionId=wasmExports.TransactionIdIsCurrentTransactionId)(e),_RecoveryInProgress=Module._RecoveryInProgress=()=>(_RecoveryInProgress=Module._RecoveryInProgress=wasmExports.RecoveryInProgress)(),_GetOldestNonRemovableTransactionId=Module._GetOldestNonRemovableTransactionId=e=>(_GetOldestNonRemovableTransactionId=Module._GetOldestNonRemovableTransactionId=wasmExports.GetOldestNonRemovableTransactionId)(e),_GetCurrentCommandId=Module._GetCurrentCommandId=e=>(_GetCurrentCommandId=Module._GetCurrentCommandId=wasmExports.GetCurrentCommandId)(e),_BackendXidGetPid=Module._BackendXidGetPid=e=>(_BackendXidGetPid=Module._BackendXidGetPid=wasmExports.BackendXidGetPid)(e),_lappend_int=Module._lappend_int=(e,t)=>(_lappend_int=Module._lappend_int=wasmExports.lappend_int)(e,t),_index_close=Module._index_close=(e,t)=>(_index_close=Module._index_close=wasmExports.index_close)(e,t),_table_close=Module._table_close=(e,t)=>(_table_close=Module._table_close=wasmExports.table_close)(e,t),_CommandCounterIncrement=Module._CommandCounterIncrement=()=>(_CommandCounterIncrement=Module._CommandCounterIncrement=wasmExports.CommandCounterIncrement)(),_GetActiveSnapshot=Module._GetActiveSnapshot=()=>(_GetActiveSnapshot=Module._GetActiveSnapshot=wasmExports.GetActiveSnapshot)(),_ScanKeyInit=Module._ScanKeyInit=(e,t,r,a,o)=>(_ScanKeyInit=Module._ScanKeyInit=wasmExports.ScanKeyInit)(e,t,r,a,o),_table_open=Module._table_open=(e,t)=>(_table_open=Module._table_open=wasmExports.table_open)(e,t),_systable_beginscan=Module._systable_beginscan=(e,t,r,a,o,s)=>(_systable_beginscan=Module._systable_beginscan=wasmExports.systable_beginscan)(e,t,r,a,o,s),_systable_getnext=Module._systable_getnext=e=>(_systable_getnext=Module._systable_getnext=wasmExports.systable_getnext)(e),_systable_endscan=Module._systable_endscan=e=>(_systable_endscan=Module._systable_endscan=wasmExports.systable_endscan)(e),_index_open=Module._index_open=(e,t)=>(_index_open=Module._index_open=wasmExports.index_open)(e,t),_systable_beginscan_ordered=Module._systable_beginscan_ordered=(e,t,r,a,o)=>(_systable_beginscan_ordered=Module._systable_beginscan_ordered=wasmExports.systable_beginscan_ordered)(e,t,r,a,o),_systable_getnext_ordered=Module._systable_getnext_ordered=(e,t)=>(_systable_getnext_ordered=Module._systable_getnext_ordered=wasmExports.systable_getnext_ordered)(e,t),_systable_endscan_ordered=Module._systable_endscan_ordered=e=>(_systable_endscan_ordered=Module._systable_endscan_ordered=wasmExports.systable_endscan_ordered)(e),_heap_form_tuple=Module._heap_form_tuple=(e,t,r)=>(_heap_form_tuple=Module._heap_form_tuple=wasmExports.heap_form_tuple)(e,t,r),_heap_freetuple=Module._heap_freetuple=e=>(_heap_freetuple=Module._heap_freetuple=wasmExports.heap_freetuple)(e),_AllocSetContextCreateInternal=Module._AllocSetContextCreateInternal=(e,t,r,a,o)=>(_AllocSetContextCreateInternal=Module._AllocSetContextCreateInternal=wasmExports.AllocSetContextCreateInternal)(e,t,r,a,o),_list_free_deep=Module._list_free_deep=e=>(_list_free_deep=Module._list_free_deep=wasmExports.list_free_deep)(e),_lappend=Module._lappend=(e,t)=>(_lappend=Module._lappend=wasmExports.lappend)(e,t),_LockBuffer=Module._LockBuffer=(e,t)=>(_LockBuffer=Module._LockBuffer=wasmExports.LockBuffer)(e,t),_GetFreeIndexPage=Module._GetFreeIndexPage=e=>(_GetFreeIndexPage=Module._GetFreeIndexPage=wasmExports.GetFreeIndexPage)(e),_RecordFreeIndexPage=Module._RecordFreeIndexPage=(e,t)=>(_RecordFreeIndexPage=Module._RecordFreeIndexPage=wasmExports.RecordFreeIndexPage)(e,t),_IndexFreeSpaceMapVacuum=Module._IndexFreeSpaceMapVacuum=e=>(_IndexFreeSpaceMapVacuum=Module._IndexFreeSpaceMapVacuum=wasmExports.IndexFreeSpaceMapVacuum)(e),_UnlockReleaseBuffer=Module._UnlockReleaseBuffer=e=>(_UnlockReleaseBuffer=Module._UnlockReleaseBuffer=wasmExports.UnlockReleaseBuffer)(e),_smgropen=Module._smgropen=(e,t)=>(_smgropen=Module._smgropen=wasmExports.smgropen)(e,t),_smgrsetowner=Module._smgrsetowner=(e,t)=>(_smgrsetowner=Module._smgrsetowner=wasmExports.smgrsetowner)(e,t),_RelationGetNumberOfBlocksInFork=Module._RelationGetNumberOfBlocksInFork=(e,t)=>(_RelationGetNumberOfBlocksInFork=Module._RelationGetNumberOfBlocksInFork=wasmExports.RelationGetNumberOfBlocksInFork)(e,t),_ReleaseBuffer=Module._ReleaseBuffer=e=>(_ReleaseBuffer=Module._ReleaseBuffer=wasmExports.ReleaseBuffer)(e),_GetRecordedFreeSpace=Module._GetRecordedFreeSpace=(e,t)=>(_GetRecordedFreeSpace=Module._GetRecordedFreeSpace=wasmExports.GetRecordedFreeSpace)(e,t),_smgrexists=Module._smgrexists=(e,t)=>(_smgrexists=Module._smgrexists=wasmExports.smgrexists)(e,t),_ReadBufferExtended=Module._ReadBufferExtended=(e,t,r,a,o)=>(_ReadBufferExtended=Module._ReadBufferExtended=wasmExports.ReadBufferExtended)(e,t,r,a,o),_MarkBufferDirty=Module._MarkBufferDirty=e=>(_MarkBufferDirty=Module._MarkBufferDirty=wasmExports.MarkBufferDirty)(e),_log_newpage_buffer=Module._log_newpage_buffer=(e,t)=>(_log_newpage_buffer=Module._log_newpage_buffer=wasmExports.log_newpage_buffer)(e,t),_copy_file=Module._copy_file=(e,t)=>(_copy_file=Module._copy_file=wasmExports.copy_file)(e,t),_fd_fsync_fname=Module._fd_fsync_fname=(e,t)=>(_fd_fsync_fname=Module._fd_fsync_fname=wasmExports.fd_fsync_fname)(e,t),_OpenTransientFile=Module._OpenTransientFile=(e,t)=>(_OpenTransientFile=Module._OpenTransientFile=wasmExports.OpenTransientFile)(e,t),_CloseTransientFile=Module._CloseTransientFile=e=>(_CloseTransientFile=Module._CloseTransientFile=wasmExports.CloseTransientFile)(e),_hash_bytes=Module._hash_bytes=(e,t)=>(_hash_bytes=Module._hash_bytes=wasmExports.hash_bytes)(e,t),_pstrdup=Module._pstrdup=e=>(_pstrdup=Module._pstrdup=wasmExports.pstrdup)(e),_repalloc=Module._repalloc=(e,t)=>(_repalloc=Module._repalloc=wasmExports.repalloc)(e,t),_wasm_OpenPipeStream=Module._wasm_OpenPipeStream=(e,t)=>(_wasm_OpenPipeStream=Module._wasm_OpenPipeStream=wasmExports.wasm_OpenPipeStream)(e,t),_access=Module._access=(e,t)=>(_access=Module._access=wasmExports.access)(e,t),_fopen=Module._fopen=(e,t)=>(_fopen=Module._fopen=wasmExports.fopen)(e,t),_fiprintf=Module._fiprintf=(e,t,r)=>(_fiprintf=Module._fiprintf=wasmExports.fiprintf)(e,t,r),_fclose=Module._fclose=e=>(_fclose=Module._fclose=wasmExports.fclose)(e),_fsync_fname_ext=Module._fsync_fname_ext=(e,t,r,a)=>(_fsync_fname_ext=Module._fsync_fname_ext=wasmExports.fsync_fname_ext)(e,t,r,a),_fd_durable_rename=Module._fd_durable_rename=(e,t,r)=>(_fd_durable_rename=Module._fd_durable_rename=wasmExports.fd_durable_rename)(e,t,r),_rename=Module._rename=(e,t)=>(_rename=Module._rename=wasmExports.rename)(e,t),_strlcpy=Module._strlcpy=(e,t,r)=>(_strlcpy=Module._strlcpy=wasmExports.strlcpy)(e,t,r),_dup=Module._dup=e=>(_dup=Module._dup=wasmExports.dup)(e),_open=Module._open=(e,t,r)=>(_open=Module._open=wasmExports.open)(e,t,r),_AcquireExternalFD=Module._AcquireExternalFD=()=>(_AcquireExternalFD=Module._AcquireExternalFD=wasmExports.AcquireExternalFD)(),_realloc=Module._realloc=(e,t)=>(_realloc=Module._realloc=wasmExports.realloc)(e,t),_stat=Module._stat=(e,t)=>(_stat=Module._stat=wasmExports.stat)(e,t),_pwrite=Module._pwrite=(e,t,r,a)=>(_pwrite=Module._pwrite=wasmExports.pwrite)(e,t,r,a),_lseek=Module._lseek=(e,t,r)=>(_lseek=Module._lseek=wasmExports.lseek)(e,t,r),_AllocateFile=Module._AllocateFile=(e,t)=>(_AllocateFile=Module._AllocateFile=wasmExports.AllocateFile)(e,t),_GetCurrentSubTransactionId=Module._GetCurrentSubTransactionId=()=>(_GetCurrentSubTransactionId=Module._GetCurrentSubTransactionId=wasmExports.GetCurrentSubTransactionId)(),_FreeFile=Module._FreeFile=e=>(_FreeFile=Module._FreeFile=wasmExports.FreeFile)(e),_pclose=Module._pclose=e=>(_pclose=Module._pclose=wasmExports.pclose)(e),_ClosePipeStream=Module._ClosePipeStream=e=>(_ClosePipeStream=Module._ClosePipeStream=wasmExports.ClosePipeStream)(e),_pg_prng_uint64_range=Module._pg_prng_uint64_range=(e,t,r)=>(_pg_prng_uint64_range=Module._pg_prng_uint64_range=wasmExports.pg_prng_uint64_range)(e,t,r),_AtEOSubXact_Files=Module._AtEOSubXact_Files=(e,t,r)=>(_AtEOSubXact_Files=Module._AtEOSubXact_Files=wasmExports.AtEOSubXact_Files)(e,t,r),_pre_format_elog_string=Module._pre_format_elog_string=(e,t)=>(_pre_format_elog_string=Module._pre_format_elog_string=wasmExports.pre_format_elog_string)(e,t),_format_elog_string=Module._format_elog_string=(e,t)=>(_format_elog_string=Module._format_elog_string=wasmExports.format_elog_string)(e,t),_list_free=Module._list_free=e=>(_list_free=Module._list_free=wasmExports.list_free)(e),_guc_malloc=Module._guc_malloc=(e,t)=>(_guc_malloc=Module._guc_malloc=wasmExports.guc_malloc)(e,t),_MemoryContextDelete=Module._MemoryContextDelete=e=>(_MemoryContextDelete=Module._MemoryContextDelete=wasmExports.MemoryContextDelete)(e),_strtoul=Module._strtoul=(e,t,r)=>(_strtoul=Module._strtoul=wasmExports.strtoul)(e,t,r),_hash_get_num_entries=Module._hash_get_num_entries=e=>(_hash_get_num_entries=Module._hash_get_num_entries=wasmExports.hash_get_num_entries)(e),_LWLockInitialize=Module._LWLockInitialize=(e,t)=>(_LWLockInitialize=Module._LWLockInitialize=wasmExports.LWLockInitialize)(e,t),_PrefetchBuffer=Module._PrefetchBuffer=(e,t,r,a)=>(_PrefetchBuffer=Module._PrefetchBuffer=wasmExports.PrefetchBuffer)(e,t,r,a),_LockBufHdr=Module._LockBufHdr=e=>(_LockBufHdr=Module._LockBufHdr=wasmExports.LockBufHdr)(e),_ReadBuffer=Module._ReadBuffer=(e,t)=>(_ReadBuffer=Module._ReadBuffer=wasmExports.ReadBuffer)(e,t),_pgstat_assoc_relation=Module._pgstat_assoc_relation=e=>(_pgstat_assoc_relation=Module._pgstat_assoc_relation=wasmExports.pgstat_assoc_relation)(e),_ExtendBufferedRel=Module._ExtendBufferedRel=(e,t,r,a)=>(_ExtendBufferedRel=Module._ExtendBufferedRel=wasmExports.ExtendBufferedRel)(e,t,r,a),_LockBufferForCleanup=Module._LockBufferForCleanup=e=>(_LockBufferForCleanup=Module._LockBufferForCleanup=wasmExports.LockBufferForCleanup)(e),_smgrread=Module._smgrread=(e,t,r,a)=>(_smgrread=Module._smgrread=wasmExports.smgrread)(e,t,r,a),_LockRelationForExtension=Module._LockRelationForExtension=(e,t)=>(_LockRelationForExtension=Module._LockRelationForExtension=wasmExports.LockRelationForExtension)(e,t),_UnlockRelationForExtension=Module._UnlockRelationForExtension=(e,t)=>(_UnlockRelationForExtension=Module._UnlockRelationForExtension=wasmExports.UnlockRelationForExtension)(e,t),_BufferGetBlockNumber=Module._BufferGetBlockNumber=e=>(_BufferGetBlockNumber=Module._BufferGetBlockNumber=wasmExports.BufferGetBlockNumber)(e),_bsearch=Module._bsearch=(e,t,r,a,o)=>(_bsearch=Module._bsearch=wasmExports.bsearch)(e,t,r,a,o),_set_errcontext_domain=Module._set_errcontext_domain=e=>(_set_errcontext_domain=Module._set_errcontext_domain=wasmExports.set_errcontext_domain)(e),_errcontext_msg=Module._errcontext_msg=(e,t)=>(_errcontext_msg=Module._errcontext_msg=wasmExports.errcontext_msg)(e,t),_GetAccessStrategy=Module._GetAccessStrategy=e=>(_GetAccessStrategy=Module._GetAccessStrategy=wasmExports.GetAccessStrategy)(e),_FreeAccessStrategy=Module._FreeAccessStrategy=e=>(_FreeAccessStrategy=Module._FreeAccessStrategy=wasmExports.FreeAccessStrategy)(e),_ConditionalLockBuffer=Module._ConditionalLockBuffer=e=>(_ConditionalLockBuffer=Module._ConditionalLockBuffer=wasmExports.ConditionalLockBuffer)(e),_TestForOldSnapshot_impl=Module._TestForOldSnapshot_impl=(e,t)=>(_TestForOldSnapshot_impl=Module._TestForOldSnapshot_impl=wasmExports.TestForOldSnapshot_impl)(e,t),_calloc=Module._calloc=(e,t)=>(_calloc=Module._calloc=wasmExports.calloc)(e,t),_have_free_buffer=Module._have_free_buffer=()=>(_have_free_buffer=Module._have_free_buffer=wasmExports.have_free_buffer)(),_palloc0=Module._palloc0=e=>(_palloc0=Module._palloc0=wasmExports.palloc0)(e),_resetStringInfo=Module._resetStringInfo=e=>(_resetStringInfo=Module._resetStringInfo=wasmExports.resetStringInfo)(e),_appendStringInfoChar=Module._appendStringInfoChar=(e,t)=>(_appendStringInfoChar=Module._appendStringInfoChar=wasmExports.appendStringInfoChar)(e,t),_appendBinaryStringInfo=Module._appendBinaryStringInfo=(e,t,r)=>(_appendBinaryStringInfo=Module._appendBinaryStringInfo=wasmExports.appendBinaryStringInfo)(e,t,r),_errdetail_internal=Module._errdetail_internal=(e,t)=>(_errdetail_internal=Module._errdetail_internal=wasmExports.errdetail_internal)(e,t),_strcpy=Module._strcpy=(e,t)=>(_strcpy=Module._strcpy=wasmExports.strcpy)(e,t),_LWLockRegisterTranche=Module._LWLockRegisterTranche=(e,t)=>(_LWLockRegisterTranche=Module._LWLockRegisterTranche=wasmExports.LWLockRegisterTranche)(e,t),_GetNamedLWLockTranche=Module._GetNamedLWLockTranche=e=>(_GetNamedLWLockTranche=Module._GetNamedLWLockTranche=wasmExports.GetNamedLWLockTranche)(e),_LWLockNewTrancheId=Module._LWLockNewTrancheId=()=>(_LWLockNewTrancheId=Module._LWLockNewTrancheId=wasmExports.LWLockNewTrancheId)(),_RequestNamedLWLockTranche=Module._RequestNamedLWLockTranche=(e,t)=>(_RequestNamedLWLockTranche=Module._RequestNamedLWLockTranche=wasmExports.RequestNamedLWLockTranche)(e,t),_pg_prng_double=Module._pg_prng_double=e=>(_pg_prng_double=Module._pg_prng_double=wasmExports.pg_prng_double)(e),_getpid=Module._getpid=()=>(_getpid=Module._getpid=wasmExports.getpid)(),_GetTransactionSnapshot=Module._GetTransactionSnapshot=()=>(_GetTransactionSnapshot=Module._GetTransactionSnapshot=wasmExports.GetTransactionSnapshot)(),_ConditionVariableSignal=Module._ConditionVariableSignal=e=>(_ConditionVariableSignal=Module._ConditionVariableSignal=wasmExports.ConditionVariableSignal)(e),_LockPage=Module._LockPage=(e,t,r)=>(_LockPage=Module._LockPage=wasmExports.LockPage)(e,t,r),_UnlockPage=Module._UnlockPage=(e,t,r)=>(_UnlockPage=Module._UnlockPage=wasmExports.UnlockPage)(e,t,r),_pgstat_progress_update_param=Module._pgstat_progress_update_param=(e,t)=>(_pgstat_progress_update_param=Module._pgstat_progress_update_param=wasmExports.pgstat_progress_update_param)(e,t),_list_make1_impl=Module._list_make1_impl=(e,t)=>(_list_make1_impl=Module._list_make1_impl=wasmExports.list_make1_impl)(e,t),_psprintf=Module._psprintf=(e,t)=>(_psprintf=Module._psprintf=wasmExports.psprintf)(e,t),_smgrtruncate=Module._smgrtruncate=(e,t,r,a)=>(_smgrtruncate=Module._smgrtruncate=wasmExports.smgrtruncate)(e,t,r,a),_log=Module._log=e=>(_log=Module._log=wasmExports.log)(e),_pairingheap_allocate=Module._pairingheap_allocate=(e,t)=>(_pairingheap_allocate=Module._pairingheap_allocate=wasmExports.pairingheap_allocate)(e,t),_pairingheap_add=Module._pairingheap_add=(e,t)=>(_pairingheap_add=Module._pairingheap_add=wasmExports.pairingheap_add)(e,t),_pairingheap_first=Module._pairingheap_first=e=>(_pairingheap_first=Module._pairingheap_first=wasmExports.pairingheap_first)(e),_pairingheap_remove_first=Module._pairingheap_remove_first=e=>(_pairingheap_remove_first=Module._pairingheap_remove_first=wasmExports.pairingheap_remove_first)(e),_bloom_create=Module._bloom_create=(e,t,r)=>(_bloom_create=Module._bloom_create=wasmExports.bloom_create)(e,t,r),_bloom_free=Module._bloom_free=e=>(_bloom_free=Module._bloom_free=wasmExports.bloom_free)(e),_bloom_add_element=Module._bloom_add_element=(e,t,r)=>(_bloom_add_element=Module._bloom_add_element=wasmExports.bloom_add_element)(e,t,r),_hash_bytes_extended=Module._hash_bytes_extended=(e,t,r)=>(_hash_bytes_extended=Module._hash_bytes_extended=wasmExports.hash_bytes_extended)(e,t,r),_bloom_lacks_element=Module._bloom_lacks_element=(e,t,r)=>(_bloom_lacks_element=Module._bloom_lacks_element=wasmExports.bloom_lacks_element)(e,t,r),_bloom_prop_bits_set=Module._bloom_prop_bits_set=e=>(_bloom_prop_bits_set=Module._bloom_prop_bits_set=wasmExports.bloom_prop_bits_set)(e),_pg_popcount=Module._pg_popcount=(e,t)=>(_pg_popcount=Module._pg_popcount=wasmExports.pg_popcount)(e,t),_memcmp=Module._memcmp=(e,t,r)=>(_memcmp=Module._memcmp=wasmExports.memcmp)(e,t,r),_bms_make_singleton=Module._bms_make_singleton=e=>(_bms_make_singleton=Module._bms_make_singleton=wasmExports.bms_make_singleton)(e),_bms_add_members=Module._bms_add_members=(e,t)=>(_bms_add_members=Module._bms_add_members=wasmExports.bms_add_members)(e,t),_bms_add_member=Module._bms_add_member=(e,t)=>(_bms_add_member=Module._bms_add_member=wasmExports.bms_add_member)(e,t),_bms_del_member=Module._bms_del_member=(e,t)=>(_bms_del_member=Module._bms_del_member=wasmExports.bms_del_member)(e,t),_check_stack_depth=Module._check_stack_depth=()=>(_check_stack_depth=Module._check_stack_depth=wasmExports.check_stack_depth)(),_parser_errposition=Module._parser_errposition=(e,t)=>(_parser_errposition=Module._parser_errposition=wasmExports.parser_errposition)(e,t),_makeVar=Module._makeVar=(e,t,r,a,o,s)=>(_makeVar=Module._makeVar=wasmExports.makeVar)(e,t,r,a,o,s),_bms_union=Module._bms_union=(e,t)=>(_bms_union=Module._bms_union=wasmExports.bms_union)(e,t),_varstr_levenshtein_less_equal=Module._varstr_levenshtein_less_equal=(e,t,r,a,o,s,l,n,_)=>(_varstr_levenshtein_less_equal=Module._varstr_levenshtein_less_equal=wasmExports.varstr_levenshtein_less_equal)(e,t,r,a,o,s,l,n,_),_SearchSysCacheExists=Module._SearchSysCacheExists=(e,t,r,a,o)=>(_SearchSysCacheExists=Module._SearchSysCacheExists=wasmExports.SearchSysCacheExists)(e,t,r,a,o),_MemoryContextAllocZeroAligned=Module._MemoryContextAllocZeroAligned=(e,t)=>(_MemoryContextAllocZeroAligned=Module._MemoryContextAllocZeroAligned=wasmExports.MemoryContextAllocZeroAligned)(e,t),_makeString=Module._makeString=e=>(_makeString=Module._makeString=wasmExports.makeString)(e),_addRTEPermissionInfo=Module._addRTEPermissionInfo=(e,t)=>(_addRTEPermissionInfo=Module._addRTEPermissionInfo=wasmExports.addRTEPermissionInfo)(e,t),_copyObjectImpl=Module._copyObjectImpl=e=>(_copyObjectImpl=Module._copyObjectImpl=wasmExports.copyObjectImpl)(e),_exprType=Module._exprType=e=>(_exprType=Module._exprType=wasmExports.exprType)(e),_lappend_oid=Module._lappend_oid=(e,t)=>(_lappend_oid=Module._lappend_oid=wasmExports.lappend_oid)(e,t),_exprTypmod=Module._exprTypmod=e=>(_exprTypmod=Module._exprTypmod=wasmExports.exprTypmod)(e),_exprLocation=Module._exprLocation=e=>(_exprLocation=Module._exprLocation=wasmExports.exprLocation)(e),_CreateTemplateTupleDesc=Module._CreateTemplateTupleDesc=e=>(_CreateTemplateTupleDesc=Module._CreateTemplateTupleDesc=wasmExports.CreateTemplateTupleDesc)(e),_TupleDescInitEntry=Module._TupleDescInitEntry=(e,t,r,a,o,s)=>(_TupleDescInitEntry=Module._TupleDescInitEntry=wasmExports.TupleDescInitEntry)(e,t,r,a,o,s),_TupleDescInitEntryCollation=Module._TupleDescInitEntryCollation=(e,t,r)=>(_TupleDescInitEntryCollation=Module._TupleDescInitEntryCollation=wasmExports.TupleDescInitEntryCollation)(e,t,r),_typenameTypeIdAndMod=Module._typenameTypeIdAndMod=(e,t,r,a)=>(_typenameTypeIdAndMod=Module._typenameTypeIdAndMod=wasmExports.typenameTypeIdAndMod)(e,t,r,a),_format_type_be=Module._format_type_be=e=>(_format_type_be=Module._format_type_be=wasmExports.format_type_be)(e),_list_concat=Module._list_concat=(e,t)=>(_list_concat=Module._list_concat=wasmExports.list_concat)(e,t),_list_copy=Module._list_copy=e=>(_list_copy=Module._list_copy=wasmExports.list_copy)(e),_relation_open=Module._relation_open=(e,t)=>(_relation_open=Module._relation_open=wasmExports.relation_open)(e,t),_relation_close=Module._relation_close=(e,t)=>(_relation_close=Module._relation_close=wasmExports.relation_close)(e,t),_makeTargetEntry=Module._makeTargetEntry=(e,t,r,a)=>(_makeTargetEntry=Module._makeTargetEntry=wasmExports.makeTargetEntry)(e,t,r,a),_get_attname=Module._get_attname=(e,t,r)=>(_get_attname=Module._get_attname=wasmExports.get_attname)(e,t,r),_SearchSysCache2=Module._SearchSysCache2=(e,t,r)=>(_SearchSysCache2=Module._SearchSysCache2=wasmExports.SearchSysCache2)(e,t,r),_ReleaseSysCache=Module._ReleaseSysCache=e=>(_ReleaseSysCache=Module._ReleaseSysCache=wasmExports.ReleaseSysCache)(e),_RangeVarGetRelidExtended=Module._RangeVarGetRelidExtended=(e,t,r,a,o)=>(_RangeVarGetRelidExtended=Module._RangeVarGetRelidExtended=wasmExports.RangeVarGetRelidExtended)(e,t,r,a,o),_pg_mbstrlen_with_len=Module._pg_mbstrlen_with_len=(e,t)=>(_pg_mbstrlen_with_len=Module._pg_mbstrlen_with_len=wasmExports.pg_mbstrlen_with_len)(e,t),_errposition=Module._errposition=e=>(_errposition=Module._errposition=wasmExports.errposition)(e),_numeric_in=Module._numeric_in=e=>(_numeric_in=Module._numeric_in=wasmExports.numeric_in)(e),_DirectFunctionCall3Coll=Module._DirectFunctionCall3Coll=(e,t,r,a,o)=>(_DirectFunctionCall3Coll=Module._DirectFunctionCall3Coll=wasmExports.DirectFunctionCall3Coll)(e,t,r,a,o),_bit_in=Module._bit_in=e=>(_bit_in=Module._bit_in=wasmExports.bit_in)(e),_NameListToString=Module._NameListToString=e=>(_NameListToString=Module._NameListToString=wasmExports.NameListToString)(e),_appendStringInfoString=Module._appendStringInfoString=(e,t)=>(_appendStringInfoString=Module._appendStringInfoString=wasmExports.appendStringInfoString)(e,t),_lookup_type_cache=Module._lookup_type_cache=(e,t)=>(_lookup_type_cache=Module._lookup_type_cache=wasmExports.lookup_type_cache)(e,t),_CacheRegisterSyscacheCallback=Module._CacheRegisterSyscacheCallback=(e,t,r)=>(_CacheRegisterSyscacheCallback=Module._CacheRegisterSyscacheCallback=wasmExports.CacheRegisterSyscacheCallback)(e,t,r),_SearchSysCache1=Module._SearchSysCache1=(e,t)=>(_SearchSysCache1=Module._SearchSysCache1=wasmExports.SearchSysCache1)(e,t),_list_make2_impl=Module._list_make2_impl=(e,t,r)=>(_list_make2_impl=Module._list_make2_impl=wasmExports.list_make2_impl)(e,t,r),_get_base_element_type=Module._get_base_element_type=e=>(_get_base_element_type=Module._get_base_element_type=wasmExports.get_base_element_type)(e),_downcase_truncate_identifier=Module._downcase_truncate_identifier=(e,t,r)=>(_downcase_truncate_identifier=Module._downcase_truncate_identifier=wasmExports.downcase_truncate_identifier)(e,t,r),_pg_database_encoding_max_length=Module._pg_database_encoding_max_length=()=>(_pg_database_encoding_max_length=Module._pg_database_encoding_max_length=wasmExports.pg_database_encoding_max_length)(),_truncate_identifier=Module._truncate_identifier=(e,t,r)=>(_truncate_identifier=Module._truncate_identifier=wasmExports.truncate_identifier)(e,t,r),_scanner_isspace=Module._scanner_isspace=e=>(_scanner_isspace=Module._scanner_isspace=wasmExports.scanner_isspace)(e),_get_typcollation=Module._get_typcollation=e=>(_get_typcollation=Module._get_typcollation=wasmExports.get_typcollation)(e),_list_delete_cell=Module._list_delete_cell=(e,t)=>(_list_delete_cell=Module._list_delete_cell=wasmExports.list_delete_cell)(e,t),_makeTypeNameFromNameList=Module._makeTypeNameFromNameList=e=>(_makeTypeNameFromNameList=Module._makeTypeNameFromNameList=wasmExports.makeTypeNameFromNameList)(e),_SysCacheGetAttrNotNull=Module._SysCacheGetAttrNotNull=(e,t,r)=>(_SysCacheGetAttrNotNull=Module._SysCacheGetAttrNotNull=wasmExports.SysCacheGetAttrNotNull)(e,t,r),_text_to_cstring=Module._text_to_cstring=e=>(_text_to_cstring=Module._text_to_cstring=wasmExports.text_to_cstring)(e),_stringToNode=Module._stringToNode=e=>(_stringToNode=Module._stringToNode=wasmExports.stringToNode)(e),_bms_is_member=Module._bms_is_member=(e,t)=>(_bms_is_member=Module._bms_is_member=wasmExports.bms_is_member)(e,t),_bms_free=Module._bms_free=e=>(_bms_free=Module._bms_free=wasmExports.bms_free)(e),_core_yylex=Module._core_yylex=(e,t,r)=>(_core_yylex=Module._core_yylex=wasmExports.core_yylex)(e,t,r),_getc=Module._getc=e=>(_getc=Module._getc=wasmExports.getc)(e),_ferror=Module._ferror=e=>(_ferror=Module._ferror=wasmExports.ferror)(e),_fread=Module._fread=(e,t,r,a)=>(_fread=Module._fread=wasmExports.fread)(e,t,r,a),_clearerr=Module._clearerr=e=>(_clearerr=Module._clearerr=wasmExports.clearerr)(e),_scanner_init=Module._scanner_init=(e,t,r,a)=>(_scanner_init=Module._scanner_init=wasmExports.scanner_init)(e,t,r,a),_scanner_finish=Module._scanner_finish=e=>(_scanner_finish=Module._scanner_finish=wasmExports.scanner_finish)(e),_get_namespace_name=Module._get_namespace_name=e=>(_get_namespace_name=Module._get_namespace_name=wasmExports.get_namespace_name)(e),_lookup_rowtype_tupdesc=Module._lookup_rowtype_tupdesc=(e,t)=>(_lookup_rowtype_tupdesc=Module._lookup_rowtype_tupdesc=wasmExports.lookup_rowtype_tupdesc)(e,t),_DecrTupleDescRefCount=Module._DecrTupleDescRefCount=e=>(_DecrTupleDescRefCount=Module._DecrTupleDescRefCount=wasmExports.DecrTupleDescRefCount)(e),_relation_openrv=Module._relation_openrv=(e,t)=>(_relation_openrv=Module._relation_openrv=wasmExports.relation_openrv)(e,t),_errdetail_relkind_not_supported=Module._errdetail_relkind_not_supported=e=>(_errdetail_relkind_not_supported=Module._errdetail_relkind_not_supported=wasmExports.errdetail_relkind_not_supported)(e),_object_aclcheck=Module._object_aclcheck=(e,t,r,a)=>(_object_aclcheck=Module._object_aclcheck=wasmExports.object_aclcheck)(e,t,r,a),_aclcheck_error=Module._aclcheck_error=(e,t,r)=>(_aclcheck_error=Module._aclcheck_error=wasmExports.aclcheck_error)(e,t,r),_pg_class_aclcheck=Module._pg_class_aclcheck=(e,t,r)=>(_pg_class_aclcheck=Module._pg_class_aclcheck=wasmExports.pg_class_aclcheck)(e,t,r),_get_relkind_objtype=Module._get_relkind_objtype=e=>(_get_relkind_objtype=Module._get_relkind_objtype=wasmExports.get_relkind_objtype)(e),_list_make3_impl=Module._list_make3_impl=(e,t,r,a)=>(_list_make3_impl=Module._list_make3_impl=wasmExports.list_make3_impl)(e,t,r,a),_quote_qualified_identifier=Module._quote_qualified_identifier=(e,t)=>(_quote_qualified_identifier=Module._quote_qualified_identifier=wasmExports.quote_qualified_identifier)(e,t),_table_openrv=Module._table_openrv=(e,t)=>(_table_openrv=Module._table_openrv=wasmExports.table_openrv)(e,t),_equal=Module._equal=(e,t)=>(_equal=Module._equal=wasmExports.equal)(e,t),_RelationGetIndexList=Module._RelationGetIndexList=e=>(_RelationGetIndexList=Module._RelationGetIndexList=wasmExports.RelationGetIndexList)(e),_pg_detoast_datum=Module._pg_detoast_datum=e=>(_pg_detoast_datum=Module._pg_detoast_datum=wasmExports.pg_detoast_datum)(e),_SysCacheGetAttr=Module._SysCacheGetAttr=(e,t,r,a)=>(_SysCacheGetAttr=Module._SysCacheGetAttr=wasmExports.SysCacheGetAttr)(e,t,r,a),_deconstruct_array_builtin=Module._deconstruct_array_builtin=(e,t,r,a,o)=>(_deconstruct_array_builtin=Module._deconstruct_array_builtin=wasmExports.deconstruct_array_builtin)(e,t,r,a,o),_untransformRelOptions=Module._untransformRelOptions=e=>(_untransformRelOptions=Module._untransformRelOptions=wasmExports.untransformRelOptions)(e),_transformExpr=Module._transformExpr=(e,t,r)=>(_transformExpr=Module._transformExpr=wasmExports.transformExpr)(e,t,r),_get_rel_namespace=Module._get_rel_namespace=e=>(_get_rel_namespace=Module._get_rel_namespace=wasmExports.get_rel_namespace)(e),_get_rel_name=Module._get_rel_name=e=>(_get_rel_name=Module._get_rel_name=wasmExports.get_rel_name)(e),_makeRangeVar=Module._makeRangeVar=(e,t,r)=>(_makeRangeVar=Module._makeRangeVar=wasmExports.makeRangeVar)(e,t,r),_makeDefElem=Module._makeDefElem=(e,t,r)=>(_makeDefElem=Module._makeDefElem=wasmExports.makeDefElem)(e,t,r),_makeRangeVarFromNameList=Module._makeRangeVarFromNameList=e=>(_makeRangeVarFromNameList=Module._makeRangeVarFromNameList=wasmExports.makeRangeVarFromNameList)(e),_coerce_to_target_type=Module._coerce_to_target_type=(e,t,r,a,o,s,l,n)=>(_coerce_to_target_type=Module._coerce_to_target_type=wasmExports.coerce_to_target_type)(e,t,r,a,o,s,l,n),_LookupTypeName=Module._LookupTypeName=(e,t,r,a)=>(_LookupTypeName=Module._LookupTypeName=wasmExports.LookupTypeName)(e,t,r,a),_GetSysCacheOid=Module._GetSysCacheOid=(e,t,r,a,o,s)=>(_GetSysCacheOid=Module._GetSysCacheOid=wasmExports.GetSysCacheOid)(e,t,r,a,o,s),_construct_array_builtin=Module._construct_array_builtin=(e,t,r)=>(_construct_array_builtin=Module._construct_array_builtin=wasmExports.construct_array_builtin)(e,t,r),_get_collation_oid=Module._get_collation_oid=(e,t)=>(_get_collation_oid=Module._get_collation_oid=wasmExports.get_collation_oid)(e,t),_typeStringToTypeName=Module._typeStringToTypeName=(e,t)=>(_typeStringToTypeName=Module._typeStringToTypeName=wasmExports.typeStringToTypeName)(e,t),_raw_parser=Module._raw_parser=(e,t)=>(_raw_parser=Module._raw_parser=wasmExports.raw_parser)(e,t),_errsave_start=Module._errsave_start=(e,t)=>(_errsave_start=Module._errsave_start=wasmExports.errsave_start)(e,t),_errsave_finish=Module._errsave_finish=(e,t,r,a)=>(_errsave_finish=Module._errsave_finish=wasmExports.errsave_finish)(e,t,r,a),_defGetBoolean=Module._defGetBoolean=e=>(_defGetBoolean=Module._defGetBoolean=wasmExports.defGetBoolean)(e),_list_delete_last=Module._list_delete_last=e=>(_list_delete_last=Module._list_delete_last=wasmExports.list_delete_last)(e),_format_type_with_typemod=Module._format_type_with_typemod=(e,t)=>(_format_type_with_typemod=Module._format_type_with_typemod=wasmExports.format_type_with_typemod)(e,t),_list_member=Module._list_member=(e,t)=>(_list_member=Module._list_member=wasmExports.list_member)(e,t),_list_member_int=Module._list_member_int=(e,t)=>(_list_member_int=Module._list_member_int=wasmExports.list_member_int)(e,t),_list_sort=Module._list_sort=(e,t)=>(_list_sort=Module._list_sort=wasmExports.list_sort)(e,t),_get_element_type=Module._get_element_type=e=>(_get_element_type=Module._get_element_type=wasmExports.get_element_type)(e),_makeBoolean=Module._makeBoolean=e=>(_makeBoolean=Module._makeBoolean=wasmExports.makeBoolean)(e),_makeInteger=Module._makeInteger=e=>(_makeInteger=Module._makeInteger=wasmExports.makeInteger)(e),_makeTypeName=Module._makeTypeName=e=>(_makeTypeName=Module._makeTypeName=wasmExports.makeTypeName)(e),_list_make4_impl=Module._list_make4_impl=(e,t,r,a,o)=>(_list_make4_impl=Module._list_make4_impl=wasmExports.list_make4_impl)(e,t,r,a,o),_isxdigit=Module._isxdigit=e=>(_isxdigit=Module._isxdigit=wasmExports.isxdigit)(e),_strip_implicit_coercions=Module._strip_implicit_coercions=e=>(_strip_implicit_coercions=Module._strip_implicit_coercions=wasmExports.strip_implicit_coercions)(e),_SearchSysCacheList=Module._SearchSysCacheList=(e,t,r,a,o)=>(_SearchSysCacheList=Module._SearchSysCacheList=wasmExports.SearchSysCacheList)(e,t,r,a,o),_ReleaseCatCacheList=Module._ReleaseCatCacheList=e=>(_ReleaseCatCacheList=Module._ReleaseCatCacheList=wasmExports.ReleaseCatCacheList)(e),_get_sortgroupref_tle=Module._get_sortgroupref_tle=(e,t)=>(_get_sortgroupref_tle=Module._get_sortgroupref_tle=wasmExports.get_sortgroupref_tle)(e,t),_type_is_rowtype=Module._type_is_rowtype=e=>(_type_is_rowtype=Module._type_is_rowtype=wasmExports.type_is_rowtype)(e),_bms_next_member=Module._bms_next_member=(e,t)=>(_bms_next_member=Module._bms_next_member=wasmExports.bms_next_member)(e,t),_MemoryContextReset=Module._MemoryContextReset=e=>(_MemoryContextReset=Module._MemoryContextReset=wasmExports.MemoryContextReset)(e),_abort=Module._abort=()=>(_abort=Module._abort=wasmExports.abort)(),_heap_getnext=Module._heap_getnext=(e,t)=>(_heap_getnext=Module._heap_getnext=wasmExports.heap_getnext)(e,t),_OidOutputFunctionCall=Module._OidOutputFunctionCall=(e,t)=>(_OidOutputFunctionCall=Module._OidOutputFunctionCall=wasmExports.OidOutputFunctionCall)(e,t),_atoi=Module._atoi=e=>(_atoi=Module._atoi=wasmExports.atoi)(e),_GetConfigOption=Module._GetConfigOption=(e,t,r)=>(_GetConfigOption=Module._GetConfigOption=wasmExports.GetConfigOption)(e,t,r),_pg_strong_random=Module._pg_strong_random=(e,t)=>(_pg_strong_random=Module._pg_strong_random=wasmExports.pg_strong_random)(e,t),_pg_prng_seed_check=Module._pg_prng_seed_check=e=>(_pg_prng_seed_check=Module._pg_prng_seed_check=wasmExports.pg_prng_seed_check)(e),_pg_prng_seed=Module._pg_prng_seed=(e,t)=>(_pg_prng_seed=Module._pg_prng_seed=wasmExports.pg_prng_seed)(e,t),_fputc=Module._fputc=(e,t)=>(_fputc=Module._fputc=wasmExports.fputc)(e,t),_time=Module._time=e=>(_time=Module._time=wasmExports.time)(e),_TimestampDifferenceMilliseconds=Module._TimestampDifferenceMilliseconds=(e,t)=>(_TimestampDifferenceMilliseconds=Module._TimestampDifferenceMilliseconds=wasmExports.TimestampDifferenceMilliseconds)(e,t),_ProcessConfigFile=Module._ProcessConfigFile=e=>(_ProcessConfigFile=Module._ProcessConfigFile=wasmExports.ProcessConfigFile)(e),_send=Module._send=(e,t,r,a)=>(_send=Module._send=wasmExports.send)(e,t,r,a),_parse_bool=Module._parse_bool=(e,t)=>(_parse_bool=Module._parse_bool=wasmExports.parse_bool)(e,t),_enlargeStringInfo=Module._enlargeStringInfo=(e,t)=>(_enlargeStringInfo=Module._enlargeStringInfo=wasmExports.enlargeStringInfo)(e,t),_BackgroundWorkerInitializeConnectionByOid=Module._BackgroundWorkerInitializeConnectionByOid=(e,t,r)=>(_BackgroundWorkerInitializeConnectionByOid=Module._BackgroundWorkerInitializeConnectionByOid=wasmExports.BackgroundWorkerInitializeConnectionByOid)(e,t,r),_BackgroundWorkerUnblockSignals=Module._BackgroundWorkerUnblockSignals=()=>(_BackgroundWorkerUnblockSignals=Module._BackgroundWorkerUnblockSignals=wasmExports.BackgroundWorkerUnblockSignals)(),_pg_getnameinfo_all=Module._pg_getnameinfo_all=(e,t,r,a,o,s,l)=>(_pg_getnameinfo_all=Module._pg_getnameinfo_all=wasmExports.pg_getnameinfo_all)(e,t,r,a,o,s,l),_gai_strerror=Module._gai_strerror=e=>(_gai_strerror=Module._gai_strerror=wasmExports.gai_strerror)(e),_SignalHandlerForConfigReload=Module._SignalHandlerForConfigReload=e=>(_SignalHandlerForConfigReload=Module._SignalHandlerForConfigReload=wasmExports.SignalHandlerForConfigReload)(e),_fwrite=Module._fwrite=(e,t,r,a)=>(_fwrite=Module._fwrite=wasmExports.fwrite)(e,t,r,a),_SignalHandlerForShutdownRequest=Module._SignalHandlerForShutdownRequest=e=>(_SignalHandlerForShutdownRequest=Module._SignalHandlerForShutdownRequest=wasmExports.SignalHandlerForShutdownRequest)(e),_EmitErrorReport=Module._EmitErrorReport=()=>(_EmitErrorReport=Module._EmitErrorReport=wasmExports.EmitErrorReport)(),_FlushErrorState=Module._FlushErrorState=()=>(_FlushErrorState=Module._FlushErrorState=wasmExports.FlushErrorState)(),_die=Module._die=e=>(_die=Module._die=wasmExports.die)(e),_MultiXactIdPrecedes=Module._MultiXactIdPrecedes=(e,t)=>(_MultiXactIdPrecedes=Module._MultiXactIdPrecedes=wasmExports.MultiXactIdPrecedes)(e,t),_CreateTupleDescCopy=Module._CreateTupleDescCopy=e=>(_CreateTupleDescCopy=Module._CreateTupleDescCopy=wasmExports.CreateTupleDescCopy)(e),_pgstat_report_activity=Module._pgstat_report_activity=(e,t)=>(_pgstat_report_activity=Module._pgstat_report_activity=wasmExports.pgstat_report_activity)(e,t),_DirectFunctionCall2Coll=Module._DirectFunctionCall2Coll=(e,t,r,a)=>(_DirectFunctionCall2Coll=Module._DirectFunctionCall2Coll=wasmExports.DirectFunctionCall2Coll)(e,t,r,a),_RegisterBackgroundWorker=Module._RegisterBackgroundWorker=e=>(_RegisterBackgroundWorker=Module._RegisterBackgroundWorker=wasmExports.RegisterBackgroundWorker)(e),_RegisterDynamicBackgroundWorker=Module._RegisterDynamicBackgroundWorker=(e,t)=>(_RegisterDynamicBackgroundWorker=Module._RegisterDynamicBackgroundWorker=wasmExports.RegisterDynamicBackgroundWorker)(e,t),_WaitForBackgroundWorkerStartup=Module._WaitForBackgroundWorkerStartup=(e,t)=>(_WaitForBackgroundWorkerStartup=Module._WaitForBackgroundWorkerStartup=wasmExports.WaitForBackgroundWorkerStartup)(e,t),_WaitForBackgroundWorkerShutdown=Module._WaitForBackgroundWorkerShutdown=e=>(_WaitForBackgroundWorkerShutdown=Module._WaitForBackgroundWorkerShutdown=wasmExports.WaitForBackgroundWorkerShutdown)(e),_GetXLogReplayRecPtr=Module._GetXLogReplayRecPtr=e=>(_GetXLogReplayRecPtr=Module._GetXLogReplayRecPtr=wasmExports.GetXLogReplayRecPtr)(e),_gettimeofday=Module._gettimeofday=(e,t)=>(_gettimeofday=Module._gettimeofday=wasmExports.gettimeofday)(e,t),_sscanf=Module._sscanf=(e,t,r)=>(_sscanf=Module._sscanf=wasmExports.sscanf)(e,t,r),_get_call_result_type=Module._get_call_result_type=(e,t,r)=>(_get_call_result_type=Module._get_call_result_type=wasmExports.get_call_result_type)(e,t,r),_HeapTupleHeaderGetDatum=Module._HeapTupleHeaderGetDatum=e=>(_HeapTupleHeaderGetDatum=Module._HeapTupleHeaderGetDatum=wasmExports.HeapTupleHeaderGetDatum)(e),_wal_segment_close=Module._wal_segment_close=e=>(_wal_segment_close=Module._wal_segment_close=wasmExports.wal_segment_close)(e),_wal_segment_open=Module._wal_segment_open=(e,t,r)=>(_wal_segment_open=Module._wal_segment_open=wasmExports.wal_segment_open)(e,t,r),_GetFlushRecPtr=Module._GetFlushRecPtr=e=>(_GetFlushRecPtr=Module._GetFlushRecPtr=wasmExports.GetFlushRecPtr)(e),_XLogReadRecord=Module._XLogReadRecord=(e,t)=>(_XLogReadRecord=Module._XLogReadRecord=wasmExports.XLogReadRecord)(e,t),_RmgrNotFound=Module._RmgrNotFound=e=>(_RmgrNotFound=Module._RmgrNotFound=wasmExports.RmgrNotFound)(e),_CacheRegisterRelcacheCallback=Module._CacheRegisterRelcacheCallback=(e,t)=>(_CacheRegisterRelcacheCallback=Module._CacheRegisterRelcacheCallback=wasmExports.CacheRegisterRelcacheCallback)(e,t),_free_attrmap=Module._free_attrmap=e=>(_free_attrmap=Module._free_attrmap=wasmExports.free_attrmap)(e),_BuildIndexInfo=Module._BuildIndexInfo=e=>(_BuildIndexInfo=Module._BuildIndexInfo=wasmExports.BuildIndexInfo)(e),_hash_seq_term=Module._hash_seq_term=e=>(_hash_seq_term=Module._hash_seq_term=wasmExports.hash_seq_term)(e),_PushActiveSnapshot=Module._PushActiveSnapshot=e=>(_PushActiveSnapshot=Module._PushActiveSnapshot=wasmExports.PushActiveSnapshot)(e),_PopActiveSnapshot=Module._PopActiveSnapshot=()=>(_PopActiveSnapshot=Module._PopActiveSnapshot=wasmExports.PopActiveSnapshot)(),_MakePerTupleExprContext=Module._MakePerTupleExprContext=e=>(_MakePerTupleExprContext=Module._MakePerTupleExprContext=wasmExports.MakePerTupleExprContext)(e),_ExecInitExpr=Module._ExecInitExpr=(e,t)=>(_ExecInitExpr=Module._ExecInitExpr=wasmExports.ExecInitExpr)(e,t),_FreeExecutorState=Module._FreeExecutorState=e=>(_FreeExecutorState=Module._FreeExecutorState=wasmExports.FreeExecutorState)(e),_list_member_oid=Module._list_member_oid=(e,t)=>(_list_member_oid=Module._list_member_oid=wasmExports.list_member_oid)(e,t),_MemoryContextStrdup=Module._MemoryContextStrdup=(e,t)=>(_MemoryContextStrdup=Module._MemoryContextStrdup=wasmExports.MemoryContextStrdup)(e,t),_pq_getmsgint=Module._pq_getmsgint=(e,t)=>(_pq_getmsgint=Module._pq_getmsgint=wasmExports.pq_getmsgint)(e,t),_CreateExecutorState=Module._CreateExecutorState=()=>(_CreateExecutorState=Module._CreateExecutorState=wasmExports.CreateExecutorState)(),_ExecInitRangeTable=Module._ExecInitRangeTable=(e,t,r)=>(_ExecInitRangeTable=Module._ExecInitRangeTable=wasmExports.ExecInitRangeTable)(e,t,r),_getTypeInputInfo=Module._getTypeInputInfo=(e,t,r)=>(_getTypeInputInfo=Module._getTypeInputInfo=wasmExports.getTypeInputInfo)(e,t,r),_ExecStoreVirtualTuple=Module._ExecStoreVirtualTuple=e=>(_ExecStoreVirtualTuple=Module._ExecStoreVirtualTuple=wasmExports.ExecStoreVirtualTuple)(e),_execute_attr_map_slot=Module._execute_attr_map_slot=(e,t,r)=>(_execute_attr_map_slot=Module._execute_attr_map_slot=wasmExports.execute_attr_map_slot)(e,t,r),_slot_getsomeattrs_int=Module._slot_getsomeattrs_int=(e,t)=>(_slot_getsomeattrs_int=Module._slot_getsomeattrs_int=wasmExports.slot_getsomeattrs_int)(e,t),_GetUserNameFromId=Module._GetUserNameFromId=(e,t)=>(_GetUserNameFromId=Module._GetUserNameFromId=wasmExports.GetUserNameFromId)(e,t),_makeStringInfo=Module._makeStringInfo=()=>(_makeStringInfo=Module._makeStringInfo=wasmExports.makeStringInfo)(),_list_member_xid=Module._list_member_xid=(e,t)=>(_list_member_xid=Module._list_member_xid=wasmExports.list_member_xid)(e,t),_lappend_xid=Module._lappend_xid=(e,t)=>(_lappend_xid=Module._lappend_xid=wasmExports.lappend_xid)(e,t),_tuplestore_end=Module._tuplestore_end=e=>(_tuplestore_end=Module._tuplestore_end=wasmExports.tuplestore_end)(e),_quote_literal_cstr=Module._quote_literal_cstr=e=>(_quote_literal_cstr=Module._quote_literal_cstr=wasmExports.quote_literal_cstr)(e),_MakeSingleTupleTableSlot=Module._MakeSingleTupleTableSlot=(e,t)=>(_MakeSingleTupleTableSlot=Module._MakeSingleTupleTableSlot=wasmExports.MakeSingleTupleTableSlot)(e,t),_ExecDropSingleTupleTableSlot=Module._ExecDropSingleTupleTableSlot=e=>(_ExecDropSingleTupleTableSlot=Module._ExecDropSingleTupleTableSlot=wasmExports.ExecDropSingleTupleTableSlot)(e),_tuplestore_tuple_count=Module._tuplestore_tuple_count=e=>(_tuplestore_tuple_count=Module._tuplestore_tuple_count=wasmExports.tuplestore_tuple_count)(e),_quote_identifier=Module._quote_identifier=e=>(_quote_identifier=Module._quote_identifier=wasmExports.quote_identifier)(e),_BeginCopyFrom=Module._BeginCopyFrom=(e,t,r,a,o,s,l,n)=>(_BeginCopyFrom=Module._BeginCopyFrom=wasmExports.BeginCopyFrom)(e,t,r,a,o,s,l,n),_array_contains_nulls=Module._array_contains_nulls=e=>(_array_contains_nulls=Module._array_contains_nulls=wasmExports.array_contains_nulls)(e),_format_procedure=Module._format_procedure=e=>(_format_procedure=Module._format_procedure=wasmExports.format_procedure)(e),_pg_detoast_datum_packed=Module._pg_detoast_datum_packed=e=>(_pg_detoast_datum_packed=Module._pg_detoast_datum_packed=wasmExports.pg_detoast_datum_packed)(e),_cstring_to_text_with_len=Module._cstring_to_text_with_len=(e,t)=>(_cstring_to_text_with_len=Module._cstring_to_text_with_len=wasmExports.cstring_to_text_with_len)(e,t),_GenerationContextCreate=Module._GenerationContextCreate=(e,t,r,a,o)=>(_GenerationContextCreate=Module._GenerationContextCreate=wasmExports.GenerationContextCreate)(e,t,r,a,o),_BeginInternalSubTransaction=Module._BeginInternalSubTransaction=e=>(_BeginInternalSubTransaction=Module._BeginInternalSubTransaction=wasmExports.BeginInternalSubTransaction)(e),_RollbackAndReleaseCurrentSubTransaction=Module._RollbackAndReleaseCurrentSubTransaction=()=>(_RollbackAndReleaseCurrentSubTransaction=Module._RollbackAndReleaseCurrentSubTransaction=wasmExports.RollbackAndReleaseCurrentSubTransaction)(),_CopyErrorData=Module._CopyErrorData=()=>(_CopyErrorData=Module._CopyErrorData=wasmExports.CopyErrorData)(),_FreeErrorData=Module._FreeErrorData=e=>(_FreeErrorData=Module._FreeErrorData=wasmExports.FreeErrorData)(e),_RelidByRelfilenumber=Module._RelidByRelfilenumber=(e,t)=>(_RelidByRelfilenumber=Module._RelidByRelfilenumber=wasmExports.RelidByRelfilenumber)(e,t),_RelationIdGetRelation=Module._RelationIdGetRelation=e=>(_RelationIdGetRelation=Module._RelationIdGetRelation=wasmExports.RelationIdGetRelation)(e),_heap_deform_tuple=Module._heap_deform_tuple=(e,t,r,a)=>(_heap_deform_tuple=Module._heap_deform_tuple=wasmExports.heap_deform_tuple)(e,t,r,a),_RelationClose=Module._RelationClose=e=>(_RelationClose=Module._RelationClose=wasmExports.RelationClose)(e),_nocachegetattr=Module._nocachegetattr=(e,t,r)=>(_nocachegetattr=Module._nocachegetattr=wasmExports.nocachegetattr)(e,t,r),_XLogReaderAllocate=Module._XLogReaderAllocate=(e,t,r,a)=>(_XLogReaderAllocate=Module._XLogReaderAllocate=wasmExports.XLogReaderAllocate)(e,t,r,a),_XLogReaderFree=Module._XLogReaderFree=e=>(_XLogReaderFree=Module._XLogReaderFree=wasmExports.XLogReaderFree)(e),_OutputPluginPrepareWrite=Module._OutputPluginPrepareWrite=(e,t)=>(_OutputPluginPrepareWrite=Module._OutputPluginPrepareWrite=wasmExports.OutputPluginPrepareWrite)(e,t),_OutputPluginWrite=Module._OutputPluginWrite=(e,t)=>(_OutputPluginWrite=Module._OutputPluginWrite=wasmExports.OutputPluginWrite)(e,t),_OutputPluginUpdateProgress=Module._OutputPluginUpdateProgress=(e,t)=>(_OutputPluginUpdateProgress=Module._OutputPluginUpdateProgress=wasmExports.OutputPluginUpdateProgress)(e,t),_replorigin_by_oid=Module._replorigin_by_oid=(e,t,r)=>(_replorigin_by_oid=Module._replorigin_by_oid=wasmExports.replorigin_by_oid)(e,t,r),_logicalrep_write_begin=Module._logicalrep_write_begin=(e,t)=>(_logicalrep_write_begin=Module._logicalrep_write_begin=wasmExports.logicalrep_write_begin)(e,t),_logicalrep_write_commit=Module._logicalrep_write_commit=(e,t,r)=>(_logicalrep_write_commit=Module._logicalrep_write_commit=wasmExports.logicalrep_write_commit)(e,t,r),_logicalrep_write_begin_prepare=Module._logicalrep_write_begin_prepare=(e,t)=>(_logicalrep_write_begin_prepare=Module._logicalrep_write_begin_prepare=wasmExports.logicalrep_write_begin_prepare)(e,t),_logicalrep_write_prepare=Module._logicalrep_write_prepare=(e,t,r)=>(_logicalrep_write_prepare=Module._logicalrep_write_prepare=wasmExports.logicalrep_write_prepare)(e,t,r),_logicalrep_write_commit_prepared=Module._logicalrep_write_commit_prepared=(e,t,r)=>(_logicalrep_write_commit_prepared=Module._logicalrep_write_commit_prepared=wasmExports.logicalrep_write_commit_prepared)(e,t,r),_logicalrep_write_rollback_prepared=Module._logicalrep_write_rollback_prepared=(e,t,r,a)=>(_logicalrep_write_rollback_prepared=Module._logicalrep_write_rollback_prepared=wasmExports.logicalrep_write_rollback_prepared)(e,t,r,a),_logicalrep_write_stream_prepare=Module._logicalrep_write_stream_prepare=(e,t,r)=>(_logicalrep_write_stream_prepare=Module._logicalrep_write_stream_prepare=wasmExports.logicalrep_write_stream_prepare)(e,t,r),_logicalrep_write_origin=Module._logicalrep_write_origin=(e,t,r)=>(_logicalrep_write_origin=Module._logicalrep_write_origin=wasmExports.logicalrep_write_origin)(e,t,r),_logicalrep_write_insert=Module._logicalrep_write_insert=(e,t,r,a,o,s)=>(_logicalrep_write_insert=Module._logicalrep_write_insert=wasmExports.logicalrep_write_insert)(e,t,r,a,o,s),_logicalrep_write_update=Module._logicalrep_write_update=(e,t,r,a,o,s,l)=>(_logicalrep_write_update=Module._logicalrep_write_update=wasmExports.logicalrep_write_update)(e,t,r,a,o,s,l),_logicalrep_write_delete=Module._logicalrep_write_delete=(e,t,r,a,o,s)=>(_logicalrep_write_delete=Module._logicalrep_write_delete=wasmExports.logicalrep_write_delete)(e,t,r,a,o,s),_logicalrep_write_truncate=Module._logicalrep_write_truncate=(e,t,r,a,o,s)=>(_logicalrep_write_truncate=Module._logicalrep_write_truncate=wasmExports.logicalrep_write_truncate)(e,t,r,a,o,s),_logicalrep_write_message=Module._logicalrep_write_message=(e,t,r,a,o,s,l)=>(_logicalrep_write_message=Module._logicalrep_write_message=wasmExports.logicalrep_write_message)(e,t,r,a,o,s,l),_logicalrep_write_rel=Module._logicalrep_write_rel=(e,t,r,a)=>(_logicalrep_write_rel=Module._logicalrep_write_rel=wasmExports.logicalrep_write_rel)(e,t,r,a),_logicalrep_write_typ=Module._logicalrep_write_typ=(e,t,r)=>(_logicalrep_write_typ=Module._logicalrep_write_typ=wasmExports.logicalrep_write_typ)(e,t,r),_logicalrep_write_stream_start=Module._logicalrep_write_stream_start=(e,t,r)=>(_logicalrep_write_stream_start=Module._logicalrep_write_stream_start=wasmExports.logicalrep_write_stream_start)(e,t,r),_logicalrep_write_stream_stop=Module._logicalrep_write_stream_stop=e=>(_logicalrep_write_stream_stop=Module._logicalrep_write_stream_stop=wasmExports.logicalrep_write_stream_stop)(e),_logicalrep_write_stream_commit=Module._logicalrep_write_stream_commit=(e,t,r)=>(_logicalrep_write_stream_commit=Module._logicalrep_write_stream_commit=wasmExports.logicalrep_write_stream_commit)(e,t,r),_logicalrep_write_stream_abort=Module._logicalrep_write_stream_abort=(e,t,r,a,o,s)=>(_logicalrep_write_stream_abort=Module._logicalrep_write_stream_abort=wasmExports.logicalrep_write_stream_abort)(e,t,r,a,o,s),_ProcessWalRcvInterrupts=Module._ProcessWalRcvInterrupts=()=>(_ProcessWalRcvInterrupts=Module._ProcessWalRcvInterrupts=wasmExports.ProcessWalRcvInterrupts)(),_timestamptz_to_str=Module._timestamptz_to_str=e=>(_timestamptz_to_str=Module._timestamptz_to_str=wasmExports.timestamptz_to_str)(e),_GetDatabaseEncodingName=Module._GetDatabaseEncodingName=()=>(_GetDatabaseEncodingName=Module._GetDatabaseEncodingName=wasmExports.GetDatabaseEncodingName)(),_PQconnectStartParams=Module._PQconnectStartParams=(e,t,r)=>(_PQconnectStartParams=Module._PQconnectStartParams=wasmExports.PQconnectStartParams)(e,t,r),_PQstatus=Module._PQstatus=e=>(_PQstatus=Module._PQstatus=wasmExports.PQstatus)(e),_PQsocket=Module._PQsocket=e=>(_PQsocket=Module._PQsocket=wasmExports.PQsocket)(e),_PQconnectPoll=Module._PQconnectPoll=e=>(_PQconnectPoll=Module._PQconnectPoll=wasmExports.PQconnectPoll)(e),_PQconnectionUsedPassword=Module._PQconnectionUsedPassword=e=>(_PQconnectionUsedPassword=Module._PQconnectionUsedPassword=wasmExports.PQconnectionUsedPassword)(e),_PQfinish=Module._PQfinish=e=>(_PQfinish=Module._PQfinish=wasmExports.PQfinish)(e),_PQresultStatus=Module._PQresultStatus=e=>(_PQresultStatus=Module._PQresultStatus=wasmExports.PQresultStatus)(e),_PQclear=Module._PQclear=e=>(_PQclear=Module._PQclear=wasmExports.PQclear)(e),_PQerrorMessage=Module._PQerrorMessage=e=>(_PQerrorMessage=Module._PQerrorMessage=wasmExports.PQerrorMessage)(e),_pchomp=Module._pchomp=e=>(_pchomp=Module._pchomp=wasmExports.pchomp)(e),_PQnfields=Module._PQnfields=e=>(_PQnfields=Module._PQnfields=wasmExports.PQnfields)(e),_PQntuples=Module._PQntuples=e=>(_PQntuples=Module._PQntuples=wasmExports.PQntuples)(e),_PQgetvalue=Module._PQgetvalue=(e,t,r)=>(_PQgetvalue=Module._PQgetvalue=wasmExports.PQgetvalue)(e,t,r),_pg_strtoint32=Module._pg_strtoint32=e=>(_pg_strtoint32=Module._pg_strtoint32=wasmExports.pg_strtoint32)(e),_PQconsumeInput=Module._PQconsumeInput=e=>(_PQconsumeInput=Module._PQconsumeInput=wasmExports.PQconsumeInput)(e),_pg_lsn_in=Module._pg_lsn_in=e=>(_pg_lsn_in=Module._pg_lsn_in=wasmExports.pg_lsn_in)(e),_DirectFunctionCall1Coll=Module._DirectFunctionCall1Coll=(e,t,r)=>(_DirectFunctionCall1Coll=Module._DirectFunctionCall1Coll=wasmExports.DirectFunctionCall1Coll)(e,t,r),_PQgetisnull=Module._PQgetisnull=(e,t,r)=>(_PQgetisnull=Module._PQgetisnull=wasmExports.PQgetisnull)(e,t,r),_tuplestore_begin_heap=Module._tuplestore_begin_heap=(e,t,r)=>(_tuplestore_begin_heap=Module._tuplestore_begin_heap=wasmExports.tuplestore_begin_heap)(e,t,r),_TupleDescGetAttInMetadata=Module._TupleDescGetAttInMetadata=e=>(_TupleDescGetAttInMetadata=Module._TupleDescGetAttInMetadata=wasmExports.TupleDescGetAttInMetadata)(e),_BuildTupleFromCStrings=Module._BuildTupleFromCStrings=(e,t)=>(_BuildTupleFromCStrings=Module._BuildTupleFromCStrings=wasmExports.BuildTupleFromCStrings)(e,t),_tuplestore_puttuple=Module._tuplestore_puttuple=(e,t)=>(_tuplestore_puttuple=Module._tuplestore_puttuple=wasmExports.tuplestore_puttuple)(e,t),_PQresultErrorField=Module._PQresultErrorField=(e,t)=>(_PQresultErrorField=Module._PQresultErrorField=wasmExports.PQresultErrorField)(e,t),_PQsendQuery=Module._PQsendQuery=(e,t)=>(_PQsendQuery=Module._PQsendQuery=wasmExports.PQsendQuery)(e,t),_PQisBusy=Module._PQisBusy=e=>(_PQisBusy=Module._PQisBusy=wasmExports.PQisBusy)(e),_PQgetResult=Module._PQgetResult=e=>(_PQgetResult=Module._PQgetResult=wasmExports.PQgetResult)(e),_ResourceOwnerDelete=Module._ResourceOwnerDelete=e=>(_ResourceOwnerDelete=Module._ResourceOwnerDelete=wasmExports.ResourceOwnerDelete)(e),_CreateDestReceiver=Module._CreateDestReceiver=e=>(_CreateDestReceiver=Module._CreateDestReceiver=wasmExports.CreateDestReceiver)(e),_defGetString=Module._defGetString=e=>(_defGetString=Module._defGetString=wasmExports.defGetString)(e),_pg_md5_encrypt=Module._pg_md5_encrypt=(e,t,r,a,o)=>(_pg_md5_encrypt=Module._pg_md5_encrypt=wasmExports.pg_md5_encrypt)(e,t,r,a,o),_plain_crypt_verify=Module._plain_crypt_verify=(e,t,r,a)=>(_plain_crypt_verify=Module._plain_crypt_verify=wasmExports.plain_crypt_verify)(e,t,r,a),_pg_b64_enc_len=Module._pg_b64_enc_len=e=>(_pg_b64_enc_len=Module._pg_b64_enc_len=wasmExports.pg_b64_enc_len)(e),_pg_b64_encode=Module._pg_b64_encode=(e,t,r,a)=>(_pg_b64_encode=Module._pg_b64_encode=wasmExports.pg_b64_encode)(e,t,r,a),_pg_b64_dec_len=Module._pg_b64_dec_len=e=>(_pg_b64_dec_len=Module._pg_b64_dec_len=wasmExports.pg_b64_dec_len)(e),_pg_b64_decode=Module._pg_b64_decode=(e,t,r,a)=>(_pg_b64_decode=Module._pg_b64_decode=wasmExports.pg_b64_decode)(e,t,r,a),_pg_hmac_create=Module._pg_hmac_create=e=>(_pg_hmac_create=Module._pg_hmac_create=wasmExports.pg_hmac_create)(e),_pg_hmac_init=Module._pg_hmac_init=(e,t,r)=>(_pg_hmac_init=Module._pg_hmac_init=wasmExports.pg_hmac_init)(e,t,r),_pg_hmac_update=Module._pg_hmac_update=(e,t,r)=>(_pg_hmac_update=Module._pg_hmac_update=wasmExports.pg_hmac_update)(e,t,r),_pg_hmac_final=Module._pg_hmac_final=(e,t,r)=>(_pg_hmac_final=Module._pg_hmac_final=wasmExports.pg_hmac_final)(e,t,r),_pg_hmac_error=Module._pg_hmac_error=e=>(_pg_hmac_error=Module._pg_hmac_error=wasmExports.pg_hmac_error)(e),_pg_hmac_free=Module._pg_hmac_free=e=>(_pg_hmac_free=Module._pg_hmac_free=wasmExports.pg_hmac_free)(e),_scram_H=Module._scram_H=(e,t,r,a,o)=>(_scram_H=Module._scram_H=wasmExports.scram_H)(e,t,r,a,o),_pg_saslprep=Module._pg_saslprep=(e,t)=>(_pg_saslprep=Module._pg_saslprep=wasmExports.pg_saslprep)(e,t),_scram_build_secret=Module._scram_build_secret=(e,t,r,a,o,s,l)=>(_scram_build_secret=Module._scram_build_secret=wasmExports.scram_build_secret)(e,t,r,a,o,s,l),_scram_SaltedPassword=Module._scram_SaltedPassword=(e,t,r,a,o,s,l,n)=>(_scram_SaltedPassword=Module._scram_SaltedPassword=wasmExports.scram_SaltedPassword)(e,t,r,a,o,s,l,n),_scram_ServerKey=Module._scram_ServerKey=(e,t,r,a,o)=>(_scram_ServerKey=Module._scram_ServerKey=wasmExports.scram_ServerKey)(e,t,r,a,o),_strtol=Module._strtol=(e,t,r)=>(_strtol=Module._strtol=wasmExports.strtol)(e,t,r),_replace_percent_placeholders=Module._replace_percent_placeholders=(e,t,r,a)=>(_replace_percent_placeholders=Module._replace_percent_placeholders=wasmExports.replace_percent_placeholders)(e,t,r,a),_fgets=Module._fgets=(e,t,r)=>(_fgets=Module._fgets=wasmExports.fgets)(e,t,r),_explicit_bzero=Module._explicit_bzero=(e,t)=>(_explicit_bzero=Module._explicit_bzero=wasmExports.explicit_bzero)(e,t),_wait_result_to_str=Module._wait_result_to_str=e=>(_wait_result_to_str=Module._wait_result_to_str=wasmExports.wait_result_to_str)(e),_pg_strip_crlf=Module._pg_strip_crlf=e=>(_pg_strip_crlf=Module._pg_strip_crlf=wasmExports.pg_strip_crlf)(e),_geteuid=Module._geteuid=()=>(_geteuid=Module._geteuid=wasmExports.geteuid)(),_getpeereid=Module._getpeereid=(e,t,r)=>(_getpeereid=Module._getpeereid=wasmExports.getpeereid)(e,t,r),_pg_getaddrinfo_all=Module._pg_getaddrinfo_all=(e,t,r,a)=>(_pg_getaddrinfo_all=Module._pg_getaddrinfo_all=wasmExports.pg_getaddrinfo_all)(e,t,r,a),_socket=Module._socket=(e,t,r)=>(_socket=Module._socket=wasmExports.socket)(e,t,r),_connect=Module._connect=(e,t,r)=>(_connect=Module._connect=wasmExports.connect)(e,t,r),_recv=Module._recv=(e,t,r,a)=>(_recv=Module._recv=wasmExports.recv)(e,t,r,a),_pg_freeaddrinfo_all=Module._pg_freeaddrinfo_all=(e,t)=>(_pg_freeaddrinfo_all=Module._pg_freeaddrinfo_all=wasmExports.pg_freeaddrinfo_all)(e,t),_pq_sendtext=Module._pq_sendtext=(e,t,r)=>(_pq_sendtext=Module._pq_sendtext=wasmExports.pq_sendtext)(e,t,r),_pq_sendfloat4=Module._pq_sendfloat4=(e,t)=>(_pq_sendfloat4=Module._pq_sendfloat4=wasmExports.pq_sendfloat4)(e,t),_pq_sendfloat8=Module._pq_sendfloat8=(e,t)=>(_pq_sendfloat8=Module._pq_sendfloat8=wasmExports.pq_sendfloat8)(e,t),_pq_begintypsend=Module._pq_begintypsend=e=>(_pq_begintypsend=Module._pq_begintypsend=wasmExports.pq_begintypsend)(e),_pq_endtypsend=Module._pq_endtypsend=e=>(_pq_endtypsend=Module._pq_endtypsend=wasmExports.pq_endtypsend)(e),_pq_getmsgfloat4=Module._pq_getmsgfloat4=e=>(_pq_getmsgfloat4=Module._pq_getmsgfloat4=wasmExports.pq_getmsgfloat4)(e),_pq_getmsgfloat8=Module._pq_getmsgfloat8=e=>(_pq_getmsgfloat8=Module._pq_getmsgfloat8=wasmExports.pq_getmsgfloat8)(e),_pq_getmsgtext=Module._pq_getmsgtext=(e,t,r)=>(_pq_getmsgtext=Module._pq_getmsgtext=wasmExports.pq_getmsgtext)(e,t,r),_feof=Module._feof=e=>(_feof=Module._feof=wasmExports.feof)(e),_pg_mb2wchar_with_len=Module._pg_mb2wchar_with_len=(e,t,r)=>(_pg_mb2wchar_with_len=Module._pg_mb2wchar_with_len=wasmExports.pg_mb2wchar_with_len)(e,t,r),_pg_regcomp=Module._pg_regcomp=(e,t,r,a,o)=>(_pg_regcomp=Module._pg_regcomp=wasmExports.pg_regcomp)(e,t,r,a,o),_pg_regerror=Module._pg_regerror=(e,t,r,a)=>(_pg_regerror=Module._pg_regerror=wasmExports.pg_regerror)(e,t,r,a),_get_role_oid=Module._get_role_oid=(e,t)=>(_get_role_oid=Module._get_role_oid=wasmExports.get_role_oid)(e,t),_strcat=Module._strcat=(e,t)=>(_strcat=Module._strcat=wasmExports.strcat)(e,t),_sigemptyset=Module._sigemptyset=e=>(_sigemptyset=Module._sigemptyset=wasmExports.sigemptyset)(e),_be_lo_unlink=Module._be_lo_unlink=e=>(_be_lo_unlink=Module._be_lo_unlink=wasmExports.be_lo_unlink)(e),_object_ownercheck=Module._object_ownercheck=(e,t,r)=>(_object_ownercheck=Module._object_ownercheck=wasmExports.object_ownercheck)(e,t,r),_text_to_cstring_buffer=Module._text_to_cstring_buffer=(e,t,r)=>(_text_to_cstring_buffer=Module._text_to_cstring_buffer=wasmExports.text_to_cstring_buffer)(e,t,r),_setsockopt=Module._setsockopt=(e,t,r,a,o)=>(_setsockopt=Module._setsockopt=wasmExports.setsockopt)(e,t,r,a,o),_getsockname=Module._getsockname=(e,t,r)=>(_getsockname=Module._getsockname=wasmExports.getsockname)(e,t,r),_pq_recvbuf_fill=Module._pq_recvbuf_fill=(e,t)=>(_pq_recvbuf_fill=Module._pq_recvbuf_fill=wasmExports.pq_recvbuf_fill)(e,t),_getsockopt=Module._getsockopt=(e,t,r,a,o)=>(_getsockopt=Module._getsockopt=wasmExports.getsockopt)(e,t,r,a,o),_getmissingattr=Module._getmissingattr=(e,t,r)=>(_getmissingattr=Module._getmissingattr=wasmExports.getmissingattr)(e,t,r),_get_rel_relkind=Module._get_rel_relkind=e=>(_get_rel_relkind=Module._get_rel_relkind=wasmExports.get_rel_relkind)(e),_MemoryContextSetIdentifier=Module._MemoryContextSetIdentifier=(e,t)=>(_MemoryContextSetIdentifier=Module._MemoryContextSetIdentifier=wasmExports.MemoryContextSetIdentifier)(e,t),_MemoryContextSetParent=Module._MemoryContextSetParent=(e,t)=>(_MemoryContextSetParent=Module._MemoryContextSetParent=wasmExports.MemoryContextSetParent)(e,t),_find_base_rel=Module._find_base_rel=(e,t)=>(_find_base_rel=Module._find_base_rel=wasmExports.find_base_rel)(e,t),_bms_equal=Module._bms_equal=(e,t)=>(_bms_equal=Module._bms_equal=wasmExports.bms_equal)(e,t),_bms_num_members=Module._bms_num_members=e=>(_bms_num_members=Module._bms_num_members=wasmExports.bms_num_members)(e),_fmgr_info_copy=Module._fmgr_info_copy=(e,t,r)=>(_fmgr_info_copy=Module._fmgr_info_copy=wasmExports.fmgr_info_copy)(e,t,r),_fmgr_info_cxt=Module._fmgr_info_cxt=(e,t,r)=>(_fmgr_info_cxt=Module._fmgr_info_cxt=wasmExports.fmgr_info_cxt)(e,t,r),_get_typlenbyvalalign=Module._get_typlenbyvalalign=(e,t,r,a)=>(_get_typlenbyvalalign=Module._get_typlenbyvalalign=wasmExports.get_typlenbyvalalign)(e,t,r,a),_deconstruct_array=Module._deconstruct_array=(e,t,r,a,o,s,l,n)=>(_deconstruct_array=Module._deconstruct_array=wasmExports.deconstruct_array)(e,t,r,a,o,s,l,n),_datumCopy=Module._datumCopy=(e,t,r)=>(_datumCopy=Module._datumCopy=wasmExports.datumCopy)(e,t,r),_qsort_arg=Module._qsort_arg=(e,t,r,a,o)=>(_qsort_arg=Module._qsort_arg=wasmExports.qsort_arg)(e,t,r,a,o),_FunctionCall2Coll=Module._FunctionCall2Coll=(e,t,r,a)=>(_FunctionCall2Coll=Module._FunctionCall2Coll=wasmExports.FunctionCall2Coll)(e,t,r,a),_datumIsEqual=Module._datumIsEqual=(e,t,r,a)=>(_datumIsEqual=Module._datumIsEqual=wasmExports.datumIsEqual)(e,t,r,a),_bms_overlap=Module._bms_overlap=(e,t)=>(_bms_overlap=Module._bms_overlap=wasmExports.bms_overlap)(e,t),_ExecPrepareExpr=Module._ExecPrepareExpr=(e,t)=>(_ExecPrepareExpr=Module._ExecPrepareExpr=wasmExports.ExecPrepareExpr)(e,t),_RegisterSnapshot=Module._RegisterSnapshot=e=>(_RegisterSnapshot=Module._RegisterSnapshot=wasmExports.RegisterSnapshot)(e),_UnregisterSnapshot=Module._UnregisterSnapshot=e=>(_UnregisterSnapshot=Module._UnregisterSnapshot=wasmExports.UnregisterSnapshot)(e),_get_fn_expr_argtype=Module._get_fn_expr_argtype=(e,t)=>(_get_fn_expr_argtype=Module._get_fn_expr_argtype=wasmExports.get_fn_expr_argtype)(e,t),_get_opfamily_member=Module._get_opfamily_member=(e,t,r,a)=>(_get_opfamily_member=Module._get_opfamily_member=wasmExports.get_opfamily_member)(e,t,r,a),_init_MultiFuncCall=Module._init_MultiFuncCall=e=>(_init_MultiFuncCall=Module._init_MultiFuncCall=wasmExports.init_MultiFuncCall)(e),_per_MultiFuncCall=Module._per_MultiFuncCall=e=>(_per_MultiFuncCall=Module._per_MultiFuncCall=wasmExports.per_MultiFuncCall)(e),_end_MultiFuncCall=Module._end_MultiFuncCall=(e,t)=>(_end_MultiFuncCall=Module._end_MultiFuncCall=wasmExports.end_MultiFuncCall)(e,t),_textToQualifiedNameList=Module._textToQualifiedNameList=e=>(_textToQualifiedNameList=Module._textToQualifiedNameList=wasmExports.textToQualifiedNameList)(e),_FunctionCall1Coll=Module._FunctionCall1Coll=(e,t,r)=>(_FunctionCall1Coll=Module._FunctionCall1Coll=wasmExports.FunctionCall1Coll)(e,t,r),_DirectFunctionCall4Coll=Module._DirectFunctionCall4Coll=(e,t,r,a,o,s)=>(_DirectFunctionCall4Coll=Module._DirectFunctionCall4Coll=wasmExports.DirectFunctionCall4Coll)(e,t,r,a,o,s),_pg_mblen=Module._pg_mblen=e=>(_pg_mblen=Module._pg_mblen=wasmExports.pg_mblen)(e),_tsearch_readline_begin=Module._tsearch_readline_begin=(e,t)=>(_tsearch_readline_begin=Module._tsearch_readline_begin=wasmExports.tsearch_readline_begin)(e,t),_tsearch_readline=Module._tsearch_readline=e=>(_tsearch_readline=Module._tsearch_readline=wasmExports.tsearch_readline)(e),_t_isspace=Module._t_isspace=e=>(_t_isspace=Module._t_isspace=wasmExports.t_isspace)(e),_lowerstr=Module._lowerstr=e=>(_lowerstr=Module._lowerstr=wasmExports.lowerstr)(e),_tsearch_readline_end=Module._tsearch_readline_end=e=>(_tsearch_readline_end=Module._tsearch_readline_end=wasmExports.tsearch_readline_end)(e),_t_isdigit=Module._t_isdigit=e=>(_t_isdigit=Module._t_isdigit=wasmExports.t_isdigit)(e),_pnstrdup=Module._pnstrdup=(e,t)=>(_pnstrdup=Module._pnstrdup=wasmExports.pnstrdup)(e,t),_get_tsearch_config_filename=Module._get_tsearch_config_filename=(e,t)=>(_get_tsearch_config_filename=Module._get_tsearch_config_filename=wasmExports.get_tsearch_config_filename)(e,t),_lookup_ts_dictionary_cache=Module._lookup_ts_dictionary_cache=e=>(_lookup_ts_dictionary_cache=Module._lookup_ts_dictionary_cache=wasmExports.lookup_ts_dictionary_cache)(e),_FunctionCall4Coll=Module._FunctionCall4Coll=(e,t,r,a,o,s)=>(_FunctionCall4Coll=Module._FunctionCall4Coll=wasmExports.FunctionCall4Coll)(e,t,r,a,o,s),_t_isalnum=Module._t_isalnum=e=>(_t_isalnum=Module._t_isalnum=wasmExports.t_isalnum)(e),_isalnum=Module._isalnum=e=>(_isalnum=Module._isalnum=wasmExports.isalnum)(e),_pg_any_to_server=Module._pg_any_to_server=(e,t,r)=>(_pg_any_to_server=Module._pg_any_to_server=wasmExports.pg_any_to_server)(e,t,r),_lowerstr_with_len=Module._lowerstr_with_len=(e,t)=>(_lowerstr_with_len=Module._lowerstr_with_len=wasmExports.lowerstr_with_len)(e,t),_tolower=Module._tolower=e=>(_tolower=Module._tolower=wasmExports.tolower)(e),_readstoplist=Module._readstoplist=(e,t,r)=>(_readstoplist=Module._readstoplist=wasmExports.readstoplist)(e,t,r),_searchstoplist=Module._searchstoplist=(e,t)=>(_searchstoplist=Module._searchstoplist=wasmExports.searchstoplist)(e,t),_GetDatabaseEncoding=Module._GetDatabaseEncoding=()=>(_GetDatabaseEncoding=Module._GetDatabaseEncoding=wasmExports.GetDatabaseEncoding)(),_vacuum_delay_point=Module._vacuum_delay_point=()=>(_vacuum_delay_point=Module._vacuum_delay_point=wasmExports.vacuum_delay_point)(),_get_restriction_variable=Module._get_restriction_variable=(e,t,r,a,o,s)=>(_get_restriction_variable=Module._get_restriction_variable=wasmExports.get_restriction_variable)(e,t,r,a,o,s),_get_attstatsslot=Module._get_attstatsslot=(e,t,r,a,o)=>(_get_attstatsslot=Module._get_attstatsslot=wasmExports.get_attstatsslot)(e,t,r,a,o),_free_attstatsslot=Module._free_attstatsslot=e=>(_free_attstatsslot=Module._free_attstatsslot=wasmExports.free_attstatsslot)(e),_Float8GetDatum=Module._Float8GetDatum=e=>(_Float8GetDatum=Module._Float8GetDatum=wasmExports.Float8GetDatum)(e),_ExecReScan=Module._ExecReScan=e=>(_ExecReScan=Module._ExecReScan=wasmExports.ExecReScan)(e),_ExecAsyncResponse=Module._ExecAsyncResponse=e=>(_ExecAsyncResponse=Module._ExecAsyncResponse=wasmExports.ExecAsyncResponse)(e),_ExecAsyncRequestDone=Module._ExecAsyncRequestDone=(e,t)=>(_ExecAsyncRequestDone=Module._ExecAsyncRequestDone=wasmExports.ExecAsyncRequestDone)(e,t),_ExecAsyncRequestPending=Module._ExecAsyncRequestPending=e=>(_ExecAsyncRequestPending=Module._ExecAsyncRequestPending=wasmExports.ExecAsyncRequestPending)(e),_tuplesort_end=Module._tuplesort_end=e=>(_tuplesort_end=Module._tuplesort_end=wasmExports.tuplesort_end)(e),_ExecInitExprList=Module._ExecInitExprList=(e,t)=>(_ExecInitExprList=Module._ExecInitExprList=wasmExports.ExecInitExprList)(e,t),_fmgr_info=Module._fmgr_info=(e,t)=>(_fmgr_info=Module._fmgr_info=wasmExports.fmgr_info)(e,t),_get_typlenbyval=Module._get_typlenbyval=(e,t,r)=>(_get_typlenbyval=Module._get_typlenbyval=wasmExports.get_typlenbyval)(e,t,r),_ExecForceStoreHeapTuple=Module._ExecForceStoreHeapTuple=(e,t,r)=>(_ExecForceStoreHeapTuple=Module._ExecForceStoreHeapTuple=wasmExports.ExecForceStoreHeapTuple)(e,t,r),_tuplesort_performsort=Module._tuplesort_performsort=e=>(_tuplesort_performsort=Module._tuplesort_performsort=wasmExports.tuplesort_performsort)(e),_tuplesort_begin_heap=Module._tuplesort_begin_heap=(e,t,r,a,o,s,l,n,_)=>(_tuplesort_begin_heap=Module._tuplesort_begin_heap=wasmExports.tuplesort_begin_heap)(e,t,r,a,o,s,l,n,_),_MemoryContextMemAllocated=Module._MemoryContextMemAllocated=(e,t)=>(_MemoryContextMemAllocated=Module._MemoryContextMemAllocated=wasmExports.MemoryContextMemAllocated)(e,t),_tuplesort_gettupleslot=Module._tuplesort_gettupleslot=(e,t,r,a,o)=>(_tuplesort_gettupleslot=Module._tuplesort_gettupleslot=wasmExports.tuplesort_gettupleslot)(e,t,r,a,o),_tuplesort_puttupleslot=Module._tuplesort_puttupleslot=(e,t)=>(_tuplesort_puttupleslot=Module._tuplesort_puttupleslot=wasmExports.tuplesort_puttupleslot)(e,t),_ExecStoreAllNullTuple=Module._ExecStoreAllNullTuple=e=>(_ExecStoreAllNullTuple=Module._ExecStoreAllNullTuple=wasmExports.ExecStoreAllNullTuple)(e),_MakeExpandedObjectReadOnlyInternal=Module._MakeExpandedObjectReadOnlyInternal=e=>(_MakeExpandedObjectReadOnlyInternal=Module._MakeExpandedObjectReadOnlyInternal=wasmExports.MakeExpandedObjectReadOnlyInternal)(e),_BlessTupleDesc=Module._BlessTupleDesc=e=>(_BlessTupleDesc=Module._BlessTupleDesc=wasmExports.BlessTupleDesc)(e),_pg_detoast_datum_copy=Module._pg_detoast_datum_copy=e=>(_pg_detoast_datum_copy=Module._pg_detoast_datum_copy=wasmExports.pg_detoast_datum_copy)(e),_construct_md_array=Module._construct_md_array=(e,t,r,a,o,s,l,n,_)=>(_construct_md_array=Module._construct_md_array=wasmExports.construct_md_array)(e,t,r,a,o,s,l,n,_),_ArrayGetNItems=Module._ArrayGetNItems=(e,t)=>(_ArrayGetNItems=Module._ArrayGetNItems=wasmExports.ArrayGetNItems)(e,t),_construct_empty_array=Module._construct_empty_array=e=>(_construct_empty_array=Module._construct_empty_array=wasmExports.construct_empty_array)(e),_DatumGetEOHP=Module._DatumGetEOHP=e=>(_DatumGetEOHP=Module._DatumGetEOHP=wasmExports.DatumGetEOHP)(e),_expanded_record_fetch_tupdesc=Module._expanded_record_fetch_tupdesc=e=>(_expanded_record_fetch_tupdesc=Module._expanded_record_fetch_tupdesc=wasmExports.expanded_record_fetch_tupdesc)(e),_expanded_record_fetch_field=Module._expanded_record_fetch_field=(e,t,r)=>(_expanded_record_fetch_field=Module._expanded_record_fetch_field=wasmExports.expanded_record_fetch_field)(e,t,r),_execute_attr_map_tuple=Module._execute_attr_map_tuple=(e,t)=>(_execute_attr_map_tuple=Module._execute_attr_map_tuple=wasmExports.execute_attr_map_tuple)(e,t),_MemoryContextAllocExtended=Module._MemoryContextAllocExtended=(e,t,r)=>(_MemoryContextAllocExtended=Module._MemoryContextAllocExtended=wasmExports.MemoryContextAllocExtended)(e,t,r),_lookup_rowtype_tupdesc_domain=Module._lookup_rowtype_tupdesc_domain=(e,t,r)=>(_lookup_rowtype_tupdesc_domain=Module._lookup_rowtype_tupdesc_domain=wasmExports.lookup_rowtype_tupdesc_domain)(e,t,r),_MemoryContextGetParent=Module._MemoryContextGetParent=e=>(_MemoryContextGetParent=Module._MemoryContextGetParent=wasmExports.MemoryContextGetParent)(e),_DeleteExpandedObject=Module._DeleteExpandedObject=e=>(_DeleteExpandedObject=Module._DeleteExpandedObject=wasmExports.DeleteExpandedObject)(e),_InstrAlloc=Module._InstrAlloc=(e,t,r)=>(_InstrAlloc=Module._InstrAlloc=wasmExports.InstrAlloc)(e,t,r),_ExprEvalPushStep=Module._ExprEvalPushStep=(e,t)=>(_ExprEvalPushStep=Module._ExprEvalPushStep=wasmExports.ExprEvalPushStep)(e,t),_getTypeOutputInfo=Module._getTypeOutputInfo=(e,t,r)=>(_getTypeOutputInfo=Module._getTypeOutputInfo=wasmExports.getTypeOutputInfo)(e,t,r),_ExecInitExprWithParams=Module._ExecInitExprWithParams=(e,t)=>(_ExecInitExprWithParams=Module._ExecInitExprWithParams=wasmExports.ExecInitExprWithParams)(e,t),_ExecOpenScanRelation=Module._ExecOpenScanRelation=(e,t,r)=>(_ExecOpenScanRelation=Module._ExecOpenScanRelation=wasmExports.ExecOpenScanRelation)(e,t,r),_FreeExprContext=Module._FreeExprContext=(e,t)=>(_FreeExprContext=Module._FreeExprContext=wasmExports.FreeExprContext)(e,t),_CreateExprContext=Module._CreateExprContext=e=>(_CreateExprContext=Module._CreateExprContext=wasmExports.CreateExprContext)(e),_ExecGetReturningSlot=Module._ExecGetReturningSlot=(e,t)=>(_ExecGetReturningSlot=Module._ExecGetReturningSlot=wasmExports.ExecGetReturningSlot)(e,t),_build_attrmap_by_name_if_req=Module._build_attrmap_by_name_if_req=(e,t,r)=>(_build_attrmap_by_name_if_req=Module._build_attrmap_by_name_if_req=wasmExports.build_attrmap_by_name_if_req)(e,t,r),_ExecGetResultRelCheckAsUser=Module._ExecGetResultRelCheckAsUser=(e,t)=>(_ExecGetResultRelCheckAsUser=Module._ExecGetResultRelCheckAsUser=wasmExports.ExecGetResultRelCheckAsUser)(e,t),_InstrEndLoop=Module._InstrEndLoop=e=>(_InstrEndLoop=Module._InstrEndLoop=wasmExports.InstrEndLoop)(e),_ExecStoreHeapTuple=Module._ExecStoreHeapTuple=(e,t,r)=>(_ExecStoreHeapTuple=Module._ExecStoreHeapTuple=wasmExports.ExecStoreHeapTuple)(e,t,r),_get_partition_ancestors=Module._get_partition_ancestors=e=>(_get_partition_ancestors=Module._get_partition_ancestors=wasmExports.get_partition_ancestors)(e),_pull_varattnos=Module._pull_varattnos=(e,t,r)=>(_pull_varattnos=Module._pull_varattnos=wasmExports.pull_varattnos)(e,t,r),_ExecFindJunkAttributeInTlist=Module._ExecFindJunkAttributeInTlist=(e,t)=>(_ExecFindJunkAttributeInTlist=Module._ExecFindJunkAttributeInTlist=wasmExports.ExecFindJunkAttributeInTlist)(e,t),_visibilitymap_get_status=Module._visibilitymap_get_status=(e,t,r)=>(_visibilitymap_get_status=Module._visibilitymap_get_status=wasmExports.visibilitymap_get_status)(e,t,r),_index_deform_tuple=Module._index_deform_tuple=(e,t,r,a)=>(_index_deform_tuple=Module._index_deform_tuple=wasmExports.index_deform_tuple)(e,t,r,a),_LaunchParallelWorkers=Module._LaunchParallelWorkers=e=>(_LaunchParallelWorkers=Module._LaunchParallelWorkers=wasmExports.LaunchParallelWorkers)(e),_standard_ExecutorStart=Module._standard_ExecutorStart=(e,t)=>(_standard_ExecutorStart=Module._standard_ExecutorStart=wasmExports.standard_ExecutorStart)(e,t),_GetCommandTagName=Module._GetCommandTagName=e=>(_GetCommandTagName=Module._GetCommandTagName=wasmExports.GetCommandTagName)(e),_standard_ExecutorRun=Module._standard_ExecutorRun=(e,t,r,a)=>(_standard_ExecutorRun=Module._standard_ExecutorRun=wasmExports.standard_ExecutorRun)(e,t,r,a),_EnterParallelMode=Module._EnterParallelMode=()=>(_EnterParallelMode=Module._EnterParallelMode=wasmExports.EnterParallelMode)(),_ExitParallelMode=Module._ExitParallelMode=()=>(_ExitParallelMode=Module._ExitParallelMode=wasmExports.ExitParallelMode)(),_standard_ExecutorFinish=Module._standard_ExecutorFinish=e=>(_standard_ExecutorFinish=Module._standard_ExecutorFinish=wasmExports.standard_ExecutorFinish)(e),_standard_ExecutorEnd=Module._standard_ExecutorEnd=e=>(_standard_ExecutorEnd=Module._standard_ExecutorEnd=wasmExports.standard_ExecutorEnd)(e),_MakeTupleTableSlot=Module._MakeTupleTableSlot=(e,t)=>(_MakeTupleTableSlot=Module._MakeTupleTableSlot=wasmExports.MakeTupleTableSlot)(e,t),_CreateParallelContext=Module._CreateParallelContext=(e,t,r)=>(_CreateParallelContext=Module._CreateParallelContext=wasmExports.CreateParallelContext)(e,t,r),_InitializeParallelDSM=Module._InitializeParallelDSM=e=>(_InitializeParallelDSM=Module._InitializeParallelDSM=wasmExports.InitializeParallelDSM)(e),_WaitForParallelWorkersToFinish=Module._WaitForParallelWorkersToFinish=e=>(_WaitForParallelWorkersToFinish=Module._WaitForParallelWorkersToFinish=wasmExports.WaitForParallelWorkersToFinish)(e),_DestroyParallelContext=Module._DestroyParallelContext=e=>(_DestroyParallelContext=Module._DestroyParallelContext=wasmExports.DestroyParallelContext)(e),_SPI_connect=Module._SPI_connect=()=>(_SPI_connect=Module._SPI_connect=wasmExports.SPI_connect)(),_SPI_connect_ext=Module._SPI_connect_ext=e=>(_SPI_connect_ext=Module._SPI_connect_ext=wasmExports.SPI_connect_ext)(e),_SPI_finish=Module._SPI_finish=()=>(_SPI_finish=Module._SPI_finish=wasmExports.SPI_finish)(),_SPI_commit=Module._SPI_commit=()=>(_SPI_commit=Module._SPI_commit=wasmExports.SPI_commit)(),_ReThrowError=Module._ReThrowError=e=>(_ReThrowError=Module._ReThrowError=wasmExports.ReThrowError)(e),_SPI_commit_and_chain=Module._SPI_commit_and_chain=()=>(_SPI_commit_and_chain=Module._SPI_commit_and_chain=wasmExports.SPI_commit_and_chain)(),_SPI_rollback=Module._SPI_rollback=()=>(_SPI_rollback=Module._SPI_rollback=wasmExports.SPI_rollback)(),_SPI_rollback_and_chain=Module._SPI_rollback_and_chain=()=>(_SPI_rollback_and_chain=Module._SPI_rollback_and_chain=wasmExports.SPI_rollback_and_chain)(),_SPI_execute=Module._SPI_execute=(e,t,r)=>(_SPI_execute=Module._SPI_execute=wasmExports.SPI_execute)(e,t,r),_EnsurePortalSnapshotExists=Module._EnsurePortalSnapshotExists=()=>(_EnsurePortalSnapshotExists=Module._EnsurePortalSnapshotExists=wasmExports.EnsurePortalSnapshotExists)(),_SPI_freetuptable=Module._SPI_freetuptable=e=>(_SPI_freetuptable=Module._SPI_freetuptable=wasmExports.SPI_freetuptable)(e),_ReleaseCachedPlan=Module._ReleaseCachedPlan=(e,t)=>(_ReleaseCachedPlan=Module._ReleaseCachedPlan=wasmExports.ReleaseCachedPlan)(e,t),_SPI_exec=Module._SPI_exec=(e,t)=>(_SPI_exec=Module._SPI_exec=wasmExports.SPI_exec)(e,t),_SPI_execute_extended=Module._SPI_execute_extended=(e,t)=>(_SPI_execute_extended=Module._SPI_execute_extended=wasmExports.SPI_execute_extended)(e,t),_makeParamList=Module._makeParamList=e=>(_makeParamList=Module._makeParamList=wasmExports.makeParamList)(e),_SPI_execp=Module._SPI_execp=(e,t,r,a)=>(_SPI_execp=Module._SPI_execp=wasmExports.SPI_execp)(e,t,r,a),_SPI_execute_plan_extended=Module._SPI_execute_plan_extended=(e,t)=>(_SPI_execute_plan_extended=Module._SPI_execute_plan_extended=wasmExports.SPI_execute_plan_extended)(e,t),_SPI_execute_plan_with_paramlist=Module._SPI_execute_plan_with_paramlist=(e,t,r,a)=>(_SPI_execute_plan_with_paramlist=Module._SPI_execute_plan_with_paramlist=wasmExports.SPI_execute_plan_with_paramlist)(e,t,r,a),_SPI_prepare=Module._SPI_prepare=(e,t,r)=>(_SPI_prepare=Module._SPI_prepare=wasmExports.SPI_prepare)(e,t,r),_SPI_prepare_extended=Module._SPI_prepare_extended=(e,t)=>(_SPI_prepare_extended=Module._SPI_prepare_extended=wasmExports.SPI_prepare_extended)(e,t),_SPI_keepplan=Module._SPI_keepplan=e=>(_SPI_keepplan=Module._SPI_keepplan=wasmExports.SPI_keepplan)(e),_SPI_freeplan=Module._SPI_freeplan=e=>(_SPI_freeplan=Module._SPI_freeplan=wasmExports.SPI_freeplan)(e),_SPI_copytuple=Module._SPI_copytuple=e=>(_SPI_copytuple=Module._SPI_copytuple=wasmExports.SPI_copytuple)(e),_SPI_returntuple=Module._SPI_returntuple=(e,t)=>(_SPI_returntuple=Module._SPI_returntuple=wasmExports.SPI_returntuple)(e,t),_SPI_fnumber=Module._SPI_fnumber=(e,t)=>(_SPI_fnumber=Module._SPI_fnumber=wasmExports.SPI_fnumber)(e,t),_SPI_fname=Module._SPI_fname=(e,t)=>(_SPI_fname=Module._SPI_fname=wasmExports.SPI_fname)(e,t),_SPI_getvalue=Module._SPI_getvalue=(e,t,r)=>(_SPI_getvalue=Module._SPI_getvalue=wasmExports.SPI_getvalue)(e,t,r),_SPI_getbinval=Module._SPI_getbinval=(e,t,r,a)=>(_SPI_getbinval=Module._SPI_getbinval=wasmExports.SPI_getbinval)(e,t,r,a),_SPI_gettype=Module._SPI_gettype=(e,t)=>(_SPI_gettype=Module._SPI_gettype=wasmExports.SPI_gettype)(e,t),_SPI_gettypeid=Module._SPI_gettypeid=(e,t)=>(_SPI_gettypeid=Module._SPI_gettypeid=wasmExports.SPI_gettypeid)(e,t),_SPI_getrelname=Module._SPI_getrelname=e=>(_SPI_getrelname=Module._SPI_getrelname=wasmExports.SPI_getrelname)(e),_SPI_palloc=Module._SPI_palloc=e=>(_SPI_palloc=Module._SPI_palloc=wasmExports.SPI_palloc)(e),_SPI_datumTransfer=Module._SPI_datumTransfer=(e,t,r)=>(_SPI_datumTransfer=Module._SPI_datumTransfer=wasmExports.SPI_datumTransfer)(e,t,r),_datumTransfer=Module._datumTransfer=(e,t,r)=>(_datumTransfer=Module._datumTransfer=wasmExports.datumTransfer)(e,t,r),_SPI_cursor_open_with_paramlist=Module._SPI_cursor_open_with_paramlist=(e,t,r,a)=>(_SPI_cursor_open_with_paramlist=Module._SPI_cursor_open_with_paramlist=wasmExports.SPI_cursor_open_with_paramlist)(e,t,r,a),_SPI_cursor_parse_open=Module._SPI_cursor_parse_open=(e,t,r)=>(_SPI_cursor_parse_open=Module._SPI_cursor_parse_open=wasmExports.SPI_cursor_parse_open)(e,t,r),_SPI_cursor_find=Module._SPI_cursor_find=e=>(_SPI_cursor_find=Module._SPI_cursor_find=wasmExports.SPI_cursor_find)(e),_SPI_cursor_fetch=Module._SPI_cursor_fetch=(e,t,r)=>(_SPI_cursor_fetch=Module._SPI_cursor_fetch=wasmExports.SPI_cursor_fetch)(e,t,r),_SPI_scroll_cursor_fetch=Module._SPI_scroll_cursor_fetch=(e,t,r)=>(_SPI_scroll_cursor_fetch=Module._SPI_scroll_cursor_fetch=wasmExports.SPI_scroll_cursor_fetch)(e,t,r),_SPI_scroll_cursor_move=Module._SPI_scroll_cursor_move=(e,t,r)=>(_SPI_scroll_cursor_move=Module._SPI_scroll_cursor_move=wasmExports.SPI_scroll_cursor_move)(e,t,r),_SPI_cursor_close=Module._SPI_cursor_close=e=>(_SPI_cursor_close=Module._SPI_cursor_close=wasmExports.SPI_cursor_close)(e),_SPI_result_code_string=Module._SPI_result_code_string=e=>(_SPI_result_code_string=Module._SPI_result_code_string=wasmExports.SPI_result_code_string)(e),_SPI_plan_get_plan_sources=Module._SPI_plan_get_plan_sources=e=>(_SPI_plan_get_plan_sources=Module._SPI_plan_get_plan_sources=wasmExports.SPI_plan_get_plan_sources)(e),_SPI_plan_get_cached_plan=Module._SPI_plan_get_cached_plan=e=>(_SPI_plan_get_cached_plan=Module._SPI_plan_get_cached_plan=wasmExports.SPI_plan_get_cached_plan)(e),_geterrposition=Module._geterrposition=()=>(_geterrposition=Module._geterrposition=wasmExports.geterrposition)(),_internalerrposition=Module._internalerrposition=e=>(_internalerrposition=Module._internalerrposition=wasmExports.internalerrposition)(e),_internalerrquery=Module._internalerrquery=e=>(_internalerrquery=Module._internalerrquery=wasmExports.internalerrquery)(e),_SPI_register_trigger_data=Module._SPI_register_trigger_data=e=>(_SPI_register_trigger_data=Module._SPI_register_trigger_data=wasmExports.SPI_register_trigger_data)(e),_EOH_get_flat_size=Module._EOH_get_flat_size=e=>(_EOH_get_flat_size=Module._EOH_get_flat_size=wasmExports.EOH_get_flat_size)(e),_EOH_flatten_into=Module._EOH_flatten_into=(e,t,r)=>(_EOH_flatten_into=Module._EOH_flatten_into=wasmExports.EOH_flatten_into)(e,t,r),_ExecFetchSlotHeapTuple=Module._ExecFetchSlotHeapTuple=(e,t,r)=>(_ExecFetchSlotHeapTuple=Module._ExecFetchSlotHeapTuple=wasmExports.ExecFetchSlotHeapTuple)(e,t,r),_InputFunctionCall=Module._InputFunctionCall=(e,t,r,a)=>(_InputFunctionCall=Module._InputFunctionCall=wasmExports.InputFunctionCall)(e,t,r,a),_convert_tuples_by_position=Module._convert_tuples_by_position=(e,t,r)=>(_convert_tuples_by_position=Module._convert_tuples_by_position=wasmExports.convert_tuples_by_position)(e,t,r),_SetTuplestoreDestReceiverParams=Module._SetTuplestoreDestReceiverParams=(e,t,r,a,o,s)=>(_SetTuplestoreDestReceiverParams=Module._SetTuplestoreDestReceiverParams=wasmExports.SetTuplestoreDestReceiverParams)(e,t,r,a,o,s),_detoast_external_attr=Module._detoast_external_attr=e=>(_detoast_external_attr=Module._detoast_external_attr=wasmExports.detoast_external_attr)(e),_bms_nonempty_difference=Module._bms_nonempty_difference=(e,t)=>(_bms_nonempty_difference=Module._bms_nonempty_difference=wasmExports.bms_nonempty_difference)(e,t),_table_parallelscan_estimate=Module._table_parallelscan_estimate=(e,t)=>(_table_parallelscan_estimate=Module._table_parallelscan_estimate=wasmExports.table_parallelscan_estimate)(e,t),_table_parallelscan_initialize=Module._table_parallelscan_initialize=(e,t,r)=>(_table_parallelscan_initialize=Module._table_parallelscan_initialize=wasmExports.table_parallelscan_initialize)(e,t,r),_table_beginscan_parallel=Module._table_beginscan_parallel=(e,t)=>(_table_beginscan_parallel=Module._table_beginscan_parallel=wasmExports.table_beginscan_parallel)(e,t),_BufferUsageAccumDiff=Module._BufferUsageAccumDiff=(e,t,r)=>(_BufferUsageAccumDiff=Module._BufferUsageAccumDiff=wasmExports.BufferUsageAccumDiff)(e,t,r),_WalUsageAccumDiff=Module._WalUsageAccumDiff=(e,t,r)=>(_WalUsageAccumDiff=Module._WalUsageAccumDiff=wasmExports.WalUsageAccumDiff)(e,t,r),_InstrUpdateTupleCount=Module._InstrUpdateTupleCount=(e,t)=>(_InstrUpdateTupleCount=Module._InstrUpdateTupleCount=wasmExports.InstrUpdateTupleCount)(e,t),_tuplesort_reset=Module._tuplesort_reset=e=>(_tuplesort_reset=Module._tuplesort_reset=wasmExports.tuplesort_reset)(e),_get_call_expr_argtype=Module._get_call_expr_argtype=(e,t)=>(_get_call_expr_argtype=Module._get_call_expr_argtype=wasmExports.get_call_expr_argtype)(e,t),_get_typtype=Module._get_typtype=e=>(_get_typtype=Module._get_typtype=wasmExports.get_typtype)(e),_pull_var_clause=Module._pull_var_clause=(e,t)=>(_pull_var_clause=Module._pull_var_clause=wasmExports.pull_var_clause)(e,t),_bms_is_subset=Module._bms_is_subset=(e,t)=>(_bms_is_subset=Module._bms_is_subset=wasmExports.bms_is_subset)(e,t),_bms_membership=Module._bms_membership=e=>(_bms_membership=Module._bms_membership=wasmExports.bms_membership)(e),_make_restrictinfo=Module._make_restrictinfo=(e,t,r,a,o,s,l,n,_,m)=>(_make_restrictinfo=Module._make_restrictinfo=wasmExports.make_restrictinfo)(e,t,r,a,o,s,l,n,_,m),_GetSysCacheHashValue=Module._GetSysCacheHashValue=(e,t,r,a,o)=>(_GetSysCacheHashValue=Module._GetSysCacheHashValue=wasmExports.GetSysCacheHashValue)(e,t,r,a,o),_tlist_member=Module._tlist_member=(e,t)=>(_tlist_member=Module._tlist_member=wasmExports.tlist_member)(e,t),_add_path=Module._add_path=(e,t)=>(_add_path=Module._add_path=wasmExports.add_path)(e,t),_contain_mutable_functions=Module._contain_mutable_functions=e=>(_contain_mutable_functions=Module._contain_mutable_functions=wasmExports.contain_mutable_functions)(e),_make_orclause=Module._make_orclause=e=>(_make_orclause=Module._make_orclause=wasmExports.make_orclause)(e),_extract_actual_clauses=Module._extract_actual_clauses=(e,t)=>(_extract_actual_clauses=Module._extract_actual_clauses=wasmExports.extract_actual_clauses)(e,t),_cost_sort=Module._cost_sort=(e,t,r,a,o,s,l,n,_)=>(_cost_sort=Module._cost_sort=wasmExports.cost_sort)(e,t,r,a,o,s,l,n,_),_pathkeys_contained_in=Module._pathkeys_contained_in=(e,t)=>(_pathkeys_contained_in=Module._pathkeys_contained_in=wasmExports.pathkeys_contained_in)(e,t),_change_plan_targetlist=Module._change_plan_targetlist=(e,t,r)=>(_change_plan_targetlist=Module._change_plan_targetlist=wasmExports.change_plan_targetlist)(e,t,r),_make_foreignscan=Module._make_foreignscan=(e,t,r,a,o,s,l,n)=>(_make_foreignscan=Module._make_foreignscan=wasmExports.make_foreignscan)(e,t,r,a,o,s,l,n),_list_member_ptr=Module._list_member_ptr=(e,t)=>(_list_member_ptr=Module._list_member_ptr=wasmExports.list_member_ptr)(e,t),_clamp_row_est=Module._clamp_row_est=e=>(_clamp_row_est=Module._clamp_row_est=wasmExports.clamp_row_est)(e),_standard_planner=Module._standard_planner=(e,t,r,a)=>(_standard_planner=Module._standard_planner=wasmExports.standard_planner)(e,t,r,a),_estimate_expression_value=Module._estimate_expression_value=(e,t)=>(_estimate_expression_value=Module._estimate_expression_value=wasmExports.estimate_expression_value)(e,t),_add_new_columns_to_pathtarget=Module._add_new_columns_to_pathtarget=(e,t)=>(_add_new_columns_to_pathtarget=Module._add_new_columns_to_pathtarget=wasmExports.add_new_columns_to_pathtarget)(e,t),_get_sortgroupref_clause_noerr=Module._get_sortgroupref_clause_noerr=(e,t)=>(_get_sortgroupref_clause_noerr=Module._get_sortgroupref_clause_noerr=wasmExports.get_sortgroupref_clause_noerr)(e,t),_get_agg_clause_costs=Module._get_agg_clause_costs=(e,t,r)=>(_get_agg_clause_costs=Module._get_agg_clause_costs=wasmExports.get_agg_clause_costs)(e,t,r),_grouping_is_sortable=Module._grouping_is_sortable=e=>(_grouping_is_sortable=Module._grouping_is_sortable=wasmExports.grouping_is_sortable)(e),_create_sort_path=Module._create_sort_path=(e,t,r,a,o)=>(_create_sort_path=Module._create_sort_path=wasmExports.create_sort_path)(e,t,r,a,o),_copy_pathtarget=Module._copy_pathtarget=e=>(_copy_pathtarget=Module._copy_pathtarget=wasmExports.copy_pathtarget)(e),_get_sortgrouplist_exprs=Module._get_sortgrouplist_exprs=(e,t)=>(_get_sortgrouplist_exprs=Module._get_sortgrouplist_exprs=wasmExports.get_sortgrouplist_exprs)(e,t),_estimate_num_groups=Module._estimate_num_groups=(e,t,r,a,o)=>(_estimate_num_groups=Module._estimate_num_groups=wasmExports.estimate_num_groups)(e,t,r,a,o),_cost_qual_eval=Module._cost_qual_eval=(e,t,r)=>(_cost_qual_eval=Module._cost_qual_eval=wasmExports.cost_qual_eval)(e,t,r),_plan_create_index_workers=Module._plan_create_index_workers=(e,t)=>(_plan_create_index_workers=Module._plan_create_index_workers=wasmExports.plan_create_index_workers)(e,t),_create_projection_path=Module._create_projection_path=(e,t,r,a)=>(_create_projection_path=Module._create_projection_path=wasmExports.create_projection_path)(e,t,r,a),_get_plan_rowmark=Module._get_plan_rowmark=(e,t)=>(_get_plan_rowmark=Module._get_plan_rowmark=wasmExports.get_plan_rowmark)(e,t),_find_join_rel=Module._find_join_rel=(e,t)=>(_find_join_rel=Module._find_join_rel=wasmExports.find_join_rel)(e,t),_make_canonical_pathkey=Module._make_canonical_pathkey=(e,t,r,a,o)=>(_make_canonical_pathkey=Module._make_canonical_pathkey=wasmExports.make_canonical_pathkey)(e,t,r,a,o),_eclass_useful_for_merging=Module._eclass_useful_for_merging=(e,t,r)=>(_eclass_useful_for_merging=Module._eclass_useful_for_merging=wasmExports.eclass_useful_for_merging)(e,t,r),_update_mergeclause_eclasses=Module._update_mergeclause_eclasses=(e,t)=>(_update_mergeclause_eclasses=Module._update_mergeclause_eclasses=wasmExports.update_mergeclause_eclasses)(e,t),_clauselist_selectivity=Module._clauselist_selectivity=(e,t,r,a,o)=>(_clauselist_selectivity=Module._clauselist_selectivity=wasmExports.clauselist_selectivity)(e,t,r,a,o),_join_clause_is_movable_to=Module._join_clause_is_movable_to=(e,t)=>(_join_clause_is_movable_to=Module._join_clause_is_movable_to=wasmExports.join_clause_is_movable_to)(e,t),_generate_implied_equalities_for_column=Module._generate_implied_equalities_for_column=(e,t,r,a,o)=>(_generate_implied_equalities_for_column=Module._generate_implied_equalities_for_column=wasmExports.generate_implied_equalities_for_column)(e,t,r,a,o),_get_tablespace_page_costs=Module._get_tablespace_page_costs=(e,t,r)=>(_get_tablespace_page_costs=Module._get_tablespace_page_costs=wasmExports.get_tablespace_page_costs)(e,t,r),_set_baserel_size_estimates=Module._set_baserel_size_estimates=(e,t)=>(_set_baserel_size_estimates=Module._set_baserel_size_estimates=wasmExports.set_baserel_size_estimates)(e,t),_add_to_flat_tlist=Module._add_to_flat_tlist=(e,t)=>(_add_to_flat_tlist=Module._add_to_flat_tlist=wasmExports.add_to_flat_tlist)(e,t),_get_baserel_parampathinfo=Module._get_baserel_parampathinfo=(e,t,r)=>(_get_baserel_parampathinfo=Module._get_baserel_parampathinfo=wasmExports.get_baserel_parampathinfo)(e,t,r),_create_foreignscan_path=Module._create_foreignscan_path=(e,t,r,a,o,s,l,n,_,m)=>(_create_foreignscan_path=Module._create_foreignscan_path=wasmExports.create_foreignscan_path)(e,t,r,a,o,s,l,n,_,m),_create_foreign_join_path=Module._create_foreign_join_path=(e,t,r,a,o,s,l,n,_,m)=>(_create_foreign_join_path=Module._create_foreign_join_path=wasmExports.create_foreign_join_path)(e,t,r,a,o,s,l,n,_,m),_create_foreign_upper_path=Module._create_foreign_upper_path=(e,t,r,a,o,s,l,n,_)=>(_create_foreign_upper_path=Module._create_foreign_upper_path=wasmExports.create_foreign_upper_path)(e,t,r,a,o,s,l,n,_),_adjust_limit_rows_costs=Module._adjust_limit_rows_costs=(e,t,r,a,o)=>(_adjust_limit_rows_costs=Module._adjust_limit_rows_costs=wasmExports.adjust_limit_rows_costs)(e,t,r,a,o),_SearchSysCacheAttName=Module._SearchSysCacheAttName=(e,t)=>(_SearchSysCacheAttName=Module._SearchSysCacheAttName=wasmExports.SearchSysCacheAttName)(e,t),_get_translated_update_targetlist=Module._get_translated_update_targetlist=(e,t,r,a)=>(_get_translated_update_targetlist=Module._get_translated_update_targetlist=wasmExports.get_translated_update_targetlist)(e,t,r,a),_add_row_identity_var=Module._add_row_identity_var=(e,t,r,a)=>(_add_row_identity_var=Module._add_row_identity_var=wasmExports.add_row_identity_var)(e,t,r,a),_get_rel_all_updated_cols=Module._get_rel_all_updated_cols=(e,t)=>(_get_rel_all_updated_cols=Module._get_rel_all_updated_cols=wasmExports.get_rel_all_updated_cols)(e,t),_list_append_unique_ptr=Module._list_append_unique_ptr=(e,t)=>(_list_append_unique_ptr=Module._list_append_unique_ptr=wasmExports.list_append_unique_ptr)(e,t),_palloc_extended=Module._palloc_extended=(e,t)=>(_palloc_extended=Module._palloc_extended=wasmExports.palloc_extended)(e,t),_pg_reg_getinitialstate=Module._pg_reg_getinitialstate=e=>(_pg_reg_getinitialstate=Module._pg_reg_getinitialstate=wasmExports.pg_reg_getinitialstate)(e),_pg_reg_getfinalstate=Module._pg_reg_getfinalstate=e=>(_pg_reg_getfinalstate=Module._pg_reg_getfinalstate=wasmExports.pg_reg_getfinalstate)(e),_pg_reg_getnumoutarcs=Module._pg_reg_getnumoutarcs=(e,t)=>(_pg_reg_getnumoutarcs=Module._pg_reg_getnumoutarcs=wasmExports.pg_reg_getnumoutarcs)(e,t),_pg_reg_getoutarcs=Module._pg_reg_getoutarcs=(e,t,r,a)=>(_pg_reg_getoutarcs=Module._pg_reg_getoutarcs=wasmExports.pg_reg_getoutarcs)(e,t,r,a),_pg_reg_getnumcolors=Module._pg_reg_getnumcolors=e=>(_pg_reg_getnumcolors=Module._pg_reg_getnumcolors=wasmExports.pg_reg_getnumcolors)(e),_pg_reg_colorisbegin=Module._pg_reg_colorisbegin=(e,t)=>(_pg_reg_colorisbegin=Module._pg_reg_colorisbegin=wasmExports.pg_reg_colorisbegin)(e,t),_pg_reg_colorisend=Module._pg_reg_colorisend=(e,t)=>(_pg_reg_colorisend=Module._pg_reg_colorisend=wasmExports.pg_reg_colorisend)(e,t),_pg_reg_getnumcharacters=Module._pg_reg_getnumcharacters=(e,t)=>(_pg_reg_getnumcharacters=Module._pg_reg_getnumcharacters=wasmExports.pg_reg_getnumcharacters)(e,t),_pg_reg_getcharacters=Module._pg_reg_getcharacters=(e,t,r,a)=>(_pg_reg_getcharacters=Module._pg_reg_getcharacters=wasmExports.pg_reg_getcharacters)(e,t,r,a),_toupper=Module._toupper=e=>(_toupper=Module._toupper=wasmExports.toupper)(e),_pg_initdb=Module._pg_initdb=()=>(_pg_initdb=Module._pg_initdb=wasmExports.pg_initdb)(),_pg_initdb_main=Module._pg_initdb_main=()=>(_pg_initdb_main=Module._pg_initdb_main=wasmExports.pg_initdb_main)(),___cxa_throw=Module.___cxa_throw=(e,t,r)=>(___cxa_throw=Module.___cxa_throw=wasmExports.__cxa_throw)(e,t,r),_main_repl=Module._main_repl=()=>(_main_repl=Module._main_repl=wasmExports.main_repl)(),_main=Module._main=(e,t)=>(_main=Module._main=wasmExports.__main_argc_argv)(e,t),_setenv=Module._setenv=(e,t,r)=>(_setenv=Module._setenv=wasmExports.setenv)(e,t,r),_pg_repl_raf=Module._pg_repl_raf=()=>(_pg_repl_raf=Module._pg_repl_raf=wasmExports.pg_repl_raf)(),_GetForeignDataWrapper=Module._GetForeignDataWrapper=e=>(_GetForeignDataWrapper=Module._GetForeignDataWrapper=wasmExports.GetForeignDataWrapper)(e),_GetForeignServer=Module._GetForeignServer=e=>(_GetForeignServer=Module._GetForeignServer=wasmExports.GetForeignServer)(e),_GetForeignServerExtended=Module._GetForeignServerExtended=(e,t)=>(_GetForeignServerExtended=Module._GetForeignServerExtended=wasmExports.GetForeignServerExtended)(e,t),_GetForeignServerByName=Module._GetForeignServerByName=(e,t)=>(_GetForeignServerByName=Module._GetForeignServerByName=wasmExports.GetForeignServerByName)(e,t),_GetUserMapping=Module._GetUserMapping=(e,t)=>(_GetUserMapping=Module._GetUserMapping=wasmExports.GetUserMapping)(e,t),_GetForeignTable=Module._GetForeignTable=e=>(_GetForeignTable=Module._GetForeignTable=wasmExports.GetForeignTable)(e),_GetForeignColumnOptions=Module._GetForeignColumnOptions=(e,t)=>(_GetForeignColumnOptions=Module._GetForeignColumnOptions=wasmExports.GetForeignColumnOptions)(e,t),_initClosestMatch=Module._initClosestMatch=(e,t,r)=>(_initClosestMatch=Module._initClosestMatch=wasmExports.initClosestMatch)(e,t,r),_updateClosestMatch=Module._updateClosestMatch=(e,t)=>(_updateClosestMatch=Module._updateClosestMatch=wasmExports.updateClosestMatch)(e,t),_getClosestMatch=Module._getClosestMatch=e=>(_getClosestMatch=Module._getClosestMatch=wasmExports.getClosestMatch)(e),_GetExistingLocalJoinPath=Module._GetExistingLocalJoinPath=e=>(_GetExistingLocalJoinPath=Module._GetExistingLocalJoinPath=wasmExports.GetExistingLocalJoinPath)(e),_BaseBackupAddTarget=Module._BaseBackupAddTarget=(e,t,r)=>(_BaseBackupAddTarget=Module._BaseBackupAddTarget=wasmExports.BaseBackupAddTarget)(e,t,r),_bbsink_forward_begin_backup=Module._bbsink_forward_begin_backup=e=>(_bbsink_forward_begin_backup=Module._bbsink_forward_begin_backup=wasmExports.bbsink_forward_begin_backup)(e),_bbsink_forward_archive_contents=Module._bbsink_forward_archive_contents=(e,t)=>(_bbsink_forward_archive_contents=Module._bbsink_forward_archive_contents=wasmExports.bbsink_forward_archive_contents)(e,t),_bbsink_forward_end_archive=Module._bbsink_forward_end_archive=e=>(_bbsink_forward_end_archive=Module._bbsink_forward_end_archive=wasmExports.bbsink_forward_end_archive)(e),_bbsink_forward_begin_archive=Module._bbsink_forward_begin_archive=(e,t)=>(_bbsink_forward_begin_archive=Module._bbsink_forward_begin_archive=wasmExports.bbsink_forward_begin_archive)(e,t),_bbsink_forward_begin_manifest=Module._bbsink_forward_begin_manifest=e=>(_bbsink_forward_begin_manifest=Module._bbsink_forward_begin_manifest=wasmExports.bbsink_forward_begin_manifest)(e),_bbsink_forward_manifest_contents=Module._bbsink_forward_manifest_contents=(e,t)=>(_bbsink_forward_manifest_contents=Module._bbsink_forward_manifest_contents=wasmExports.bbsink_forward_manifest_contents)(e,t),_bbsink_forward_end_manifest=Module._bbsink_forward_end_manifest=e=>(_bbsink_forward_end_manifest=Module._bbsink_forward_end_manifest=wasmExports.bbsink_forward_end_manifest)(e),_bbsink_forward_end_backup=Module._bbsink_forward_end_backup=(e,t,r)=>(_bbsink_forward_end_backup=Module._bbsink_forward_end_backup=wasmExports.bbsink_forward_end_backup)(e,t,r),_bbsink_forward_cleanup=Module._bbsink_forward_cleanup=e=>(_bbsink_forward_cleanup=Module._bbsink_forward_cleanup=wasmExports.bbsink_forward_cleanup)(e),_ResourceOwnerCreate=Module._ResourceOwnerCreate=(e,t)=>(_ResourceOwnerCreate=Module._ResourceOwnerCreate=wasmExports.ResourceOwnerCreate)(e,t),_escape_json=Module._escape_json=(e,t)=>(_escape_json=Module._escape_json=wasmExports.escape_json)(e,t),_exprIsLengthCoercion=Module._exprIsLengthCoercion=(e,t)=>(_exprIsLengthCoercion=Module._exprIsLengthCoercion=wasmExports.exprIsLengthCoercion)(e,t),_tbm_add_tuples=Module._tbm_add_tuples=(e,t,r,a)=>(_tbm_add_tuples=Module._tbm_add_tuples=wasmExports.tbm_add_tuples)(e,t,r,a),_appendStringInfoStringQuoted=Module._appendStringInfoStringQuoted=(e,t,r)=>(_appendStringInfoStringQuoted=Module._appendStringInfoStringQuoted=wasmExports.appendStringInfoStringQuoted)(e,t,r),_list_make5_impl=Module._list_make5_impl=(e,t,r,a,o,s)=>(_list_make5_impl=Module._list_make5_impl=wasmExports.list_make5_impl)(e,t,r,a,o,s),_list_delete=Module._list_delete=(e,t)=>(_list_delete=Module._list_delete=wasmExports.list_delete)(e,t),_CleanQuerytext=Module._CleanQuerytext=(e,t,r)=>(_CleanQuerytext=Module._CleanQuerytext=wasmExports.CleanQuerytext)(e,t,r),_EnableQueryId=Module._EnableQueryId=()=>(_EnableQueryId=Module._EnableQueryId=wasmExports.EnableQueryId)(),_get_rel_type_id=Module._get_rel_type_id=e=>(_get_rel_type_id=Module._get_rel_type_id=wasmExports.get_rel_type_id)(e),_set_config_option=Module._set_config_option=(e,t,r,a,o,s,l,n)=>(_set_config_option=Module._set_config_option=wasmExports.set_config_option)(e,t,r,a,o,s,l,n),_NewGUCNestLevel=Module._NewGUCNestLevel=()=>(_NewGUCNestLevel=Module._NewGUCNestLevel=wasmExports.NewGUCNestLevel)(),_AtEOXact_GUC=Module._AtEOXact_GUC=(e,t)=>(_AtEOXact_GUC=Module._AtEOXact_GUC=wasmExports.AtEOXact_GUC)(e,t),_parse_int=Module._parse_int=(e,t,r,a)=>(_parse_int=Module._parse_int=wasmExports.parse_int)(e,t,r,a),_strtod=Module._strtod=(e,t)=>(_strtod=Module._strtod=wasmExports.strtod)(e,t),_parse_real=Module._parse_real=(e,t,r,a)=>(_parse_real=Module._parse_real=wasmExports.parse_real)(e,t,r,a),_DefineCustomBoolVariable=Module._DefineCustomBoolVariable=(e,t,r,a,o,s,l,n,_,m)=>(_DefineCustomBoolVariable=Module._DefineCustomBoolVariable=wasmExports.DefineCustomBoolVariable)(e,t,r,a,o,s,l,n,_,m),_DefineCustomIntVariable=Module._DefineCustomIntVariable=(e,t,r,a,o,s,l,n,_,m,p,d)=>(_DefineCustomIntVariable=Module._DefineCustomIntVariable=wasmExports.DefineCustomIntVariable)(e,t,r,a,o,s,l,n,_,m,p,d),_DefineCustomRealVariable=Module._DefineCustomRealVariable=(e,t,r,a,o,s,l,n,_,m,p,d)=>(_DefineCustomRealVariable=Module._DefineCustomRealVariable=wasmExports.DefineCustomRealVariable)(e,t,r,a,o,s,l,n,_,m,p,d),_DefineCustomStringVariable=Module._DefineCustomStringVariable=(e,t,r,a,o,s,l,n,_,m)=>(_DefineCustomStringVariable=Module._DefineCustomStringVariable=wasmExports.DefineCustomStringVariable)(e,t,r,a,o,s,l,n,_,m),_DefineCustomEnumVariable=Module._DefineCustomEnumVariable=(e,t,r,a,o,s,l,n,_,m,p)=>(_DefineCustomEnumVariable=Module._DefineCustomEnumVariable=wasmExports.DefineCustomEnumVariable)(e,t,r,a,o,s,l,n,_,m,p),_MarkGUCPrefixReserved=Module._MarkGUCPrefixReserved=e=>(_MarkGUCPrefixReserved=Module._MarkGUCPrefixReserved=wasmExports.MarkGUCPrefixReserved)(e),_strcspn=Module._strcspn=(e,t)=>(_strcspn=Module._strcspn=wasmExports.strcspn)(e,t),_BlockSampler_Init=Module._BlockSampler_Init=(e,t,r,a)=>(_BlockSampler_Init=Module._BlockSampler_Init=wasmExports.BlockSampler_Init)(e,t,r,a),_sampler_random_init_state=Module._sampler_random_init_state=(e,t)=>(_sampler_random_init_state=Module._sampler_random_init_state=wasmExports.sampler_random_init_state)(e,t),_BlockSampler_HasMore=Module._BlockSampler_HasMore=e=>(_BlockSampler_HasMore=Module._BlockSampler_HasMore=wasmExports.BlockSampler_HasMore)(e),_BlockSampler_Next=Module._BlockSampler_Next=e=>(_BlockSampler_Next=Module._BlockSampler_Next=wasmExports.BlockSampler_Next)(e),_sampler_random_fract=Module._sampler_random_fract=e=>(_sampler_random_fract=Module._sampler_random_fract=wasmExports.sampler_random_fract)(e),_reservoir_init_selection_state=Module._reservoir_init_selection_state=(e,t)=>(_reservoir_init_selection_state=Module._reservoir_init_selection_state=wasmExports.reservoir_init_selection_state)(e,t),_reservoir_get_next_S=Module._reservoir_get_next_S=(e,t,r)=>(_reservoir_get_next_S=Module._reservoir_get_next_S=wasmExports.reservoir_get_next_S)(e,t,r),_canonicalize_path=Module._canonicalize_path=e=>(_canonicalize_path=Module._canonicalize_path=wasmExports.canonicalize_path)(e),__bt_mkscankey=Module.__bt_mkscankey=(e,t)=>(__bt_mkscankey=Module.__bt_mkscankey=wasmExports._bt_mkscankey)(e,t),_nocache_index_getattr=Module._nocache_index_getattr=(e,t,r)=>(_nocache_index_getattr=Module._nocache_index_getattr=wasmExports.nocache_index_getattr)(e,t,r),_tuplesort_estimate_shared=Module._tuplesort_estimate_shared=e=>(_tuplesort_estimate_shared=Module._tuplesort_estimate_shared=wasmExports.tuplesort_estimate_shared)(e),_tuplesort_initialize_shared=Module._tuplesort_initialize_shared=(e,t,r)=>(_tuplesort_initialize_shared=Module._tuplesort_initialize_shared=wasmExports.tuplesort_initialize_shared)(e,t,r),_tuplesort_attach_shared=Module._tuplesort_attach_shared=(e,t)=>(_tuplesort_attach_shared=Module._tuplesort_attach_shared=wasmExports.tuplesort_attach_shared)(e,t),_GetCurrentTransactionNestLevel=Module._GetCurrentTransactionNestLevel=()=>(_GetCurrentTransactionNestLevel=Module._GetCurrentTransactionNestLevel=wasmExports.GetCurrentTransactionNestLevel)(),_in_error_recursion_trouble=Module._in_error_recursion_trouble=()=>(_in_error_recursion_trouble=Module._in_error_recursion_trouble=wasmExports.in_error_recursion_trouble)(),_strrchr=Module._strrchr=(e,t)=>(_strrchr=Module._strrchr=wasmExports.strrchr)(e,t),_errhidestmt=Module._errhidestmt=e=>(_errhidestmt=Module._errhidestmt=wasmExports.errhidestmt)(e),_err_generic_string=Module._err_generic_string=(e,t)=>(_err_generic_string=Module._err_generic_string=wasmExports.err_generic_string)(e,t),_getinternalerrposition=Module._getinternalerrposition=()=>(_getinternalerrposition=Module._getinternalerrposition=wasmExports.getinternalerrposition)(),_GetErrorContextStack=Module._GetErrorContextStack=()=>(_GetErrorContextStack=Module._GetErrorContextStack=wasmExports.GetErrorContextStack)(),_SplitIdentifierString=Module._SplitIdentifierString=(e,t,r)=>(_SplitIdentifierString=Module._SplitIdentifierString=wasmExports.SplitIdentifierString)(e,t,r),_appendStringInfoSpaces=Module._appendStringInfoSpaces=(e,t)=>(_appendStringInfoSpaces=Module._appendStringInfoSpaces=wasmExports.appendStringInfoSpaces)(e,t),_unpack_sql_state=Module._unpack_sql_state=e=>(_unpack_sql_state=Module._unpack_sql_state=wasmExports.unpack_sql_state)(e),_CreateTupleDescCopyConstr=Module._CreateTupleDescCopyConstr=e=>(_CreateTupleDescCopyConstr=Module._CreateTupleDescCopyConstr=wasmExports.CreateTupleDescCopyConstr)(e),_CachedPlanAllowsSimpleValidityCheck=Module._CachedPlanAllowsSimpleValidityCheck=(e,t,r)=>(_CachedPlanAllowsSimpleValidityCheck=Module._CachedPlanAllowsSimpleValidityCheck=wasmExports.CachedPlanAllowsSimpleValidityCheck)(e,t,r),_CachedPlanIsSimplyValid=Module._CachedPlanIsSimplyValid=(e,t,r)=>(_CachedPlanIsSimplyValid=Module._CachedPlanIsSimplyValid=wasmExports.CachedPlanIsSimplyValid)(e,t,r),_GetCachedExpression=Module._GetCachedExpression=e=>(_GetCachedExpression=Module._GetCachedExpression=wasmExports.GetCachedExpression)(e),_FreeCachedExpression=Module._FreeCachedExpression=e=>(_FreeCachedExpression=Module._FreeCachedExpression=wasmExports.FreeCachedExpression)(e),_MemoryContextDeleteChildren=Module._MemoryContextDeleteChildren=e=>(_MemoryContextDeleteChildren=Module._MemoryContextDeleteChildren=wasmExports.MemoryContextDeleteChildren)(e),_is_publishable_relation=Module._is_publishable_relation=e=>(_is_publishable_relation=Module._is_publishable_relation=wasmExports.is_publishable_relation)(e),_GetRelationPublications=Module._GetRelationPublications=e=>(_GetRelationPublications=Module._GetRelationPublications=wasmExports.GetRelationPublications)(e),_GetSchemaPublications=Module._GetSchemaPublications=e=>(_GetSchemaPublications=Module._GetSchemaPublications=wasmExports.GetSchemaPublications)(e),_index_getprocid=Module._index_getprocid=(e,t,r)=>(_index_getprocid=Module._index_getprocid=wasmExports.index_getprocid)(e,t,r),_get_rel_relispartition=Module._get_rel_relispartition=e=>(_get_rel_relispartition=Module._get_rel_relispartition=wasmExports.get_rel_relispartition)(e),_get_func_namespace=Module._get_func_namespace=e=>(_get_func_namespace=Module._get_func_namespace=wasmExports.get_func_namespace)(e),_get_typsubscript=Module._get_typsubscript=(e,t)=>(_get_typsubscript=Module._get_typsubscript=wasmExports.get_typsubscript)(e,t),_get_namespace_name_or_temp=Module._get_namespace_name_or_temp=e=>(_get_namespace_name_or_temp=Module._get_namespace_name_or_temp=wasmExports.get_namespace_name_or_temp)(e),_texteq=Module._texteq=e=>(_texteq=Module._texteq=wasmExports.texteq)(e),_GetUserIdAndSecContext=Module._GetUserIdAndSecContext=(e,t)=>(_GetUserIdAndSecContext=Module._GetUserIdAndSecContext=wasmExports.GetUserIdAndSecContext)(e,t),_SetUserIdAndSecContext=Module._SetUserIdAndSecContext=(e,t)=>(_SetUserIdAndSecContext=Module._SetUserIdAndSecContext=wasmExports.SetUserIdAndSecContext)(e,t),_DirectFunctionCall5Coll=Module._DirectFunctionCall5Coll=(e,t,r,a,o,s,l)=>(_DirectFunctionCall5Coll=Module._DirectFunctionCall5Coll=wasmExports.DirectFunctionCall5Coll)(e,t,r,a,o,s,l),_CallerFInfoFunctionCall2=Module._CallerFInfoFunctionCall2=(e,t,r,a,o)=>(_CallerFInfoFunctionCall2=Module._CallerFInfoFunctionCall2=wasmExports.CallerFInfoFunctionCall2)(e,t,r,a,o),_FunctionCall0Coll=Module._FunctionCall0Coll=(e,t)=>(_FunctionCall0Coll=Module._FunctionCall0Coll=wasmExports.FunctionCall0Coll)(e,t),_OutputFunctionCall=Module._OutputFunctionCall=(e,t)=>(_OutputFunctionCall=Module._OutputFunctionCall=wasmExports.OutputFunctionCall)(e,t),_get_fn_expr_rettype=Module._get_fn_expr_rettype=e=>(_get_fn_expr_rettype=Module._get_fn_expr_rettype=wasmExports.get_fn_expr_rettype)(e),_has_fn_opclass_options=Module._has_fn_opclass_options=e=>(_has_fn_opclass_options=Module._has_fn_opclass_options=wasmExports.has_fn_opclass_options)(e),_get_fn_opclass_options=Module._get_fn_opclass_options=e=>(_get_fn_opclass_options=Module._get_fn_opclass_options=wasmExports.get_fn_opclass_options)(e),_CheckFunctionValidatorAccess=Module._CheckFunctionValidatorAccess=(e,t)=>(_CheckFunctionValidatorAccess=Module._CheckFunctionValidatorAccess=wasmExports.CheckFunctionValidatorAccess)(e,t),_resolve_polymorphic_argtypes=Module._resolve_polymorphic_argtypes=(e,t,r,a)=>(_resolve_polymorphic_argtypes=Module._resolve_polymorphic_argtypes=wasmExports.resolve_polymorphic_argtypes)(e,t,r,a),_get_func_arg_info=Module._get_func_arg_info=(e,t,r,a)=>(_get_func_arg_info=Module._get_func_arg_info=wasmExports.get_func_arg_info)(e,t,r,a),_dlsym=Module._dlsym=(e,t)=>(_dlsym=Module._dlsym=wasmExports.dlsym)(e,t),_dlopen=Module._dlopen=(e,t)=>(_dlopen=Module._dlopen=wasmExports.dlopen)(e,t),_dlerror=Module._dlerror=()=>(_dlerror=Module._dlerror=wasmExports.dlerror)(),_dlclose=Module._dlclose=e=>(_dlclose=Module._dlclose=wasmExports.dlclose)(e),_find_rendezvous_variable=Module._find_rendezvous_variable=e=>(_find_rendezvous_variable=Module._find_rendezvous_variable=wasmExports.find_rendezvous_variable)(e),_fscanf=Module._fscanf=(e,t,r)=>(_fscanf=Module._fscanf=wasmExports.fscanf)(e,t,r),_strlcat=Module._strlcat=(e,t,r)=>(_strlcat=Module._strlcat=wasmExports.strlcat)(e,t,r),_pg_bindtextdomain=Module._pg_bindtextdomain=e=>(_pg_bindtextdomain=Module._pg_bindtextdomain=wasmExports.pg_bindtextdomain)(e),_pg_do_encoding_conversion=Module._pg_do_encoding_conversion=(e,t,r,a)=>(_pg_do_encoding_conversion=Module._pg_do_encoding_conversion=wasmExports.pg_do_encoding_conversion)(e,t,r,a),_report_invalid_encoding=Module._report_invalid_encoding=(e,t,r)=>(_report_invalid_encoding=Module._report_invalid_encoding=wasmExports.report_invalid_encoding)(e,t,r),_pg_encoding_to_char_private=Module._pg_encoding_to_char_private=e=>(_pg_encoding_to_char_private=Module._pg_encoding_to_char_private=wasmExports.pg_encoding_to_char_private)(e),_MemoryContextAllocHuge=Module._MemoryContextAllocHuge=(e,t)=>(_MemoryContextAllocHuge=Module._MemoryContextAllocHuge=wasmExports.MemoryContextAllocHuge)(e,t),_namein=Module._namein=e=>(_namein=Module._namein=wasmExports.namein)(e),_pg_char_to_encoding_private=Module._pg_char_to_encoding_private=e=>(_pg_char_to_encoding_private=Module._pg_char_to_encoding_private=wasmExports.pg_char_to_encoding_private)(e),_pg_encoding_max_length=Module._pg_encoding_max_length=e=>(_pg_encoding_max_length=Module._pg_encoding_max_length=wasmExports.pg_encoding_max_length)(e),_pg_server_to_any=Module._pg_server_to_any=(e,t,r)=>(_pg_server_to_any=Module._pg_server_to_any=wasmExports.pg_server_to_any)(e,t,r),_pg_utf_mblen=Module._pg_utf_mblen=e=>(_pg_utf_mblen=Module._pg_utf_mblen=wasmExports.pg_utf_mblen)(e),_pg_wchar2mb_with_len=Module._pg_wchar2mb_with_len=(e,t,r)=>(_pg_wchar2mb_with_len=Module._pg_wchar2mb_with_len=wasmExports.pg_wchar2mb_with_len)(e,t,r),_pg_encoding_mblen=Module._pg_encoding_mblen=(e,t)=>(_pg_encoding_mblen=Module._pg_encoding_mblen=wasmExports.pg_encoding_mblen)(e,t),_check_encoding_conversion_args=Module._check_encoding_conversion_args=(e,t,r,a,o)=>(_check_encoding_conversion_args=Module._check_encoding_conversion_args=wasmExports.check_encoding_conversion_args)(e,t,r,a,o),_report_untranslatable_char=Module._report_untranslatable_char=(e,t,r,a)=>(_report_untranslatable_char=Module._report_untranslatable_char=wasmExports.report_untranslatable_char)(e,t,r,a),_local2local=Module._local2local=(e,t,r,a,o,s,l)=>(_local2local=Module._local2local=wasmExports.local2local)(e,t,r,a,o,s,l),_latin2mic=Module._latin2mic=(e,t,r,a,o,s)=>(_latin2mic=Module._latin2mic=wasmExports.latin2mic)(e,t,r,a,o,s),_mic2latin=Module._mic2latin=(e,t,r,a,o,s)=>(_mic2latin=Module._mic2latin=wasmExports.mic2latin)(e,t,r,a,o,s),_latin2mic_with_table=Module._latin2mic_with_table=(e,t,r,a,o,s,l)=>(_latin2mic_with_table=Module._latin2mic_with_table=wasmExports.latin2mic_with_table)(e,t,r,a,o,s,l),_mic2latin_with_table=Module._mic2latin_with_table=(e,t,r,a,o,s,l)=>(_mic2latin_with_table=Module._mic2latin_with_table=wasmExports.mic2latin_with_table)(e,t,r,a,o,s,l),_pg_encoding_verifymbchar=Module._pg_encoding_verifymbchar=(e,t,r)=>(_pg_encoding_verifymbchar=Module._pg_encoding_verifymbchar=wasmExports.pg_encoding_verifymbchar)(e,t,r),_float_overflow_error=Module._float_overflow_error=()=>(_float_overflow_error=Module._float_overflow_error=wasmExports.float_overflow_error)(),_float_underflow_error=Module._float_underflow_error=()=>(_float_underflow_error=Module._float_underflow_error=wasmExports.float_underflow_error)(),_float4in_internal=Module._float4in_internal=(e,t,r,a,o)=>(_float4in_internal=Module._float4in_internal=wasmExports.float4in_internal)(e,t,r,a,o),_strtof=Module._strtof=(e,t)=>(_strtof=Module._strtof=wasmExports.strtof)(e,t),_float_to_shortest_decimal_buf=Module._float_to_shortest_decimal_buf=(e,t)=>(_float_to_shortest_decimal_buf=Module._float_to_shortest_decimal_buf=wasmExports.float_to_shortest_decimal_buf)(e,t),_float8in_internal=Module._float8in_internal=(e,t,r,a,o)=>(_float8in_internal=Module._float8in_internal=wasmExports.float8in_internal)(e,t,r,a,o),_float8out_internal=Module._float8out_internal=e=>(_float8out_internal=Module._float8out_internal=wasmExports.float8out_internal)(e),_btfloat4cmp=Module._btfloat4cmp=e=>(_btfloat4cmp=Module._btfloat4cmp=wasmExports.btfloat4cmp)(e),_btfloat8cmp=Module._btfloat8cmp=e=>(_btfloat8cmp=Module._btfloat8cmp=wasmExports.btfloat8cmp)(e),_pow=Module._pow=(e,t)=>(_pow=Module._pow=wasmExports.pow)(e,t),_log10=Module._log10=e=>(_log10=Module._log10=wasmExports.log10)(e),_acos=Module._acos=e=>(_acos=Module._acos=wasmExports.acos)(e),_asin=Module._asin=e=>(_asin=Module._asin=wasmExports.asin)(e),_cos=Module._cos=e=>(_cos=Module._cos=wasmExports.cos)(e),_sin=Module._sin=e=>(_sin=Module._sin=wasmExports.sin)(e),_fmod=Module._fmod=(e,t)=>(_fmod=Module._fmod=wasmExports.fmod)(e,t),_construct_array=Module._construct_array=(e,t,r,a,o,s)=>(_construct_array=Module._construct_array=wasmExports.construct_array)(e,t,r,a,o,s),_try_relation_open=Module._try_relation_open=(e,t)=>(_try_relation_open=Module._try_relation_open=wasmExports.try_relation_open)(e,t),_forkname_to_number=Module._forkname_to_number=e=>(_forkname_to_number=Module._forkname_to_number=wasmExports.forkname_to_number)(e),_numeric_lt=Module._numeric_lt=e=>(_numeric_lt=Module._numeric_lt=wasmExports.numeric_lt)(e),_int64_to_numeric=Module._int64_to_numeric=e=>(_int64_to_numeric=Module._int64_to_numeric=wasmExports.int64_to_numeric)(e),_numeric_sub=Module._numeric_sub=e=>(_numeric_sub=Module._numeric_sub=wasmExports.numeric_sub)(e),_numeric_ge=Module._numeric_ge=e=>(_numeric_ge=Module._numeric_ge=wasmExports.numeric_ge)(e),_inet_in=Module._inet_in=e=>(_inet_in=Module._inet_in=wasmExports.inet_in)(e),_format_operator=Module._format_operator=e=>(_format_operator=Module._format_operator=wasmExports.format_operator)(e),_RelationIsVisible=Module._RelationIsVisible=e=>(_RelationIsVisible=Module._RelationIsVisible=wasmExports.RelationIsVisible)(e),_pg_get_indexdef_columns_extended=Module._pg_get_indexdef_columns_extended=(e,t)=>(_pg_get_indexdef_columns_extended=Module._pg_get_indexdef_columns_extended=wasmExports.pg_get_indexdef_columns_extended)(e,t),_accumArrayResult=Module._accumArrayResult=(e,t,r,a,o)=>(_accumArrayResult=Module._accumArrayResult=wasmExports.accumArrayResult)(e,t,r,a,o),_makeArrayResult=Module._makeArrayResult=(e,t)=>(_makeArrayResult=Module._makeArrayResult=wasmExports.makeArrayResult)(e,t),_init_local_reloptions=Module._init_local_reloptions=(e,t)=>(_init_local_reloptions=Module._init_local_reloptions=wasmExports.init_local_reloptions)(e,t),_add_local_int_reloption=Module._add_local_int_reloption=(e,t,r,a,o,s,l)=>(_add_local_int_reloption=Module._add_local_int_reloption=wasmExports.add_local_int_reloption)(e,t,r,a,o,s,l),_pg_inet_net_ntop=Module._pg_inet_net_ntop=(e,t,r,a,o)=>(_pg_inet_net_ntop=Module._pg_inet_net_ntop=wasmExports.pg_inet_net_ntop)(e,t,r,a,o),_network_cmp=Module._network_cmp=e=>(_network_cmp=Module._network_cmp=wasmExports.network_cmp)(e),_convert_network_to_scalar=Module._convert_network_to_scalar=(e,t,r)=>(_convert_network_to_scalar=Module._convert_network_to_scalar=wasmExports.convert_network_to_scalar)(e,t,r),_JsonbValueToJsonb=Module._JsonbValueToJsonb=e=>(_JsonbValueToJsonb=Module._JsonbValueToJsonb=wasmExports.JsonbValueToJsonb)(e),_pushJsonbValue=Module._pushJsonbValue=(e,t,r)=>(_pushJsonbValue=Module._pushJsonbValue=wasmExports.pushJsonbValue)(e,t,r),_numeric_cmp=Module._numeric_cmp=e=>(_numeric_cmp=Module._numeric_cmp=wasmExports.numeric_cmp)(e),_timetz_cmp=Module._timetz_cmp=e=>(_timetz_cmp=Module._timetz_cmp=wasmExports.timetz_cmp)(e),_date_cmp=Module._date_cmp=e=>(_date_cmp=Module._date_cmp=wasmExports.date_cmp)(e),_time_cmp=Module._time_cmp=e=>(_time_cmp=Module._time_cmp=wasmExports.time_cmp)(e),_timestamp_cmp=Module._timestamp_cmp=e=>(_timestamp_cmp=Module._timestamp_cmp=wasmExports.timestamp_cmp)(e),_domain_check=Module._domain_check=(e,t,r,a,o)=>(_domain_check=Module._domain_check=wasmExports.domain_check)(e,t,r,a,o),_initArrayResult=Module._initArrayResult=(e,t,r)=>(_initArrayResult=Module._initArrayResult=wasmExports.initArrayResult)(e,t,r),_path_is_prefix_of_path=Module._path_is_prefix_of_path=(e,t)=>(_path_is_prefix_of_path=Module._path_is_prefix_of_path=wasmExports.path_is_prefix_of_path)(e,t),_path_is_relative_and_below_cwd=Module._path_is_relative_and_below_cwd=e=>(_path_is_relative_and_below_cwd=Module._path_is_relative_and_below_cwd=wasmExports.path_is_relative_and_below_cwd)(e),_ArrayGetIntegerTypmods=Module._ArrayGetIntegerTypmods=(e,t)=>(_ArrayGetIntegerTypmods=Module._ArrayGetIntegerTypmods=wasmExports.ArrayGetIntegerTypmods)(e,t),_bpchareq=Module._bpchareq=e=>(_bpchareq=Module._bpchareq=wasmExports.bpchareq)(e),_varstr_cmp=Module._varstr_cmp=(e,t,r,a,o)=>(_varstr_cmp=Module._varstr_cmp=wasmExports.varstr_cmp)(e,t,r,a,o),_bpcharlt=Module._bpcharlt=e=>(_bpcharlt=Module._bpcharlt=wasmExports.bpcharlt)(e),_bpcharle=Module._bpcharle=e=>(_bpcharle=Module._bpcharle=wasmExports.bpcharle)(e),_bpchargt=Module._bpchargt=e=>(_bpchargt=Module._bpchargt=wasmExports.bpchargt)(e),_bpcharge=Module._bpcharge=e=>(_bpcharge=Module._bpcharge=wasmExports.bpcharge)(e),_bpcharcmp=Module._bpcharcmp=e=>(_bpcharcmp=Module._bpcharcmp=wasmExports.bpcharcmp)(e),_current_query=Module._current_query=e=>(_current_query=Module._current_query=wasmExports.current_query)(e),_str_tolower=Module._str_tolower=(e,t,r)=>(_str_tolower=Module._str_tolower=wasmExports.str_tolower)(e,t,r),_TransferExpandedObject=Module._TransferExpandedObject=(e,t)=>(_TransferExpandedObject=Module._TransferExpandedObject=wasmExports.TransferExpandedObject)(e,t),_macaddr_cmp=Module._macaddr_cmp=e=>(_macaddr_cmp=Module._macaddr_cmp=wasmExports.macaddr_cmp)(e),_macaddr_lt=Module._macaddr_lt=e=>(_macaddr_lt=Module._macaddr_lt=wasmExports.macaddr_lt)(e),_macaddr_le=Module._macaddr_le=e=>(_macaddr_le=Module._macaddr_le=wasmExports.macaddr_le)(e),_macaddr_eq=Module._macaddr_eq=e=>(_macaddr_eq=Module._macaddr_eq=wasmExports.macaddr_eq)(e),_macaddr_ge=Module._macaddr_ge=e=>(_macaddr_ge=Module._macaddr_ge=wasmExports.macaddr_ge)(e),_macaddr_gt=Module._macaddr_gt=e=>(_macaddr_gt=Module._macaddr_gt=wasmExports.macaddr_gt)(e),_quote_ident=Module._quote_ident=e=>(_quote_ident=Module._quote_ident=wasmExports.quote_ident)(e),_timestamp_in=Module._timestamp_in=e=>(_timestamp_in=Module._timestamp_in=wasmExports.timestamp_in)(e),_ParseDateTime=Module._ParseDateTime=(e,t,r,a,o,s,l)=>(_ParseDateTime=Module._ParseDateTime=wasmExports.ParseDateTime)(e,t,r,a,o,s,l),_DecodeDateTime=Module._DecodeDateTime=(e,t,r,a,o,s,l,n)=>(_DecodeDateTime=Module._DecodeDateTime=wasmExports.DecodeDateTime)(e,t,r,a,o,s,l,n),___multi3=Module.___multi3=(e,t,r,a,o)=>(___multi3=Module.___multi3=wasmExports.__multi3)(e,t,r,a,o),_timestamptz_in=Module._timestamptz_in=e=>(_timestamptz_in=Module._timestamptz_in=wasmExports.timestamptz_in)(e),_timestamp_eq=Module._timestamp_eq=e=>(_timestamp_eq=Module._timestamp_eq=wasmExports.timestamp_eq)(e),_timestamp_lt=Module._timestamp_lt=e=>(_timestamp_lt=Module._timestamp_lt=wasmExports.timestamp_lt)(e),_timestamp_gt=Module._timestamp_gt=e=>(_timestamp_gt=Module._timestamp_gt=wasmExports.timestamp_gt)(e),_timestamp_le=Module._timestamp_le=e=>(_timestamp_le=Module._timestamp_le=wasmExports.timestamp_le)(e),_timestamp_ge=Module._timestamp_ge=e=>(_timestamp_ge=Module._timestamp_ge=wasmExports.timestamp_ge)(e),_interval_eq=Module._interval_eq=e=>(_interval_eq=Module._interval_eq=wasmExports.interval_eq)(e),_interval_lt=Module._interval_lt=e=>(_interval_lt=Module._interval_lt=wasmExports.interval_lt)(e),_interval_gt=Module._interval_gt=e=>(_interval_gt=Module._interval_gt=wasmExports.interval_gt)(e),_interval_le=Module._interval_le=e=>(_interval_le=Module._interval_le=wasmExports.interval_le)(e),_interval_ge=Module._interval_ge=e=>(_interval_ge=Module._interval_ge=wasmExports.interval_ge)(e),_interval_cmp=Module._interval_cmp=e=>(_interval_cmp=Module._interval_cmp=wasmExports.interval_cmp)(e),_timestamp_mi=Module._timestamp_mi=e=>(_timestamp_mi=Module._timestamp_mi=wasmExports.timestamp_mi)(e),_interval_um=Module._interval_um=e=>(_interval_um=Module._interval_um=wasmExports.interval_um)(e),_interval_mi=Module._interval_mi=e=>(_interval_mi=Module._interval_mi=wasmExports.interval_mi)(e),_IsValidJsonNumber=Module._IsValidJsonNumber=(e,t)=>(_IsValidJsonNumber=Module._IsValidJsonNumber=wasmExports.IsValidJsonNumber)(e,t),_btnamecmp=Module._btnamecmp=e=>(_btnamecmp=Module._btnamecmp=wasmExports.btnamecmp)(e),_strncpy=Module._strncpy=(e,t,r)=>(_strncpy=Module._strncpy=wasmExports.strncpy)(e,t,r),_expand_array=Module._expand_array=(e,t,r)=>(_expand_array=Module._expand_array=wasmExports.expand_array)(e,t,r),_pg_get_encoding_from_locale=Module._pg_get_encoding_from_locale=(e,t)=>(_pg_get_encoding_from_locale=Module._pg_get_encoding_from_locale=wasmExports.pg_get_encoding_from_locale)(e,t),_localtime=Module._localtime=e=>(_localtime=Module._localtime=wasmExports.localtime)(e),_strftime=Module._strftime=(e,t,r,a)=>(_strftime=Module._strftime=wasmExports.strftime)(e,t,r,a),_numeric_is_nan=Module._numeric_is_nan=e=>(_numeric_is_nan=Module._numeric_is_nan=wasmExports.numeric_is_nan)(e),_numeric_eq=Module._numeric_eq=e=>(_numeric_eq=Module._numeric_eq=wasmExports.numeric_eq)(e),_numeric_gt=Module._numeric_gt=e=>(_numeric_gt=Module._numeric_gt=wasmExports.numeric_gt)(e),_numeric_le=Module._numeric_le=e=>(_numeric_le=Module._numeric_le=wasmExports.numeric_le)(e),_numeric_div=Module._numeric_div=e=>(_numeric_div=Module._numeric_div=wasmExports.numeric_div)(e),_numeric_float8_no_overflow=Module._numeric_float8_no_overflow=e=>(_numeric_float8_no_overflow=Module._numeric_float8_no_overflow=wasmExports.numeric_float8_no_overflow)(e),_numeric_float4=Module._numeric_float4=e=>(_numeric_float4=Module._numeric_float4=wasmExports.numeric_float4)(e),_date_eq=Module._date_eq=e=>(_date_eq=Module._date_eq=wasmExports.date_eq)(e),_date_lt=Module._date_lt=e=>(_date_lt=Module._date_lt=wasmExports.date_lt)(e),_date_le=Module._date_le=e=>(_date_le=Module._date_le=wasmExports.date_le)(e),_date_gt=Module._date_gt=e=>(_date_gt=Module._date_gt=wasmExports.date_gt)(e),_date_ge=Module._date_ge=e=>(_date_ge=Module._date_ge=wasmExports.date_ge)(e),_date_mi=Module._date_mi=e=>(_date_mi=Module._date_mi=wasmExports.date_mi)(e),_time_eq=Module._time_eq=e=>(_time_eq=Module._time_eq=wasmExports.time_eq)(e),_time_lt=Module._time_lt=e=>(_time_lt=Module._time_lt=wasmExports.time_lt)(e),_time_le=Module._time_le=e=>(_time_le=Module._time_le=wasmExports.time_le)(e),_time_gt=Module._time_gt=e=>(_time_gt=Module._time_gt=wasmExports.time_gt)(e),_time_ge=Module._time_ge=e=>(_time_ge=Module._time_ge=wasmExports.time_ge)(e),_time_mi_time=Module._time_mi_time=e=>(_time_mi_time=Module._time_mi_time=wasmExports.time_mi_time)(e),_get_extension_oid=Module._get_extension_oid=(e,t)=>(_get_extension_oid=Module._get_extension_oid=wasmExports.get_extension_oid)(e,t),_pg_ltoa=Module._pg_ltoa=(e,t)=>(_pg_ltoa=Module._pg_ltoa=wasmExports.pg_ltoa)(e,t),_varbit_in=Module._varbit_in=e=>(_varbit_in=Module._varbit_in=wasmExports.varbit_in)(e),_biteq=Module._biteq=e=>(_biteq=Module._biteq=wasmExports.biteq)(e),_bitlt=Module._bitlt=e=>(_bitlt=Module._bitlt=wasmExports.bitlt)(e),_bitle=Module._bitle=e=>(_bitle=Module._bitle=wasmExports.bitle)(e),_bitgt=Module._bitgt=e=>(_bitgt=Module._bitgt=wasmExports.bitgt)(e),_bitge=Module._bitge=e=>(_bitge=Module._bitge=wasmExports.bitge)(e),_bitcmp=Module._bitcmp=e=>(_bitcmp=Module._bitcmp=wasmExports.bitcmp)(e),_tidin=Module._tidin=e=>(_tidin=Module._tidin=wasmExports.tidin)(e),_tidout=Module._tidout=e=>(_tidout=Module._tidout=wasmExports.tidout)(e),_cash_cmp=Module._cash_cmp=e=>(_cash_cmp=Module._cash_cmp=wasmExports.cash_cmp)(e),_arraycontsel=Module._arraycontsel=e=>(_arraycontsel=Module._arraycontsel=wasmExports.arraycontsel)(e),_arraycontjoinsel=Module._arraycontjoinsel=e=>(_arraycontjoinsel=Module._arraycontjoinsel=wasmExports.arraycontjoinsel)(e),_text_lt=Module._text_lt=e=>(_text_lt=Module._text_lt=wasmExports.text_lt)(e),_text_le=Module._text_le=e=>(_text_le=Module._text_le=wasmExports.text_le)(e),_text_gt=Module._text_gt=e=>(_text_gt=Module._text_gt=wasmExports.text_gt)(e),_text_ge=Module._text_ge=e=>(_text_ge=Module._text_ge=wasmExports.text_ge)(e),_bttextcmp=Module._bttextcmp=e=>(_bttextcmp=Module._bttextcmp=wasmExports.bttextcmp)(e),_byteaeq=Module._byteaeq=e=>(_byteaeq=Module._byteaeq=wasmExports.byteaeq)(e),_bytealt=Module._bytealt=e=>(_bytealt=Module._bytealt=wasmExports.bytealt)(e),_byteale=Module._byteale=e=>(_byteale=Module._byteale=wasmExports.byteale)(e),_byteagt=Module._byteagt=e=>(_byteagt=Module._byteagt=wasmExports.byteagt)(e),_byteage=Module._byteage=e=>(_byteage=Module._byteage=wasmExports.byteage)(e),_byteacmp=Module._byteacmp=e=>(_byteacmp=Module._byteacmp=wasmExports.byteacmp)(e),_to_hex32=Module._to_hex32=e=>(_to_hex32=Module._to_hex32=wasmExports.to_hex32)(e),_varstr_levenshtein=Module._varstr_levenshtein=(e,t,r,a,o,s,l,n)=>(_varstr_levenshtein=Module._varstr_levenshtein=wasmExports.varstr_levenshtein)(e,t,r,a,o,s,l,n),_utf8_to_unicode=Module._utf8_to_unicode=e=>(_utf8_to_unicode=Module._utf8_to_unicode=wasmExports.utf8_to_unicode)(e),_format_type_extended=Module._format_type_extended=(e,t,r)=>(_format_type_extended=Module._format_type_extended=wasmExports.format_type_extended)(e,t,r),_array_create_iterator=Module._array_create_iterator=(e,t,r)=>(_array_create_iterator=Module._array_create_iterator=wasmExports.array_create_iterator)(e,t,r),_array_iterate=Module._array_iterate=(e,t,r)=>(_array_iterate=Module._array_iterate=wasmExports.array_iterate)(e,t,r),_make_expanded_record_from_typeid=Module._make_expanded_record_from_typeid=(e,t,r)=>(_make_expanded_record_from_typeid=Module._make_expanded_record_from_typeid=wasmExports.make_expanded_record_from_typeid)(e,t,r),_make_expanded_record_from_tupdesc=Module._make_expanded_record_from_tupdesc=(e,t)=>(_make_expanded_record_from_tupdesc=Module._make_expanded_record_from_tupdesc=wasmExports.make_expanded_record_from_tupdesc)(e,t),_make_expanded_record_from_exprecord=Module._make_expanded_record_from_exprecord=(e,t)=>(_make_expanded_record_from_exprecord=Module._make_expanded_record_from_exprecord=wasmExports.make_expanded_record_from_exprecord)(e,t),_expanded_record_set_tuple=Module._expanded_record_set_tuple=(e,t,r,a)=>(_expanded_record_set_tuple=Module._expanded_record_set_tuple=wasmExports.expanded_record_set_tuple)(e,t,r,a),_expanded_record_get_tuple=Module._expanded_record_get_tuple=e=>(_expanded_record_get_tuple=Module._expanded_record_get_tuple=wasmExports.expanded_record_get_tuple)(e),_deconstruct_expanded_record=Module._deconstruct_expanded_record=e=>(_deconstruct_expanded_record=Module._deconstruct_expanded_record=wasmExports.deconstruct_expanded_record)(e),_expanded_record_lookup_field=Module._expanded_record_lookup_field=(e,t,r)=>(_expanded_record_lookup_field=Module._expanded_record_lookup_field=wasmExports.expanded_record_lookup_field)(e,t,r),_expanded_record_set_field_internal=Module._expanded_record_set_field_internal=(e,t,r,a,o,s)=>(_expanded_record_set_field_internal=Module._expanded_record_set_field_internal=wasmExports.expanded_record_set_field_internal)(e,t,r,a,o,s),_expanded_record_set_fields=Module._expanded_record_set_fields=(e,t,r,a)=>(_expanded_record_set_fields=Module._expanded_record_set_fields=wasmExports.expanded_record_set_fields)(e,t,r,a),_macaddr8_cmp=Module._macaddr8_cmp=e=>(_macaddr8_cmp=Module._macaddr8_cmp=wasmExports.macaddr8_cmp)(e),_macaddr8_lt=Module._macaddr8_lt=e=>(_macaddr8_lt=Module._macaddr8_lt=wasmExports.macaddr8_lt)(e),_macaddr8_le=Module._macaddr8_le=e=>(_macaddr8_le=Module._macaddr8_le=wasmExports.macaddr8_le)(e),_macaddr8_eq=Module._macaddr8_eq=e=>(_macaddr8_eq=Module._macaddr8_eq=wasmExports.macaddr8_eq)(e),_macaddr8_ge=Module._macaddr8_ge=e=>(_macaddr8_ge=Module._macaddr8_ge=wasmExports.macaddr8_ge)(e),_macaddr8_gt=Module._macaddr8_gt=e=>(_macaddr8_gt=Module._macaddr8_gt=wasmExports.macaddr8_gt)(e),_enum_lt=Module._enum_lt=e=>(_enum_lt=Module._enum_lt=wasmExports.enum_lt)(e),_enum_le=Module._enum_le=e=>(_enum_le=Module._enum_le=wasmExports.enum_le)(e),_enum_ge=Module._enum_ge=e=>(_enum_ge=Module._enum_ge=wasmExports.enum_ge)(e),_enum_gt=Module._enum_gt=e=>(_enum_gt=Module._enum_gt=wasmExports.enum_gt)(e),_enum_cmp=Module._enum_cmp=e=>(_enum_cmp=Module._enum_cmp=wasmExports.enum_cmp)(e),_uuid_in=Module._uuid_in=e=>(_uuid_in=Module._uuid_in=wasmExports.uuid_in)(e),_uuid_out=Module._uuid_out=e=>(_uuid_out=Module._uuid_out=wasmExports.uuid_out)(e),_uuid_cmp=Module._uuid_cmp=e=>(_uuid_cmp=Module._uuid_cmp=wasmExports.uuid_cmp)(e),_gen_random_uuid=Module._gen_random_uuid=e=>(_gen_random_uuid=Module._gen_random_uuid=wasmExports.gen_random_uuid)(e),_generic_restriction_selectivity=Module._generic_restriction_selectivity=(e,t,r,a,o,s)=>(_generic_restriction_selectivity=Module._generic_restriction_selectivity=wasmExports.generic_restriction_selectivity)(e,t,r,a,o,s),_genericcostestimate=Module._genericcostestimate=(e,t,r,a)=>(_genericcostestimate=Module._genericcostestimate=wasmExports.genericcostestimate)(e,t,r,a),_pg_xml_init=Module._pg_xml_init=e=>(_pg_xml_init=Module._pg_xml_init=wasmExports.pg_xml_init)(e),_xmlInitParser=Module._xmlInitParser=()=>(_xmlInitParser=Module._xmlInitParser=wasmExports.xmlInitParser)(),_xml_ereport=Module._xml_ereport=(e,t,r,a)=>(_xml_ereport=Module._xml_ereport=wasmExports.xml_ereport)(e,t,r,a),_pg_xml_done=Module._pg_xml_done=(e,t)=>(_pg_xml_done=Module._pg_xml_done=wasmExports.pg_xml_done)(e,t),_xmlXPathNewContext=Module._xmlXPathNewContext=e=>(_xmlXPathNewContext=Module._xmlXPathNewContext=wasmExports.xmlXPathNewContext)(e),_xmlXPathFreeContext=Module._xmlXPathFreeContext=e=>(_xmlXPathFreeContext=Module._xmlXPathFreeContext=wasmExports.xmlXPathFreeContext)(e),_xmlFreeDoc=Module._xmlFreeDoc=e=>(_xmlFreeDoc=Module._xmlFreeDoc=wasmExports.xmlFreeDoc)(e),_xmlXPathCompile=Module._xmlXPathCompile=e=>(_xmlXPathCompile=Module._xmlXPathCompile=wasmExports.xmlXPathCompile)(e),_xmlXPathCompiledEval=Module._xmlXPathCompiledEval=(e,t)=>(_xmlXPathCompiledEval=Module._xmlXPathCompiledEval=wasmExports.xmlXPathCompiledEval)(e,t),_xmlXPathFreeCompExpr=Module._xmlXPathFreeCompExpr=e=>(_xmlXPathFreeCompExpr=Module._xmlXPathFreeCompExpr=wasmExports.xmlXPathFreeCompExpr)(e),_xmlStrdup=Module._xmlStrdup=e=>(_xmlStrdup=Module._xmlStrdup=wasmExports.xmlStrdup)(e),_strnlen=Module._strnlen=(e,t)=>(_strnlen=Module._strnlen=wasmExports.strnlen)(e,t),_xmlXPathCastNodeToString=Module._xmlXPathCastNodeToString=e=>(_xmlXPathCastNodeToString=Module._xmlXPathCastNodeToString=wasmExports.xmlXPathCastNodeToString)(e),_heap_modify_tuple_by_cols=Module._heap_modify_tuple_by_cols=(e,t,r,a,o,s)=>(_heap_modify_tuple_by_cols=Module._heap_modify_tuple_by_cols=wasmExports.heap_modify_tuple_by_cols)(e,t,r,a,o,s),_ResourceOwnerReleaseAllPlanCacheRefs=Module._ResourceOwnerReleaseAllPlanCacheRefs=e=>(_ResourceOwnerReleaseAllPlanCacheRefs=Module._ResourceOwnerReleaseAllPlanCacheRefs=wasmExports.ResourceOwnerReleaseAllPlanCacheRefs)(e),_RegisterResourceReleaseCallback=Module._RegisterResourceReleaseCallback=(e,t)=>(_RegisterResourceReleaseCallback=Module._RegisterResourceReleaseCallback=wasmExports.RegisterResourceReleaseCallback)(e,t),_PinPortal=Module._PinPortal=e=>(_PinPortal=Module._PinPortal=wasmExports.PinPortal)(e),_UnpinPortal=Module._UnpinPortal=e=>(_UnpinPortal=Module._UnpinPortal=wasmExports.UnpinPortal)(e),_btint2cmp=Module._btint2cmp=e=>(_btint2cmp=Module._btint2cmp=wasmExports.btint2cmp)(e),_btint4cmp=Module._btint4cmp=e=>(_btint4cmp=Module._btint4cmp=wasmExports.btint4cmp)(e),_btoidcmp=Module._btoidcmp=e=>(_btoidcmp=Module._btoidcmp=wasmExports.btoidcmp)(e),_btcharcmp=Module._btcharcmp=e=>(_btcharcmp=Module._btcharcmp=wasmExports.btcharcmp)(e),_btint8cmp=Module._btint8cmp=e=>(_btint8cmp=Module._btint8cmp=wasmExports.btint8cmp)(e),_btboolcmp=Module._btboolcmp=e=>(_btboolcmp=Module._btboolcmp=wasmExports.btboolcmp)(e),_GetPublicationByName=Module._GetPublicationByName=(e,t)=>(_GetPublicationByName=Module._GetPublicationByName=wasmExports.GetPublicationByName)(e,t),_GetTopMostAncestorInPublication=Module._GetTopMostAncestorInPublication=(e,t,r)=>(_GetTopMostAncestorInPublication=Module._GetTopMostAncestorInPublication=wasmExports.GetTopMostAncestorInPublication)(e,t,r),_pub_collist_to_bitmapset=Module._pub_collist_to_bitmapset=(e,t,r)=>(_pub_collist_to_bitmapset=Module._pub_collist_to_bitmapset=wasmExports.pub_collist_to_bitmapset)(e,t,r),_getExtensionOfObject=Module._getExtensionOfObject=(e,t)=>(_getExtensionOfObject=Module._getExtensionOfObject=wasmExports.getExtensionOfObject)(e,t),_visibilitymap_prepare_truncate=Module._visibilitymap_prepare_truncate=(e,t)=>(_visibilitymap_prepare_truncate=Module._visibilitymap_prepare_truncate=wasmExports.visibilitymap_prepare_truncate)(e,t),_log_newpage_range=Module._log_newpage_range=(e,t,r,a,o)=>(_log_newpage_range=Module._log_newpage_range=wasmExports.log_newpage_range)(e,t,r,a,o),_function_parse_error_transpose=Module._function_parse_error_transpose=e=>(_function_parse_error_transpose=Module._function_parse_error_transpose=wasmExports.function_parse_error_transpose)(e),_IndexGetRelation=Module._IndexGetRelation=(e,t)=>(_IndexGetRelation=Module._IndexGetRelation=wasmExports.IndexGetRelation)(e,t),_RelnameGetRelid=Module._RelnameGetRelid=e=>(_RelnameGetRelid=Module._RelnameGetRelid=wasmExports.RelnameGetRelid)(e),_standard_ProcessUtility=Module._standard_ProcessUtility=(e,t,r,a,o,s,l,n)=>(_standard_ProcessUtility=Module._standard_ProcessUtility=wasmExports.standard_ProcessUtility)(e,t,r,a,o,s,l,n),_Async_Notify=Module._Async_Notify=(e,t)=>(_Async_Notify=Module._Async_Notify=wasmExports.Async_Notify)(e,t),_sigaddset=Module._sigaddset=(e,t)=>(_sigaddset=Module._sigaddset=wasmExports.sigaddset)(e,t),_fsync_pgdata=Module._fsync_pgdata=(e,t)=>(_fsync_pgdata=Module._fsync_pgdata=wasmExports.fsync_pgdata)(e,t),_get_restricted_token=Module._get_restricted_token=()=>(_get_restricted_token=Module._get_restricted_token=wasmExports.get_restricted_token)(),_pg_malloc=Module._pg_malloc=e=>(_pg_malloc=Module._pg_malloc=wasmExports.pg_malloc)(e),_pg_realloc=Module._pg_realloc=(e,t)=>(_pg_realloc=Module._pg_realloc=wasmExports.pg_realloc)(e,t),_pg_strdup=Module._pg_strdup=e=>(_pg_strdup=Module._pg_strdup=wasmExports.pg_strdup)(e),_simple_prompt=Module._simple_prompt=(e,t)=>(_simple_prompt=Module._simple_prompt=wasmExports.simple_prompt)(e,t),_interactive_file=Module._interactive_file=()=>(_interactive_file=Module._interactive_file=wasmExports.interactive_file)(),_interactive_one=Module._interactive_one=()=>(_interactive_one=Module._interactive_one=wasmExports.interactive_one)(),_pg_shutdown=Module._pg_shutdown=()=>(_pg_shutdown=Module._pg_shutdown=wasmExports.pg_shutdown)(),_interactive_write=Module._interactive_write=e=>(_interactive_write=Module._interactive_write=wasmExports.interactive_write)(e),_interactive_read=Module._interactive_read=()=>(_interactive_read=Module._interactive_read=wasmExports.interactive_read)(),_visibilitymap_pin=Module._visibilitymap_pin=(e,t,r)=>(_visibilitymap_pin=Module._visibilitymap_pin=wasmExports.visibilitymap_pin)(e,t,r),_HeapTupleSatisfiesVacuum=Module._HeapTupleSatisfiesVacuum=(e,t,r)=>(_HeapTupleSatisfiesVacuum=Module._HeapTupleSatisfiesVacuum=wasmExports.HeapTupleSatisfiesVacuum)(e,t,r),_visibilitymap_clear=Module._visibilitymap_clear=(e,t,r,a)=>(_visibilitymap_clear=Module._visibilitymap_clear=wasmExports.visibilitymap_clear)(e,t,r,a),_vac_estimate_reltuples=Module._vac_estimate_reltuples=(e,t,r,a)=>(_vac_estimate_reltuples=Module._vac_estimate_reltuples=wasmExports.vac_estimate_reltuples)(e,t,r,a),_heap_tuple_needs_eventual_freeze=Module._heap_tuple_needs_eventual_freeze=e=>(_heap_tuple_needs_eventual_freeze=Module._heap_tuple_needs_eventual_freeze=wasmExports.heap_tuple_needs_eventual_freeze)(e),_HeapTupleSatisfiesUpdate=Module._HeapTupleSatisfiesUpdate=(e,t,r)=>(_HeapTupleSatisfiesUpdate=Module._HeapTupleSatisfiesUpdate=wasmExports.HeapTupleSatisfiesUpdate)(e,t,r),_HeapTupleGetUpdateXid=Module._HeapTupleGetUpdateXid=e=>(_HeapTupleGetUpdateXid=Module._HeapTupleGetUpdateXid=wasmExports.HeapTupleGetUpdateXid)(e),_HeapTupleSatisfiesVisibility=Module._HeapTupleSatisfiesVisibility=(e,t,r)=>(_HeapTupleSatisfiesVisibility=Module._HeapTupleSatisfiesVisibility=wasmExports.HeapTupleSatisfiesVisibility)(e,t,r),_GetMultiXactIdMembers=Module._GetMultiXactIdMembers=(e,t,r,a)=>(_GetMultiXactIdMembers=Module._GetMultiXactIdMembers=wasmExports.GetMultiXactIdMembers)(e,t,r,a),_XLogRecGetBlockTagExtended=Module._XLogRecGetBlockTagExtended=(e,t,r,a,o,s)=>(_XLogRecGetBlockTagExtended=Module._XLogRecGetBlockTagExtended=wasmExports.XLogRecGetBlockTagExtended)(e,t,r,a,o,s),_toast_open_indexes=Module._toast_open_indexes=(e,t,r,a)=>(_toast_open_indexes=Module._toast_open_indexes=wasmExports.toast_open_indexes)(e,t,r,a),_init_toast_snapshot=Module._init_toast_snapshot=e=>(_init_toast_snapshot=Module._init_toast_snapshot=wasmExports.init_toast_snapshot)(e),_toast_close_indexes=Module._toast_close_indexes=(e,t,r)=>(_toast_close_indexes=Module._toast_close_indexes=wasmExports.toast_close_indexes)(e,t,r),_index_getprocinfo=Module._index_getprocinfo=(e,t,r)=>(_index_getprocinfo=Module._index_getprocinfo=wasmExports.index_getprocinfo)(e,t,r),_identify_opfamily_groups=Module._identify_opfamily_groups=(e,t)=>(_identify_opfamily_groups=Module._identify_opfamily_groups=wasmExports.identify_opfamily_groups)(e,t),_check_amproc_signature=Module._check_amproc_signature=(e,t,r,a,o,s)=>(_check_amproc_signature=Module._check_amproc_signature=wasmExports.check_amproc_signature)(e,t,r,a,o,s),_check_amoptsproc_signature=Module._check_amoptsproc_signature=e=>(_check_amoptsproc_signature=Module._check_amoptsproc_signature=wasmExports.check_amoptsproc_signature)(e),_check_amop_signature=Module._check_amop_signature=(e,t,r,a)=>(_check_amop_signature=Module._check_amop_signature=wasmExports.check_amop_signature)(e,t,r,a),_RelationGetIndexScan=Module._RelationGetIndexScan=(e,t,r)=>(_RelationGetIndexScan=Module._RelationGetIndexScan=wasmExports.RelationGetIndexScan)(e,t,r),__hash_get_indextuple_hashkey=Module.__hash_get_indextuple_hashkey=e=>(__hash_get_indextuple_hashkey=Module.__hash_get_indextuple_hashkey=wasmExports._hash_get_indextuple_hashkey)(e),__hash_getbuf=Module.__hash_getbuf=(e,t,r,a)=>(__hash_getbuf=Module.__hash_getbuf=wasmExports._hash_getbuf)(e,t,r,a),__hash_relbuf=Module.__hash_relbuf=(e,t)=>(__hash_relbuf=Module.__hash_relbuf=wasmExports._hash_relbuf)(e,t),__hash_getbuf_with_strategy=Module.__hash_getbuf_with_strategy=(e,t,r,a,o)=>(__hash_getbuf_with_strategy=Module.__hash_getbuf_with_strategy=wasmExports._hash_getbuf_with_strategy)(e,t,r,a,o),_build_reloptions=Module._build_reloptions=(e,t,r,a,o,s)=>(_build_reloptions=Module._build_reloptions=wasmExports.build_reloptions)(e,t,r,a,o,s),_index_form_tuple=Module._index_form_tuple=(e,t,r)=>(_index_form_tuple=Module._index_form_tuple=wasmExports.index_form_tuple)(e,t,r),__hash_ovflblkno_to_bitno=Module.__hash_ovflblkno_to_bitno=(e,t)=>(__hash_ovflblkno_to_bitno=Module.__hash_ovflblkno_to_bitno=wasmExports._hash_ovflblkno_to_bitno)(e,t),_brin_build_desc=Module._brin_build_desc=e=>(_brin_build_desc=Module._brin_build_desc=wasmExports.brin_build_desc)(e),_brin_deform_tuple=Module._brin_deform_tuple=(e,t,r)=>(_brin_deform_tuple=Module._brin_deform_tuple=wasmExports.brin_deform_tuple)(e,t,r),_brin_free_desc=Module._brin_free_desc=e=>(_brin_free_desc=Module._brin_free_desc=wasmExports.brin_free_desc)(e),_XLogRecGetBlockRefInfo=Module._XLogRecGetBlockRefInfo=(e,t,r,a,o)=>(_XLogRecGetBlockRefInfo=Module._XLogRecGetBlockRefInfo=wasmExports.XLogRecGetBlockRefInfo)(e,t,r,a,o),_ginPostingListDecode=Module._ginPostingListDecode=(e,t)=>(_ginPostingListDecode=Module._ginPostingListDecode=wasmExports.ginPostingListDecode)(e,t),_add_reloption_kind=Module._add_reloption_kind=()=>(_add_reloption_kind=Module._add_reloption_kind=wasmExports.add_reloption_kind)(),_register_reloptions_validator=Module._register_reloptions_validator=(e,t)=>(_register_reloptions_validator=Module._register_reloptions_validator=wasmExports.register_reloptions_validator)(e,t),_add_int_reloption=Module._add_int_reloption=(e,t,r,a,o,s,l)=>(_add_int_reloption=Module._add_int_reloption=wasmExports.add_int_reloption)(e,t,r,a,o,s,l),_XLogFindNextRecord=Module._XLogFindNextRecord=(e,t)=>(_XLogFindNextRecord=Module._XLogFindNextRecord=wasmExports.XLogFindNextRecord)(e,t),_RestoreBlockImage=Module._RestoreBlockImage=(e,t,r)=>(_RestoreBlockImage=Module._RestoreBlockImage=wasmExports.RestoreBlockImage)(e,t,r),_GenericXLogStart=Module._GenericXLogStart=e=>(_GenericXLogStart=Module._GenericXLogStart=wasmExports.GenericXLogStart)(e),_GenericXLogRegisterBuffer=Module._GenericXLogRegisterBuffer=(e,t,r)=>(_GenericXLogRegisterBuffer=Module._GenericXLogRegisterBuffer=wasmExports.GenericXLogRegisterBuffer)(e,t,r),_GenericXLogFinish=Module._GenericXLogFinish=e=>(_GenericXLogFinish=Module._GenericXLogFinish=wasmExports.GenericXLogFinish)(e),_GenericXLogAbort=Module._GenericXLogAbort=e=>(_GenericXLogAbort=Module._GenericXLogAbort=wasmExports.GenericXLogAbort)(e),_read_local_xlog_page_no_wait=Module._read_local_xlog_page_no_wait=(e,t,r,a,o)=>(_read_local_xlog_page_no_wait=Module._read_local_xlog_page_no_wait=wasmExports.read_local_xlog_page_no_wait)(e,t,r,a,o),_XLogRecStoreStats=Module._XLogRecStoreStats=(e,t)=>(_XLogRecStoreStats=Module._XLogRecStoreStats=wasmExports.XLogRecStoreStats)(e,t),_ReadMultiXactIdRange=Module._ReadMultiXactIdRange=(e,t)=>(_ReadMultiXactIdRange=Module._ReadMultiXactIdRange=wasmExports.ReadMultiXactIdRange)(e,t),_MultiXactIdPrecedesOrEquals=Module._MultiXactIdPrecedesOrEquals=(e,t)=>(_MultiXactIdPrecedesOrEquals=Module._MultiXactIdPrecedesOrEquals=wasmExports.MultiXactIdPrecedesOrEquals)(e,t),_RegisterXactCallback=Module._RegisterXactCallback=(e,t)=>(_RegisterXactCallback=Module._RegisterXactCallback=wasmExports.RegisterXactCallback)(e,t),_RegisterSubXactCallback=Module._RegisterSubXactCallback=(e,t)=>(_RegisterSubXactCallback=Module._RegisterSubXactCallback=wasmExports.RegisterSubXactCallback)(e,t),_ReleaseCurrentSubTransaction=Module._ReleaseCurrentSubTransaction=()=>(_ReleaseCurrentSubTransaction=Module._ReleaseCurrentSubTransaction=wasmExports.ReleaseCurrentSubTransaction)(),_WaitForParallelWorkersToAttach=Module._WaitForParallelWorkersToAttach=e=>(_WaitForParallelWorkersToAttach=Module._WaitForParallelWorkersToAttach=wasmExports.WaitForParallelWorkersToAttach)(e),__bt_allequalimage=Module.__bt_allequalimage=(e,t)=>(__bt_allequalimage=Module.__bt_allequalimage=wasmExports._bt_allequalimage)(e,t),__bt_checkpage=Module.__bt_checkpage=(e,t)=>(__bt_checkpage=Module.__bt_checkpage=wasmExports._bt_checkpage)(e,t),__bt_relbuf=Module.__bt_relbuf=(e,t)=>(__bt_relbuf=Module.__bt_relbuf=wasmExports._bt_relbuf)(e,t),__bt_metaversion=Module.__bt_metaversion=(e,t,r)=>(__bt_metaversion=Module.__bt_metaversion=wasmExports._bt_metaversion)(e,t,r),__bt_search=Module.__bt_search=(e,t,r,a,o,s)=>(__bt_search=Module.__bt_search=wasmExports._bt_search)(e,t,r,a,o,s),__bt_compare=Module.__bt_compare=(e,t,r,a)=>(__bt_compare=Module.__bt_compare=wasmExports._bt_compare)(e,t,r,a),__bt_binsrch_insert=Module.__bt_binsrch_insert=(e,t)=>(__bt_binsrch_insert=Module.__bt_binsrch_insert=wasmExports._bt_binsrch_insert)(e,t),__bt_freestack=Module.__bt_freestack=e=>(__bt_freestack=Module.__bt_freestack=wasmExports._bt_freestack)(e),__bt_form_posting=Module.__bt_form_posting=(e,t,r)=>(__bt_form_posting=Module.__bt_form_posting=wasmExports._bt_form_posting)(e,t,r),__bt_check_natts=Module.__bt_check_natts=(e,t,r,a)=>(__bt_check_natts=Module.__bt_check_natts=wasmExports._bt_check_natts)(e,t,r,a),_gistcheckpage=Module._gistcheckpage=(e,t)=>(_gistcheckpage=Module._gistcheckpage=wasmExports.gistcheckpage)(e,t),_EndCopyFrom=Module._EndCopyFrom=e=>(_EndCopyFrom=Module._EndCopyFrom=wasmExports.EndCopyFrom)(e),_ProcessCopyOptions=Module._ProcessCopyOptions=(e,t,r,a)=>(_ProcessCopyOptions=Module._ProcessCopyOptions=wasmExports.ProcessCopyOptions)(e,t,r,a),_CopyFromErrorCallback=Module._CopyFromErrorCallback=e=>(_CopyFromErrorCallback=Module._CopyFromErrorCallback=wasmExports.CopyFromErrorCallback)(e),_NextCopyFrom=Module._NextCopyFrom=(e,t,r,a)=>(_NextCopyFrom=Module._NextCopyFrom=wasmExports.NextCopyFrom)(e,t,r,a),_nextval=Module._nextval=e=>(_nextval=Module._nextval=wasmExports.nextval)(e),_defGetStreamingMode=Module._defGetStreamingMode=e=>(_defGetStreamingMode=Module._defGetStreamingMode=wasmExports.defGetStreamingMode)(e),_ExplainBeginOutput=Module._ExplainBeginOutput=e=>(_ExplainBeginOutput=Module._ExplainBeginOutput=wasmExports.ExplainBeginOutput)(e),_NewExplainState=Module._NewExplainState=()=>(_NewExplainState=Module._NewExplainState=wasmExports.NewExplainState)(),_ExplainEndOutput=Module._ExplainEndOutput=e=>(_ExplainEndOutput=Module._ExplainEndOutput=wasmExports.ExplainEndOutput)(e),_ExplainPrintPlan=Module._ExplainPrintPlan=(e,t)=>(_ExplainPrintPlan=Module._ExplainPrintPlan=wasmExports.ExplainPrintPlan)(e,t),_ExplainPrintTriggers=Module._ExplainPrintTriggers=(e,t)=>(_ExplainPrintTriggers=Module._ExplainPrintTriggers=wasmExports.ExplainPrintTriggers)(e,t),_ExplainPrintJITSummary=Module._ExplainPrintJITSummary=(e,t)=>(_ExplainPrintJITSummary=Module._ExplainPrintJITSummary=wasmExports.ExplainPrintJITSummary)(e,t),_ExplainPropertyInteger=Module._ExplainPropertyInteger=(e,t,r,a)=>(_ExplainPropertyInteger=Module._ExplainPropertyInteger=wasmExports.ExplainPropertyInteger)(e,t,r,a),_ExplainQueryText=Module._ExplainQueryText=(e,t)=>(_ExplainQueryText=Module._ExplainQueryText=wasmExports.ExplainQueryText)(e,t),_ExplainPropertyText=Module._ExplainPropertyText=(e,t,r)=>(_ExplainPropertyText=Module._ExplainPropertyText=wasmExports.ExplainPropertyText)(e,t,r),_ExplainQueryParameters=Module._ExplainQueryParameters=(e,t,r)=>(_ExplainQueryParameters=Module._ExplainQueryParameters=wasmExports.ExplainQueryParameters)(e,t,r),_pg_is_ascii=Module._pg_is_ascii=e=>(_pg_is_ascii=Module._pg_is_ascii=wasmExports.pg_is_ascii)(e),_fputs=Module._fputs=(e,t)=>(_fputs=Module._fputs=wasmExports.fputs)(e,t),_popen=Module._popen=(e,t)=>(_popen=Module._popen=wasmExports.popen)(e,t),_float_to_shortest_decimal_bufn=Module._float_to_shortest_decimal_bufn=(e,t)=>(_float_to_shortest_decimal_bufn=Module._float_to_shortest_decimal_bufn=wasmExports.float_to_shortest_decimal_bufn)(e,t),_pg_prng_uint64=Module._pg_prng_uint64=e=>(_pg_prng_uint64=Module._pg_prng_uint64=wasmExports.pg_prng_uint64)(e),_scram_ClientKey=Module._scram_ClientKey=(e,t,r,a,o)=>(_scram_ClientKey=Module._scram_ClientKey=wasmExports.scram_ClientKey)(e,t,r,a,o),_pg_encoding_dsplen=Module._pg_encoding_dsplen=(e,t)=>(_pg_encoding_dsplen=Module._pg_encoding_dsplen=wasmExports.pg_encoding_dsplen)(e,t),_getcwd=Module._getcwd=(e,t)=>(_getcwd=Module._getcwd=wasmExports.getcwd)(e,t),_pg_get_user_home_dir=Module._pg_get_user_home_dir=(e,t,r)=>(_pg_get_user_home_dir=Module._pg_get_user_home_dir=wasmExports.pg_get_user_home_dir)(e,t,r),_nanosleep=Module._nanosleep=(e,t)=>(_nanosleep=Module._nanosleep=wasmExports.nanosleep)(e,t),_snprintf=Module._snprintf=(e,t,r,a)=>(_snprintf=Module._snprintf=wasmExports.snprintf)(e,t,r,a),_pg_strerror_r=Module._pg_strerror_r=(e,t,r)=>(_pg_strerror_r=Module._pg_strerror_r=wasmExports.pg_strerror_r)(e,t,r),_pthread_mutex_lock=Module._pthread_mutex_lock=e=>(_pthread_mutex_lock=Module._pthread_mutex_lock=wasmExports.pthread_mutex_lock)(e),_pthread_mutex_unlock=Module._pthread_mutex_unlock=e=>(_pthread_mutex_unlock=Module._pthread_mutex_unlock=wasmExports.pthread_mutex_unlock)(e),_strncat=Module._strncat=(e,t,r)=>(_strncat=Module._strncat=wasmExports.strncat)(e,t,r),_PQexec=Module._PQexec=(e,t)=>(_PQexec=Module._PQexec=wasmExports.PQexec)(e,t),_PQsetSingleRowMode=Module._PQsetSingleRowMode=e=>(_PQsetSingleRowMode=Module._PQsetSingleRowMode=wasmExports.PQsetSingleRowMode)(e),_PQcmdStatus=Module._PQcmdStatus=e=>(_PQcmdStatus=Module._PQcmdStatus=wasmExports.PQcmdStatus)(e),_pthread_sigmask=Module._pthread_sigmask=(e,t,r)=>(_pthread_sigmask=Module._pthread_sigmask=wasmExports.pthread_sigmask)(e,t,r),_sigismember=Module._sigismember=(e,t)=>(_sigismember=Module._sigismember=wasmExports.sigismember)(e,t),_sigpending=Module._sigpending=e=>(_sigpending=Module._sigpending=wasmExports.sigpending)(e),_sigwait=Module._sigwait=(e,t)=>(_sigwait=Module._sigwait=wasmExports.sigwait)(e,t),_isolat1ToUTF8=Module._isolat1ToUTF8=(e,t,r,a)=>(_isolat1ToUTF8=Module._isolat1ToUTF8=wasmExports.isolat1ToUTF8)(e,t,r,a),_UTF8Toisolat1=Module._UTF8Toisolat1=(e,t,r,a)=>(_UTF8Toisolat1=Module._UTF8Toisolat1=wasmExports.UTF8Toisolat1)(e,t,r,a),_vfprintf=Module._vfprintf=(e,t,r)=>(_vfprintf=Module._vfprintf=wasmExports.vfprintf)(e,t,r),_vsnprintf=Module._vsnprintf=(e,t,r,a)=>(_vsnprintf=Module._vsnprintf=wasmExports.vsnprintf)(e,t,r,a),_xmlParserValidityWarning=Module._xmlParserValidityWarning=(e,t,r)=>(_xmlParserValidityWarning=Module._xmlParserValidityWarning=wasmExports.xmlParserValidityWarning)(e,t,r),_xmlParserValidityError=Module._xmlParserValidityError=(e,t,r)=>(_xmlParserValidityError=Module._xmlParserValidityError=wasmExports.xmlParserValidityError)(e,t,r),_xmlParserError=Module._xmlParserError=(e,t,r)=>(_xmlParserError=Module._xmlParserError=wasmExports.xmlParserError)(e,t,r),_xmlParserWarning=Module._xmlParserWarning=(e,t,r)=>(_xmlParserWarning=Module._xmlParserWarning=wasmExports.xmlParserWarning)(e,t,r),_fprintf=Module._fprintf=(e,t,r)=>(_fprintf=Module._fprintf=wasmExports.fprintf)(e,t,r),___xmlParserInputBufferCreateFilename=Module.___xmlParserInputBufferCreateFilename=(e,t)=>(___xmlParserInputBufferCreateFilename=Module.___xmlParserInputBufferCreateFilename=wasmExports.__xmlParserInputBufferCreateFilename)(e,t),___xmlOutputBufferCreateFilename=Module.___xmlOutputBufferCreateFilename=(e,t,r)=>(___xmlOutputBufferCreateFilename=Module.___xmlOutputBufferCreateFilename=wasmExports.__xmlOutputBufferCreateFilename)(e,t,r),_xmlSAX2InternalSubset=Module._xmlSAX2InternalSubset=(e,t,r,a)=>(_xmlSAX2InternalSubset=Module._xmlSAX2InternalSubset=wasmExports.xmlSAX2InternalSubset)(e,t,r,a),_xmlSAX2IsStandalone=Module._xmlSAX2IsStandalone=e=>(_xmlSAX2IsStandalone=Module._xmlSAX2IsStandalone=wasmExports.xmlSAX2IsStandalone)(e),_xmlSAX2HasInternalSubset=Module._xmlSAX2HasInternalSubset=e=>(_xmlSAX2HasInternalSubset=Module._xmlSAX2HasInternalSubset=wasmExports.xmlSAX2HasInternalSubset)(e),_xmlSAX2HasExternalSubset=Module._xmlSAX2HasExternalSubset=e=>(_xmlSAX2HasExternalSubset=Module._xmlSAX2HasExternalSubset=wasmExports.xmlSAX2HasExternalSubset)(e),_xmlSAX2ResolveEntity=Module._xmlSAX2ResolveEntity=(e,t,r)=>(_xmlSAX2ResolveEntity=Module._xmlSAX2ResolveEntity=wasmExports.xmlSAX2ResolveEntity)(e,t,r),_xmlSAX2GetEntity=Module._xmlSAX2GetEntity=(e,t)=>(_xmlSAX2GetEntity=Module._xmlSAX2GetEntity=wasmExports.xmlSAX2GetEntity)(e,t),_xmlSAX2EntityDecl=Module._xmlSAX2EntityDecl=(e,t,r,a,o,s)=>(_xmlSAX2EntityDecl=Module._xmlSAX2EntityDecl=wasmExports.xmlSAX2EntityDecl)(e,t,r,a,o,s),_xmlSAX2NotationDecl=Module._xmlSAX2NotationDecl=(e,t,r,a)=>(_xmlSAX2NotationDecl=Module._xmlSAX2NotationDecl=wasmExports.xmlSAX2NotationDecl)(e,t,r,a),_xmlSAX2AttributeDecl=Module._xmlSAX2AttributeDecl=(e,t,r,a,o,s,l)=>(_xmlSAX2AttributeDecl=Module._xmlSAX2AttributeDecl=wasmExports.xmlSAX2AttributeDecl)(e,t,r,a,o,s,l),_xmlSAX2ElementDecl=Module._xmlSAX2ElementDecl=(e,t,r,a)=>(_xmlSAX2ElementDecl=Module._xmlSAX2ElementDecl=wasmExports.xmlSAX2ElementDecl)(e,t,r,a),_xmlSAX2UnparsedEntityDecl=Module._xmlSAX2UnparsedEntityDecl=(e,t,r,a,o)=>(_xmlSAX2UnparsedEntityDecl=Module._xmlSAX2UnparsedEntityDecl=wasmExports.xmlSAX2UnparsedEntityDecl)(e,t,r,a,o),_xmlSAX2SetDocumentLocator=Module._xmlSAX2SetDocumentLocator=(e,t)=>(_xmlSAX2SetDocumentLocator=Module._xmlSAX2SetDocumentLocator=wasmExports.xmlSAX2SetDocumentLocator)(e,t),_xmlSAX2StartDocument=Module._xmlSAX2StartDocument=e=>(_xmlSAX2StartDocument=Module._xmlSAX2StartDocument=wasmExports.xmlSAX2StartDocument)(e),_xmlSAX2EndDocument=Module._xmlSAX2EndDocument=e=>(_xmlSAX2EndDocument=Module._xmlSAX2EndDocument=wasmExports.xmlSAX2EndDocument)(e),_xmlSAX2StartElement=Module._xmlSAX2StartElement=(e,t,r)=>(_xmlSAX2StartElement=Module._xmlSAX2StartElement=wasmExports.xmlSAX2StartElement)(e,t,r),_xmlSAX2EndElement=Module._xmlSAX2EndElement=(e,t)=>(_xmlSAX2EndElement=Module._xmlSAX2EndElement=wasmExports.xmlSAX2EndElement)(e,t),_xmlSAX2Reference=Module._xmlSAX2Reference=(e,t)=>(_xmlSAX2Reference=Module._xmlSAX2Reference=wasmExports.xmlSAX2Reference)(e,t),_xmlSAX2Characters=Module._xmlSAX2Characters=(e,t,r)=>(_xmlSAX2Characters=Module._xmlSAX2Characters=wasmExports.xmlSAX2Characters)(e,t,r),_xmlSAX2ProcessingInstruction=Module._xmlSAX2ProcessingInstruction=(e,t,r)=>(_xmlSAX2ProcessingInstruction=Module._xmlSAX2ProcessingInstruction=wasmExports.xmlSAX2ProcessingInstruction)(e,t,r),_xmlSAX2Comment=Module._xmlSAX2Comment=(e,t)=>(_xmlSAX2Comment=Module._xmlSAX2Comment=wasmExports.xmlSAX2Comment)(e,t),_xmlSAX2GetParameterEntity=Module._xmlSAX2GetParameterEntity=(e,t)=>(_xmlSAX2GetParameterEntity=Module._xmlSAX2GetParameterEntity=wasmExports.xmlSAX2GetParameterEntity)(e,t),_xmlSAX2CDataBlock=Module._xmlSAX2CDataBlock=(e,t,r)=>(_xmlSAX2CDataBlock=Module._xmlSAX2CDataBlock=wasmExports.xmlSAX2CDataBlock)(e,t,r),_xmlSAX2ExternalSubset=Module._xmlSAX2ExternalSubset=(e,t,r,a)=>(_xmlSAX2ExternalSubset=Module._xmlSAX2ExternalSubset=wasmExports.xmlSAX2ExternalSubset)(e,t,r,a),_xmlSAX2GetPublicId=Module._xmlSAX2GetPublicId=e=>(_xmlSAX2GetPublicId=Module._xmlSAX2GetPublicId=wasmExports.xmlSAX2GetPublicId)(e),_xmlSAX2GetSystemId=Module._xmlSAX2GetSystemId=e=>(_xmlSAX2GetSystemId=Module._xmlSAX2GetSystemId=wasmExports.xmlSAX2GetSystemId)(e),_xmlSAX2GetLineNumber=Module._xmlSAX2GetLineNumber=e=>(_xmlSAX2GetLineNumber=Module._xmlSAX2GetLineNumber=wasmExports.xmlSAX2GetLineNumber)(e),_xmlSAX2GetColumnNumber=Module._xmlSAX2GetColumnNumber=e=>(_xmlSAX2GetColumnNumber=Module._xmlSAX2GetColumnNumber=wasmExports.xmlSAX2GetColumnNumber)(e),_xmlSAX2IgnorableWhitespace=Module._xmlSAX2IgnorableWhitespace=(e,t,r)=>(_xmlSAX2IgnorableWhitespace=Module._xmlSAX2IgnorableWhitespace=wasmExports.xmlSAX2IgnorableWhitespace)(e,t,r),_xmlHashDefaultDeallocator=Module._xmlHashDefaultDeallocator=(e,t)=>(_xmlHashDefaultDeallocator=Module._xmlHashDefaultDeallocator=wasmExports.xmlHashDefaultDeallocator)(e,t),_iconv_open=Module._iconv_open=(e,t)=>(_iconv_open=Module._iconv_open=wasmExports.iconv_open)(e,t),_iconv_close=Module._iconv_close=e=>(_iconv_close=Module._iconv_close=wasmExports.iconv_close)(e),_iconv=Module._iconv=(e,t,r,a,o)=>(_iconv=Module._iconv=wasmExports.iconv)(e,t,r,a,o),_UTF8ToHtml=Module._UTF8ToHtml=(e,t,r,a)=>(_UTF8ToHtml=Module._UTF8ToHtml=wasmExports.UTF8ToHtml)(e,t,r,a),_xmlReadMemory=Module._xmlReadMemory=(e,t,r,a,o)=>(_xmlReadMemory=Module._xmlReadMemory=wasmExports.xmlReadMemory)(e,t,r,a,o),_xmlSAX2StartElementNs=Module._xmlSAX2StartElementNs=(e,t,r,a,o,s,l,n,_)=>(_xmlSAX2StartElementNs=Module._xmlSAX2StartElementNs=wasmExports.xmlSAX2StartElementNs)(e,t,r,a,o,s,l,n,_),_xmlSAX2EndElementNs=Module._xmlSAX2EndElementNs=(e,t,r,a)=>(_xmlSAX2EndElementNs=Module._xmlSAX2EndElementNs=wasmExports.xmlSAX2EndElementNs)(e,t,r,a),___cxa_atexit=Module.___cxa_atexit=(e,t,r)=>(___cxa_atexit=Module.___cxa_atexit=wasmExports.__cxa_atexit)(e,t,r),_xmlDocGetRootElement=Module._xmlDocGetRootElement=e=>(_xmlDocGetRootElement=Module._xmlDocGetRootElement=wasmExports.xmlDocGetRootElement)(e),_xmlFileMatch=Module._xmlFileMatch=e=>(_xmlFileMatch=Module._xmlFileMatch=wasmExports.xmlFileMatch)(e),_xmlFileOpen=Module._xmlFileOpen=e=>(_xmlFileOpen=Module._xmlFileOpen=wasmExports.xmlFileOpen)(e),_xmlFileRead=Module._xmlFileRead=(e,t,r)=>(_xmlFileRead=Module._xmlFileRead=wasmExports.xmlFileRead)(e,t,r),_xmlFileClose=Module._xmlFileClose=e=>(_xmlFileClose=Module._xmlFileClose=wasmExports.xmlFileClose)(e),_gzread=Module._gzread=(e,t,r)=>(_gzread=Module._gzread=wasmExports.gzread)(e,t,r),_gzclose=Module._gzclose=e=>(_gzclose=Module._gzclose=wasmExports.gzclose)(e),_gzdirect=Module._gzdirect=e=>(_gzdirect=Module._gzdirect=wasmExports.gzdirect)(e),_gzdopen=Module._gzdopen=(e,t)=>(_gzdopen=Module._gzdopen=wasmExports.gzdopen)(e,t),_gzopen=Module._gzopen=(e,t)=>(_gzopen=Module._gzopen=wasmExports.gzopen)(e,t),_gzwrite=Module._gzwrite=(e,t,r)=>(_gzwrite=Module._gzwrite=wasmExports.gzwrite)(e,t,r),_xmlUCSIsCatNd=Module._xmlUCSIsCatNd=e=>(_xmlUCSIsCatNd=Module._xmlUCSIsCatNd=wasmExports.xmlUCSIsCatNd)(e),_xmlUCSIsCatP=Module._xmlUCSIsCatP=e=>(_xmlUCSIsCatP=Module._xmlUCSIsCatP=wasmExports.xmlUCSIsCatP)(e),_xmlUCSIsCatZ=Module._xmlUCSIsCatZ=e=>(_xmlUCSIsCatZ=Module._xmlUCSIsCatZ=wasmExports.xmlUCSIsCatZ)(e),_xmlUCSIsCatC=Module._xmlUCSIsCatC=e=>(_xmlUCSIsCatC=Module._xmlUCSIsCatC=wasmExports.xmlUCSIsCatC)(e),_xmlUCSIsCatL=Module._xmlUCSIsCatL=e=>(_xmlUCSIsCatL=Module._xmlUCSIsCatL=wasmExports.xmlUCSIsCatL)(e),_xmlUCSIsCatLu=Module._xmlUCSIsCatLu=e=>(_xmlUCSIsCatLu=Module._xmlUCSIsCatLu=wasmExports.xmlUCSIsCatLu)(e),_xmlUCSIsCatLl=Module._xmlUCSIsCatLl=e=>(_xmlUCSIsCatLl=Module._xmlUCSIsCatLl=wasmExports.xmlUCSIsCatLl)(e),_xmlUCSIsCatLt=Module._xmlUCSIsCatLt=e=>(_xmlUCSIsCatLt=Module._xmlUCSIsCatLt=wasmExports.xmlUCSIsCatLt)(e),_xmlUCSIsCatLm=Module._xmlUCSIsCatLm=e=>(_xmlUCSIsCatLm=Module._xmlUCSIsCatLm=wasmExports.xmlUCSIsCatLm)(e),_xmlUCSIsCatLo=Module._xmlUCSIsCatLo=e=>(_xmlUCSIsCatLo=Module._xmlUCSIsCatLo=wasmExports.xmlUCSIsCatLo)(e),_xmlUCSIsCatM=Module._xmlUCSIsCatM=e=>(_xmlUCSIsCatM=Module._xmlUCSIsCatM=wasmExports.xmlUCSIsCatM)(e),_xmlUCSIsCatMn=Module._xmlUCSIsCatMn=e=>(_xmlUCSIsCatMn=Module._xmlUCSIsCatMn=wasmExports.xmlUCSIsCatMn)(e),_xmlUCSIsCatMc=Module._xmlUCSIsCatMc=e=>(_xmlUCSIsCatMc=Module._xmlUCSIsCatMc=wasmExports.xmlUCSIsCatMc)(e),_xmlUCSIsCatMe=Module._xmlUCSIsCatMe=e=>(_xmlUCSIsCatMe=Module._xmlUCSIsCatMe=wasmExports.xmlUCSIsCatMe)(e),_xmlUCSIsCatN=Module._xmlUCSIsCatN=e=>(_xmlUCSIsCatN=Module._xmlUCSIsCatN=wasmExports.xmlUCSIsCatN)(e),_xmlUCSIsCatNl=Module._xmlUCSIsCatNl=e=>(_xmlUCSIsCatNl=Module._xmlUCSIsCatNl=wasmExports.xmlUCSIsCatNl)(e),_xmlUCSIsCatNo=Module._xmlUCSIsCatNo=e=>(_xmlUCSIsCatNo=Module._xmlUCSIsCatNo=wasmExports.xmlUCSIsCatNo)(e),_xmlUCSIsCatPc=Module._xmlUCSIsCatPc=e=>(_xmlUCSIsCatPc=Module._xmlUCSIsCatPc=wasmExports.xmlUCSIsCatPc)(e),_xmlUCSIsCatPd=Module._xmlUCSIsCatPd=e=>(_xmlUCSIsCatPd=Module._xmlUCSIsCatPd=wasmExports.xmlUCSIsCatPd)(e),_xmlUCSIsCatPs=Module._xmlUCSIsCatPs=e=>(_xmlUCSIsCatPs=Module._xmlUCSIsCatPs=wasmExports.xmlUCSIsCatPs)(e),_xmlUCSIsCatPe=Module._xmlUCSIsCatPe=e=>(_xmlUCSIsCatPe=Module._xmlUCSIsCatPe=wasmExports.xmlUCSIsCatPe)(e),_xmlUCSIsCatPi=Module._xmlUCSIsCatPi=e=>(_xmlUCSIsCatPi=Module._xmlUCSIsCatPi=wasmExports.xmlUCSIsCatPi)(e),_xmlUCSIsCatPf=Module._xmlUCSIsCatPf=e=>(_xmlUCSIsCatPf=Module._xmlUCSIsCatPf=wasmExports.xmlUCSIsCatPf)(e),_xmlUCSIsCatPo=Module._xmlUCSIsCatPo=e=>(_xmlUCSIsCatPo=Module._xmlUCSIsCatPo=wasmExports.xmlUCSIsCatPo)(e),_xmlUCSIsCatZs=Module._xmlUCSIsCatZs=e=>(_xmlUCSIsCatZs=Module._xmlUCSIsCatZs=wasmExports.xmlUCSIsCatZs)(e),_xmlUCSIsCatZl=Module._xmlUCSIsCatZl=e=>(_xmlUCSIsCatZl=Module._xmlUCSIsCatZl=wasmExports.xmlUCSIsCatZl)(e),_xmlUCSIsCatZp=Module._xmlUCSIsCatZp=e=>(_xmlUCSIsCatZp=Module._xmlUCSIsCatZp=wasmExports.xmlUCSIsCatZp)(e),_xmlUCSIsCatS=Module._xmlUCSIsCatS=e=>(_xmlUCSIsCatS=Module._xmlUCSIsCatS=wasmExports.xmlUCSIsCatS)(e),_xmlUCSIsCatSm=Module._xmlUCSIsCatSm=e=>(_xmlUCSIsCatSm=Module._xmlUCSIsCatSm=wasmExports.xmlUCSIsCatSm)(e),_xmlUCSIsCatSc=Module._xmlUCSIsCatSc=e=>(_xmlUCSIsCatSc=Module._xmlUCSIsCatSc=wasmExports.xmlUCSIsCatSc)(e),_xmlUCSIsCatSk=Module._xmlUCSIsCatSk=e=>(_xmlUCSIsCatSk=Module._xmlUCSIsCatSk=wasmExports.xmlUCSIsCatSk)(e),_xmlUCSIsCatSo=Module._xmlUCSIsCatSo=e=>(_xmlUCSIsCatSo=Module._xmlUCSIsCatSo=wasmExports.xmlUCSIsCatSo)(e),_xmlUCSIsCatCc=Module._xmlUCSIsCatCc=e=>(_xmlUCSIsCatCc=Module._xmlUCSIsCatCc=wasmExports.xmlUCSIsCatCc)(e),_xmlUCSIsCatCf=Module._xmlUCSIsCatCf=e=>(_xmlUCSIsCatCf=Module._xmlUCSIsCatCf=wasmExports.xmlUCSIsCatCf)(e),_xmlUCSIsCatCo=Module._xmlUCSIsCatCo=e=>(_xmlUCSIsCatCo=Module._xmlUCSIsCatCo=wasmExports.xmlUCSIsCatCo)(e),_xmlUCSIsAegeanNumbers=Module._xmlUCSIsAegeanNumbers=e=>(_xmlUCSIsAegeanNumbers=Module._xmlUCSIsAegeanNumbers=wasmExports.xmlUCSIsAegeanNumbers)(e),_xmlUCSIsAlphabeticPresentationForms=Module._xmlUCSIsAlphabeticPresentationForms=e=>(_xmlUCSIsAlphabeticPresentationForms=Module._xmlUCSIsAlphabeticPresentationForms=wasmExports.xmlUCSIsAlphabeticPresentationForms)(e),_xmlUCSIsArabic=Module._xmlUCSIsArabic=e=>(_xmlUCSIsArabic=Module._xmlUCSIsArabic=wasmExports.xmlUCSIsArabic)(e),_xmlUCSIsArabicPresentationFormsA=Module._xmlUCSIsArabicPresentationFormsA=e=>(_xmlUCSIsArabicPresentationFormsA=Module._xmlUCSIsArabicPresentationFormsA=wasmExports.xmlUCSIsArabicPresentationFormsA)(e),_xmlUCSIsArabicPresentationFormsB=Module._xmlUCSIsArabicPresentationFormsB=e=>(_xmlUCSIsArabicPresentationFormsB=Module._xmlUCSIsArabicPresentationFormsB=wasmExports.xmlUCSIsArabicPresentationFormsB)(e),_xmlUCSIsArmenian=Module._xmlUCSIsArmenian=e=>(_xmlUCSIsArmenian=Module._xmlUCSIsArmenian=wasmExports.xmlUCSIsArmenian)(e),_xmlUCSIsArrows=Module._xmlUCSIsArrows=e=>(_xmlUCSIsArrows=Module._xmlUCSIsArrows=wasmExports.xmlUCSIsArrows)(e),_xmlUCSIsBasicLatin=Module._xmlUCSIsBasicLatin=e=>(_xmlUCSIsBasicLatin=Module._xmlUCSIsBasicLatin=wasmExports.xmlUCSIsBasicLatin)(e),_xmlUCSIsBengali=Module._xmlUCSIsBengali=e=>(_xmlUCSIsBengali=Module._xmlUCSIsBengali=wasmExports.xmlUCSIsBengali)(e),_xmlUCSIsBlockElements=Module._xmlUCSIsBlockElements=e=>(_xmlUCSIsBlockElements=Module._xmlUCSIsBlockElements=wasmExports.xmlUCSIsBlockElements)(e),_xmlUCSIsBopomofo=Module._xmlUCSIsBopomofo=e=>(_xmlUCSIsBopomofo=Module._xmlUCSIsBopomofo=wasmExports.xmlUCSIsBopomofo)(e),_xmlUCSIsBopomofoExtended=Module._xmlUCSIsBopomofoExtended=e=>(_xmlUCSIsBopomofoExtended=Module._xmlUCSIsBopomofoExtended=wasmExports.xmlUCSIsBopomofoExtended)(e),_xmlUCSIsBoxDrawing=Module._xmlUCSIsBoxDrawing=e=>(_xmlUCSIsBoxDrawing=Module._xmlUCSIsBoxDrawing=wasmExports.xmlUCSIsBoxDrawing)(e),_xmlUCSIsBraillePatterns=Module._xmlUCSIsBraillePatterns=e=>(_xmlUCSIsBraillePatterns=Module._xmlUCSIsBraillePatterns=wasmExports.xmlUCSIsBraillePatterns)(e),_xmlUCSIsBuhid=Module._xmlUCSIsBuhid=e=>(_xmlUCSIsBuhid=Module._xmlUCSIsBuhid=wasmExports.xmlUCSIsBuhid)(e),_xmlUCSIsByzantineMusicalSymbols=Module._xmlUCSIsByzantineMusicalSymbols=e=>(_xmlUCSIsByzantineMusicalSymbols=Module._xmlUCSIsByzantineMusicalSymbols=wasmExports.xmlUCSIsByzantineMusicalSymbols)(e),_xmlUCSIsCJKCompatibility=Module._xmlUCSIsCJKCompatibility=e=>(_xmlUCSIsCJKCompatibility=Module._xmlUCSIsCJKCompatibility=wasmExports.xmlUCSIsCJKCompatibility)(e),_xmlUCSIsCJKCompatibilityForms=Module._xmlUCSIsCJKCompatibilityForms=e=>(_xmlUCSIsCJKCompatibilityForms=Module._xmlUCSIsCJKCompatibilityForms=wasmExports.xmlUCSIsCJKCompatibilityForms)(e),_xmlUCSIsCJKCompatibilityIdeographs=Module._xmlUCSIsCJKCompatibilityIdeographs=e=>(_xmlUCSIsCJKCompatibilityIdeographs=Module._xmlUCSIsCJKCompatibilityIdeographs=wasmExports.xmlUCSIsCJKCompatibilityIdeographs)(e),_xmlUCSIsCJKCompatibilityIdeographsSupplement=Module._xmlUCSIsCJKCompatibilityIdeographsSupplement=e=>(_xmlUCSIsCJKCompatibilityIdeographsSupplement=Module._xmlUCSIsCJKCompatibilityIdeographsSupplement=wasmExports.xmlUCSIsCJKCompatibilityIdeographsSupplement)(e),_xmlUCSIsCJKRadicalsSupplement=Module._xmlUCSIsCJKRadicalsSupplement=e=>(_xmlUCSIsCJKRadicalsSupplement=Module._xmlUCSIsCJKRadicalsSupplement=wasmExports.xmlUCSIsCJKRadicalsSupplement)(e),_xmlUCSIsCJKSymbolsandPunctuation=Module._xmlUCSIsCJKSymbolsandPunctuation=e=>(_xmlUCSIsCJKSymbolsandPunctuation=Module._xmlUCSIsCJKSymbolsandPunctuation=wasmExports.xmlUCSIsCJKSymbolsandPunctuation)(e),_xmlUCSIsCJKUnifiedIdeographs=Module._xmlUCSIsCJKUnifiedIdeographs=e=>(_xmlUCSIsCJKUnifiedIdeographs=Module._xmlUCSIsCJKUnifiedIdeographs=wasmExports.xmlUCSIsCJKUnifiedIdeographs)(e),_xmlUCSIsCJKUnifiedIdeographsExtensionA=Module._xmlUCSIsCJKUnifiedIdeographsExtensionA=e=>(_xmlUCSIsCJKUnifiedIdeographsExtensionA=Module._xmlUCSIsCJKUnifiedIdeographsExtensionA=wasmExports.xmlUCSIsCJKUnifiedIdeographsExtensionA)(e),_xmlUCSIsCJKUnifiedIdeographsExtensionB=Module._xmlUCSIsCJKUnifiedIdeographsExtensionB=e=>(_xmlUCSIsCJKUnifiedIdeographsExtensionB=Module._xmlUCSIsCJKUnifiedIdeographsExtensionB=wasmExports.xmlUCSIsCJKUnifiedIdeographsExtensionB)(e),_xmlUCSIsCherokee=Module._xmlUCSIsCherokee=e=>(_xmlUCSIsCherokee=Module._xmlUCSIsCherokee=wasmExports.xmlUCSIsCherokee)(e),_xmlUCSIsCombiningDiacriticalMarks=Module._xmlUCSIsCombiningDiacriticalMarks=e=>(_xmlUCSIsCombiningDiacriticalMarks=Module._xmlUCSIsCombiningDiacriticalMarks=wasmExports.xmlUCSIsCombiningDiacriticalMarks)(e),_xmlUCSIsCombiningDiacriticalMarksforSymbols=Module._xmlUCSIsCombiningDiacriticalMarksforSymbols=e=>(_xmlUCSIsCombiningDiacriticalMarksforSymbols=Module._xmlUCSIsCombiningDiacriticalMarksforSymbols=wasmExports.xmlUCSIsCombiningDiacriticalMarksforSymbols)(e),_xmlUCSIsCombiningHalfMarks=Module._xmlUCSIsCombiningHalfMarks=e=>(_xmlUCSIsCombiningHalfMarks=Module._xmlUCSIsCombiningHalfMarks=wasmExports.xmlUCSIsCombiningHalfMarks)(e),_xmlUCSIsCombiningMarksforSymbols=Module._xmlUCSIsCombiningMarksforSymbols=e=>(_xmlUCSIsCombiningMarksforSymbols=Module._xmlUCSIsCombiningMarksforSymbols=wasmExports.xmlUCSIsCombiningMarksforSymbols)(e),_xmlUCSIsControlPictures=Module._xmlUCSIsControlPictures=e=>(_xmlUCSIsControlPictures=Module._xmlUCSIsControlPictures=wasmExports.xmlUCSIsControlPictures)(e),_xmlUCSIsCurrencySymbols=Module._xmlUCSIsCurrencySymbols=e=>(_xmlUCSIsCurrencySymbols=Module._xmlUCSIsCurrencySymbols=wasmExports.xmlUCSIsCurrencySymbols)(e),_xmlUCSIsCypriotSyllabary=Module._xmlUCSIsCypriotSyllabary=e=>(_xmlUCSIsCypriotSyllabary=Module._xmlUCSIsCypriotSyllabary=wasmExports.xmlUCSIsCypriotSyllabary)(e),_xmlUCSIsCyrillic=Module._xmlUCSIsCyrillic=e=>(_xmlUCSIsCyrillic=Module._xmlUCSIsCyrillic=wasmExports.xmlUCSIsCyrillic)(e),_xmlUCSIsCyrillicSupplement=Module._xmlUCSIsCyrillicSupplement=e=>(_xmlUCSIsCyrillicSupplement=Module._xmlUCSIsCyrillicSupplement=wasmExports.xmlUCSIsCyrillicSupplement)(e),_xmlUCSIsDeseret=Module._xmlUCSIsDeseret=e=>(_xmlUCSIsDeseret=Module._xmlUCSIsDeseret=wasmExports.xmlUCSIsDeseret)(e),_xmlUCSIsDevanagari=Module._xmlUCSIsDevanagari=e=>(_xmlUCSIsDevanagari=Module._xmlUCSIsDevanagari=wasmExports.xmlUCSIsDevanagari)(e),_xmlUCSIsDingbats=Module._xmlUCSIsDingbats=e=>(_xmlUCSIsDingbats=Module._xmlUCSIsDingbats=wasmExports.xmlUCSIsDingbats)(e),_xmlUCSIsEnclosedAlphanumerics=Module._xmlUCSIsEnclosedAlphanumerics=e=>(_xmlUCSIsEnclosedAlphanumerics=Module._xmlUCSIsEnclosedAlphanumerics=wasmExports.xmlUCSIsEnclosedAlphanumerics)(e),_xmlUCSIsEnclosedCJKLettersandMonths=Module._xmlUCSIsEnclosedCJKLettersandMonths=e=>(_xmlUCSIsEnclosedCJKLettersandMonths=Module._xmlUCSIsEnclosedCJKLettersandMonths=wasmExports.xmlUCSIsEnclosedCJKLettersandMonths)(e),_xmlUCSIsEthiopic=Module._xmlUCSIsEthiopic=e=>(_xmlUCSIsEthiopic=Module._xmlUCSIsEthiopic=wasmExports.xmlUCSIsEthiopic)(e),_xmlUCSIsGeneralPunctuation=Module._xmlUCSIsGeneralPunctuation=e=>(_xmlUCSIsGeneralPunctuation=Module._xmlUCSIsGeneralPunctuation=wasmExports.xmlUCSIsGeneralPunctuation)(e),_xmlUCSIsGeometricShapes=Module._xmlUCSIsGeometricShapes=e=>(_xmlUCSIsGeometricShapes=Module._xmlUCSIsGeometricShapes=wasmExports.xmlUCSIsGeometricShapes)(e),_xmlUCSIsGeorgian=Module._xmlUCSIsGeorgian=e=>(_xmlUCSIsGeorgian=Module._xmlUCSIsGeorgian=wasmExports.xmlUCSIsGeorgian)(e),_xmlUCSIsGothic=Module._xmlUCSIsGothic=e=>(_xmlUCSIsGothic=Module._xmlUCSIsGothic=wasmExports.xmlUCSIsGothic)(e),_xmlUCSIsGreek=Module._xmlUCSIsGreek=e=>(_xmlUCSIsGreek=Module._xmlUCSIsGreek=wasmExports.xmlUCSIsGreek)(e),_xmlUCSIsGreekExtended=Module._xmlUCSIsGreekExtended=e=>(_xmlUCSIsGreekExtended=Module._xmlUCSIsGreekExtended=wasmExports.xmlUCSIsGreekExtended)(e),_xmlUCSIsGreekandCoptic=Module._xmlUCSIsGreekandCoptic=e=>(_xmlUCSIsGreekandCoptic=Module._xmlUCSIsGreekandCoptic=wasmExports.xmlUCSIsGreekandCoptic)(e),_xmlUCSIsGujarati=Module._xmlUCSIsGujarati=e=>(_xmlUCSIsGujarati=Module._xmlUCSIsGujarati=wasmExports.xmlUCSIsGujarati)(e),_xmlUCSIsGurmukhi=Module._xmlUCSIsGurmukhi=e=>(_xmlUCSIsGurmukhi=Module._xmlUCSIsGurmukhi=wasmExports.xmlUCSIsGurmukhi)(e),_xmlUCSIsHalfwidthandFullwidthForms=Module._xmlUCSIsHalfwidthandFullwidthForms=e=>(_xmlUCSIsHalfwidthandFullwidthForms=Module._xmlUCSIsHalfwidthandFullwidthForms=wasmExports.xmlUCSIsHalfwidthandFullwidthForms)(e),_xmlUCSIsHangulCompatibilityJamo=Module._xmlUCSIsHangulCompatibilityJamo=e=>(_xmlUCSIsHangulCompatibilityJamo=Module._xmlUCSIsHangulCompatibilityJamo=wasmExports.xmlUCSIsHangulCompatibilityJamo)(e),_xmlUCSIsHangulJamo=Module._xmlUCSIsHangulJamo=e=>(_xmlUCSIsHangulJamo=Module._xmlUCSIsHangulJamo=wasmExports.xmlUCSIsHangulJamo)(e),_xmlUCSIsHangulSyllables=Module._xmlUCSIsHangulSyllables=e=>(_xmlUCSIsHangulSyllables=Module._xmlUCSIsHangulSyllables=wasmExports.xmlUCSIsHangulSyllables)(e),_xmlUCSIsHanunoo=Module._xmlUCSIsHanunoo=e=>(_xmlUCSIsHanunoo=Module._xmlUCSIsHanunoo=wasmExports.xmlUCSIsHanunoo)(e),_xmlUCSIsHebrew=Module._xmlUCSIsHebrew=e=>(_xmlUCSIsHebrew=Module._xmlUCSIsHebrew=wasmExports.xmlUCSIsHebrew)(e),_xmlUCSIsHighPrivateUseSurrogates=Module._xmlUCSIsHighPrivateUseSurrogates=e=>(_xmlUCSIsHighPrivateUseSurrogates=Module._xmlUCSIsHighPrivateUseSurrogates=wasmExports.xmlUCSIsHighPrivateUseSurrogates)(e),_xmlUCSIsHighSurrogates=Module._xmlUCSIsHighSurrogates=e=>(_xmlUCSIsHighSurrogates=Module._xmlUCSIsHighSurrogates=wasmExports.xmlUCSIsHighSurrogates)(e),_xmlUCSIsHiragana=Module._xmlUCSIsHiragana=e=>(_xmlUCSIsHiragana=Module._xmlUCSIsHiragana=wasmExports.xmlUCSIsHiragana)(e),_xmlUCSIsIPAExtensions=Module._xmlUCSIsIPAExtensions=e=>(_xmlUCSIsIPAExtensions=Module._xmlUCSIsIPAExtensions=wasmExports.xmlUCSIsIPAExtensions)(e),_xmlUCSIsIdeographicDescriptionCharacters=Module._xmlUCSIsIdeographicDescriptionCharacters=e=>(_xmlUCSIsIdeographicDescriptionCharacters=Module._xmlUCSIsIdeographicDescriptionCharacters=wasmExports.xmlUCSIsIdeographicDescriptionCharacters)(e),_xmlUCSIsKanbun=Module._xmlUCSIsKanbun=e=>(_xmlUCSIsKanbun=Module._xmlUCSIsKanbun=wasmExports.xmlUCSIsKanbun)(e),_xmlUCSIsKangxiRadicals=Module._xmlUCSIsKangxiRadicals=e=>(_xmlUCSIsKangxiRadicals=Module._xmlUCSIsKangxiRadicals=wasmExports.xmlUCSIsKangxiRadicals)(e),_xmlUCSIsKannada=Module._xmlUCSIsKannada=e=>(_xmlUCSIsKannada=Module._xmlUCSIsKannada=wasmExports.xmlUCSIsKannada)(e),_xmlUCSIsKatakana=Module._xmlUCSIsKatakana=e=>(_xmlUCSIsKatakana=Module._xmlUCSIsKatakana=wasmExports.xmlUCSIsKatakana)(e),_xmlUCSIsKatakanaPhoneticExtensions=Module._xmlUCSIsKatakanaPhoneticExtensions=e=>(_xmlUCSIsKatakanaPhoneticExtensions=Module._xmlUCSIsKatakanaPhoneticExtensions=wasmExports.xmlUCSIsKatakanaPhoneticExtensions)(e),_xmlUCSIsKhmer=Module._xmlUCSIsKhmer=e=>(_xmlUCSIsKhmer=Module._xmlUCSIsKhmer=wasmExports.xmlUCSIsKhmer)(e),_xmlUCSIsKhmerSymbols=Module._xmlUCSIsKhmerSymbols=e=>(_xmlUCSIsKhmerSymbols=Module._xmlUCSIsKhmerSymbols=wasmExports.xmlUCSIsKhmerSymbols)(e),_xmlUCSIsLao=Module._xmlUCSIsLao=e=>(_xmlUCSIsLao=Module._xmlUCSIsLao=wasmExports.xmlUCSIsLao)(e),_xmlUCSIsLatin1Supplement=Module._xmlUCSIsLatin1Supplement=e=>(_xmlUCSIsLatin1Supplement=Module._xmlUCSIsLatin1Supplement=wasmExports.xmlUCSIsLatin1Supplement)(e),_xmlUCSIsLatinExtendedA=Module._xmlUCSIsLatinExtendedA=e=>(_xmlUCSIsLatinExtendedA=Module._xmlUCSIsLatinExtendedA=wasmExports.xmlUCSIsLatinExtendedA)(e),_xmlUCSIsLatinExtendedB=Module._xmlUCSIsLatinExtendedB=e=>(_xmlUCSIsLatinExtendedB=Module._xmlUCSIsLatinExtendedB=wasmExports.xmlUCSIsLatinExtendedB)(e),_xmlUCSIsLatinExtendedAdditional=Module._xmlUCSIsLatinExtendedAdditional=e=>(_xmlUCSIsLatinExtendedAdditional=Module._xmlUCSIsLatinExtendedAdditional=wasmExports.xmlUCSIsLatinExtendedAdditional)(e),_xmlUCSIsLetterlikeSymbols=Module._xmlUCSIsLetterlikeSymbols=e=>(_xmlUCSIsLetterlikeSymbols=Module._xmlUCSIsLetterlikeSymbols=wasmExports.xmlUCSIsLetterlikeSymbols)(e),_xmlUCSIsLimbu=Module._xmlUCSIsLimbu=e=>(_xmlUCSIsLimbu=Module._xmlUCSIsLimbu=wasmExports.xmlUCSIsLimbu)(e),_xmlUCSIsLinearBIdeograms=Module._xmlUCSIsLinearBIdeograms=e=>(_xmlUCSIsLinearBIdeograms=Module._xmlUCSIsLinearBIdeograms=wasmExports.xmlUCSIsLinearBIdeograms)(e),_xmlUCSIsLinearBSyllabary=Module._xmlUCSIsLinearBSyllabary=e=>(_xmlUCSIsLinearBSyllabary=Module._xmlUCSIsLinearBSyllabary=wasmExports.xmlUCSIsLinearBSyllabary)(e),_xmlUCSIsLowSurrogates=Module._xmlUCSIsLowSurrogates=e=>(_xmlUCSIsLowSurrogates=Module._xmlUCSIsLowSurrogates=wasmExports.xmlUCSIsLowSurrogates)(e),_xmlUCSIsMalayalam=Module._xmlUCSIsMalayalam=e=>(_xmlUCSIsMalayalam=Module._xmlUCSIsMalayalam=wasmExports.xmlUCSIsMalayalam)(e),_xmlUCSIsMathematicalAlphanumericSymbols=Module._xmlUCSIsMathematicalAlphanumericSymbols=e=>(_xmlUCSIsMathematicalAlphanumericSymbols=Module._xmlUCSIsMathematicalAlphanumericSymbols=wasmExports.xmlUCSIsMathematicalAlphanumericSymbols)(e),_xmlUCSIsMathematicalOperators=Module._xmlUCSIsMathematicalOperators=e=>(_xmlUCSIsMathematicalOperators=Module._xmlUCSIsMathematicalOperators=wasmExports.xmlUCSIsMathematicalOperators)(e),_xmlUCSIsMiscellaneousMathematicalSymbolsA=Module._xmlUCSIsMiscellaneousMathematicalSymbolsA=e=>(_xmlUCSIsMiscellaneousMathematicalSymbolsA=Module._xmlUCSIsMiscellaneousMathematicalSymbolsA=wasmExports.xmlUCSIsMiscellaneousMathematicalSymbolsA)(e),_xmlUCSIsMiscellaneousMathematicalSymbolsB=Module._xmlUCSIsMiscellaneousMathematicalSymbolsB=e=>(_xmlUCSIsMiscellaneousMathematicalSymbolsB=Module._xmlUCSIsMiscellaneousMathematicalSymbolsB=wasmExports.xmlUCSIsMiscellaneousMathematicalSymbolsB)(e),_xmlUCSIsMiscellaneousSymbols=Module._xmlUCSIsMiscellaneousSymbols=e=>(_xmlUCSIsMiscellaneousSymbols=Module._xmlUCSIsMiscellaneousSymbols=wasmExports.xmlUCSIsMiscellaneousSymbols)(e),_xmlUCSIsMiscellaneousSymbolsandArrows=Module._xmlUCSIsMiscellaneousSymbolsandArrows=e=>(_xmlUCSIsMiscellaneousSymbolsandArrows=Module._xmlUCSIsMiscellaneousSymbolsandArrows=wasmExports.xmlUCSIsMiscellaneousSymbolsandArrows)(e),_xmlUCSIsMiscellaneousTechnical=Module._xmlUCSIsMiscellaneousTechnical=e=>(_xmlUCSIsMiscellaneousTechnical=Module._xmlUCSIsMiscellaneousTechnical=wasmExports.xmlUCSIsMiscellaneousTechnical)(e),_xmlUCSIsMongolian=Module._xmlUCSIsMongolian=e=>(_xmlUCSIsMongolian=Module._xmlUCSIsMongolian=wasmExports.xmlUCSIsMongolian)(e),_xmlUCSIsMusicalSymbols=Module._xmlUCSIsMusicalSymbols=e=>(_xmlUCSIsMusicalSymbols=Module._xmlUCSIsMusicalSymbols=wasmExports.xmlUCSIsMusicalSymbols)(e),_xmlUCSIsMyanmar=Module._xmlUCSIsMyanmar=e=>(_xmlUCSIsMyanmar=Module._xmlUCSIsMyanmar=wasmExports.xmlUCSIsMyanmar)(e),_xmlUCSIsNumberForms=Module._xmlUCSIsNumberForms=e=>(_xmlUCSIsNumberForms=Module._xmlUCSIsNumberForms=wasmExports.xmlUCSIsNumberForms)(e),_xmlUCSIsOgham=Module._xmlUCSIsOgham=e=>(_xmlUCSIsOgham=Module._xmlUCSIsOgham=wasmExports.xmlUCSIsOgham)(e),_xmlUCSIsOldItalic=Module._xmlUCSIsOldItalic=e=>(_xmlUCSIsOldItalic=Module._xmlUCSIsOldItalic=wasmExports.xmlUCSIsOldItalic)(e),_xmlUCSIsOpticalCharacterRecognition=Module._xmlUCSIsOpticalCharacterRecognition=e=>(_xmlUCSIsOpticalCharacterRecognition=Module._xmlUCSIsOpticalCharacterRecognition=wasmExports.xmlUCSIsOpticalCharacterRecognition)(e),_xmlUCSIsOriya=Module._xmlUCSIsOriya=e=>(_xmlUCSIsOriya=Module._xmlUCSIsOriya=wasmExports.xmlUCSIsOriya)(e),_xmlUCSIsOsmanya=Module._xmlUCSIsOsmanya=e=>(_xmlUCSIsOsmanya=Module._xmlUCSIsOsmanya=wasmExports.xmlUCSIsOsmanya)(e),_xmlUCSIsPhoneticExtensions=Module._xmlUCSIsPhoneticExtensions=e=>(_xmlUCSIsPhoneticExtensions=Module._xmlUCSIsPhoneticExtensions=wasmExports.xmlUCSIsPhoneticExtensions)(e),_xmlUCSIsPrivateUse=Module._xmlUCSIsPrivateUse=e=>(_xmlUCSIsPrivateUse=Module._xmlUCSIsPrivateUse=wasmExports.xmlUCSIsPrivateUse)(e),_xmlUCSIsPrivateUseArea=Module._xmlUCSIsPrivateUseArea=e=>(_xmlUCSIsPrivateUseArea=Module._xmlUCSIsPrivateUseArea=wasmExports.xmlUCSIsPrivateUseArea)(e),_xmlUCSIsRunic=Module._xmlUCSIsRunic=e=>(_xmlUCSIsRunic=Module._xmlUCSIsRunic=wasmExports.xmlUCSIsRunic)(e),_xmlUCSIsShavian=Module._xmlUCSIsShavian=e=>(_xmlUCSIsShavian=Module._xmlUCSIsShavian=wasmExports.xmlUCSIsShavian)(e),_xmlUCSIsSinhala=Module._xmlUCSIsSinhala=e=>(_xmlUCSIsSinhala=Module._xmlUCSIsSinhala=wasmExports.xmlUCSIsSinhala)(e),_xmlUCSIsSmallFormVariants=Module._xmlUCSIsSmallFormVariants=e=>(_xmlUCSIsSmallFormVariants=Module._xmlUCSIsSmallFormVariants=wasmExports.xmlUCSIsSmallFormVariants)(e),_xmlUCSIsSpacingModifierLetters=Module._xmlUCSIsSpacingModifierLetters=e=>(_xmlUCSIsSpacingModifierLetters=Module._xmlUCSIsSpacingModifierLetters=wasmExports.xmlUCSIsSpacingModifierLetters)(e),_xmlUCSIsSpecials=Module._xmlUCSIsSpecials=e=>(_xmlUCSIsSpecials=Module._xmlUCSIsSpecials=wasmExports.xmlUCSIsSpecials)(e),_xmlUCSIsSuperscriptsandSubscripts=Module._xmlUCSIsSuperscriptsandSubscripts=e=>(_xmlUCSIsSuperscriptsandSubscripts=Module._xmlUCSIsSuperscriptsandSubscripts=wasmExports.xmlUCSIsSuperscriptsandSubscripts)(e),_xmlUCSIsSupplementalArrowsA=Module._xmlUCSIsSupplementalArrowsA=e=>(_xmlUCSIsSupplementalArrowsA=Module._xmlUCSIsSupplementalArrowsA=wasmExports.xmlUCSIsSupplementalArrowsA)(e),_xmlUCSIsSupplementalArrowsB=Module._xmlUCSIsSupplementalArrowsB=e=>(_xmlUCSIsSupplementalArrowsB=Module._xmlUCSIsSupplementalArrowsB=wasmExports.xmlUCSIsSupplementalArrowsB)(e),_xmlUCSIsSupplementalMathematicalOperators=Module._xmlUCSIsSupplementalMathematicalOperators=e=>(_xmlUCSIsSupplementalMathematicalOperators=Module._xmlUCSIsSupplementalMathematicalOperators=wasmExports.xmlUCSIsSupplementalMathematicalOperators)(e),_xmlUCSIsSupplementaryPrivateUseAreaA=Module._xmlUCSIsSupplementaryPrivateUseAreaA=e=>(_xmlUCSIsSupplementaryPrivateUseAreaA=Module._xmlUCSIsSupplementaryPrivateUseAreaA=wasmExports.xmlUCSIsSupplementaryPrivateUseAreaA)(e),_xmlUCSIsSupplementaryPrivateUseAreaB=Module._xmlUCSIsSupplementaryPrivateUseAreaB=e=>(_xmlUCSIsSupplementaryPrivateUseAreaB=Module._xmlUCSIsSupplementaryPrivateUseAreaB=wasmExports.xmlUCSIsSupplementaryPrivateUseAreaB)(e),_xmlUCSIsSyriac=Module._xmlUCSIsSyriac=e=>(_xmlUCSIsSyriac=Module._xmlUCSIsSyriac=wasmExports.xmlUCSIsSyriac)(e),_xmlUCSIsTagalog=Module._xmlUCSIsTagalog=e=>(_xmlUCSIsTagalog=Module._xmlUCSIsTagalog=wasmExports.xmlUCSIsTagalog)(e),_xmlUCSIsTagbanwa=Module._xmlUCSIsTagbanwa=e=>(_xmlUCSIsTagbanwa=Module._xmlUCSIsTagbanwa=wasmExports.xmlUCSIsTagbanwa)(e),_xmlUCSIsTags=Module._xmlUCSIsTags=e=>(_xmlUCSIsTags=Module._xmlUCSIsTags=wasmExports.xmlUCSIsTags)(e),_xmlUCSIsTaiLe=Module._xmlUCSIsTaiLe=e=>(_xmlUCSIsTaiLe=Module._xmlUCSIsTaiLe=wasmExports.xmlUCSIsTaiLe)(e),_xmlUCSIsTaiXuanJingSymbols=Module._xmlUCSIsTaiXuanJingSymbols=e=>(_xmlUCSIsTaiXuanJingSymbols=Module._xmlUCSIsTaiXuanJingSymbols=wasmExports.xmlUCSIsTaiXuanJingSymbols)(e),_xmlUCSIsTamil=Module._xmlUCSIsTamil=e=>(_xmlUCSIsTamil=Module._xmlUCSIsTamil=wasmExports.xmlUCSIsTamil)(e),_xmlUCSIsTelugu=Module._xmlUCSIsTelugu=e=>(_xmlUCSIsTelugu=Module._xmlUCSIsTelugu=wasmExports.xmlUCSIsTelugu)(e),_xmlUCSIsThaana=Module._xmlUCSIsThaana=e=>(_xmlUCSIsThaana=Module._xmlUCSIsThaana=wasmExports.xmlUCSIsThaana)(e),_xmlUCSIsThai=Module._xmlUCSIsThai=e=>(_xmlUCSIsThai=Module._xmlUCSIsThai=wasmExports.xmlUCSIsThai)(e),_xmlUCSIsTibetan=Module._xmlUCSIsTibetan=e=>(_xmlUCSIsTibetan=Module._xmlUCSIsTibetan=wasmExports.xmlUCSIsTibetan)(e),_xmlUCSIsUgaritic=Module._xmlUCSIsUgaritic=e=>(_xmlUCSIsUgaritic=Module._xmlUCSIsUgaritic=wasmExports.xmlUCSIsUgaritic)(e),_xmlUCSIsUnifiedCanadianAboriginalSyllabics=Module._xmlUCSIsUnifiedCanadianAboriginalSyllabics=e=>(_xmlUCSIsUnifiedCanadianAboriginalSyllabics=Module._xmlUCSIsUnifiedCanadianAboriginalSyllabics=wasmExports.xmlUCSIsUnifiedCanadianAboriginalSyllabics)(e),_xmlUCSIsVariationSelectors=Module._xmlUCSIsVariationSelectors=e=>(_xmlUCSIsVariationSelectors=Module._xmlUCSIsVariationSelectors=wasmExports.xmlUCSIsVariationSelectors)(e),_xmlUCSIsVariationSelectorsSupplement=Module._xmlUCSIsVariationSelectorsSupplement=e=>(_xmlUCSIsVariationSelectorsSupplement=Module._xmlUCSIsVariationSelectorsSupplement=wasmExports.xmlUCSIsVariationSelectorsSupplement)(e),_xmlUCSIsYiRadicals=Module._xmlUCSIsYiRadicals=e=>(_xmlUCSIsYiRadicals=Module._xmlUCSIsYiRadicals=wasmExports.xmlUCSIsYiRadicals)(e),_xmlUCSIsYiSyllables=Module._xmlUCSIsYiSyllables=e=>(_xmlUCSIsYiSyllables=Module._xmlUCSIsYiSyllables=wasmExports.xmlUCSIsYiSyllables)(e),_xmlUCSIsYijingHexagramSymbols=Module._xmlUCSIsYijingHexagramSymbols=e=>(_xmlUCSIsYijingHexagramSymbols=Module._xmlUCSIsYijingHexagramSymbols=wasmExports.xmlUCSIsYijingHexagramSymbols)(e),_xmlUCSIsCatCs=Module._xmlUCSIsCatCs=e=>(_xmlUCSIsCatCs=Module._xmlUCSIsCatCs=wasmExports.xmlUCSIsCatCs)(e),___small_fprintf=Module.___small_fprintf=(e,t,r)=>(___small_fprintf=Module.___small_fprintf=wasmExports.__small_fprintf)(e,t,r),_xmlXPathBooleanFunction=Module._xmlXPathBooleanFunction=(e,t)=>(_xmlXPathBooleanFunction=Module._xmlXPathBooleanFunction=wasmExports.xmlXPathBooleanFunction)(e,t),_xmlXPathCeilingFunction=Module._xmlXPathCeilingFunction=(e,t)=>(_xmlXPathCeilingFunction=Module._xmlXPathCeilingFunction=wasmExports.xmlXPathCeilingFunction)(e,t),_xmlXPathCountFunction=Module._xmlXPathCountFunction=(e,t)=>(_xmlXPathCountFunction=Module._xmlXPathCountFunction=wasmExports.xmlXPathCountFunction)(e,t),_xmlXPathConcatFunction=Module._xmlXPathConcatFunction=(e,t)=>(_xmlXPathConcatFunction=Module._xmlXPathConcatFunction=wasmExports.xmlXPathConcatFunction)(e,t),_xmlXPathContainsFunction=Module._xmlXPathContainsFunction=(e,t)=>(_xmlXPathContainsFunction=Module._xmlXPathContainsFunction=wasmExports.xmlXPathContainsFunction)(e,t),_xmlXPathIdFunction=Module._xmlXPathIdFunction=(e,t)=>(_xmlXPathIdFunction=Module._xmlXPathIdFunction=wasmExports.xmlXPathIdFunction)(e,t),_xmlXPathFalseFunction=Module._xmlXPathFalseFunction=(e,t)=>(_xmlXPathFalseFunction=Module._xmlXPathFalseFunction=wasmExports.xmlXPathFalseFunction)(e,t),_xmlXPathFloorFunction=Module._xmlXPathFloorFunction=(e,t)=>(_xmlXPathFloorFunction=Module._xmlXPathFloorFunction=wasmExports.xmlXPathFloorFunction)(e,t),_xmlXPathLastFunction=Module._xmlXPathLastFunction=(e,t)=>(_xmlXPathLastFunction=Module._xmlXPathLastFunction=wasmExports.xmlXPathLastFunction)(e,t),_xmlXPathLangFunction=Module._xmlXPathLangFunction=(e,t)=>(_xmlXPathLangFunction=Module._xmlXPathLangFunction=wasmExports.xmlXPathLangFunction)(e,t),_xmlXPathLocalNameFunction=Module._xmlXPathLocalNameFunction=(e,t)=>(_xmlXPathLocalNameFunction=Module._xmlXPathLocalNameFunction=wasmExports.xmlXPathLocalNameFunction)(e,t),_xmlXPathNotFunction=Module._xmlXPathNotFunction=(e,t)=>(_xmlXPathNotFunction=Module._xmlXPathNotFunction=wasmExports.xmlXPathNotFunction)(e,t),_xmlXPathNamespaceURIFunction=Module._xmlXPathNamespaceURIFunction=(e,t)=>(_xmlXPathNamespaceURIFunction=Module._xmlXPathNamespaceURIFunction=wasmExports.xmlXPathNamespaceURIFunction)(e,t),_xmlXPathNormalizeFunction=Module._xmlXPathNormalizeFunction=(e,t)=>(_xmlXPathNormalizeFunction=Module._xmlXPathNormalizeFunction=wasmExports.xmlXPathNormalizeFunction)(e,t),_xmlXPathNumberFunction=Module._xmlXPathNumberFunction=(e,t)=>(_xmlXPathNumberFunction=Module._xmlXPathNumberFunction=wasmExports.xmlXPathNumberFunction)(e,t),_xmlXPathPositionFunction=Module._xmlXPathPositionFunction=(e,t)=>(_xmlXPathPositionFunction=Module._xmlXPathPositionFunction=wasmExports.xmlXPathPositionFunction)(e,t),_xmlXPathRoundFunction=Module._xmlXPathRoundFunction=(e,t)=>(_xmlXPathRoundFunction=Module._xmlXPathRoundFunction=wasmExports.xmlXPathRoundFunction)(e,t),_xmlXPathStringFunction=Module._xmlXPathStringFunction=(e,t)=>(_xmlXPathStringFunction=Module._xmlXPathStringFunction=wasmExports.xmlXPathStringFunction)(e,t),_xmlXPathStringLengthFunction=Module._xmlXPathStringLengthFunction=(e,t)=>(_xmlXPathStringLengthFunction=Module._xmlXPathStringLengthFunction=wasmExports.xmlXPathStringLengthFunction)(e,t),_xmlXPathStartsWithFunction=Module._xmlXPathStartsWithFunction=(e,t)=>(_xmlXPathStartsWithFunction=Module._xmlXPathStartsWithFunction=wasmExports.xmlXPathStartsWithFunction)(e,t),_xmlXPathSubstringFunction=Module._xmlXPathSubstringFunction=(e,t)=>(_xmlXPathSubstringFunction=Module._xmlXPathSubstringFunction=wasmExports.xmlXPathSubstringFunction)(e,t),_xmlXPathSubstringBeforeFunction=Module._xmlXPathSubstringBeforeFunction=(e,t)=>(_xmlXPathSubstringBeforeFunction=Module._xmlXPathSubstringBeforeFunction=wasmExports.xmlXPathSubstringBeforeFunction)(e,t),_xmlXPathSubstringAfterFunction=Module._xmlXPathSubstringAfterFunction=(e,t)=>(_xmlXPathSubstringAfterFunction=Module._xmlXPathSubstringAfterFunction=wasmExports.xmlXPathSubstringAfterFunction)(e,t),_xmlXPathSumFunction=Module._xmlXPathSumFunction=(e,t)=>(_xmlXPathSumFunction=Module._xmlXPathSumFunction=wasmExports.xmlXPathSumFunction)(e,t),_xmlXPathTrueFunction=Module._xmlXPathTrueFunction=(e,t)=>(_xmlXPathTrueFunction=Module._xmlXPathTrueFunction=wasmExports.xmlXPathTrueFunction)(e,t),_xmlXPathTranslateFunction=Module._xmlXPathTranslateFunction=(e,t)=>(_xmlXPathTranslateFunction=Module._xmlXPathTranslateFunction=wasmExports.xmlXPathTranslateFunction)(e,t),_xmlXPathNextSelf=Module._xmlXPathNextSelf=(e,t)=>(_xmlXPathNextSelf=Module._xmlXPathNextSelf=wasmExports.xmlXPathNextSelf)(e,t),_xmlXPathNextChild=Module._xmlXPathNextChild=(e,t)=>(_xmlXPathNextChild=Module._xmlXPathNextChild=wasmExports.xmlXPathNextChild)(e,t),_xmlXPathNextDescendant=Module._xmlXPathNextDescendant=(e,t)=>(_xmlXPathNextDescendant=Module._xmlXPathNextDescendant=wasmExports.xmlXPathNextDescendant)(e,t),_xmlXPathNextDescendantOrSelf=Module._xmlXPathNextDescendantOrSelf=(e,t)=>(_xmlXPathNextDescendantOrSelf=Module._xmlXPathNextDescendantOrSelf=wasmExports.xmlXPathNextDescendantOrSelf)(e,t),_xmlXPathNextParent=Module._xmlXPathNextParent=(e,t)=>(_xmlXPathNextParent=Module._xmlXPathNextParent=wasmExports.xmlXPathNextParent)(e,t),_xmlXPathNextAncestor=Module._xmlXPathNextAncestor=(e,t)=>(_xmlXPathNextAncestor=Module._xmlXPathNextAncestor=wasmExports.xmlXPathNextAncestor)(e,t),_xmlXPathNextAncestorOrSelf=Module._xmlXPathNextAncestorOrSelf=(e,t)=>(_xmlXPathNextAncestorOrSelf=Module._xmlXPathNextAncestorOrSelf=wasmExports.xmlXPathNextAncestorOrSelf)(e,t),_xmlXPathNextFollowingSibling=Module._xmlXPathNextFollowingSibling=(e,t)=>(_xmlXPathNextFollowingSibling=Module._xmlXPathNextFollowingSibling=wasmExports.xmlXPathNextFollowingSibling)(e,t),_xmlXPathNextPrecedingSibling=Module._xmlXPathNextPrecedingSibling=(e,t)=>(_xmlXPathNextPrecedingSibling=Module._xmlXPathNextPrecedingSibling=wasmExports.xmlXPathNextPrecedingSibling)(e,t),_xmlXPathNextFollowing=Module._xmlXPathNextFollowing=(e,t)=>(_xmlXPathNextFollowing=Module._xmlXPathNextFollowing=wasmExports.xmlXPathNextFollowing)(e,t),_xmlXPathNextNamespace=Module._xmlXPathNextNamespace=(e,t)=>(_xmlXPathNextNamespace=Module._xmlXPathNextNamespace=wasmExports.xmlXPathNextNamespace)(e,t),_xmlXPathNextAttribute=Module._xmlXPathNextAttribute=(e,t)=>(_xmlXPathNextAttribute=Module._xmlXPathNextAttribute=wasmExports.xmlXPathNextAttribute)(e,t),_zcalloc=Module._zcalloc=(e,t,r)=>(_zcalloc=Module._zcalloc=wasmExports.zcalloc)(e,t,r),_zcfree=Module._zcfree=(e,t)=>(_zcfree=Module._zcfree=wasmExports.zcfree)(e,t),_strerror=Module._strerror=e=>(_strerror=Module._strerror=wasmExports.strerror)(e),___dl_seterr=(e,t)=>(___dl_seterr=wasmExports.__dl_seterr)(e,t),_putc=Module._putc=(e,t)=>(_putc=Module._putc=wasmExports.putc)(e,t),_gmtime=Module._gmtime=e=>(_gmtime=Module._gmtime=wasmExports.gmtime)(e),_htonl=e=>(_htonl=wasmExports.htonl)(e),_htons=e=>(_htons=wasmExports.htons)(e),_ioctl=Module._ioctl=(e,t,r)=>(_ioctl=Module._ioctl=wasmExports.ioctl)(e,t,r),_emscripten_builtin_memalign=(e,t)=>(_emscripten_builtin_memalign=wasmExports.emscripten_builtin_memalign)(e,t),_ntohs=e=>(_ntohs=wasmExports.ntohs)(e),_srand=Module._srand=e=>(_srand=Module._srand=wasmExports.srand)(e),_rand=Module._rand=()=>(_rand=Module._rand=wasmExports.rand)(),__emscripten_timeout=(e,t)=>(__emscripten_timeout=wasmExports._emscripten_timeout)(e,t),___floatsitf=Module.___floatsitf=(e,t)=>(___floatsitf=Module.___floatsitf=wasmExports.__floatsitf)(e,t),___multf3=Module.___multf3=(e,t,r,a,o)=>(___multf3=Module.___multf3=wasmExports.__multf3)(e,t,r,a,o),___extenddftf2=Module.___extenddftf2=(e,t)=>(___extenddftf2=Module.___extenddftf2=wasmExports.__extenddftf2)(e,t),___getf2=Module.___getf2=(e,t,r,a)=>(___getf2=Module.___getf2=wasmExports.__getf2)(e,t,r,a),___subtf3=Module.___subtf3=(e,t,r,a,o)=>(___subtf3=Module.___subtf3=wasmExports.__subtf3)(e,t,r,a,o),___letf2=Module.___letf2=(e,t,r,a)=>(___letf2=Module.___letf2=wasmExports.__letf2)(e,t,r,a),___lttf2=Module.___lttf2=(e,t,r,a)=>(___lttf2=Module.___lttf2=wasmExports.__lttf2)(e,t,r,a),_setThrew=(e,t)=>(_setThrew=wasmExports.setThrew)(e,t),__emscripten_tempret_set=e=>(__emscripten_tempret_set=wasmExports._emscripten_tempret_set)(e),__emscripten_tempret_get=()=>(__emscripten_tempret_get=wasmExports._emscripten_tempret_get)(),___fixtfsi=Module.___fixtfsi=(e,t)=>(___fixtfsi=Module.___fixtfsi=wasmExports.__fixtfsi)(e,t),__emscripten_stack_restore=e=>(__emscripten_stack_restore=wasmExports._emscripten_stack_restore)(e),__emscripten_stack_alloc=e=>(__emscripten_stack_alloc=wasmExports._emscripten_stack_alloc)(e),_emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports.emscripten_stack_get_current)(),___wasm_apply_data_relocs=()=>(___wasm_apply_data_relocs=wasmExports.__wasm_apply_data_relocs)(),_ScanKeywords=Module._ScanKeywords=18770052,_stderr=Module._stderr=18792480,_stdout=Module._stdout=18792784,_TopMemoryContext=Module._TopMemoryContext=18830716,_MainLWLockArray=Module._MainLWLockArray=18800668,_MyProc=Module._MyProc=18802328,_MyProcPid=Module._MyProcPid=18824228,_MyLatch=Module._MyLatch=18824260,_CurrentMemoryContext=Module._CurrentMemoryContext=18830712,_InterruptPending=Module._InterruptPending=18824092,_pg_global_prng_state=Module._pg_global_prng_state=18936304,_CurrentResourceOwner=Module._CurrentResourceOwner=18830692,_InterruptHoldoffCount=Module._InterruptHoldoffCount=18824132,_IsUnderPostmaster=Module._IsUnderPostmaster=18824165,_wal_level=Module._wal_level=18758340,_MyDatabaseId=Module._MyDatabaseId=18824148,_error_context_stack=Module._error_context_stack=18816816,_PG_exception_stack=Module._PG_exception_stack=18816820,___THREW__=Module.___THREW__=18950052,___threwValue=Module.___threwValue=18950056,_ShmemVariableCache=Module._ShmemVariableCache=18849760,_shmem_startup_hook=Module._shmem_startup_hook=18794508,_debug_query_string=Module._debug_query_string=18848300,_CritSectionCount=Module._CritSectionCount=18824140,_old_snapshot_threshold=Module._old_snapshot_threshold=18823756,_TopTransactionResourceOwner=Module._TopTransactionResourceOwner=18830700,_LocalBufferBlockPointers=Module._LocalBufferBlockPointers=18800556,_BufferBlocks=Module._BufferBlocks=18795304,_pgBufferUsage=Module._pgBufferUsage=18813728,_GUC_check_errdetail_string=Module._GUC_check_errdetail_string=18814680,_NBuffers=Module._NBuffers=18690456,_BufferDescriptors=Module._BufferDescriptors=18795300,_ParallelWorkerNumber=Module._ParallelWorkerNumber=18767008,_stdin=Module._stdin=18792632,_ScanKeywordTokens=Module._ScanKeywordTokens=17487664,_post_parse_analyze_hook=Module._post_parse_analyze_hook=18802584,_progname=Module._progname=18848060,_DataDir=Module._DataDir=18824144,_MyStartTime=Module._MyStartTime=18824232,_MyProcPort=Module._MyProcPort=18824248,_Log_directory=Module._Log_directory=18803120,_Log_filename=Module._Log_filename=18803124,_ConfigReloadPending=Module._ConfigReloadPending=18803272,_ShutdownRequestPending=Module._ShutdownRequestPending=18803276,_process_shared_preload_libraries_in_progress=Module._process_shared_preload_libraries_in_progress=18824080,_wal_segment_size=Module._wal_segment_size=18758360,_application_name=Module._application_name=18815988,_XactIsoLevel=Module._XactIsoLevel=18758700,_RmgrTable=Module._RmgrTable=18758816,_CacheMemoryContext=Module._CacheMemoryContext=18830728,_TopTransactionContext=Module._TopTransactionContext=18830736,_TTSOpsVirtual=Module._TTSOpsVirtual=18638668,_WalReceiverFunctions=Module._WalReceiverFunctions=18803712,_TTSOpsMinimalTuple=Module._TTSOpsMinimalTuple=18638764,_cluster_name=Module._cluster_name=18640444,_work_mem=Module._work_mem=18690432,_ClientAuthentication_hook=Module._ClientAuthentication_hook=18804032,_cma_rsize=Module._cma_rsize=18848108,_SOCKET_DATA=Module._SOCKET_DATA=18854312,_SOCKET_FILE=Module._SOCKET_FILE=18854308,_TTSOpsHeapTuple=Module._TTSOpsHeapTuple=18638716,_SnapshotAnyData=Module._SnapshotAnyData=18690240,_ExecutorStart_hook=Module._ExecutorStart_hook=18813600,_ExecutorRun_hook=Module._ExecutorRun_hook=18813604,_ExecutorFinish_hook=Module._ExecutorFinish_hook=18813608,_ExecutorEnd_hook=Module._ExecutorEnd_hook=18813612,_SPI_processed=Module._SPI_processed=18813624,_SPI_tuptable=Module._SPI_tuptable=18813632,_SPI_result=Module._SPI_result=18813636,_pgWalUsage=Module._pgWalUsage=18813840,_cpu_operator_cost=Module._cpu_operator_cost=18638912,_planner_hook=Module._planner_hook=18813876,_maintenance_work_mem=Module._maintenance_work_mem=18690448,_max_parallel_maintenance_workers=Module._max_parallel_maintenance_workers=18690452,_cpu_tuple_cost=Module._cpu_tuple_cost=18638896,_seq_page_cost=Module._seq_page_cost=18638880,_check_function_bodies=Module._check_function_bodies=18640389,_quote_all_identifiers=Module._quote_all_identifiers=18848065,_extra_float_digits=Module._extra_float_digits=18692128,_IntervalStyle=Module._IntervalStyle=18824172,_pg_crc32_table=Module._pg_crc32_table=18115504,_oldSnapshotControl=Module._oldSnapshotControl=18823760,_shmem_request_hook=Module._shmem_request_hook=18824084,_DateStyle=Module._DateStyle=18690420,_pg_number_of_ones=Module._pg_number_of_ones=18433360,_xmlStructuredError=Module._xmlStructuredError=18936668,_xmlStructuredErrorContext=Module._xmlStructuredErrorContext=18936676,_xmlGenericErrorContext=Module._xmlGenericErrorContext=18936672,_xmlGenericError=Module._xmlGenericError=18774356,_xmlIsBaseCharGroup=Module._xmlIsBaseCharGroup=18774120,_xmlIsDigitGroup=Module._xmlIsDigitGroup=18774152,_xmlIsCombiningGroup=Module._xmlIsCombiningGroup=18774136,_xmlIsExtenderGroup=Module._xmlIsExtenderGroup=18774168,_xmlFree=Module._xmlFree=18774320,_ProcessUtility_hook=Module._ProcessUtility_hook=18848012,_single_mode_feed=Module._single_mode_feed=18848076,_cma_wsize=Module._cma_wsize=18848116,_check_password_hook=Module._check_password_hook=18850784,_IDB_STAGE=Module._IDB_STAGE=18854320,_IDB_PIPE_FP=Module._IDB_PIPE_FP=18854316,_pg_scram_mech=Module._pg_scram_mech=18774064,_pg_g_threadlock=Module._pg_g_threadlock=18772168,_pgresStatus=Module._pgresStatus=18773856,_xmlIsPubidChar_tab=Module._xmlIsPubidChar_tab=18433648,_xmlGetWarningsDefaultValue=Module._xmlGetWarningsDefaultValue=18774348,_xmlMalloc=Module._xmlMalloc=18774324,_xmlRealloc=Module._xmlRealloc=18774332,_xmlLastError=Module._xmlLastError=18936688,_xmlMallocAtomic=Module._xmlMallocAtomic=18774328,_xmlMemStrdup=Module._xmlMemStrdup=18774336,_xmlBufferAllocScheme=Module._xmlBufferAllocScheme=18774340,_xmlDefaultBufferSize=Module._xmlDefaultBufferSize=18774344,_xmlParserDebugEntities=Module._xmlParserDebugEntities=18936628,_xmlDoValidityCheckingDefaultValue=Module._xmlDoValidityCheckingDefaultValue=18936632,_xmlLoadExtDtdDefaultValue=Module._xmlLoadExtDtdDefaultValue=18936636,_xmlPedanticParserDefaultValue=Module._xmlPedanticParserDefaultValue=18936640,_xmlLineNumbersDefaultValue=Module._xmlLineNumbersDefaultValue=18936644,_xmlKeepBlanksDefaultValue=Module._xmlKeepBlanksDefaultValue=18774352,_xmlSubstituteEntitiesDefaultValue=Module._xmlSubstituteEntitiesDefaultValue=18936648,_xmlRegisterNodeDefaultValue=Module._xmlRegisterNodeDefaultValue=18936652,_xmlDeregisterNodeDefaultValue=Module._xmlDeregisterNodeDefaultValue=18936656,_xmlParserInputBufferCreateFilenameValue=Module._xmlParserInputBufferCreateFilenameValue=18936660,_xmlOutputBufferCreateFilenameValue=Module._xmlOutputBufferCreateFilenameValue=18936664,_xmlIndentTreeOutput=Module._xmlIndentTreeOutput=18774360,_xmlTreeIndentString=Module._xmlTreeIndentString=18774364,_xmlSaveNoEmptyTags=Module._xmlSaveNoEmptyTags=18936680,_xmlDefaultSAXHandler=Module._xmlDefaultSAXHandler=18774368,_xmlDefaultSAXLocator=Module._xmlDefaultSAXLocator=18774480,_xmlParserMaxDepth=Module._xmlParserMaxDepth=18775140,_xmlStringText=Module._xmlStringText=18435456,_xmlStringComment=Module._xmlStringComment=18435471,_xmlStringTextNoenc=Module._xmlStringTextNoenc=18435461,_xmlXPathNAN=Module._xmlXPathNAN=18937352,_xmlXPathNINF=Module._xmlXPathNINF=18937368,_xmlXPathPINF=Module._xmlXPathPINF=18937360,_z_errmsg=Module._z_errmsg=18791696,__length_code=Module.__length_code=18455120,__dist_code=Module.__dist_code=18454608;function invoke_i(e){var t=stackSave();try{return getWasmTableEntry(e)()}catch(r){if(stackRestore(t),r!==r+0)throw r;_setThrew(1,0)}}function invoke_v(e){var t=stackSave();try{getWasmTableEntry(e)()}catch(r){if(stackRestore(t),r!==r+0)throw r;_setThrew(1,0)}}function invoke_vi(e,t){var r=stackSave();try{getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_iii(e,t,r){var a=stackSave();try{return getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;_setThrew(1,0)}}function invoke_iiiiii(e,t,r,a,o,s){var l=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s)}catch(n){if(stackRestore(l),n!==n+0)throw n;_setThrew(1,0)}}function invoke_viii(e,t,r,a){var o=stackSave();try{getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_viiiiiii(e,t,r,a,o,s,l,n){var _=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l,n)}catch(m){if(stackRestore(_),m!==m+0)throw m;_setThrew(1,0)}}function invoke_iiii(e,t,r,a){var o=stackSave();try{return getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_viiii(e,t,r,a,o){var s=stackSave();try{getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;_setThrew(1,0)}}function invoke_iiiii(e,t,r,a,o){var s=stackSave();try{return getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;_setThrew(1,0)}}function invoke_vii(e,t,r){var a=stackSave();try{getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;_setThrew(1,0)}}function invoke_ii(e,t){var r=stackSave();try{return getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_viiiiiiii(e,t,r,a,o,s,l,n,_){var m=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l,n,_)}catch(p){if(stackRestore(m),p!==p+0)throw p;_setThrew(1,0)}}function invoke_viiiii(e,t,r,a,o,s){var l=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s)}catch(n){if(stackRestore(l),n!==n+0)throw n;_setThrew(1,0)}}function invoke_ij(e,t){var r=stackSave();try{return getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_ji(e,t){var r=stackSave();try{return getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;return _setThrew(1,0),0n}}function invoke_ijiiiiii(e,t,r,a,o,s,l,n){var _=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n)}catch(m){if(stackRestore(_),m!==m+0)throw m;_setThrew(1,0)}}function invoke_vij(e,t,r){var a=stackSave();try{getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;_setThrew(1,0)}}function invoke_vj(e,t){var r=stackSave();try{getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_viijii(e,t,r,a,o,s){var l=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s)}catch(n){if(stackRestore(l),n!==n+0)throw n;_setThrew(1,0)}}function invoke_iiiiiji(e,t,r,a,o,s,l){var n=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l)}catch(_){if(stackRestore(n),_!==_+0)throw _;_setThrew(1,0)}}function invoke_viijiiii(e,t,r,a,o,s,l,n){var _=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l,n)}catch(m){if(stackRestore(_),m!==m+0)throw m;_setThrew(1,0)}}function invoke_viij(e,t,r,a){var o=stackSave();try{getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_jiiiiiiii(e,t,r,a,o,s,l,n,_){var m=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n,_)}catch(p){if(stackRestore(m),p!==p+0)throw p;return _setThrew(1,0),0n}}function invoke_jiiiii(e,t,r,a,o,s){var l=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s)}catch(n){if(stackRestore(l),n!==n+0)throw n;return _setThrew(1,0),0n}}function invoke_iiiiiiiii(e,t,r,a,o,s,l,n,_){var m=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n,_)}catch(p){if(stackRestore(m),p!==p+0)throw p;_setThrew(1,0)}}function invoke_vji(e,t,r){var a=stackSave();try{getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;_setThrew(1,0)}}function invoke_iiiijii(e,t,r,a,o,s,l){var n=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l)}catch(_){if(stackRestore(n),_!==_+0)throw _;_setThrew(1,0)}}function invoke_vijiji(e,t,r,a,o,s){var l=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s)}catch(n){if(stackRestore(l),n!==n+0)throw n;_setThrew(1,0)}}function invoke_viji(e,t,r,a){var o=stackSave();try{getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_iiij(e,t,r,a){var o=stackSave();try{return getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_iiiiiiii(e,t,r,a,o,s,l,n){var _=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n)}catch(m){if(stackRestore(_),m!==m+0)throw m;_setThrew(1,0)}}function invoke_iiiiiii(e,t,r,a,o,s,l){var n=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l)}catch(_){if(stackRestore(n),_!==_+0)throw _;_setThrew(1,0)}}function invoke_di(e,t){var r=stackSave();try{return getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_id(e,t){var r=stackSave();try{return getWasmTableEntry(e)(t)}catch(a){if(stackRestore(r),a!==a+0)throw a;_setThrew(1,0)}}function invoke_ijiiiii(e,t,r,a,o,s,l){var n=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l)}catch(_){if(stackRestore(n),_!==_+0)throw _;_setThrew(1,0)}}function invoke_jiiii(e,t,r,a,o){var s=stackSave();try{return getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;return _setThrew(1,0),0n}}function invoke_viiiiii(e,t,r,a,o,s,l){var n=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l)}catch(_){if(stackRestore(n),_!==_+0)throw _;_setThrew(1,0)}}function invoke_viiiiiiiiiiii(e,t,r,a,o,s,l,n,_,m,p,d,g){var c=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l,n,_,m,p,d,g)}catch(f){if(stackRestore(c),f!==f+0)throw f;_setThrew(1,0)}}function invoke_jii(e,t,r){var a=stackSave();try{return getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;return _setThrew(1,0),0n}}function invoke_iiiij(e,t,r,a,o){var s=stackSave();try{return getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;_setThrew(1,0)}}function invoke_iiiiiiiiii(e,t,r,a,o,s,l,n,_,m){var p=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n,_,m)}catch(d){if(stackRestore(p),d!==d+0)throw d;_setThrew(1,0)}}function invoke_viiji(e,t,r,a,o){var s=stackSave();try{getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;_setThrew(1,0)}}function invoke_iiji(e,t,r,a){var o=stackSave();try{return getWasmTableEntry(e)(t,r,a)}catch(s){if(stackRestore(o),s!==s+0)throw s;_setThrew(1,0)}}function invoke_vid(e,t,r){var a=stackSave();try{getWasmTableEntry(e)(t,r)}catch(o){if(stackRestore(a),o!==o+0)throw o;_setThrew(1,0)}}function invoke_viiiiiiiii(e,t,r,a,o,s,l,n,_,m){var p=stackSave();try{getWasmTableEntry(e)(t,r,a,o,s,l,n,_,m)}catch(d){if(stackRestore(p),d!==d+0)throw d;_setThrew(1,0)}}function invoke_viiij(e,t,r,a,o){var s=stackSave();try{getWasmTableEntry(e)(t,r,a,o)}catch(l){if(stackRestore(s),l!==l+0)throw l;_setThrew(1,0)}}function invoke_iiiiiiiiiiiiiiiii(e,t,r,a,o,s,l,n,_,m,p,d,g,c,f,u,w){var h=stackSave();try{return getWasmTableEntry(e)(t,r,a,o,s,l,n,_,m,p,d,g,c,f,u,w)}catch(S){if(stackRestore(h),S!==S+0)throw S;_setThrew(1,0)}}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.callMain=callMain,Module.ccall=ccall,Module.cwrap=cwrap,Module.setValue=setValue,Module.getValue=getValue,Module.UTF8ToString=UTF8ToString,Module.stringToNewUTF8=stringToNewUTF8,Module.stringToUTF8OnStack=stringToUTF8OnStack,Module.FS_createPreloadedFile=FS_createPreloadedFile,Module.FS_unlink=FS_unlink,Module.FS_createPath=FS_createPath,Module.FS_createDevice=FS_createDevice,Module.FS=FS,Module.FS_createDataFile=FS_createDataFile,Module.FS_createLazyFile=FS_createLazyFile;var calledRun;dependenciesFulfilled=function e(){calledRun||run(),calledRun||(dependenciesFulfilled=e)};function callMain(e=[]){var t=resolveGlobalSymbol("main").sym;if(t){e.unshift(thisProgram);var r=e.length,a=stackAlloc((r+1)*4),o=a;e.forEach(l=>{HEAPU32[o>>2]=stringToUTF8OnStack(l),o+=4}),HEAPU32[o>>2]=0;try{var s=t(r,a);return exitJS(s,!0),s}catch(l){return handleException(l)}}}function run(e=arguments_){if(runDependencies>0||(preRun(),runDependencies>0))return;function t(){calledRun||(calledRun=!0,Module.calledRun=!0,!ABORT&&(initRuntime(),preMain(),readyPromiseResolve(Module),Module.onRuntimeInitialized?.(),shouldRunNow&&callMain(e),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>Module.setStatus(""),1),t()},1)):t()}if(Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;return Module.noInitialRun&&(shouldRunNow=!1),run(),moduleRtn=readyPromise,moduleRtn}})(),ke=Qe;var Te=ke;var Y,W,j,J,$,_e,ie,me,Z,ae,oe,se,V,G,k,K,O,qe,re,pe=class pe extends _chunk_A7RFOIQ7_js__WEBPACK_IMPORTED_MODULE_0__.a{constructor(r={},a={}){super();(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,O);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,Y,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,W,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,j,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,J,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,$,!1);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,_e,new H);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,ie,new H);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,me,new H);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,Z,!1);this.debug=0;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,ae);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,oe,[]);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,se,new _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.o);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,V);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,G);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,k,new Map);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.f)(this,K,new Set);typeof r=="string"?a={dataDir:r,...a}:a=r,this.dataDir=a.dataDir,a.parsers!==void 0&&(this.parsers={...this.parsers,...a.parsers}),a.serializers!==void 0&&(this.serializers={...this.serializers,...a.serializers}),a?.debug!==void 0&&(this.debug=a.debug),a?.relaxedDurability!==void 0&&(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,$,a.relaxedDurability),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,ae,a.extensions??{}),this.waitReady=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.h)(this,O,qe).call(this,a??{})}static async create(r,a){let o=typeof r=="string"?{dataDir:r,...a??{}}:r??{},s=new pe(o);return await s.waitReady,s}get Module(){return this.mod}get ready(){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,Y)&&!(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,W)&&!(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,j)}get closed(){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,j)}async close(){await this._checkReady(),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,W,!0);for(let r of (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,oe))await r();try{await this.execProtocol(_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.i.end()),this.mod._pg_shutdown()}catch(r){let a=r;if(!(a.name==="ExitStatus"&&a.status===0))throw r}await this.fs.closeFs(),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,j,!0),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,W,!1)}async[Symbol.asyncDispose](){await this.close()}async _handleBlob(r){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,V,r?await r.arrayBuffer():void 0)}async _cleanupBlob(){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,V,void 0)}async _getWrittenBlob(){if(!(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,G))return;let r=new Blob((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,G));return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,G,void 0),r}async _checkReady(){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,W))throw new Error("PGlite is closing");if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,j))throw new Error("PGlite is closed");(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,Y)||await this.waitReady}execProtocolRawSync(r){let a=r.length,o=this.mod;o._interactive_write(a),o.HEAPU8.set(r,1),o._interactive_one();let s=a+2,l=s+o._interactive_read();return o.HEAPU8.subarray(s,l)}async execProtocolRaw(r,{syncToFs:a=!0}={}){let o=r.length,s=this.mod;s._interactive_write(o),s.HEAPU8.set(r,1),s._interactive_one();let l=o+2,n=l+s._interactive_read(),_=s.HEAPU8.subarray(l,n);return a&&await this.syncToFs(),_}async execProtocol(r,{syncToFs:a=!0,throwOnError:o=!0,onNotice:s}={}){let l=await this.execProtocolRaw(r,{syncToFs:a}),n=[];return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,se).parse(l,_=>{if(_ instanceof _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.j){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,se,new _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.o),o)throw _}else if(_ instanceof _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.m)this.debug>0&&console.warn(_),s&&s(_);else if(_ instanceof _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.l)switch(_.text){case"BEGIN":(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,J,!0);break;case"COMMIT":case"ROLLBACK":(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,J,!1);break}else if(_ instanceof _chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.k){let m=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(_.channel);m&&m.forEach(p=>{queueMicrotask(()=>p(_.payload))}),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,K).forEach(p=>{queueMicrotask(()=>p(_.channel,_.payload))})}n.push(_)}),{messages:n,data:l}}isInTransaction(){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,J)}async syncToFs(){if((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,Z))return;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,Z,!0);let r=async()=>{await (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,me).runExclusive(async()=>{(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,Z,!1),await this.fs.syncToFs((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,$))})};(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,$)?r():await r()}async listen(r,a){let o=(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.x)(r);(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).has(o)||(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).set(o,new Set),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(o).add(a);try{await this.exec(`LISTEN ${r}`)}catch(s){throw (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(o).delete(a),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(o)?.size===0&&(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).delete(o),s}return async()=>{await this.unlisten(o,a)}}async unlisten(r,a){let o=(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.x)(r);a?((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(o)?.delete(a),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).get(o)?.size===0&&(await this.exec(`UNLISTEN ${r}`),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).delete(o))):(await this.exec(`UNLISTEN ${r}`),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,k).delete(o))}onNotification(r){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,K).add(r),()=>{(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,K).delete(r)}}offNotification(r){(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,K).delete(r)}async dumpDataDir(r){let a=this.dataDir?.split("/").pop()??"pgdata";return this.fs.dumpTar(a,r)}_runExclusiveQuery(r){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,_e).runExclusive(r)}_runExclusiveTransaction(r){return (0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,ie).runExclusive(r)}async clone(){let r=await this.dumpDataDir("none");return new pe({loadDataDir:r})}};Y=new WeakMap,W=new WeakMap,j=new WeakMap,J=new WeakMap,$=new WeakMap,_e=new WeakMap,ie=new WeakMap,me=new WeakMap,Z=new WeakMap,ae=new WeakMap,oe=new WeakMap,se=new WeakMap,V=new WeakMap,G=new WeakMap,k=new WeakMap,K=new WeakMap,O=new WeakSet,qe=async function(r){if(r.fs)this.fs=r.fs;else{let{dataDir:d,fsType:g}=Fe(r.dataDir);this.fs=await Ae(d,g)}let a={},o=[],s=[`PGDATA=${_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.d}`,`PREFIX=${_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.c}`,`PGUSER=${r.username??"postgres"}`,`PGDATABASE=${r.database??"template1"}`,"MODE=REACT","REPL=N",...this.debug?["-d",this.debug.toString()]:[]];r.wasmModule||(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.r)();let l=r.fsBundle?r.fsBundle.arrayBuffer():(0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.t)(),n;l.then(d=>{n=d});let _={WASM_PREFIX:_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.c,arguments:s,INITIAL_MEMORY:r.initialMemory,noExitRuntime:!0,...this.debug>0?{print:console.info,printErr:console.error}:{print:()=>{},printErr:()=>{}},instantiateWasm:(d,g)=>((0,_chunk_EADU5A67_js__WEBPACK_IMPORTED_MODULE_1__.s)(d,r.wasmModule).then(({instance:c,module:f})=>{g(c,f)}),{}),getPreloadedPackage:(d,g)=>{if(d==="postgres.data"){if(n.byteLength!==g)throw new Error(`Invalid FS bundle size: ${n.byteLength} !== ${g}`);return n}throw new Error(`Unknown package: ${d}`)},preRun:[d=>{let g=d.FS.makedev(64,0),c={open:f=>{},close:f=>{},read:(f,u,w,h,S)=>{let M=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,V);if(!M)throw new Error("No /dev/blob File or Blob provided to read from");let y=new Uint8Array(M);if(S>=y.length)return 0;let x=Math.min(y.length-S,h);for(let E=0;E((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,G)??(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,G,[]),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,G).push(u.slice(w,w+h)),h),llseek:(f,u,w)=>{let h=(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,V);if(!h)throw new Error("No /dev/blob File or Blob provided to llseek");let S=u;if(w===1?S+=f.position:w===2&&(S=new Uint8Array(h).length),S<0)throw new d.FS.ErrnoError(28);return S}};d.FS.registerDevice(g,c),d.FS.mkdev("/dev/blob",g)}]},{emscriptenOpts:m}=await this.fs.init(this,_);_=m;for(let[d,g]of Object.entries((0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,ae)))if(g instanceof URL)a[d]=ge(g);else{let c=await g.setup(this,_);if(c.emscriptenOpts&&(_=c.emscriptenOpts),c.namespaceObj){let f=this;f[d]=c.namespaceObj}c.bundlePath&&(a[d]=ge(c.bundlePath)),c.init&&o.push(c.init),c.close&&(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.e)(this,oe).push(c.close)}if(_.pg_extensions=a,await l,this.mod=await Te(_),await this.fs.initialSyncFs(),r.loadDataDir){if(this.mod.FS.analyzePath(_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.d+"/PG_VERSION").exists)throw new Error("Database already exists, cannot load from tarball");(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.h)(this,O,re).call(this,"pglite: loading data from tarball"),await (0,_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.b)(this.mod.FS,r.loadDataDir,_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.d)}this.mod.FS.analyzePath(_chunk_WGR4JCLS_js__WEBPACK_IMPORTED_MODULE_2__.d+"/PG_VERSION").exists?(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.h)(this,O,re).call(this,"pglite: found DB, resuming"):(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.h)(this,O,re).call(this,"pglite: no db"),await Pe(this.mod,(...d)=>(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.h)(this,O,re).call(this,...d));let p=this.mod._pg_initdb();if(!p)throw new Error("INITDB failed to return value");if(p&1)throw new Error("INITDB failed");if(p&2){let d=r.username??"postgres",g=r.database??"template1";if(p&4){if(!(p&12))throw new Error("Invalid db/user combination")}else if(g!=="template1"&&d!=="postgres")throw new Error("INITDB created a new datadir, but an alternative db/user was requested")}await this.syncToFs(),(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.g)(this,Y,!0),await this.exec("SET search_path TO public;"),await this._initArrayTypes();for(let d of o)await d()},re=function(...r){this.debug>0&&console.log(...r)};var Ue=pe;(0,_chunk_BTBUZ646_js__WEBPACK_IMPORTED_MODULE_4__.j)(); -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/postgres.data": -/*!**************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/postgres.data ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -module.exports = __webpack_require__.p + "6a6af95f67e70830cb39.data"; - -/***/ }), - -/***/ "./node_modules/@electric-sql/pglite/dist/postgres.wasm": -/*!**************************************************************!*\ - !*** ./node_modules/@electric-sql/pglite/dist/postgres.wasm ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -module.exports = __webpack_require__.p + "882a4fc4178bf2b803a6.wasm"; - -/***/ }), - -/***/ "./src/cgi-worker.mjs": -/*!****************************!*\ - !*** ./src/cgi-worker.mjs ***! - \****************************/ -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var php_cgi_wasm_PhpCgiWorker_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! php-cgi-wasm/PhpCgiWorker.mjs */ "../packages/php-cgi-wasm/PhpCgiWorker.mjs"); -/* harmony import */ var _electric_sql_pglite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @electric-sql/pglite */ "./node_modules/@electric-sql/pglite/dist/index.js"); -/* eslint-disable no-restricted-globals */ - - -const buildType = {"BUILD_TYPE":"dynamic"}.BUILD_TYPE ?? 'dynamic'; -const sharedLibs = []; -const files = [{ - parent: '/preload/test_www/', - name: 'hello-world.php', - url: './scripts/hello-world.php' -}, { - parent: '/preload/test_www/', - name: 'phpinfo.php', - url: './scripts/phpinfo.php' -}, { - parent: '/preload/', - name: 'list-extensions.php', - url: './scripts/list-extensions.php' -}]; -if (buildType === 'dynamic') { - sharedLibs.push(...(await Promise.all([__webpack_require__.e(/*! import() */ "packages_libxml_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-libxml */ "../packages/libxml/index.mjs")), __webpack_require__.e(/*! import() */ "packages_dom_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-dom */ "../packages/dom/index.mjs")), __webpack_require__.e(/*! import() */ "packages_zlib_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-zlib */ "../packages/zlib/index.mjs")), __webpack_require__.e(/*! import() */ "packages_libzip_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-libzip */ "../packages/libzip/index.mjs")), __webpack_require__.e(/*! import() */ "packages_gd_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-gd */ "../packages/gd/index.mjs")), __webpack_require__.e(/*! import() */ "packages_iconv_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-iconv */ "../packages/iconv/index.mjs")), __webpack_require__.e(/*! import() */ "packages_intl_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-intl */ "../packages/intl/index.mjs")), __webpack_require__.e(/*! import() */ "packages_openssl_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-openssl */ "../packages/openssl/index.mjs")), __webpack_require__.e(/*! import() */ "packages_mbstring_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-mbstring */ "../packages/mbstring/index.mjs")), __webpack_require__.e(/*! import() */ "packages_sqlite_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-sqlite */ "../packages/sqlite/index.mjs")), __webpack_require__.e(/*! import() */ "packages_xml_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-xml */ "../packages/xml/index.mjs")), __webpack_require__.e(/*! import() */ "packages_simplexml_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-simplexml */ "../packages/simplexml/index.mjs")), __webpack_require__.e(/*! import() */ "packages_tidy_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-tidy */ "../packages/tidy/index.mjs")), __webpack_require__.e(/*! import() */ "packages_libyaml_index_mjs").then(__webpack_require__.bind(__webpack_require__, /*! php-wasm-yaml */ "../packages/libyaml/index.mjs"))])).map(m => m.default)); -} else if (buildType === 'shared') { - // files.push( - // { parent: '/preload/', name: 'icudt72l.dat', url: (await import('php-wasm-intl/icudt72l.dat')).default } - // ); - - sharedLibs.push({ - name: 'libxml2.so', - url: (await __webpack_require__.e(/*! import() */ "packages_libxml_libxml2_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-libxml/libxml2.so */ "../packages/libxml/libxml2.so", 17))).default - }, { - name: 'libz.so', - url: (await __webpack_require__.e(/*! import() */ "packages_zlib_libz_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-zlib/libz.so */ "../packages/zlib/libz.so", 17))).default - }, { - name: 'libzip.so', - url: (await __webpack_require__.e(/*! import() */ "packages_libzip_libzip_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-libzip/libzip.so */ "../packages/libzip/libzip.so", 17))).default - }, { - name: 'libfreetype.so', - url: (await __webpack_require__.e(/*! import() */ "packages_gd_libfreetype_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-gd/libfreetype.so */ "../packages/gd/libfreetype.so", 17))).default - }, { - name: 'libjpeg.so', - url: (await __webpack_require__.e(/*! import() */ "packages_gd_libjpeg_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-gd/libjpeg.so */ "../packages/gd/libjpeg.so", 17))).default - }, { - name: 'libwebp.so', - url: (await __webpack_require__.e(/*! import() */ "packages_gd_libwebp_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-gd/libwebp.so */ "../packages/gd/libwebp.so", 17))).default - }, { - name: 'libpng.so', - url: (await __webpack_require__.e(/*! import() */ "packages_gd_libpng_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-gd/libpng.so */ "../packages/gd/libpng.so", 17))).default - }, { - name: 'libiconv.so', - url: (await __webpack_require__.e(/*! import() */ "packages_iconv_libiconv_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-iconv/libiconv.so */ "../packages/iconv/libiconv.so", 17))).default - }, { - name: 'libicuuc.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicuuc_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicuuc.so */ "../packages/intl/libicuuc.so", 17))).default - }, { - name: 'libicutu.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicutu_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicutu.so */ "../packages/intl/libicutu.so", 17))).default - }, { - name: 'libicutest.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicutest_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicutest.so */ "../packages/intl/libicutest.so", 17))).default - }, { - name: 'libicuio.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicuio_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicuio.so */ "../packages/intl/libicuio.so", 17))).default - }, { - name: 'libicui18n.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicui18n_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicui18n.so */ "../packages/intl/libicui18n.so", 17))).default - }, { - name: 'libicudata.so', - url: (await __webpack_require__.e(/*! import() */ "packages_intl_libicudata_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-intl/libicudata.so */ "../packages/intl/libicudata.so", 17))).default - }, { - name: 'libcrypto.so', - url: (await __webpack_require__.e(/*! import() */ "packages_openssl_libcrypto_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-openssl/libcrypto.so */ "../packages/openssl/libcrypto.so", 17))).default - }, { - name: 'libssl.so', - url: (await __webpack_require__.e(/*! import() */ "packages_openssl_libssl_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-openssl/libssl.so */ "../packages/openssl/libssl.so", 17))).default - }, { - name: 'libonig.so', - url: (await __webpack_require__.e(/*! import() */ "packages_mbstring_libonig_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-mbstring/libonig.so */ "../packages/mbstring/libonig.so", 17))).default - }, { - name: 'libsqlite3.so', - url: (await __webpack_require__.e(/*! import() */ "packages_sqlite_libsqlite3_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-sqlite/libsqlite3.so */ "../packages/sqlite/libsqlite3.so", 17))).default - }, { - name: 'libtidy.so', - url: (await __webpack_require__.e(/*! import() */ "packages_tidy_libtidy_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-tidy/libtidy.so */ "../packages/tidy/libtidy.so", 17))).default - }, { - name: 'libyaml.so', - url: (await __webpack_require__.e(/*! import() */ "packages_libyaml_libyaml_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-yaml/libyaml.so */ "../packages/libyaml/libyaml.so", 17))).default - }); -} else { - sharedLibs.push({ - name: 'libcrypto.so', - url: (await __webpack_require__.e(/*! import() */ "packages_openssl_libcrypto_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-openssl/libcrypto.so */ "../packages/openssl/libcrypto.so", 17))).default - }, { - name: 'libssl.so', - url: (await __webpack_require__.e(/*! import() */ "packages_openssl_libssl_so").then(__webpack_require__.t.bind(__webpack_require__, /*! php-wasm-openssl/libssl.so */ "../packages/openssl/libssl.so", 17))).default - }); -} - -// Log requests -const onRequest = (request, response) => { - const url = new URL(request.url); - const logLine = `[${new Date().toISOString()}]` + `#${php.count} 127.0.0.1 - "${request.method}` + ` ${url.pathname}" - HTTP/1.1 ${response.status}`; - console.log(logLine); -}; - -// Formatted 404s -const notFound = request => { - return new Response(`

404

${request.url} not found`, { - status: 404, - headers: { - 'Content-Type': 'text/html' - } - }); -}; -const actions = { - runSql: (php, database, sql) => { - console.log({ - database - }); - const pglite = new _electric_sql_pglite__WEBPACK_IMPORTED_MODULE_1__.PGlite(database); - return pglite.query(sql); - }, - execSql: (php, database, sql) => { - console.log({ - database - }); - const pglite = new _electric_sql_pglite__WEBPACK_IMPORTED_MODULE_1__.PGlite(database); - return pglite.exec(sql); - } -}; - -// Spawn the PHP-CGI binary -const php = new php_cgi_wasm_PhpCgiWorker_mjs__WEBPACK_IMPORTED_MODULE_0__.PhpCgiWorker({ - version: '8.3', - onRequest, - notFound, - sharedLibs, - files, - PGlite: _electric_sql_pglite__WEBPACK_IMPORTED_MODULE_1__.PGlite, - actions, - staticFS: false, - prefix: '/php-wasm/cgi-bin/', - exclude: ['/php-wasm/cgi-bin/~!@', '/php-wasm/cgi-bin/.'], - docroot: '/persist/www', - types: { - jpeg: 'image/jpeg', - jpg: 'image/jpeg', - gif: 'image/gif', - png: 'image/png', - svg: 'image/svg+xml' - }, - vHosts: [{ - "pathPrefix": "/php-wasm/cgi-bin/test", - "directory": "/preload/test_www", - "entrypoint": "hello-world.php" - }] -}); - -// Set up the event handlers -self.addEventListener('install', event => php.handleInstallEvent(event)); -self.addEventListener('activate', event => php.handleActivateEvent(event)); -self.addEventListener('fetch', event => php.handleFetchEvent(event)); -self.addEventListener('message', event => php.handleMessageEvent(event)); - -// Extras -self.addEventListener('install', event => console.log('Install')); -self.addEventListener('activate', event => console.log('Activate')); -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }, 1); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/async module */ -/******/ (() => { -/******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; -/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; -/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; -/******/ var resolveQueue = (queue) => { -/******/ if(queue && queue.d < 1) { -/******/ queue.d = 1; -/******/ queue.forEach((fn) => (fn.r--)); -/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); -/******/ } -/******/ } -/******/ var wrapDeps = (deps) => (deps.map((dep) => { -/******/ if(dep !== null && typeof dep === "object") { -/******/ if(dep[webpackQueues]) return dep; -/******/ if(dep.then) { -/******/ var queue = []; -/******/ queue.d = 0; -/******/ dep.then((r) => { -/******/ obj[webpackExports] = r; -/******/ resolveQueue(queue); -/******/ }, (e) => { -/******/ obj[webpackError] = e; -/******/ resolveQueue(queue); -/******/ }); -/******/ var obj = {}; -/******/ obj[webpackQueues] = (fn) => (fn(queue)); -/******/ return obj; -/******/ } -/******/ } -/******/ var ret = {}; -/******/ ret[webpackQueues] = x => {}; -/******/ ret[webpackExports] = dep; -/******/ return ret; -/******/ })); -/******/ __webpack_require__.a = (module, body, hasAwait) => { -/******/ var queue; -/******/ hasAwait && ((queue = []).d = -1); -/******/ var depQueues = new Set(); -/******/ var exports = module.exports; -/******/ var currentDeps; -/******/ var outerResolve; -/******/ var reject; -/******/ var promise = new Promise((resolve, rej) => { -/******/ reject = rej; -/******/ outerResolve = resolve; -/******/ }); -/******/ promise[webpackExports] = exports; -/******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); -/******/ module.exports = promise; -/******/ body((deps) => { -/******/ currentDeps = wrapDeps(deps); -/******/ var fn; -/******/ var getResult = () => (currentDeps.map((d) => { -/******/ if(d[webpackError]) throw d[webpackError]; -/******/ return d[webpackExports]; -/******/ })) -/******/ var promise = new Promise((resolve) => { -/******/ fn = () => (resolve(getResult)); -/******/ fn.r = 0; -/******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); -/******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); -/******/ }); -/******/ return fn.r ? promise : getResult(); -/******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); -/******/ queue && queue.d < 0 && (queue.d = 0); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/create fake namespace object */ -/******/ (() => { -/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); -/******/ var leafPrototypes; -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 16: return value when it's Promise-like -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = this(value); -/******/ if(mode & 8) return value; -/******/ if(typeof value === 'object' && value) { -/******/ if((mode & 4) && value.__esModule) return value; -/******/ if((mode & 16) && typeof value.then === 'function') return value; -/******/ } -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ var def = {}; -/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; -/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { -/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); -/******/ } -/******/ def['default'] = () => (value); -/******/ __webpack_require__.d(ns, def); -/******/ return ns; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/ensure chunk */ -/******/ (() => { -/******/ __webpack_require__.f = {}; -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = (chunkId) => { -/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { -/******/ __webpack_require__.f[key](chunkId, promises); -/******/ return promises; -/******/ }, [])); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get javascript chunk filename */ -/******/ (() => { -/******/ // This function allow to reference async chunks -/******/ __webpack_require__.u = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return "" + chunkId + ".cgi-worker.js"; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/publicPath */ -/******/ (() => { -/******/ __webpack_require__.p = "/"; -/******/ })(); -/******/ -/******/ /* webpack/runtime/importScripts chunk loading */ -/******/ (() => { -/******/ __webpack_require__.b = self.location + ""; -/******/ -/******/ // object to store loaded chunks -/******/ // "1" means "already loaded" -/******/ var installedChunks = { -/******/ "service-worker": 1 -/******/ }; -/******/ -/******/ // importScripts chunk loading -/******/ var installChunk = (data) => { -/******/ var [chunkIds, moreModules, runtime] = data; -/******/ for(var moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(runtime) runtime(__webpack_require__); -/******/ while(chunkIds.length) -/******/ installedChunks[chunkIds.pop()] = 1; -/******/ parentChunkLoadingFunction(data); -/******/ }; -/******/ __webpack_require__.f.i = (chunkId, promises) => { -/******/ // "1" is the signal for "already loaded" -/******/ if(!installedChunks[chunkId]) { -/******/ if(true) { // all chunks have JS -/******/ importScripts(__webpack_require__.p + __webpack_require__.u(chunkId)); -/******/ } -/******/ } -/******/ }; -/******/ -/******/ var chunkLoadingGlobal = self["webpackChunkdemo_source"] = self["webpackChunkdemo_source"] || []; -/******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal); -/******/ chunkLoadingGlobal.push = installChunk; -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module used 'module' so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__("./src/cgi-worker.mjs"); -/******/ -/******/ })() -; -//# sourceMappingURL=cgi-worker.js.map \ No newline at end of file diff --git a/demo-web/public/index.html b/demo-web/public/index.html deleted file mode 100644 index 3305ca4c5..000000000 --- a/demo-web/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - php-wasm - - - - - -
- - - diff --git a/demo-web/public/scripts/callbacks.php b/demo-web/public/scripts/callbacks.php index d074551af..11f10a252 100644 --- a/demo-web/public/scripts/callbacks.php +++ b/demo-web/public/scripts/callbacks.php @@ -11,7 +11,7 @@ if(!extension_loaded('vrzno')) { - printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP >=8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } diff --git a/demo-web/public/scripts/dom-access.php b/demo-web/public/scripts/dom-access.php index 1dd2662e7..37830c7f0 100644 --- a/demo-web/public/scripts/dom-access.php +++ b/demo-web/public/scripts/dom-access.php @@ -1,7 +1,7 @@ =8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } diff --git a/demo-web/public/scripts/fetch.php b/demo-web/public/scripts/fetch.php index ca0bb69a4..561bc8872 100644 --- a/demo-web/public/scripts/fetch.php +++ b/demo-web/public/scripts/fetch.php @@ -1,7 +1,7 @@ =8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } diff --git a/demo-web/public/scripts/import.php b/demo-web/public/scripts/import.php index 37596b620..5820d3e5f 100644 --- a/demo-web/public/scripts/import.php +++ b/demo-web/public/scripts/import.php @@ -1,7 +1,7 @@ =8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } diff --git a/demo-web/public/scripts/phpinfo.php b/demo-web/public/scripts/phpinfo.php index 4fa6fe317..83f26acb9 100644 --- a/demo-web/public/scripts/phpinfo.php +++ b/demo-web/public/scripts/phpinfo.php @@ -1,2 +1,2 @@ -=8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } diff --git a/demo-web/public/scripts/sdl-sine-bugged.php b/demo-web/public/scripts/sdl-sine-bugged.php index d5767598d..8f7a7e8df 100644 --- a/demo-web/public/scripts/sdl-sine-bugged.php +++ b/demo-web/public/scripts/sdl-sine-bugged.php @@ -10,7 +10,7 @@ if(!extension_loaded('vrzno')) { - printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP >=8.2."); + printf("The VRZNO extension is not loaded. VRZNO is required for this demo and requires PHP 8.0+."); exit(1); } @@ -54,4 +54,3 @@ $render(); - diff --git a/demo-web/public/scripts/sdl-sine.php b/demo-web/public/scripts/sdl-sine.php index f16ff1a80..f6626571e 100644 --- a/demo-web/public/scripts/sdl-sine.php +++ b/demo-web/public/scripts/sdl-sine.php @@ -1,4 +1,4 @@ -=8.2."); - exit(1); -} - ############ const WINDOW_WIDTH = 300; @@ -36,13 +30,14 @@ $j = 0; $render = function() use(&$render, $renderer, &$j, $window) { - SDL_SetRenderDrawColor($renderer, 100, 0, 0, 0); + SDL_SetRenderDrawColor($renderer, 255, 255, 255, 0); SDL_RenderClear($renderer); SDL_SetRenderDrawColor($renderer, 0, 0, 0, 255); for ($i = 0; $i < WINDOW_WIDTH; ++$i) { - SDL_RenderDrawPoint($renderer, $i, 75 + (int)( sin($j+$i/100) * 15 )); + $pos = 75 + (int)( sin($j+$i/100) * 15 ); + SDL_RenderDrawPoint($renderer, $i, $pos); $j += 0.00025; } @@ -52,5 +47,3 @@ phpinfo(); $render(); - - diff --git a/demo-web/public/scripts/sqlite-pdo.php b/demo-web/public/scripts/sqlite-pdo.php index 218ed0f0f..8e7be37b5 100644 --- a/demo-web/public/scripts/sqlite-pdo.php +++ b/demo-web/public/scripts/sqlite-pdo.php @@ -1,4 +1,4 @@ -query('CREATE TABLE IF NOT EXISTS people ( diff --git a/demo-web/scripts/build-worker.cjs b/demo-web/scripts/build-worker.cjs new file mode 100644 index 000000000..13445b7f1 --- /dev/null +++ b/demo-web/scripts/build-worker.cjs @@ -0,0 +1,19 @@ +/** + * Convenience wrapper that invokes the dedicated worker Vite build config. + */ +const path = require('node:path'); +const { spawnSync } = require('node:child_process'); + +const rootDir = path.resolve(__dirname, '..'); +const vitePackage = require.resolve('vite/package.json'); +const viteCli = path.resolve(path.dirname(vitePackage), 'bin', 'vite.js'); +const args = [viteCli, 'build', '--config', 'vite.worker.config.mjs', ...process.argv.slice(2)]; +const result = spawnSync(process.execPath, args, { + cwd: rootDir + , stdio: 'inherit' +}); + +if(result.status !== 0) +{ + process.exit(result.status ?? 1); +} diff --git a/demo-web/scripts/generate-html-aliases.cjs b/demo-web/scripts/generate-html-aliases.cjs new file mode 100644 index 000000000..a419f2d67 --- /dev/null +++ b/demo-web/scripts/generate-html-aliases.cjs @@ -0,0 +1,65 @@ +/** + * Post-build helper that fans the generated HTML entrypoint out to legacy aliases. + */ +const fs = require('node:fs/promises'); +const path = require('node:path'); + +const rootDir = path.resolve(__dirname, '..'); +const buildDir = path.join(rootDir, 'build'); +const indexHtml = path.join(buildDir, 'index.html'); +const nestedIndexHtml = path.join(buildDir, 'src', 'index.html'); +const asciiArt = path.join(rootDir, 'aphex.txt'); + +const aliases = [ + 'home.html' + , 'embedded-php.html' + , 'dbg-preview.html' + , 'cli-preview.html' + , 'install-demo.html' + , 'select-framework.html' + , 'code-editor.html' + , 'vscode.html' +]; + +/** + * Copies the generated entry HTML to every legacy route expected by the demo. + */ +async function main() { + let sourceIndexHtml = indexHtml; + + try + { + await fs.access(sourceIndexHtml); + } + catch + { + sourceIndexHtml = nestedIndexHtml; + } + + const [html, art] = await Promise.all([ + fs.readFile(sourceIndexHtml, 'utf8') + , fs.readFile(asciiArt, 'utf8') + ]); + + const htmlWithAscii = html.endsWith('\n') + ? `${html}${art}` + : `${html}\n${art}`; + + await fs.writeFile(indexHtml, htmlWithAscii); + + if(sourceIndexHtml === nestedIndexHtml) + { + await fs.rm(path.join(buildDir, 'src'), {recursive: true, force: true}); + } + + await Promise.all(aliases.map(alias => ( + fs.writeFile(path.join(buildDir, alias), htmlWithAscii) + ))); + + await fs.writeFile(path.join(buildDir, '404.html'), htmlWithAscii); +} + +main().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/demo-web/service-worker-dev.config.ts b/demo-web/service-worker-dev.config.ts deleted file mode 100644 index 56e555150..000000000 --- a/demo-web/service-worker-dev.config.ts +++ /dev/null @@ -1,41 +0,0 @@ -import path from 'path'; -import webpack from 'webpack'; -// in case you run into any typescript error when configuring `devServer` -import 'webpack-dev-server'; - -const config: webpack.Configuration = { - mode: 'development', - module: { - rules: [ - { - test: /\.mjs$/, - exclude: /node_modules/, - use: { loader: "babel-loader" } - }, - { - test: /\.(so|dat)$/, - type: 'asset/resource', - generator: { - filename: '[name].[contenthash][ext]' - }, - }, - ] - }, - entry: {'service-worker': './src/cgi-worker.mjs'}, - output: { - path: path.resolve(__dirname, 'public'), - filename: 'cgi-worker.js', - publicPath: '/', - }, - target: 'webworker', - devtool: 'source-map', - plugins: [ - new webpack.DefinePlugin({ - 'process.env': JSON.stringify({ - BUILD_TYPE: process.env.BUILD_TYPE ?? 'dynamic' - }) - }) - ], -}; - -export default config; diff --git a/demo-web/service-worker-prod.config.ts b/demo-web/service-worker-prod.config.ts deleted file mode 100644 index 1cdf0701f..000000000 --- a/demo-web/service-worker-prod.config.ts +++ /dev/null @@ -1,39 +0,0 @@ -import path from 'path'; -import webpack from 'webpack'; -// in case you run into any typescript error when configuring `devServer` -import 'webpack-dev-server'; - -const config: webpack.Configuration = { - mode: 'production', - module: { - rules: [ - { - test: /\.mjs$/, - exclude: /node_modules/, - use: { loader: "babel-loader" } - }, - { - test: /\.(so|dat)$/, - type: 'asset/resource', - generator: { - filename: '[name].[contenthash][ext]' - }, - }, - ] - }, - entry: {'service-worker': './src/cgi-worker.mjs'}, - output: { - path: path.resolve(__dirname, 'public'), - filename: 'cgi-worker.js', - }, - target: 'webworker', - plugins: [ - new webpack.DefinePlugin({ - 'process.env': JSON.stringify({ - BUILD_TYPE: process.env.BUILD_TYPE ?? 'dynamic' - }) - }) - ], -}; - -export default config; diff --git a/demo-web/src/App.js b/demo-web/src/App.js new file mode 100644 index 000000000..67d15641c --- /dev/null +++ b/demo-web/src/App.js @@ -0,0 +1,97 @@ +/** + * Top-level router composition for the demo-web application. + */ +import { Navigate, Route, Routes } from 'react-router'; +import { BrowserRouter } from 'react-router-dom'; + +import CliPreview from './pages/CliPreview'; +import DbgPreview from './pages/DbgPreview'; +import Editor from './pages/Editor'; +import Embedded from './pages/Embedded'; +import Home from './pages/Home'; +import InstallDemo from './pages/InstallDemo'; +import MultiIframeTest from './pages/MultiIframeTest'; +import SelectFramework from './pages/SelectFramework'; +import VSCodeEditor from './pages/VSCodeEditor'; +import { basePath, routerBase } from './lib/runtimePaths'; + +/** + * Declares the route table used by the demo application. + */ +export function AppRoutes() +{ + return + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } /> + } /> + ; +} + +/** + * Wraps the route table in the browser router configured for the demo base path. + */ +export default function App() +{ + return + + ; +} diff --git a/demo-web/src/App.test.js b/demo-web/src/App.test.js new file mode 100644 index 000000000..e50957b9d --- /dev/null +++ b/demo-web/src/App.test.js @@ -0,0 +1,67 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; + +vi.mock('./pages/CliPreview', () => ({ + default: () => React.createElement('div', null, 'CLI Preview') +})); + +vi.mock('./pages/DbgPreview', () => ({ + default: () => React.createElement('div', null, 'Debug Preview') +})); + +vi.mock('./pages/Editor', () => ({ + default: () => React.createElement('div', null, 'Code Editor') +})); + +vi.mock('./pages/Embedded', () => ({ + default: () => React.createElement('div', null, 'Embedded Demo') +})); + +vi.mock('./pages/Home', () => ({ + default: () => React.createElement('div', null, 'Home Page') +})); + +vi.mock('./pages/InstallDemo', () => ({ + default: () => React.createElement('div', null, 'Install Demo') +})); + +vi.mock('./pages/MultiIframeTest', () => ({ + default: () => React.createElement('div', null, 'Iframe Test') +})); + +vi.mock('./pages/SelectFramework', () => ({ + default: () => React.createElement('div', null, 'Select Framework') +})); + +vi.mock('./pages/VSCodeEditor', () => ({ + default: () => React.createElement('div', null, 'VSCode Editor') +})); + +import { AppRoutes } from './App'; + +describe('AppRoutes', () => { + it('renders the home page direct entry', () => { + render( + React.createElement( + MemoryRouter + , { initialEntries: ['/home.html'] } + , React.createElement(AppRoutes) + ) + ); + + expect(screen.getByText('Home Page')).toBeInTheDocument(); + }); + + it('redirects legacy CGI routes to the install flow', () => { + render( + React.createElement( + MemoryRouter + , { initialEntries: ['/cgi-bin/drupal'] } + , React.createElement(AppRoutes) + ) + ); + + expect(screen.getByText('Install Demo')).toBeInTheDocument(); + }); +}); diff --git a/demo-web/src/Debugger.js b/demo-web/src/Debugger.js deleted file mode 100644 index c3711d587..000000000 --- a/demo-web/src/Debugger.js +++ /dev/null @@ -1,364 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from 'react'; -import { PhpDbgWeb } from 'php-dbg-wasm/PhpDbgWeb'; -import { PGlite } from '@electric-sql/pglite'; - -import './dbg-preview.css'; -import loading from './loading.svg'; - -import Convert from 'ansi-to-html'; - -const parser = new Convert; - -const sharedLibs = [ -]; - -const buildType = process.env.REACT_APP_BUILD_TYPE ?? 'dynamic'; - -if(buildType === 'dynamic') -{ - sharedLibs.push(...(await Promise.all([ - import('php-wasm-libxml'), - import('php-wasm-dom'), - import('php-wasm-zlib'), - import('php-wasm-libzip'), - import('php-wasm-gd'), - import('php-wasm-iconv'), - import('php-wasm-intl'), - import('php-wasm-openssl'), - import('php-wasm-mbstring'), - import('php-wasm-sqlite'), - import('php-wasm-xml'), - import('php-wasm-simplexml'), - import('php-wasm-yaml'), - ])).map(m => m.default)); -} -else if(buildType === 'shared') -{ - sharedLibs.push( - // {name: 'libxml2.so', url: (new URL('php-wasm-libxml/libxml2.so', import.meta.url))}, - {name: 'libz.so', url: new URL('php-wasm-zlib/libz.so', import.meta.url)}, - {name: 'libzip.so', url: new URL('php-wasm-libzip/libzip.so', import.meta.url)}, - {name: 'libfreetype.so', url: new URL('php-wasm-gd/libfreetype.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('php-wasm-gd/libjpeg.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('php-wasm-gd/libwebp.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('php-wasm-gd/libpng.so', import.meta.url)}, - {name: 'libiconv.so', url: new URL('php-wasm-iconv/libiconv.so', import.meta.url)}, - {name: 'libicuuc.so', url: new URL('php-wasm-intl/libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('php-wasm-intl/libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('php-wasm-intl/libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('php-wasm-intl/libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('php-wasm-intl/libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('php-wasm-intl/libicudata.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('php-wasm-openssl/libcrypto.so', import.meta.url)}, - {name: 'libssl.so', url: new URL('php-wasm-openssl/libssl.so', import.meta.url)}, - {name: 'libonig.so', url: new URL('php-wasm-mbstring/libonig.so', import.meta.url)}, - {name: 'libsqlite3.so', url: new URL('php-wasm-sqlite/libsqlite3.so', import.meta.url)}, - {name: 'libtidy.so', url: new URL('php-wasm-tidy/libtidy.so', import.meta.url)}, - {name: 'libyaml.so', url: new URL('php-wasm-yaml/libyaml.so', import.meta.url)}, - ); -} -else -{ - sharedLibs.push( - {name: 'libcrypto.so', url: (new URL('php-wasm-openssl/libcrypto.so', import.meta.url))}, - {name: 'libssl.so', url: (new URL('php-wasm-openssl/libssl.so', import.meta.url))}, - ); -} - -const files = [ - { parent: '/preload/test_www/', name: 'hello-world.php', url: './scripts/hello-world.php' }, - { parent: '/preload/test_www/', name: 'phpinfo.php', url: './scripts/phpinfo.php' }, - { parent: '/preload/', name: 'list-extensions.php', url: './scripts/list-extensions.php' }, -]; - -const ini = ` - date.timezone=${Intl.DateTimeFormat().resolvedOptions().timeZone} - expose_php=0 -`; - -const escapeHtml = s => s - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); - -let lastCommand = null; - -export default forwardRef(function Debugger({ - file, setCurrentFile, setCurrentLine, setStatusMessage - , localEcho = true, initCommands = [], onStdIn -}, ref) { - const phpRef = useRef(null); - const cmdStack = useRef(['']); - const cmdStackIndex = useRef(0); - const terminal = useRef(''); - const stdIn = useRef(''); - const [prompt, setPrompt] = useState(parser.toHtml(escapeHtml('\x1b[1mprompt> '))); - const [ready, setReady] = useState(false); - const [output, setOutput] = useState([]); - const [exitCode, setExitCode] = useState(''); - const init = useRef(true); - - const query = useMemo(() => new URLSearchParams(window.location.search), []); - const [isIframe, setIsIframe] = useState(!!Number(query.get('iframed'))); - const startPath = file; - - useImperativeHandle(ref, () => ({ - setBreakpoint (file, line) { runCommand(null, `b ${file}:${line}`, true); }, - clearBreakpoint (id) { runCommand(null, `b ~ ${id}`, true); }, - bpCount() { return phpRef.current.bpCount(); }, - run() { runCommand(null, `run`, true); }, - step() { runCommand(null, `step`, true); }, - continue() { runCommand(null, `continue`, true); }, - until() { runCommand(null, `until`, true); }, - next() { runCommand(null, `next`, true); }, - finish() { runCommand(null, `finish`, true); }, - leave() { runCommand(null, `leave`, true); }, - })); - - let timeout = null; - - const scrollToEnd = () => { - if(!stdIn.current) - { - return; - } - - if(timeout) - { - clearTimeout(timeout); - } - - timeout = setTimeout(() => stdIn.current.scrollIntoView({ - behavior: 'smooth' - }), 32); - }; - - const onOutput = async event => { - const newOutput = event.detail.map(text => text - .replace('\n', '\u240A\n') - .replace('\r', '\u240D')); - - const ansi = newOutput.map(line => { - return { type: 'stdout', text: parser.toHtml(escapeHtml(line)) } - // return { type: 'stdout', text: escapeHtml(line) } - }); - - setOutput(output => [...output, ...ansi]); - scrollToEnd(); - }; - - const onError = async event => { - const newOutput = event.detail.map(text => text - .replace('\n', '\u240A\n') - .replace('\r', '\u240D')); - - const ansi = newOutput.map(line => { - return { type: 'stderr', text: parser.toHtml(escapeHtml(line)) } - // return { type: 'stderr', text: escapeHtml(line) } - }); - - setOutput(output => [...output, ...ansi]); - scrollToEnd(); - }; - - const refreshPhp = useCallback(init => { - setStatusMessage && setStatusMessage('loading...'); - phpRef.current = new PhpDbgWeb({ - version: '8.3', - sharedLibs, - files, - ini, - PGlite, - persist: [{mountPath:'/persist'}, {mountPath:'/config'}] - }); - - const php = phpRef.current; - - php.addEventListener('output', onOutput); - php.addEventListener('error', onError); - - const firstInput = async () => { - - if(init && startPath) - { - setReady(false); - await runCommand(null, `exec ${startPath}`); - } - - await Promise.all( initCommands.map(async cmd => runCommand(null, cmd, true)) ); - - await runCommand(null, 'set pagination off', true); - - setStatusMessage && setStatusMessage('php-dbg-wasm ready!'); - setReady(true); - await new Promise(a => setTimeout(a, 10)); - focusInput(); - } - - const onStdInHandler = async event => { - setCurrentFile && setCurrentFile( await php.currentFile() ); - setCurrentLine && setCurrentLine( await php.currentLine() ); - setPrompt( parser.toHtml(escapeHtml(await php.getPrompt())) ); - onStdIn && onStdIn(event); - }; - - const once = {once: true}; - - php.addEventListener('stdin-request', onStdInHandler); - php.addEventListener('stdin-request', firstInput, once); - - php.run(); - - return () => { - php.removeEventListener('output', onOutput); - php.removeEventListener('error', onError); - php.removeEventListener('stdin-request', onStdInHandler); - php.removeEventListener('stdin-request', firstInput, once); - }; - }, []); - - useEffect(() => { - if(init.current) - { - refreshPhp(init.current); - init.current = false; - } - }, [refreshPhp, init]); - - const checkEnter = async event => { - if(event.key === 'ArrowUp') - { - event.preventDefault(); - - if(event.target.selectionStart > 0) - { - event.target.selectionStart = 0; - event.target.selectionEnd = 0; - return; - } - - cmdStackIndex.current--; - if(cmdStackIndex.current < 0) - { - cmdStackIndex.current = cmdStack.current.length - 1; - } - - stdIn.current.value = cmdStack.current[cmdStackIndex.current]; - - event.target.selectionStart = 0; - event.target.selectionEnd = 0; - - return; - } - - if(event.key === 'ArrowDown') - { - event.preventDefault(); - - const end = event.target.value.length; - - if(event.target.selectionStart < end) - { - event.target.selectionStart = end; - event.target.selectionEnd = end; - return; - } - - stdIn.current.value = cmdStack.current[cmdStackIndex.current]; - - cmdStackIndex.current++; - if(cmdStackIndex.current >= cmdStack.current.length) - { - cmdStackIndex.current = 0; - } - - return; - } - - if(event.key === 'Enter') - { - cmdStackIndex.current = 0; - await runCommand(); - event.preventDefault(); - return; - } - }; - - const runCommand = async (event, command = null, silent = false) => { - - const inputValue = command || stdIn.current.value || ''; - - if(!phpRef.current) - { - return; - } - - if(command === null) - { - stdIn.current.value = ''; - } - - if(localEcho && !silent) - { - inputValue && cmdStack.current.push(inputValue); - setOutput(output => [...output, {text: `${prompt}${inputValue}`, type: 'stdin'}]); - scrollToEnd(); - } - - const php = phpRef.current; - - await php.provideInput(inputValue); - - lastCommand = inputValue || lastCommand; - setExitCode(exitCode); - - stdIn.current && stdIn.current.focus(); - } - - const focusInput = event => { - if(window.getSelection().toString() !== '') - { - return; - } - - if(!phpRef.current.interactive) - { - scrollToEnd(); - return; - } - if(window.getSelection().toString() === '') - { - stdIn.current && stdIn.current.focus(); - } - }; - - const handleTerminalClicked = () => { - - if(!phpRef.current.interactive) - { - return; - } - - focusInput(); - }; - - const handleScrollToBottom = () => { - scrollToEnd(); - }; - - return (
-
🡇
-
- ⚠️ This is in VERY early alpha! ⚠️ - {output.map((line, index) => (
))} -
- {!ready && ()} - - - -
-
-
); -}); diff --git a/demo-web/src/Editor.js b/demo-web/src/Editor.js deleted file mode 100644 index 45bafe7f1..000000000 --- a/demo-web/src/Editor.js +++ /dev/null @@ -1,434 +0,0 @@ -import './Common.css'; -import './Editor.css'; - -import { useEffect, useMemo, useRef, useState } from 'react'; - -import { sendMessageFor } from 'php-cgi-wasm/msg-bus'; -import EditorFolder from './EditorFolder'; -import Header from './Header'; - -import ace from 'ace-builds'; -import AceEditor from "react-ace-builds"; -import { Range } from "ace-builds"; -import "react-ace-builds/webpack-resolver-min"; -import { createRoot } from 'react-dom/client'; - -import reactIcon from './react-icon.svg'; -import redCircle from './circle-red.svg'; -import toggleIcon from './nuvola/view_choose.png'; -import saveIcon from './nuvola/3floppy_unmount.png'; -import vsCodeIcon from './icons/vscode-16.png'; - -import Debugger from './Debugger'; - -// const sendMessage = sendMessageFor((`${window.location.origin}${process.env.PUBLIC_URL}/cgi-worker.mjs`)); -const sendMessage = sendMessageFor(navigator.serviceWorker.controller); - -const openFilesMap = new Map(); -const sessionsMap = new WeakMap; - -const modes = { - 'php': 'ace/mode/php' - , 'phtml': 'ace/mode/php' - , 'module': 'ace/mode/php' - , 'inc': 'ace/mode/php' - , 'js': 'ace/mode/javascript' - , 'json': 'ace/mode/json' - , 'html': 'ace/mode/html' - , 'css': 'ace/mode/css' - , 'md': 'ace/mode/markdown' - , 'mjs': 'ace/mode/javascript' - , 'txt': 'ace/mode/text' - , 'xml': 'ace/mode/xml' - , 'yml': 'ace/mode/yaml' - , 'yaml': 'ace/mode/yaml' -}; - -const breakpoints = new Map; - -export default function Editor() { - const [contents, setContents] = useState('...'); - const [openFiles, setOpenFiles] = useState([]); - const [showLeft, setShowLeft] = useState([]); - const [phpdbg, setPhpDbg] = useState(false); - - const activeLines = useRef(new Set); - const currentBreak = useRef({}); - const currentPath = useRef(null); - const editBox = useRef(null); - const aceRef = useRef(null); - const tabBox = useRef(null); - const openDbg = useRef(null); - - const query = useMemo(() => new URLSearchParams(window.location.search), []); - - const handleSave = async () => { - if(currentPath.current) - { - const entry = openFilesMap.get(currentPath.current); - entry.dirty = false; - - sendMessage('writeFile', [ - currentPath.current - , new TextEncoder().encode(aceRef.current.editor.getValue()) - ]); - - const openFilesList = [...openFilesMap.entries()].map(e => e[1]); - setOpenFiles(openFilesList); - } - }; - - const handleOpenVsCode = async () => { - if(currentPath.current) - { - window.location.href = process.env.PUBLIC_URL + '/vscode.html?path=' + currentPath.current; - } - else - { - window.location.href = process.env.PUBLIC_URL + '/vscode.html'; - } - }; - - const onKeyDown = event => { - if(event.key === 's' && event.ctrlKey) - { - event.preventDefault(); - handleSave(); - return; - } - }; - - const toggleLeftBar = () => { - setShowLeft(!showLeft); - }; - - useEffect(() => { - if(!editBox.current) - { - editBox.current = document.getElementById('edit-root'); - const editRoot = createRoot(editBox.current); - - editRoot.render( - - ); - } - - window.addEventListener('keydown', onKeyDown); - window.addEventListener('editor-open-file', handleOpenFile); - return () => { - window.removeEventListener('editor-open-file', handleOpenFile); - window.removeEventListener('keydown', onKeyDown); - } - }, []); - - const closeFile = async path => { - const entry = openFilesMap.get(path); - - openFilesMap.delete(path); - - if(entry.active) - { - if(openFilesMap.size) - { - const first = [...openFilesMap.entries()][0][1]; - first.active = true; - currentPath.current = first.path; - aceRef.current.editor.setSession(first.session); - } - else - { - currentPath.current = null; - aceRef.current.editor.setSession(ace.createEditSession('', 'ace/mode/text')); - aceRef.current.editor.setReadOnly(true); - } - } - - const openFilesList = [...openFilesMap.entries()].map(e => e[1]); - setOpenFiles(openFilesList); - }; - - const openFile = async path => { - const editor = aceRef.current.editor; - - const name = path.split('/').pop(); - const newFile = openFilesMap.has(path) - ? openFilesMap.get(path) - : {name, path}; - - query.set('path', path); - - if(!openDbg.current) - { - window.history.replaceState({}, null, window.location.pathname + '?' + query); - } - - currentPath.current = path; - - editor.setReadOnly(!!openDbg.current); - - if(!newFile.session) - { - openFilesMap.set(path, newFile); - } - - const openFilesList = [...openFilesMap.entries()].map(e => e[1]); - openFilesList.map(f => f.active = false); - newFile.active = true; - setOpenFiles(openFilesList); - - if(newFile.loading) - { - editor.setSession(await newFile.loading); - return; - } - - let _accept; - newFile.loading = new Promise(accept => _accept = accept); - - const extension = path.split('.').pop(); - const mode = modes[extension] ?? 'ace/mode/text'; - - const code = new TextDecoder().decode( - await sendMessage('readFile', [path]) - ); - - newFile.session = ace.createEditSession(code, mode); - sessionsMap.set(newFile.session, newFile); - editor.setSession(newFile.session); - setContents(code); - - _accept(newFile.session); - - newFile.dirty = false; - - newFile.session.on('change', () => { - newFile.dirty = true; - const openFilesList = [...openFilesMap.entries()].map(e => e[1]); - setOpenFiles(openFilesList); - }); - - // editor.setOption("firstLineNumber", 0); - - tabBox.current.scrollTo({left:-tabBox.current.scrollWidth, behavior: 'smooth'}); - }; - - useEffect(() => { - if(aceRef.current) - { - const onGutter = async event => { - - const editor = aceRef.current.editor; - console.log(event); - - const session = editor.getSession(); - - if(!sessionsMap.has(session)) - { - console.trace('Unmapped session!'); - return; - } - - const {path} = sessionsMap.get(session); - - const target = event.domEvent.target; - - if(target.className.indexOf("ace_gutter-cell") == -1) - { - return; - } - - if(event.clientX > 28 + target.getBoundingClientRect().left) - { - return; - } - - const line = event.getDocumentPosition().row; - // const existing = event.editor.session.getBreakpoints(line, 0); - - if(!breakpoints.has(`${path}:${1 + line}`)) - { - event.editor.session.setBreakpoint(line); - - let id = breakpoints.size; - - if(openDbg.current) - { - openDbg.current.setBreakpoint(path, 1 + line); - id = await openDbg.current.bpCount(); - } - - breakpoints.set(`${path}:${1 + line}`, id); - } - else - { - const id = breakpoints.get(`${path}:${1 + line}`); - - event.editor.session.clearBreakpoint(line); - - if(openDbg.current) - { - openDbg.current.clearBreakpoint(id); - } - - breakpoints.delete(`${path}:${1 + line}`); - } - - console.log(breakpoints); - - event.stop(); - }; - - aceRef.current.editor.on('guttermousedown', onGutter); - - return () => { - aceRef.current.editor.session.off('off', onGutter); - }; - } - }, [aceRef.current]); - - const handleOpenFile = event => openFile(event.detail); - - const startDebugger = () => { - - const editor = aceRef.current.editor; - - if(openDbg.current) - { - activeLines.current.forEach(m => editor.session.removeMarker(m)); - openDbg.current = null; - editor.setReadOnly(false); - setPhpDbg(openDbg.current); - return; - } - - editor.setReadOnly(true); - - openDbg.current = `b ${bp}`), 'run']} - setCurrentFile = {file => currentBreak.current.file = file} - setCurrentLine = {line => currentBreak.current.line = line} - onStdIn = {async () => { - const file = currentBreak.current.file; - const line = currentBreak.current.line; - - activeLines.current.forEach(m => editor.session.removeMarker(m)); - - if(file && line) - { - await openFile(file); - - const marker = editor.session.addMarker( - new Range(-1 + line, 0, -1 + line, Infinity), 'active_breakpoint', 'fullLine', true - ); - - editor.scrollToLine(-1 + line, true, true, () => {}); - - activeLines.current.add(marker); - } - }} - />; - - setPhpDbg(openDbg.current); - }; - - const handleStartDebugger = event => startDebugger(); - const handleRun = event => openDbg.current.run(); - const handleStep = event => openDbg.current.step(); - const handleContinue = event => openDbg.current.continue(); - const handleUntil = event => openDbg.current.until(); - const handleNext = event => openDbg.current.next(); - const handleFinish = event => openDbg.current.finish(); - const handleLeave = event => openDbg.current.leave(); - - return ( -
-
-
-
- - - - {!phpdbg ? ( - - ) : ( - - - - - - - - - - )} -
-
-
-
- -
-
-
-
-
-
- {openFiles.map(file => -
-
openFile(file.path)}> - {file.name} {file.dirty ? '!' : ''} -
-
closeFile(file.path)}>×
-
- )} -
-
-
-
-
{contents}
-
-
-
- {phpdbg && ( -
{phpdbg}
- )} -
-
-
- Demo powered by React -
-
-
- ); -} diff --git a/demo-web/src/Embedded.js b/demo-web/src/Embedded.js deleted file mode 100644 index 78997f470..000000000 --- a/demo-web/src/Embedded.js +++ /dev/null @@ -1,606 +0,0 @@ -import './Embedded.css'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import AceEditor from "react-ace-builds"; -import "react-ace-builds/webpack-resolver-min"; - -import { PGlite } from '@electric-sql/pglite'; - -import { PhpWeb } from 'php-wasm/PhpWeb'; -import { createRoot } from 'react-dom/client'; -import Confirm from './Confirm'; - -// import yaml from 'php-wasm-yaml'; -import sdl from 'php-wasm-sdl'; - -const sharedLibs = []; - -const buildType = process.env.REACT_APP_BUILD_TYPE ?? 'dynamic'; - -const files = [ - { parent: '/preload/test_www/', name: 'hello-world.php', url: './scripts/hello-world.php' }, - { parent: '/preload/test_www/', name: 'phpinfo.php', url: './scripts/phpinfo.php' }, - { parent: '/preload/', name: 'list-extensions.php', url: './scripts/list-extensions.php' }, -]; - -if(buildType === 'dynamic') -{ - sharedLibs.push(...(await Promise.all([ - import('php-wasm-libxml'), - import('php-wasm-dom'), - import('php-wasm-xml'), - import('php-wasm-simplexml'), - import('php-wasm-zlib'), - import('php-wasm-libzip'), - import('php-wasm-gd'), - import('php-wasm-iconv'), - import('php-wasm-intl'), - import('php-wasm-openssl'), - import('php-wasm-mbstring'), - import('php-wasm-sqlite'), - ])).map(m => m.default)); -} -else if(buildType === 'shared') -{ - // files.push( - // { parent: '/preload/', name: 'icudt72l.dat', url: new URL('php-wasm-intl/icudt72l.dat', import.meta.url) } - // ); - - sharedLibs.push( - {name: 'libxml2.so', url: new URL('php-wasm-libxml/libxml2.so', import.meta.url)}, - {name: 'libz.so', url: new URL('php-wasm-zlib/libz.so', import.meta.url)}, - {name: 'libzip.so', url: new URL('php-wasm-libzip/libzip.so', import.meta.url)}, - {name: 'libfreetype.so', url: new URL('php-wasm-gd/libfreetype.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('php-wasm-gd/libjpeg.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('php-wasm-gd/libwebp.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('php-wasm-gd/libpng.so', import.meta.url)}, - {name: 'libiconv.so', url: new URL('php-wasm-iconv/libiconv.so', import.meta.url)}, - {name: 'libicuuc.so', url: new URL('php-wasm-intl/libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('php-wasm-intl/libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('php-wasm-intl/libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('php-wasm-intl/libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('php-wasm-intl/libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('php-wasm-intl/libicudata.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('php-wasm-openssl/libcrypto.so', import.meta.url)}, - {name: 'libssl.so', url: new URL('php-wasm-openssl/libssl.so', import.meta.url)}, - {name: 'libonig.so', url: new URL('php-wasm-mbstring/libonig.so', import.meta.url)}, - {name: 'libsqlite3.so', url: new URL('php-wasm-sqlite/libsqlite3.so', import.meta.url)}, - {name: 'libtidy.so', url: new URL('php-wasm-tidy/libtidy.so', import.meta.url)}, - {name: 'libyaml.so', url: new URL('php-wasm-yaml/libyaml.so', import.meta.url)}, - ); -} -else -{ - sharedLibs.push( - {name: 'libcrypto.so', url: (new URL('php-wasm-openssl/libcrypto.so', import.meta.url))}, - {name: 'libssl.so', url: (new URL('php-wasm-openssl/libssl.so', import.meta.url))}, - ); -} - -const dynamicLibs = [ - await import('php-wasm-yaml') -]; - -const ini = ` -date.timezone=${Intl.DateTimeFormat().resolvedOptions().timeZone} -expose_php=0 -display_errors = Off -display_startup_errors = Off - -log_errors = On -error_log = /dev/stderr -`; - -function Embedded() { - const init = useRef(false); - const phpRef = useRef(null); - const inputBox = useRef(null); - const selectDemoBox = useRef(null); - const selectVersionBox = useRef(null); - const selectVariantBox = useRef(null); - const htmlRadio = useRef(null); - const textRadio = useRef(null); - const editor = useRef(null); - const input = useRef(''); - const persist = useRef(''); - const single = useRef(''); - const canvasCheckbox = useRef(''); - const canvas = useRef(null); - // const stdin = useRef(''); - - const query = useMemo(() => new URLSearchParams(window.location.search), []); - - const [exitCode, setExitCode] = useState(''); - const [stdOut, setStdOut] = useState(''); - const [stdErr, setStdErr] = useState(''); - const [stdRet, setStdRet] = useState(''); - const [overlay, setOverlay] = useState(null); - const [isIframe, setIsIframe] = useState(!!Number(query.get('iframed'))); - const [showCanvas, setShowCanvas] = useState(true); - - const [running, setRunning] = useState(false); - const [displayMode, setDisplayMode] = useState(''); - const [outputMode, setOutputMode] = useState(''); - const [statusMessage, setStatusMessage] = useState('php-wasm'); - - const onOutput = event => setStdOut(stdOut => String(stdOut || '') + event.detail.join('')); - const onError = event => setStdErr(stdErr => String(stdErr || '') + event.detail.join('')); - - const refreshPhp = useCallback(() => { - const version = (selectVersionBox.current ? selectVersionBox.current.value : '8.4') ?? '8.4'; - const variant = (selectVariantBox.current ? selectVariantBox.current.value : '') ?? ''; - - const _sharedLibs = [...sharedLibs]; - - if(variant === '_sdl' && buildType === 'dynamic') - { - _sharedLibs.push(sdl); - } - - phpRef.current = new PhpWeb({ - version, - variant, - sharedLibs: _sharedLibs, - dynamicLibs, - files, - ini, - PGlite, - persist: [{mountPath:'/persist'}, {mountPath:'/config'}], - canvas: canvas.current, - }); - - const php = phpRef.current; - - php.addEventListener('output', onOutput); - php.addEventListener('error', onError); - - return () => { - php.removeEventListener('output', onOutput); - php.removeEventListener('error', onError); - }; - }, []); - - useEffect(() => { - persist.current.checked = !!Number(query.get('persist')) ?? ''; - single.current.checked = !!Number(query.get('single-expression')) ?? ''; - selectVersionBox.current.value = query.get('version') ?? '8.4'; - selectVariantBox.current.value = query.get('variant') ?? ''; - - if(!init.current && !query.has('demo')) - { - refreshPhp(); - } - init.current = true; - }, [refreshPhp]); - - const singleChanged = () => setOutputMode(single.current.checked ? 'single' : 'normal'); - const canvasChanged = () => setShowCanvas(canvasCheckbox.current.checked); - const formatSelected = event => setDisplayMode(event.target.value); - const codeChanged = newValue => input.current = newValue; - - const refreshMem = useCallback(async () => { - await phpRef.current.refresh(); - }); - - const runCode = useCallback(async () => { - setRunning(true); - - setStatusMessage('Executing...'); - - if(!persist.current.checked) - { - setStdOut(''); - setStdErr(''); - } - - setStdRet(''); - - let code = editor.current.editor.getValue(); - - const version = selectVersionBox.current?.value; - const variant = selectVariantBox.current?.value; - - code = code.replace(/^<\?php \/\/.+\n/, `\s*/, ''); - - try - { - const ret = await phpRef.current.exec(code); - setStdRet(ret); - if(!persist.current.checked) - { - await phpRef.current.refresh(); - } - } - catch(error) - { - console.error(error); - } - finally - { - setStatusMessage('php-wasm ready!') - setRunning(false); - } - } - else - { - try - { - const exitCode = await phpRef.current.run(code); - setExitCode(exitCode); - if(!persist.current.checked) - { - await phpRef.current.refresh(); - } - } - catch(error) - { - console.error(error) - } - finally - { - setStatusMessage('php-wasm ready!') - setRunning(false); - } - } - }, [query]); - - const loadDemo = useCallback(demoName => { - - if(!demoName) - { - return; - } - - if(demoName === 'drupal.php') - { - setOverlay( window.location = process.env.PUBLIC_URL + '/select-framework.html' } - onCancel = { () => setOverlay(null) } - message = {( - The Drupal demo has been moved into the php-cgi-wasm demo. Would you like to go there now? - )} - />); - return; - } - - setRunning(true); - - setStdOut(''); - setStdErr(''); - setStdRet(''); - - fetch(process.env.PUBLIC_URL + '/scripts/' + demoName) - .then(response => response.text()) - .then(async phpCode => { - editor.current.editor.setValue(phpCode, -1); - - document.querySelector('#example').innerHTML = ''; - const firstLine = String(phpCode.split(/\n/).shift()); - const settings = JSON.parse(firstLine.split('//').pop()) || {}; - - persist.current.checked = settings.persist ?? persist.current.checked; - single.current.checked = settings['single-expression'] ?? single.current.checked; - canvasCheckbox.current.checked = settings['canvas'] ?? false; - selectVersionBox.current.value = settings['version'] ?? selectVersionBox.current.value ?? '8.4'; - selectVariantBox.current.value = settings['variant'] ?? selectVariantBox.current.value ?? ''; - - if(settings['render-as']) - { - setDisplayMode(settings['render-as']); - htmlRadio.current.checked = settings['render-as'] === 'html'; - textRadio.current.checked = settings['render-as'] !== 'html'; - } - - query.set('persist', persist.current.checked ? 1 : 0); - query.set('single-expression', single.current.checked ? 1 : 0); - - if(phpCode.length < 1024) - { - query.set('code', encodeURIComponent(phpCode)); - } - - window.history.replaceState({}, document.title, "?" + query.toString()); - - refreshPhp(); - - if(settings.autorun) - { - setStatusMessage('Executing...'); - runCode(); - } - - setShowCanvas(canvasCheckbox.current.checked); - setOutputMode(single.current.checked ? 'single' : 'normal'); - }); - }, [query, refreshPhp, runCode]); - - useEffect(() => { - if(inputBox.current) - { - return; - } - - inputBox.current = document.getElementById('input-box'); - - const inputRoot = createRoot(inputBox.current); - const queryCode = query.get('code') || ''; - - const decodedCode = decodeURIComponent(queryCode); - - input.current = decodedCode; - inputRoot.render( - - ); - const firstLine = String(decodedCode.split(/\n/).shift()); - const settings = {}; - - try - { - Object.assign(settings, JSON.parse(firstLine.split('//').pop())); - } - catch - {} - - persist.current.checked = settings.persist ?? persist.current.checked; - single.current.checked = settings['single-expression'] ?? single.current.checked; - canvasCheckbox.current.checked = settings['canvas'] ?? canvasCheckbox.current.checked; - - setOutputMode(single.current.checked ? 'single' : 'normal'); - setShowCanvas(canvasCheckbox.current.checked); - - if(settings['render-as']) - { - setDisplayMode(settings['render-as']); - - htmlRadio.current.checked = settings['render-as'] === 'html'; - textRadio.current.checked = settings['render-as'] !== 'html'; - } - - if(editor.current && query.has('code')) - { - editor.current.editor.setValue(query.has('code'), -1); - } - else if(query.has('demo')) - { - const demoName = query.get('demo'); - selectDemoBox.current.value = demoName; - loadDemo(demoName); - query.delete('demo'); - } - - if(settings.autorun) - { - setTimeout(runCode, 1); - } - - }, [query, loadDemo, runCode]); - - const demoSelected = () => loadDemo(selectDemoBox.current.value); - - const onKeyDown = event => { - if(event.key === 'Enter' && event.ctrlKey) - { - runCode(); - return; - } - }; - - useEffect(() => { - - window.addEventListener('keydown', onKeyDown); - return () => { - window.removeEventListener('keydown', onKeyDown); - } - }, []); - - const openFile = async event => { - const file = event.target.files[0]; - editor.current.editor.setValue(await file.text(), -1);; - }; - - const topBar = (
-
-
- {isIframe || - - sean - -

php-wasm

-
-
} - - - - -
-
-
-
-
-
- - -
-   -
- - - -
- - -
-
); - - const statusBar = (
-
-
- {statusMessage} -
-
-
-
-
); - - return (
-
- {topBar} -
-
-
-
- - -
-
-
-
- -
-
-
-
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
- -
{stdRet}
-
-
-
-
-
- - -
-
-
- -
{stdOut}
-
-
-
-
-
- -
-
-
- -
{stdErr}
-
-
-
-
-
- {statusBar} -
-
{overlay}
-
- ); -} - -export default Embedded; diff --git a/demo-web/src/Header.js b/demo-web/src/Header.js deleted file mode 100644 index 271625fc2..000000000 --- a/demo-web/src/Header.js +++ /dev/null @@ -1,15 +0,0 @@ -export default function Header() { - return (
-
-
- - sean - -

php-wasm

-
-
-
-
-
-
); -}; diff --git a/demo-web/src/InstallDemo.js b/demo-web/src/InstallDemo.js deleted file mode 100644 index 79774710b..000000000 --- a/demo-web/src/InstallDemo.js +++ /dev/null @@ -1,199 +0,0 @@ -import { useEffect, useMemo, useState } from 'react'; -import { sendMessageFor } from 'php-cgi-wasm/msg-bus'; -import Terminal from './Terminal'; -import loader from './tail-spin.svg'; - -// import zlib from 'php-wasm-zlib'; -// import libzip from 'php-wasm-libzip'; - -import './Common.css'; -import './InstallDemo.css'; - -const packages = { - 'drupal-7': { - name: 'Drupal 7', - //*/ - file: '/backups/drupal-7.95.zip', - /*/ - file: '/backups/drupal-7.95-pgsql.zip', - sql: '/backups/drupal-7.95.sql', - //*/ - path: 'drupal-7.95', - vHost: 'drupal', - dir: 'drupal-7.95', - entry: 'index.php', - }, - 'cakephp-5': { - name: 'CakePHP 5', - file: '/backups/cakephp-5.zip', - path: 'cakephp-5', - vHost: 'cakephp-5', - dir: 'cakephp-5/webroot', - entry: 'index.php', - }, - 'codeigniter-4': { - name: 'CodeIgniter 4', - file: '/backups/codeigniter-4.zip', - path: 'codeigniter-4', - vHost: 'codeigniter-4', - dir: 'codeigniter-4/public', - entry: 'index.php', - }, - 'laminas-3': { - name: 'Laminas 3', - file: '/backups/laminas-3.zip', - path: 'laminas-3', - vHost: 'laminas-3', - dir: 'laminas-3/public', - entry: 'index.php', - }, - 'laravel-11': { - name: 'Laravel 11', - file: '/backups/laravel-11.zip', - path: 'laravel-11', - vHost: 'laravel-11', - dir: 'laravel-11/public', - entry: 'index.php', - } -}; - -const informOpener = (selectedFrameworkName) => { - window.opener && window.opener.dispatchEvent( - new CustomEvent('install-complete', {detail: selectedFrameworkName}) - ); -}; - -export default function InstallDemo() { - const query = useMemo(() => new URLSearchParams(window.location.search), []); - const [message, setMessage] = useState('Initializing...'); - const [terminal, setTerminal] = useState(''); - - useEffect(() => void (async()=>{ - await navigator.serviceWorker.register(process.env.PUBLIC_URL + `/cgi-worker.js`); - await navigator.serviceWorker.getRegistration(`${window.location.origin}${process.env.PUBLIC_URL}/cgi-worker.mjs`); - - if(!(navigator.serviceWorker && navigator.serviceWorker.controller)) - { - setMessage('No Service Worker Detected, Reloading...'); - await new Promise(a => setTimeout(a, 500)); - window.location.reload(); - return; - } - - const selectedFrameworkName = query.get('framework'); - const overwrite = query.get('overwrite') ?? false; - - if(!selectedFrameworkName) - { - setMessage('No framework selected.'); - return; - } - - if(!(selectedFrameworkName in packages)) - { - setMessage('Invalid framework selected.'); - return; - } - - const selectedFramework = packages[selectedFrameworkName]; - - setMessage('Downloading init script...'); - const initPhpCode = await (await fetch(process.env.PUBLIC_URL + '/scripts/init.php')).text(); - - setMessage('Acquiring Lock...'); - await navigator.locks.request('php-wasm-demo-install', async () => { - - setMessage('Checking for Existing Install...'); - const sendMessage = sendMessageFor(navigator.serviceWorker.controller); - const checkPath = await sendMessage('analyzePath', ['/persist/' + selectedFramework.dir]); - - if(!overwrite && checkPath.exists) - { - setMessage('Already installed...'); - informOpener(selectedFrameworkName); - window.location = '/php-wasm/cgi-bin/' + selectedFramework.vHost; - return; - } - - setMessage(`Downloading ${selectedFramework.file}...`); - const zipContents = await (await fetch(process.env.PUBLIC_URL + selectedFramework.file)).arrayBuffer(); - await sendMessage('writeFile', ['/persist/restore.zip', new Uint8Array(zipContents)]); - await sendMessage('writeFile', ['/config/restore-path.tmp', '/persist/' + selectedFramework.path]); - - setMessage(`Setting up ${selectedFrameworkName}...`); - const settings = await sendMessage('getSettings'); - const vHostPrefix = '/php-wasm/cgi-bin/' + selectedFramework.vHost; - const existingvHost = settings.vHosts.find(vHost => vHost.pathPrefix === vHostPrefix); - - if(!existingvHost) - { - settings.vHosts.push({ - pathPrefix: vHostPrefix, - directory: '/persist/' + selectedFramework.dir, - entrypoint: selectedFramework.entry - }); - } - else - { - existingvHost.directory = '/persist/' + selectedFramework.dir; - existingvHost.entrypoint = selectedFramework.entry; - } - - await sendMessage('setSettings', [settings]); - await sendMessage('storeInit'); - - setMessage(`Unpacking ${selectedFramework.file}...`); - - const onComplete = async (exitCode) => { - if(exitCode !== 0) return; - if(selectedFramework.sql) - { - setMessage('Setting up PostgreSQL...'); - const sqlFile = await (await fetch(selectedFramework.sql)).text(); - await sendMessage('execSql', [`idb://host= dbname=drupal port=5432`, sqlFile]); - await sendMessage('runSql', [`idb://host= dbname=drupal port=5432`, 'select * from information_schema.tables']); - } - - setMessage('Refreshing PHP-CGI...'); - await sendMessage('refresh', []); - - setMessage(`Opening ${selectedFrameworkName}...`); - informOpener(selectedFrameworkName); - window.location = vHostPrefix; - }; - - setTerminal( -
- ' + initPhpCode} - /> -
- ); - }); - })(), [query]); - - return ( -
-
-
-

{message}

- {terminal} - loading spinner -
-
-
- ); -} diff --git a/demo-web/src/MultiIframeTest.js b/demo-web/src/MultiIframeTest.js deleted file mode 100644 index 444d945e1..000000000 --- a/demo-web/src/MultiIframeTest.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -const FRAME_COUNT = 120; - -export default function MultiIframeTest() { - const frames = Array.from({ length: FRAME_COUNT }, (_, i) => i + 1); - return ( -
-

Multi‑Iframe PHP CGI Test

-

- This test mounts {FRAME_COUNT} simultaneous iframes pointing at a simple PHP page - served by the CGI service worker. -

-
- {frames.map(i => ( - +
{stdRet}
+
+
+ +
+
+ + +
+
+
+ +
{stdOut}
+
+
+
+
+
+ +
+
+
+ +
{stdErr}
+
+
+
+ + + {statusBar} + +
{overlay}
+ + ); +} + +export default Embedded; diff --git a/demo-web/src/pages/Embedded.test.js b/demo-web/src/pages/Embedded.test.js new file mode 100644 index 000000000..43157a13f --- /dev/null +++ b/demo-web/src/pages/Embedded.test.js @@ -0,0 +1,148 @@ +import React from 'react'; +import { fireEvent, render, waitFor } from '@testing-library/react'; + +const { + editor + , phpExec + , phpRefresh + , phpRun + , PhpWeb +} = vi.hoisted(() => { + const editor = { + getValue: vi.fn(() => '') + }; + + const phpRun = vi.fn(async () => 0); + const phpExec = vi.fn(async () => ''); + const phpRefresh = vi.fn(async () => undefined); + + const phpInstance = { + addEventListener: vi.fn() + , removeEventListener: vi.fn() + , exec: phpExec + , refresh: phpRefresh + , run: phpRun + }; + + const PhpWeb = vi.fn(function PhpWebMock() { + return phpInstance; + }); + + return { + editor + , phpExec + , phpRefresh + , phpRun + , PhpWeb + }; +}); + +vi.mock('php-wasm/PhpWeb', () => ({PhpWeb})); + +vi.mock('@electric-sql/pglite', () => ({ + PGlite: class PGliteMock {} +})); + +vi.mock('ace-builds/src-noconflict/mode-php', () => ({})); +vi.mock('ace-builds/src-noconflict/theme-monokai', () => ({})); + +vi.mock('react-ace', () => ({ + default: React.forwardRef(function AceEditorMock({value}, ref) { + React.useImperativeHandle(ref, () => ({editor}), []); + + return React.createElement('div', {'data-testid': 'ace-editor'}, value); + }) +})); + +vi.mock('../components/Confirm', () => ({ + default: function ConfirmMock() { + return null; + } +})); + +vi.mock('../lib/runtimePaths', () => ({ + basePath: (path = '') => `/php-wasm/${path}` + , libType: 'static' + , buildType: 'static' + , defaultPhpVersion: '8.4' +})); + +import Embedded from './Embedded'; + +describe('Embedded', () => { + const phpCode = ` { + PhpWeb.mockClear(); + editor.getValue.mockClear(); + phpExec.mockClear(); + phpRefresh.mockClear(); + phpRun.mockClear(); + + globalThis.fetch = vi.fn(async () => ({ + ok: true + , text: async () => phpCode + })); + + window.history.pushState( + {} + , '' + , '/embedded-php.html?demo=hello-world.php&version=8.0&extensionFlags=0' + ); + }); + + it('autoruns the fetched demo code even if Ace is still empty', async () => { + render(); + + await waitFor(() => { + expect(globalThis.fetch).toHaveBeenCalledWith('/php-wasm/scripts/hello-world.php'); + }); + + let executedCode; + + await waitFor(() => { + expect(phpRun).toHaveBeenCalledTimes(1); + [executedCode] = phpRun.mock.calls[0]; + expect(executedCode).toContain('echo "Hello, World!";'); + }); + + expect(executedCode).not.toBe(''); + expect(new URLSearchParams(window.location.search).get('code')).not.toBe(''); + }); + + it('boots the embedded demo only once under StrictMode', async () => { + render( + + + + ); + + await waitFor(() => { + expect(globalThis.fetch).toHaveBeenCalledTimes(1); + expect(PhpWeb).toHaveBeenCalledTimes(1); + expect(phpRun).toHaveBeenCalledTimes(1); + }); + }); + + it('uses Ace content for a manual run after the demo loads', async () => { + const {container} = render(); + + await waitFor(() => { + expect(phpRun).toHaveBeenCalledTimes(1); + }); + + phpRun.mockClear(); + editor.getValue.mockReturnValue(' { + expect(phpRun).toHaveBeenCalledWith('done; +} diff --git a/demo-web/src/Home.js b/demo-web/src/pages/Home.js similarity index 62% rename from demo-web/src/Home.js rename to demo-web/src/pages/Home.js index c8b8acc30..ace64e7f8 100644 --- a/demo-web/src/Home.js +++ b/demo-web/src/pages/Home.js @@ -1,32 +1,39 @@ -import './Common.css'; -import './Home.css'; -import phpPageIcon from './deepin-php-icon.svg'; -import cakePhpIcon from './cakephp-icon.svg'; -import drupalIcon from './drupal-icon.svg'; -import codeIgniterIcon from './codeigniter-icon.svg'; -import laravelIcon from './laravel-icon.svg'; -import laminasIcon from './laminas-icon.svg'; -import reactIcon from './react-icon.svg'; - -// import rolodexIcon from './icons/rolodex-icon-32.png'; -import editorIcon from './icons/editor-icon-32.png'; -import vscodeIcon from './icons/vscode-32.png'; -import donateIcon from './icons/donate-icon-32.png'; -import githubIcon from './icons/github-icon-32.png'; -import seanIcon from './icons/sean-icon-32.png'; - -import sunburstIcon from './icons/sunburst.png'; -import netscapeIcon from './icons/netscape.png'; -import mouseIcon from './icons/mouse.png'; -import cmdIcon from './icons/cmd-icon-32.png'; -import dbIcon from './icons/database.png'; -import downIcon from './icons/down.png'; -import upIcon from './icons/up.png'; +/** + * Landing page for the demo chooser and ancillary preview links. + */ +import '../styles/Common.css'; +import '../styles/Home.css'; +import phpPageIcon from '../assets/frameworks/deepin-php-icon.svg'; +import cakePhpIcon from '../assets/frameworks/cakephp-icon.svg'; +import drupalIcon from '../assets/frameworks/drupal-icon.svg'; +import codeIgniterIcon from '../assets/frameworks/codeigniter-icon.svg'; +import laravelIcon from '../assets/frameworks/laravel-icon.svg'; +import laminasIcon from '../assets/frameworks/laminas-icon.svg'; +import reactIcon from '../assets/frameworks/react-icon.svg'; + +// import rolodexIcon from '../assets/icons/rolodex-icon-32.png'; +import editorIcon from '../assets/icons/editor-icon-32.png'; +import vscodeIcon from '../assets/icons/vscode-32.png'; +import donateIcon from '../assets/icons/donate-icon-32.png'; +import githubIcon from '../assets/icons/github-icon-32.png'; +import seanIcon from '../assets/icons/sean-icon-32.png'; + +import sunburstIcon from '../assets/icons/sunburst.png'; +import netscapeIcon from '../assets/icons/netscape.png'; +import mouseIcon from '../assets/icons/mouse.png'; +import cmdIcon from '../assets/icons/cmd-icon-32.png'; +import downIcon from '../assets/icons/down.png'; +import upIcon from '../assets/icons/up.png'; import { useEffect, useMemo, useState } from 'react'; -import Header from './Header'; - -function Home() { +import Header from '../components/Header'; +import { basePath } from '../lib/runtimePaths'; + +/** + * Renders the main demo launcher and cycles the framework marquee artwork. + */ +function Home() +{ const [offset, setOffset] = useState(Math.trunc(Math.random() * 5)); const [scrollState, setScrollState] = useState(1); const [showMore, setShowMore] = useState(false); @@ -36,7 +43,7 @@ function Home() { useEffect(() => { if(query.has('code') || query.has('demo')) { - window.location = process.env.PUBLIC_URL + '/embedded-php.html' + window.location.search; + window.location = basePath(`embedded-php.html${window.location.search}`); } }, [query]); @@ -59,7 +66,6 @@ function Home() { setScrollState(1); setOffset((offset + 1) % 6); } - }, speed); }, [offset, scrollState]); @@ -70,14 +76,14 @@ function Home() {

Select a demo:

- +
page showing php logo
PHP Embedded Demo

View, edit & run PHP code right in the browser.

- +
CakePHP logo @@ -95,11 +101,11 @@ function Home() {
- - @@ -124,24 +130,24 @@ function Home() {
-

{setShowMore(!showMore)}}>More...

+

{setShowMore(!showMore);}}>More...

{ showMore && (
- + PHP-CLI Preview PHP-CLI Preview - + Inline FrontEnd PHP Inline FrontEnd PHP - + GTK PHP+Node Browser GTK PHP+Node Browser - + PHP Event Handlers PHP Event Handlers diff --git a/demo-web/src/pages/InstallDemo.js b/demo-web/src/pages/InstallDemo.js new file mode 100644 index 000000000..28f249d1e --- /dev/null +++ b/demo-web/src/pages/InstallDemo.js @@ -0,0 +1,340 @@ +/** + * Popup installer flow for restoring packaged framework demos into the CGI worker. + */ +import { useEffect, useMemo, useRef, useState } from 'react'; +import Terminal from '../components/Terminal'; +import loader from '../assets/ui/bar-spin.svg'; +import { getPhpBus, waitForPhpBusRequest } from '../lib/phpBus'; +import { basePath } from '../lib/runtimePaths'; +import { ensureServiceWorker, serviceWorkerControlTimeoutMs } from '../lib/serviceWorker'; + +// import zlib from 'php-wasm-zlib'; +// import libzip from 'php-wasm-libzip'; + +import '../styles/Common.css'; +import '../styles/InstallDemo.css'; + +const packages = { + 'drupal-7': { + // Switch these paths to the PostgreSQL backup if needed. + name: 'Drupal 7' + , file: '/backups/drupal-7.95.zip' + , path: 'drupal-7.95' + , vHost: 'drupal' + , dir: 'drupal-7.95' + , entry: 'index.php' + } + , 'cakephp-5': { + name: 'CakePHP 5' + , file: '/backups/cakephp-5.zip' + , path: 'cakephp-5' + , vHost: 'cakephp-5' + , dir: 'cakephp-5/webroot' + , entry: 'index.php' + } + , 'codeigniter-4': { + name: 'CodeIgniter 4' + , file: '/backups/codeigniter-4.zip' + , path: 'codeigniter-4' + , vHost: 'codeigniter-4' + , dir: 'codeigniter-4/public' + , entry: 'index.php' + } + , 'laminas-3': { + name: 'Laminas 3' + , file: '/backups/laminas-3.zip' + , path: 'laminas-3' + , vHost: 'laminas-3' + , dir: 'laminas-3/public' + , entry: 'index.php' + } + , 'laravel-11': { + name: 'Laravel 11' + , file: '/backups/laravel-11.zip' + , path: 'laravel-11' + , vHost: 'laravel-11' + , dir: 'laravel-11/public' + , entry: 'index.php' + } +}; + +/** + * Notifies the opener window that a framework install has completed. + */ +const informOpener = (selectedFrameworkName) => { + window.opener && window.opener.dispatchEvent( + new CustomEvent('install-complete', {detail: selectedFrameworkName}) + ); +}; + +const serviceWorkerRetryKey = 'php-wasm-install-demo-service-worker-retry'; +const serviceWorkerReloadDelayMs = 500; +const installerRpcTimeouts = { + analyzePath: 5000 + , writeFile: 30000 + , getSettings: 10000 + , setSettings: 10000 + , storeInit: 10000 + , refresh: 30000 +}; +/** + * Converts install-time RPC failures into readable status strings. + */ +const formatInstallError = error => { + const detail = error?.error ?? error?.message ?? String(error); + + if(error?.action) + { + return `Installer request "${error.action}" failed: ${detail}`; + } + + return `Installer failed: ${detail}`; +}; + +/** + * Strips service-worker settings down to the serializable fields the installer mutates. + */ +const createSerializableSettings = settings => ({ + docroot: settings?.docroot + , maxRequestAge: settings?.maxRequestAge + , staticCacheTime: settings?.staticCacheTime + , dynamicCacheTime: settings?.dynamicCacheTime + , vHosts: Array.isArray(settings?.vHosts) + ? settings.vHosts.map(vHost => ({ + pathPrefix: vHost?.pathPrefix + , directory: vHost?.directory + , entrypoint: vHost?.entrypoint + })) + : [] +}); + +/** + * Sends an installer RPC over quickbus with per-action timeout defaults. + */ +const sendInstallMessage = (bus, action, params = []) => { + const request = bus[action](...params); + + return waitForPhpBusRequest(request, { + action + , params + , timeoutMs: action in installerRpcTimeouts + ? installerRpcTimeouts[action] + : undefined + }); +}; + +/** + * Downloads, restores, and activates a selected framework package. + */ +export default function InstallDemo() +{ + const query = useMemo(() => new URLSearchParams(window.location.search), []); + const [message, setMessage] = useState('Initializing...'); + const [terminal, setTerminal] = useState(''); + const bootstrapPromise = useRef(null); + const disposed = useRef(false); + + useEffect(() => { + disposed.current = false; + + const updateMessage = nextMessage => { + if(!disposed.current) + { + setMessage(nextMessage); + } + }; + + const updateTerminal = nextTerminal => { + if(!disposed.current) + { + setTerminal(nextTerminal); + } + }; + + const failMissingController = async () => { + if(!sessionStorage.getItem(serviceWorkerRetryKey)) + { + sessionStorage.setItem(serviceWorkerRetryKey, '1'); + updateMessage('No Service Worker Detected, Reloading...'); + await new Promise(resolve => setTimeout(resolve, serviceWorkerReloadDelayMs)); + window.location.reload(); + return; + } + + sessionStorage.removeItem(serviceWorkerRetryKey); + updateMessage('Service worker did not take control of the installer popup. Close this window and try again.'); + }; + + if(!bootstrapPromise.current) + { + bootstrapPromise.current = (async () => { + try + { + const serviceWorker = await ensureServiceWorker({ + timeoutMs: serviceWorkerControlTimeoutMs + }); + + if(!serviceWorker.controlled) + { + if(serviceWorker.controlSource === 'error') + { + updateMessage('Failed to register the CGI service worker for the installer popup.'); + return; + } + + if(serviceWorker.controlSource === 'unsupported') + { + updateMessage('This browser does not support service workers for the installer popup.'); + return; + } + + await failMissingController(); + return; + } + + sessionStorage.removeItem(serviceWorkerRetryKey); + const bus = await getPhpBus({ + timeoutMs: serviceWorkerControlTimeoutMs + }); + + const selectedFrameworkName = query.get('framework'); + const overwrite = query.get('overwrite') ?? false; + + if(!selectedFrameworkName) + { + updateMessage('No framework selected.'); + return; + } + + if(!(selectedFrameworkName in packages)) + { + updateMessage('Invalid framework selected.'); + return; + } + + const selectedFramework = packages[selectedFrameworkName]; + + updateMessage('Downloading init script...'); + const initPhpCode = await (await fetch(basePath('scripts/init.php'))).text(); + + updateMessage('Acquiring Lock...'); + await navigator.locks.request('php-wasm-demo-install', async () => { + updateMessage('Checking for Existing Install...'); + const checkPath = await sendInstallMessage(bus, 'analyzePath', ['/persist/' + selectedFramework.dir]); + + if(!overwrite && checkPath.exists) + { + updateMessage('Already installed...'); + informOpener(selectedFrameworkName); + window.location = basePath(`cgi-bin/${selectedFramework.vHost}`); + return; + } + + updateMessage(`Downloading ${selectedFramework.file}...`); + const zipContents = await (await fetch(basePath(selectedFramework.file))).arrayBuffer(); + await sendInstallMessage(bus, 'writeFile', ['/persist/restore.zip', new Uint8Array(zipContents)]); + await sendInstallMessage(bus, 'writeFile', ['/config/restore-path.tmp', '/persist/' + selectedFramework.path]); + + updateMessage(`Setting up ${selectedFrameworkName}...`); + const settings = createSerializableSettings( + await sendInstallMessage(bus, 'getSettings') + ); + const vHostPrefix = basePath(`cgi-bin/${selectedFramework.vHost}`); + const existingvHost = settings.vHosts.find(vHost => vHost.pathPrefix === vHostPrefix); + + if(!existingvHost) + { + settings.vHosts.push({ + pathPrefix: vHostPrefix + , directory: '/persist/' + selectedFramework.dir + , entrypoint: selectedFramework.entry + }); + } + else + { + existingvHost.directory = '/persist/' + selectedFramework.dir; + existingvHost.entrypoint = selectedFramework.entry; + } + + await sendInstallMessage(bus, 'setSettings', [settings]); + await sendInstallMessage(bus, 'storeInit'); + + updateMessage(`Unpacking ${selectedFramework.file}...`); + + const onComplete = async (exitCode) => { + if(exitCode !== 0) return; + if(selectedFramework.sql) + { + updateMessage('Setting up PostgreSQL...'); + const sqlFile = await (await fetch(selectedFramework.sql)).text(); + await waitForPhpBusRequest( + bus.execSql(`idb://host= dbname=drupal port=5432`, sqlFile) + , { + action: 'execSql' + , params: [`idb://host= dbname=drupal port=5432`, sqlFile] + } + ); + await waitForPhpBusRequest( + bus.runSql(`idb://host= dbname=drupal port=5432`, 'select * from information_schema.tables') + , { + action: 'runSql' + , params: [`idb://host= dbname=drupal port=5432`, 'select * from information_schema.tables'] + } + ); + } + + updateMessage('Refreshing PHP-CGI...'); + await sendInstallMessage(bus, 'refresh', []); + + updateMessage(`Opening ${selectedFrameworkName}...`); + informOpener(selectedFrameworkName); + window.location = vHostPrefix; + }; + + updateTerminal( +
+ ' + initPhpCode} + /> +
+ ); + }); + } + catch(error) + { + console.error(error); + updateMessage(formatInstallError(error)); + } + })(); + } + + return () => { + disposed.current = true; + }; + }, [query]); + + return ( +
+
+
+

{message}

+ {terminal} + loading spinner +
+
+
+ ); +} diff --git a/demo-web/src/pages/InstallDemo.test.js b/demo-web/src/pages/InstallDemo.test.js new file mode 100644 index 000000000..a7a0ef2be --- /dev/null +++ b/demo-web/src/pages/InstallDemo.test.js @@ -0,0 +1,197 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; + +const { ensureServiceWorker, getPhpBus } = vi.hoisted(() => ({ + ensureServiceWorker: vi.fn() + , getPhpBus: vi.fn() +})); + +vi.mock('../lib/serviceWorker', () => ({ + ensureServiceWorker + , serviceWorkerControlTimeoutMs: 1500 +})); + +vi.mock('../lib/phpBus', async importOriginal => ({ + ...(await importOriginal()) + , getPhpBus +})); + +vi.mock('../components/Terminal', () => ({ + default: function TerminalMock() { + return null; + } +})); + +import InstallDemo from './InstallDemo'; + +describe('InstallDemo', () => { + let fetchMock; + let bus; + let originalServiceWorker; + let originalLocks; + + beforeEach(() => { + ensureServiceWorker.mockReset(); + getPhpBus.mockReset(); + + bus = { + analyzePath: vi.fn(async () => ({exists: false})) + , getSettings: vi.fn(async () => ({vHosts: []})) + , writeFile: vi.fn(async () => undefined) + , setSettings: vi.fn(async () => undefined) + , storeInit: vi.fn(async () => undefined) + , refresh: vi.fn(async () => undefined) + , execSql: vi.fn(async () => undefined) + , runSql: vi.fn(async () => undefined) + }; + + getPhpBus.mockResolvedValue(bus); + + ensureServiceWorker.mockResolvedValue({ + supported: true + , registered: true + , controlled: true + , controller: {scriptURL: '/php-wasm/cgi-worker.js'} + , controlSource: 'existing' + }); + + fetchMock = vi.fn(async (url) => { + if(String(url).includes('scripts/init.php')) + { + return { + text: async () => ' new ArrayBuffer(8) + }; + } + + throw new Error(`Unexpected fetch: ${url}`); + }); + + vi.stubGlobal('fetch', fetchMock); + + originalServiceWorker = navigator.serviceWorker; + originalLocks = navigator.locks; + + Object.defineProperty(navigator, 'serviceWorker', { + configurable: true + , value: { + controller: {scriptURL: '/php-wasm/cgi-worker.js'} + } + }); + + Object.defineProperty(navigator, 'locks', { + configurable: true + , value: { + request: vi.fn(async (_, callback) => callback()) + } + }); + + sessionStorage.clear(); + window.history.pushState({}, '', '/install-demo.html?framework=drupal-7'); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + sessionStorage.clear(); + + if(originalServiceWorker === undefined) + { + delete navigator.serviceWorker; + } + else + { + Object.defineProperty(navigator, 'serviceWorker', { + configurable: true + , value: originalServiceWorker + }); + } + + if(originalLocks === undefined) + { + delete navigator.locks; + } + else + { + Object.defineProperty(navigator, 'locks', { + configurable: true + , value: originalLocks + }); + } + }); + + it('boots the installer only once under StrictMode', async () => { + render( + React.createElement( + React.StrictMode + , null + , React.createElement(InstallDemo) + ) + ); + + await waitFor(() => expect(bus.storeInit).toHaveBeenCalledTimes(1)); + + expect(fetchMock.mock.calls.filter(([url]) => String(url).includes('scripts/init.php'))).toHaveLength(1); + expect(fetchMock.mock.calls.filter(([url]) => String(url).includes('/backups/drupal-7.95.zip'))).toHaveLength(1); + expect(navigator.locks.request).toHaveBeenCalledTimes(1); + }); + + it('sanitizes runtime settings before sending them back to the worker', async () => { + bus.getSettings.mockResolvedValue({ + docroot: '/persist/www' + , maxRequestAge: 1234 + , staticCacheTime: 10 + , dynamicCacheTime: 20 + , vHosts: [ + { + pathPrefix: '/php-wasm/cgi-bin/test' + , directory: '/preload/test_www' + , entrypoint: 'hello-world.php' + , locateFile: () => '/tmp/not-cloneable' + } + ] + }); + + render(); + + await waitFor(() => expect(bus.setSettings).toHaveBeenCalledTimes(1)); + + expect(bus.setSettings).toHaveBeenCalledWith({ + docroot: '/persist/www' + , maxRequestAge: 1234 + , staticCacheTime: 10 + , dynamicCacheTime: 20 + , vHosts: [ + { + pathPrefix: '/php-wasm/cgi-bin/test' + , directory: '/preload/test_www' + , entrypoint: 'hello-world.php' + } + , { + pathPrefix: '/cgi-bin/drupal' + , directory: '/persist/drupal-7.95' + , entrypoint: 'index.php' + } + ] + }); + }); + + it('surfaces analyzePath failures instead of hanging on the status text', async () => { + bus.analyzePath.mockRejectedValue({ + error: 'Timed out waiting for a service worker reply after 5000ms.' + , action: 'analyzePath' + , params: ['/persist/drupal-7.95'] + }); + + render(); + + await screen.findByText( + 'Installer request "analyzePath" failed: Timed out waiting for a service worker reply after 5000ms.' + ); + }); +}); diff --git a/demo-web/src/pages/MultiIframeTest.js b/demo-web/src/pages/MultiIframeTest.js new file mode 100644 index 000000000..82f8b0118 --- /dev/null +++ b/demo-web/src/pages/MultiIframeTest.js @@ -0,0 +1,33 @@ +/** + * Stress-test page that opens many CGI-backed iframes at once. + */ +const FRAME_COUNT = 120; + +/** + * Renders a large batch of demo iframes to exercise the CGI service worker. + */ +export default function MultiIframeTest() +{ + const frames = Array.from({ length: FRAME_COUNT }, (_, i) => i + 1); + return ( +
+

Multi‑Iframe PHP CGI Test

+

+ This test mounts {FRAME_COUNT} simultaneous iframes pointing at a simple PHP page + served by the CGI service worker. +

+
+ {frames.map(i => ( + \n\t\t\t\t\t\t\t\t
{stdRet}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
{stdOut}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
{stdErr}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\t{statusBar}\n\t\t
\n\t\t
{overlay}
\n\t\n\t);\n}\n\nexport default Embedded;\n","module.exports = __webpack_public_path__ + \"c88c1393fde184e940fbd038deda1777.js\";","module.exports = __webpack_public_path__ + \"2a40776d62246b927c1351303bd3a62d.js\";","module.exports = __webpack_public_path__ + \"599094eab03a98c55e5f5196a6890d00.js\";","module.exports = __webpack_public_path__ + \"78a7a73f85da048383a3af9214273d7d.js\";","module.exports = __webpack_public_path__ + \"66532514de90e08ac0c7d1e4b6e5286c.js\";","module.exports = __webpack_public_path__ + \"ed467b0f1e10c0e98c4c75fa0b449b4a.js\";","module.exports = __webpack_public_path__ + \"a41e63b870ce8d34d6af620a67487752.js\";","module.exports = __webpack_public_path__ + \"8f40f1f6eb7f424e5d2b587097130509.js\";","module.exports = __webpack_public_path__ + \"594f30af0bde34cecea1a5c9d76f84c1.js\";","module.exports = __webpack_public_path__ + \"e0a96197e4534aa90a7a99ba9c121950.js\";","module.exports = __webpack_public_path__ + \"d43ab08fca10c1c74704907d2b6d933a.js\";","module.exports = __webpack_public_path__ + \"73c09ef71e77f3c29559e6d3f8c48b31.js\";","module.exports = __webpack_public_path__ + \"4aba8f7773972fd6c47d96cbd4236ba2.js\";","export default function Header() {\n\treturn (
\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\"sean\"\n\t\t\t\t\n\t\t\t\t

php-wasm

\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t\t
\n\t\t
\n\t
);\n};\n","module.exports = __webpack_public_path__ + \"c98e74fc97b04fe8bf43dcdff549afcf.js\";","module.exports = __webpack_public_path__ + \"3b0327da890a2fc2c6b1b3b9534306f3.js\";","module.exports = __webpack_public_path__ + \"85a1bc6b5349b24dcf99ffdba13e1df8.js\";","module.exports = __webpack_public_path__ + \"778b4110847987fbfc51b84b0e235e1d.js\";","module.exports = __webpack_public_path__ + \"5e299868db8f582a38bfd49191c66452.js\";","module.exports = __webpack_public_path__ + \"4d3535459dc8829878c59eec84dd7d50.js\";","module.exports = __webpack_public_path__ + \"47feb3313fd4914e51f4744a5143a182.js\";","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","module.exports = __webpack_public_path__ + \"051172af4df2228c8acf8d04d449ab1d.js\";","module.exports = __webpack_public_path__ + \"7add9505ab183ee5d628f711369e1ee7.js\";","module.exports = __webpack_public_path__ + \"cce112a2a78f215dbf8026fccd277412.js\";","module.exports = __webpack_public_path__ + \"8555c9e84b1a7796821635d4418bc10b.js\";","module.exports = __webpack_public_path__ + \"4b2277cbb8eb12a3e65b412e8de13638.js\";","module.exports = __webpack_public_path__ + \"f2561d02a83fd42f322510803a14d6bc.js\";","module.exports = __webpack_public_path__ + \"10128da3035f009482388eca243671f9.js\";","module.exports = __webpack_public_path__ + \"f56d32e1f2b28367fb9708336457c4a6.js\";","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport { Navigate, Route, Routes } from 'react-router';\nimport { BrowserRouter } from 'react-router-dom';\n\nimport SelectFramework from './SelectFramework';\nimport Embedded from './Embedded';\nimport Home from './Home';\nimport InstallDemo from './InstallDemo';\nimport Editor from './Editor';\nimport DbgPreview from './DbgPreview';\nimport CliPreview from './CliPreview';\nimport MultiIframeTest from './MultiIframeTest';\nimport { onMessage } from 'php-cgi-wasm/msg-bus';\nimport VSCodeEditor from './VSCodeEditor';\n\nconst params = new URLSearchParams(window.location.search);\n\nif(!params.has('no-service-worker'))\n{\n\tnavigator.serviceWorker.register(process.env.PUBLIC_URL + `/cgi-worker.js`);\n\tsetTimeout(() => {\n\t\tif(!(navigator.serviceWorker && navigator.serviceWorker.controller))\n\t\t{\n\t\t\twindow.location.reload();\n\t\t}\n\t}, 450);\n\n\tnavigator.serviceWorker.addEventListener('message', onMessage);\n}\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n\t\n\t\t\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t } />\n\t\t\t}\n\t\t\t/>\n\t\t\t}\n\t\t\t/>\n\t\t\t}\n\t\t\t/>\n\t\t\t}\n\t\t\t/>\n\t\t\t}\n\t\t\t/>\n\t\t\t}\n\t\t\t/>\n\t\t\t }\n\t\t\t/>\n\t\t\t } />\n\t\t\t } />\n\t\t\n\t\n\n);\n","module.exports = __webpack_public_path__ + \"6247279dbb9c17a5fe8670679c2efa79.js\";","module.exports = __webpack_public_path__ + \"441f3dfac5b7e77c6f7c3c982f0e1abf.js\";","module.exports = __webpack_public_path__ + \"c829112fae745936906b0d0ee8e13a00.js\";","module.exports = __webpack_public_path__ + \"b543f2132fa98d7f3fbb4cc21b85798d.js\";","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch {}\n\nexport interface DataRouteMatch extends RouteMatch {}\n\nexport interface DataRouterContextObject\n // Omit `future` since those can be pulled from the `router`\n // `NavigationContext` needs future since it doesn't have a `router` in all cases\n extends Omit {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n future: {\n v7_relativeSplatPath: boolean;\n };\n}\n\nexport const NavigationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_decodePath as decodePath,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/v6/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a ``.\n *\n * @see https://reactrouter.com/v6/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/v6/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * ``.\n *\n * @see https://reactrouter.com/v6/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey,\n Path extends string\n>(pattern: PathPattern | Path): PathMatch | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath(pattern, decodePath(pathname)),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by ``s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, future, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/v6/hooks/use-outlet-context\n */\nexport function useOutletContext(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `` to render child routes.\n *\n * @see https://reactrouter.com/v6/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n {outlet}\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/v6/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params : Partial\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/v6/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { future } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/v6/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial | string,\n dataRouterState?: RemixRouter[\"state\"],\n future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a component.`\n );\n\n let { navigator } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different under a \n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // \n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // } />\n // } />\n // \n //\n // function Blog() {\n // return (\n // \n // } />\n // \n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under ) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent to .`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n // Determine the remaining pathname by removing the # of URL segments the\n // parentPathnameBase has, instead of removing based on character count.\n // This is because we can't guarantee that incoming/outgoing encodings/\n // decodings will match exactly.\n // We decode paths before matching on a per-segment basis with\n // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n // match what `window.location.pathname` would reflect. Those don't 100%\n // align when it comes to encoded URI characters such as % and &.\n //\n // So we may end up with:\n // pathname: \"/descendant/a%25b/match\"\n // parentPathnameBase: \"/descendant/a%b\"\n //\n // And the direct substring removal approach won't work :/\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n\n let matches = matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined ||\n matches[matches.length - 1].route.lazy !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState,\n future\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n \n {renderedMatches}\n \n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n

💿 Hey developer 👋

\n

\n You can provide a way better UX than this when your app throws errors\n by providing your own ErrorBoundary or{\" \"}\n errorElement prop on your route.\n

\n \n );\n }\n\n return (\n <>\n

Unexpected Application Error!

\n

{message}

\n {stack ?
{stack}
: null}\n {devInfo}\n \n );\n}\n\nconst defaultErrorElement = ;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error !== undefined ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error !== undefined ? (\n \n \n \n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null,\n future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (!dataRouterState) {\n return null;\n }\n\n if (dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else if (\n future?.v7_partialHydration &&\n parentMatches.length === 0 &&\n !dataRouterState.initialized &&\n dataRouterState.matches.length > 0\n ) {\n // Don't bail if we're initializing with partial hydration and we have\n // router matches. That means we're actively running `patchRoutesOnNavigation`\n // so we should render down the partial matches to the appropriate\n // `HydrateFallback`. We only do this if `parentMatches` is empty so it\n // only impacts the root matches for `RouterProvider` and no descendant\n // ``\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== undefined\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n // If we're in a partial hydration mode, detect if we need to render down to\n // a given HydrateFallback while we load the rest of the hydration data\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n // Track the deepest fallback up until the first route without data\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n\n if (match.route.id) {\n let { loaderData, errors } = dataRouterState;\n let needsToRunLoader =\n match.route.loader &&\n loaderData[match.route.id] === undefined &&\n (!errors || errors[match.route.id] === undefined);\n if (match.route.lazy || needsToRunLoader) {\n // We found the first route that's not ready to render (waiting on\n // lazy, or has a loader that hasn't run yet). Flag that we need to\n // render a fallback and render up until the appropriate fallback\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n // Only data routers handle errors/fallbacks\n let error: any;\n let shouldRenderHydrateFallback = false;\n let errorElement: React.ReactNode | null = null;\n let hydrateFallbackElement: React.ReactNode | null = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : undefined;\n errorElement = match.route.errorElement || defaultErrorElement;\n\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `` in `` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = ;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n \n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n \n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error !== undefined) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type { FutureConfig as RouterFutureConfig } from \"@remix-run/router\";\nimport type { FutureConfig as RenderFutureConfig } from \"./components\";\n\nconst alreadyWarned: { [key: string]: boolean } = {};\n\nexport function warnOnce(key: string, message: string): void {\n if (__DEV__ && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n\nconst logDeprecation = (flag: string, msg: string, link: string) =>\n warnOnce(\n flag,\n `⚠️ React Router Future Flag Warning: ${msg}. ` +\n `You can use the \\`${flag}\\` future flag to opt-in early. ` +\n `For more information, see ${link}.`\n );\n\nexport function logV6DeprecationWarnings(\n renderFuture: Partial | undefined,\n routerFuture?: Omit\n) {\n if (renderFuture?.v7_startTransition === undefined) {\n logDeprecation(\n \"v7_startTransition\",\n \"React Router will begin wrapping state updates in `React.startTransition` in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_starttransition\"\n );\n }\n\n if (\n renderFuture?.v7_relativeSplatPath === undefined &&\n (!routerFuture || routerFuture.v7_relativeSplatPath === undefined)\n ) {\n logDeprecation(\n \"v7_relativeSplatPath\",\n \"Relative route resolution within Splat routes is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath\"\n );\n }\n\n if (routerFuture) {\n if (routerFuture.v7_fetcherPersist === undefined) {\n logDeprecation(\n \"v7_fetcherPersist\",\n \"The persistence behavior of fetchers is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_fetcherpersist\"\n );\n }\n\n if (routerFuture.v7_normalizeFormMethod === undefined) {\n logDeprecation(\n \"v7_normalizeFormMethod\",\n \"Casing of `formMethod` fields is being normalized to uppercase in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_normalizeformmethod\"\n );\n }\n\n if (routerFuture.v7_partialHydration === undefined) {\n logDeprecation(\n \"v7_partialHydration\",\n \"`RouterProvider` hydration behavior is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_partialhydration\"\n );\n }\n\n if (routerFuture.v7_skipActionErrorRevalidation === undefined) {\n logDeprecation(\n \"v7_skipActionErrorRevalidation\",\n \"The revalidation behavior after 4xx/5xx `action` responses is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_skipactionerrorrevalidation\"\n );\n }\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\nimport { logV6DeprecationWarnings } from \"./deprecations\";\n\nexport interface FutureConfig {\n v7_relativeSplatPath: boolean;\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n // Only accept future flags relevant to rendering behavior\n // routing flags should be accessed via router.future\n future?: Partial>;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n React.useEffect(\n () => logV6DeprecationWarnings(future, router.future),\n [router, future]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a - - -

php-wasm & pglite in html

-

https://github.com/seanmorris/php-wasm

-

-		
- - diff --git a/docs/vscode.html b/docs/vscode.html deleted file mode 100644 index 5e39d02da..000000000 --- a/docs/vscode.html +++ /dev/null @@ -1,52 +0,0 @@ -php-wasm
diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..4be9d5abf --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,140 @@ +import globals from 'globals'; +import { jsdoc } from 'eslint-plugin-jsdoc'; +import smNoSaccadeStyle from 'sm-no-saccade-style'; + +const sourceLintFiles = ['source/**/*.{js,mjs}']; +const packageLintFiles = ['packages/**/8.*.{js,mjs}', 'packages/**/index.{js,mjs}']; +const testModuleLintFiles = ['test/**/*.mjs']; +const testCommonJsLintFiles = ['test/**/*.{js,cjs}']; +const testBrowserHarnessLintFiles = ['test/browser/harness/**/*.mjs']; +const testLintFiles = [...testModuleLintFiles, ...testCommonJsLintFiles]; +const lintFiles = [...sourceLintFiles, ...packageLintFiles, ...testLintFiles]; +const ignores = [ + 'packages/php-wasm/stdlib/**/*' + , 'test/browser/browser.spec.mjs-snapshots/**/*' +]; +const definedTypes = [ + 'EventInit', + 'OutputTarget', + 'PhpActionHandler', + 'PhpEventHook', + 'PhpLibraryList', + 'PhpMessageParams', + 'PhpNotFoundHook', + 'PhpPreloadFile', + 'PhpPreloadFileList', + 'PhpQueueParams', + 'PhpQueueReject', + 'PhpQueueResolve', + 'PhpQueuedCallback', + 'PhpRuntimeArgs', + 'PhpRuntimeHook', + 'PhpRuntimeValue', + 'PhpSharedLibrary', + 'PhpSharedValue', + 'PhpVhost', + 'PhpVhostList', + 'RuntimeFetchEvent', + 'RuntimeLifecycleEvent', + 'RuntimeRequest' +]; + +export default [ + ...smNoSaccadeStyle.configs.recommended.map( + config => ({ + ...config + , files: lintFiles + , ignores + }) + ) + , { + files: sourceLintFiles + , ignores + , languageOptions: { + sourceType: 'module' + , ecmaVersion: 'latest' + , globals: { + ...globals.browser + } + } + , rules: { + 'jsdoc/no-undefined-types': ['warn', { + definedTypes + }] + , 'jsdoc/require-jsdoc': ['warn', { + contexts: [ + 'PropertyDefinition' + , 'ClassProperty' + , 'FunctionDeclaration' + , 'MethodDefinition' + , 'ClassDeclaration' + ] + }] + } + } + , { + files: packageLintFiles + , ignores + , languageOptions: { + sourceType: 'module' + , ecmaVersion: 'latest' + , globals: { + ...globals.browser + } + } + , rules: { + 'jsdoc/no-undefined-types': ['warn', { + definedTypes + }] + , 'jsdoc/require-jsdoc': ['warn', { + contexts: [ + 'PropertyDefinition' + , 'ClassProperty' + , 'FunctionDeclaration' + , 'MethodDefinition' + , 'ClassDeclaration' + , 'ArrowFunctionExpression' + ] + }] + } + } + , { + files: testModuleLintFiles + , ignores + , languageOptions: { + sourceType: 'module' + , ecmaVersion: 'latest' + , globals: { + ...globals.node + } + } + } + , { + files: testCommonJsLintFiles + , ignores + , languageOptions: { + sourceType: 'commonjs' + , ecmaVersion: 'latest' + , globals: { + ...globals.node + } + } + } + , { + files: testBrowserHarnessLintFiles + , ignores + , languageOptions: { + sourceType: 'module' + , ecmaVersion: 'latest' + , globals: { + ...globals.browser + , ...globals.serviceworker + } + } + } + , { + ...jsdoc({ config: 'flat/recommended' }) + , files: lintFiles + , ignores + } +]; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 000000000..d987af2f5 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "checkJs": true, + "target": "ESNext", + "module": "esnext", + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "noEmit": true, + "maxNodeModuleJsDepth": 0, + "strict": false, + "types": ["node"], + "skipLibCheck": true + }, + "include": ["source/**/*.js", "source/**/*.mjs", "source/**/*.d.ts", "packages/**/8.*.mjs", "packages/**/index.mjs"], + "exclude": ["packages/php-wasm/stdlib/**/*"] +} diff --git a/make b/make index 3cc70cfea..b33544f8f 100755 --- a/make +++ b/make @@ -2,22 +2,20 @@ MAKE_VERSION=4.4.1 -test -e third_party/make-${MAKE_VERSION}/bin/make || { +test -e third_party/make-${MAKE_VERSION}/make || { rm -rf /third_party/make-${MAKE_VERSION}; wget -q https://gnu.mirror.constant.com/make/make-${MAKE_VERSION}.tar.gz tar -C third_party -xzvf make-${MAKE_VERSION}.tar.gz rm make-${MAKE_VERSION}.tar.gz - mkdir third_party/make-${MAKE_VERSION}/bin cd third_party/make-${MAKE_VERSION} && { ./configure - make - make install prefix=./ + sh build.sh } cd ../.. } -third_party/make-${MAKE_VERSION}/bin/make ${@} +third_party/make-${MAKE_VERSION}/make ${@} exit $? diff --git a/overlay-workspace-from-actions.sh b/overlay-workspace-from-actions.sh new file mode 100755 index 000000000..d2fe4f51e --- /dev/null +++ b/overlay-workspace-from-actions.sh @@ -0,0 +1,405 @@ +#!/usr/bin/env bash + +set -euo pipefail + +DEFAULT_ACTIONS_URL="https://github.com/seanmorris/php-wasm/actions/runs/25331839202" +DEFAULT_LIB_TYPE="dynamic" +DEFAULT_TMP_ROOT="/tmp" +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +DEFAULT_WORKSPACE_ROOT="${SCRIPT_DIR}" + +artifact_family="uncompressed" +artifact_name="${ARTIFACT_NAME:-}" +lib_type="${LIB_TYPE:-$DEFAULT_LIB_TYPE}" +overwrite_mode="ask" +php_version="" +tmp_root="${TMP_ROOT:-$DEFAULT_TMP_ROOT}" +workspace_root="${WORKSPACE_ROOT:-$DEFAULT_WORKSPACE_ROOT}" +actions_url="" +repo_slug="" +run_id="" + +usage() { + cat <. + -U, --uncompressed Download php-uncompressed--. + Default when neither flag is provided. + -v, --php-version VERSION PHP version for uncompressed artifacts. + If omitted, download all matching versions. + -a, --artifact-name NAME Artifact name to download. + Overrides compressed/uncompressed naming. + -w, --workspace-root DIR Workspace root to overlay into. + Default: ${DEFAULT_WORKSPACE_ROOT} + -d, --tmp-root DIR Parent directory for downloaded files. + Default: ${DEFAULT_TMP_ROOT} + -h, --help Show this help and exit. + +Defaults: + If no URL or run id is provided, the script uses: + ${DEFAULT_ACTIONS_URL} + +Examples: + $(basename "$0") + $(basename "$0") --url ${DEFAULT_ACTIONS_URL} + $(basename "$0") --lib-type shared + $(basename "$0") --overwrite --lib-type shared + $(basename "$0") --lib-type shared --php-version 8.4 + $(basename "$0") --compressed --run-id 25331839202 --repo seanmorris/php-wasm + $(basename "$0") --artifact-name php-compressed-dynamic +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -u|--url) + actions_url="${2:-}" + shift 2 + ;; + -r|--run-id) + run_id="${2:-}" + shift 2 + ;; + -R|--repo) + repo_slug="${2:-}" + shift 2 + ;; + -l|--lib-type) + lib_type="${2:-}" + shift 2 + ;; + -o|--overwrite) + overwrite_mode="yes" + shift + ;; + -c|--compressed) + artifact_family="compressed" + shift + ;; + -U|--uncompressed) + artifact_family="uncompressed" + shift + ;; + -v|--php-version) + php_version="${2:-}" + shift 2 + ;; + -a|--artifact-name) + artifact_name="${2:-}" + shift 2 + ;; + -w|--workspace-root) + workspace_root="${2:-}" + shift 2 + ;; + -d|--tmp-root) + tmp_root="${2:-}" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift + break + ;; + -*) + echo "Unknown option: $1" >&2 + usage >&2 + exit 1 + ;; + *) + if [[ -z "$actions_url" && -z "$run_id" ]]; then + actions_url="$1" + shift + continue + fi + + echo "Unexpected argument: $1" >&2 + usage >&2 + exit 1 + ;; + esac +done + +case "$lib_type" in + dynamic|shared|static) + ;; + *) + echo "Unsupported lib type: ${lib_type}" >&2 + echo "Expected one of: dynamic, shared, static" >&2 + exit 1 + ;; +esac + +case "$artifact_family" in + compressed|uncompressed) + ;; + *) + echo "Unsupported artifact family: ${artifact_family}" >&2 + echo "Expected one of: compressed, uncompressed" >&2 + exit 1 + ;; +esac + +if [[ -n "$actions_url" && -n "$run_id" ]]; then + echo "Use either --url or --run-id, not both." >&2 + exit 1 +fi + +if [[ -z "$actions_url" && -z "$run_id" ]]; then + actions_url="$DEFAULT_ACTIONS_URL" +fi + +if [[ -n "$actions_url" ]]; then + if [[ "$actions_url" =~ ^https://github\.com/([^/]+)/([^/]+)/actions/runs/([0-9]+)(/.*)?$ ]]; then + owner="${BASH_REMATCH[1]}" + repo="${BASH_REMATCH[2]}" + repo_slug="${owner}/${repo}" + run_id="${BASH_REMATCH[3]}" + else + echo "Expected a GitHub Actions run URL like:" >&2 + echo " https://github.com///actions/runs/" >&2 + exit 1 + fi +elif [[ -n "$run_id" ]]; then + if [[ ! "$repo_slug" =~ ^[^/]+/[^/]+$ ]]; then + echo "--repo OWNER/REPO is required when using --run-id." >&2 + exit 1 + fi +else + echo "Unable to determine a workflow run." >&2 + exit 1 +fi + +if [[ ! -d "$workspace_root" ]]; then + echo "Workspace root does not exist: ${workspace_root}" >&2 + exit 1 +fi + +if ! command -v gh >/dev/null 2>&1; then + echo "\`gh\` is required but was not found in PATH." >&2 + exit 1 +fi + +if ! command -v sha256sum >/dev/null 2>&1; then + echo "\`sha256sum\` is required but was not found in PATH." >&2 + exit 1 +fi + +prompt_for_overwrite() { + local reply="" + + if [[ "$overwrite_mode" != "ask" ]]; then + return 0 + fi + + if [[ ! -t 0 ]]; then + echo "A conflicting file needs overwrite confirmation, but stdin is not interactive." >&2 + echo "Re-run with --overwrite to replace differing files automatically." >&2 + exit 1 + fi + + while true; do + read -r -p "Overwrite differing existing files for this run? [y/N] " reply + + case "$reply" in + [yY]|[yY][eE][sS]) + overwrite_mode="yes" + return 0 + ;; + ""|[nN]|[nN][oO]) + overwrite_mode="no" + return 0 + ;; + *) + echo "Please answer y or n." >&2 + ;; + esac + done +} + +file_hash() { + local path="$1" + sha256sum "$path" | awk '{print $1}' +} + +copy_overlay_entry() { + local source_path="$1" + local source_root="$2" + local artifact_base="$3" + local relative_path="${source_path#"$source_root"/}" + local target_path="${workspace_root%/}/${relative_path}" + local target_parent + + target_parent="$(dirname "$target_path")" + mkdir -p "$target_parent" + + if [[ -L "$source_path" ]]; then + local source_link + source_link="$(readlink "$source_path")" + + if [[ -L "$target_path" && "$(readlink "$target_path")" == "$source_link" ]]; then + echo "Skipping identical symlink ${relative_path}" + skipped_match_count=$((skipped_match_count + 1)) + return 0 + fi + + if [[ -e "$target_path" || -L "$target_path" ]]; then + prompt_for_overwrite + + if [[ "$overwrite_mode" != "yes" ]]; then + echo "Skipping conflicting symlink ${relative_path}" + skipped_conflict_count=$((skipped_conflict_count + 1)) + return 0 + fi + + rm -rf "$target_path" + fi + + cp -a "$source_path" "$target_path" + echo "Overlayed ${relative_path} from ${artifact_base}" + copied_count=$((copied_count + 1)) + return 0 + fi + + if [[ ! -f "$source_path" ]]; then + return 0 + fi + + if [[ -f "$target_path" && ! -L "$target_path" ]]; then + if [[ "$(file_hash "$source_path")" == "$(file_hash "$target_path")" ]]; then + echo "Skipping identical file ${relative_path}" + skipped_match_count=$((skipped_match_count + 1)) + return 0 + fi + + prompt_for_overwrite + + if [[ "$overwrite_mode" != "yes" ]]; then + echo "Skipping changed file ${relative_path}" + skipped_conflict_count=$((skipped_conflict_count + 1)) + return 0 + fi + elif [[ -e "$target_path" || -L "$target_path" ]]; then + prompt_for_overwrite + + if [[ "$overwrite_mode" != "yes" ]]; then + echo "Skipping conflicting file ${relative_path}" + skipped_conflict_count=$((skipped_conflict_count + 1)) + return 0 + fi + fi + + if [[ -e "$target_path" || -L "$target_path" ]]; then + rm -rf "$target_path" + fi + + cp -a "$source_path" "$target_path" + echo "Overlayed ${relative_path} from ${artifact_base}" + copied_count=$((copied_count + 1)) +} + +download_mode="name" +download_selector="" +run_label="" + +if [[ -n "$artifact_name" ]]; then + download_selector="$artifact_name" + run_label="$artifact_name" +elif [[ "$artifact_family" == "compressed" ]]; then + download_selector="php-compressed-${lib_type}" + run_label="$download_selector" +else + if [[ -n "$php_version" ]]; then + download_selector="php-uncompressed-${php_version}-${lib_type}" + run_label="$download_selector" + else + download_mode="pattern" + download_selector="php-uncompressed-*-${lib_type}" + run_label="php-uncompressed-all-${lib_type}" + fi +fi + +run_root="${tmp_root%/}/${run_label}-run-${run_id}" +archive_dir="${run_root}/artifact" +extract_dir="${run_root}/extract" +overlay_count=0 +copied_count=0 +skipped_match_count=0 +skipped_conflict_count=0 + +rm -rf "$run_root" +mkdir -p "$archive_dir" "$extract_dir" + +echo "Downloading ${download_selector} from ${repo_slug} run ${run_id}..." + +if [[ "$download_mode" == "pattern" ]]; then + gh run download "$run_id" \ + -R "$repo_slug" \ + -p "$download_selector" \ + -D "$archive_dir" +else + gh run download "$run_id" \ + -R "$repo_slug" \ + -n "$download_selector" \ + -D "$archive_dir" +fi + +mapfile -t tarballs < <(find "$archive_dir" -type f -name '*.tar.gz' | sort) + +if [[ "${#tarballs[@]}" -eq 0 ]]; then + echo "No artifact tarballs were downloaded for selector: ${download_selector}" >&2 + exit 1 +fi + +for tarball in "${tarballs[@]}"; do + artifact_base="$(basename "$tarball" .tar.gz)" + artifact_extract_dir="${extract_dir}/${artifact_base}" + + mkdir -p "$artifact_extract_dir" + + echo "Extracting ${tarball} into ${artifact_extract_dir}..." + tar -xzf "$tarball" -C "$artifact_extract_dir" + + for path in packages; do + source_dir="${artifact_extract_dir}/${path}" + + if [[ ! -d "$source_dir" ]]; then + continue + fi + + mkdir -p "${workspace_root%/}/${path}" + overlay_count=$((overlay_count + 1)) + + while IFS= read -r -d '' directory_path; do + relative_path="${directory_path#"$artifact_extract_dir"/}" + mkdir -p "${workspace_root%/}/${relative_path}" + done < <(find "$source_dir" -mindepth 1 -type d -print0 | sort -z) + + while IFS= read -r -d '' entry_path; do + copy_overlay_entry "$entry_path" "$artifact_extract_dir" "$artifact_base" + done < <(find "$source_dir" -mindepth 1 \( -type f -o -type l \) -print0 | sort -z) + done +done + +if [[ "$overlay_count" -eq 0 ]]; then + echo "No overlayable directories were found for ${download_selector}." >&2 + echo "Expected: packages" >&2 + exit 1 +fi + +echo "Overlay complete from ${download_selector} into ${workspace_root}" +echo "Copied: ${copied_count}; skipped identical: ${skipped_match_count}; skipped conflicts: ${skipped_conflict_count}" diff --git a/package-lock.json b/package-lock.json index 1d71114bd..31aa89a50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "php-wasm-builder", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "php-wasm-builder", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "license": "Apache-2.0", "workspaces": [ "packages/dom", @@ -27,6 +27,8 @@ "packages/vrzno", "packages/waitline", "packages/xml", + "packages/xmlreader", + "packages/xmlwriter", "packages/zlib", "packages/sdl" ], @@ -36,35 +38,45 @@ "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/preset-env": "^7.0.0", "ansi-to-html": "^0.7.2", - "cv3-test": "^0.1.8", "pdo-cfd1": "./packages/pdo-cfd1", "pdo-pglite": "./packages/pdo-pglite", "php-cgi-wasm": "./packages/php-cgi-wasm", "php-cli-wasm": "./packages/php-cli-wasm", "php-dbg-wasm": "./packages/php-dbg-wasm", "php-wasm": "./packages/php-wasm", - "php-wasm-dom": "./packages/php-wasm-dom", - "php-wasm-gd": "./packages/php-wasm-gd", - "php-wasm-iconv": "./packages/php-wasm-iconv", - "php-wasm-intl": "./packages/php-wasm-intl", - "php-wasm-libxml": "./packages/php-wasm-libxml", - "php-wasm-libzip": "./packages/php-wasm-libzip", - "php-wasm-mbstring": "./packages/php-wasm-mbstring", - "php-wasm-openssl": "./packages/php-wasm-openssl", - "php-wasm-phar": "./packages/php-wasm-phar", - "php-wasm-sdl": "./packages/php-wasm-sdl", - "php-wasm-simplexml": "./packages/php-wasm-simplexml", - "php-wasm-sqlite": "./packages/php-wasm-sqlite", - "php-wasm-tidy": "./packages/php-wasm-tidy", - "php-wasm-xml": "./packages/php-wasm-xml", - "php-wasm-yaml": "./packages/php-wasm-yaml", - "php-wasm-zlib": "./packages/php-wasm-zlib", - "pobot": "^0.1.5", + "php-wasm-dom": "./packages/dom", + "php-wasm-gd": "./packages/gd", + "php-wasm-iconv": "./packages/iconv", + "php-wasm-intl": "./packages/intl", + "php-wasm-libxml": "./packages/libxml", + "php-wasm-libzip": "./packages/libzip", + "php-wasm-mbstring": "./packages/mbstring", + "php-wasm-openssl": "./packages/openssl", + "php-wasm-phar": "./packages/phar", + "php-wasm-sdl": "./packages/sdl", + "php-wasm-simplexml": "./packages/simplexml", + "php-wasm-sqlite": "./packages/sqlite", + "php-wasm-tidy": "./packages/tidy", + "php-wasm-xml": "./packages/xml", + "php-wasm-xmlreader": "./packages/xmlreader", + "php-wasm-xmlwriter": "./packages/xmlwriter", + "php-wasm-yaml": "./packages/libyaml", + "php-wasm-zlib": "./packages/zlib", "vrzno": "./packages/vrzno", "waitline": "./packages/waitline" }, "bin": { "php-wasm-builder": "bin/php-wasm-builder.js" + }, + "devDependencies": { + "@playwright/test": "^1.55.0", + "@types/node": "^24.8.0", + "eslint": "^10.2.1", + "eslint-plugin-jsdoc": "^62.9.0", + "globals": "^17.5.0", + "jsdoc": "^4.0.5", + "sm-no-saccade-style": "^0.1.1", + "typescript": "^6.0.3" } }, "node_modules/@ampproject/remapping": { @@ -719,6 +731,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", @@ -1455,6 +1476,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", @@ -1474,6 +1504,245 @@ "integrity": "sha512-CeCsbtVqccz0MDlEeT6p4xfgKMpq3GvGTKkswuZ2Vv4r40ZQlE0byl3QNpXcpiTxfye+VFt9RZ+lSL+Wq+jhLQ==", "optional": true }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz", + "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.58.0", + "comment-parser": "1.4.6", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -1517,130 +1786,566 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdoc/salty": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.12.tgz", + "integrity": "sha512-TuB0x50EoAvEX/UEWITd8Mkn3WhiTjSvbTMCLj0BhsQEl5iUzjXdA0bETEVpTk+5TGTLR6QktI9H4hLviVeaAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.18.1" + }, + "engines": { + "node": ">=v12.0.0" + } + }, "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/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "undici-types": "~6.19.2" + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" } }, - "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" - }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-to-html": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "node_modules/@stylistic/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", + "dev": true, + "license": "MIT", "dependencies": { - "entities": "^2.2.0" + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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, + "node_modules/@stylistic/eslint-plugin/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" + "undici-types": "~7.16.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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/@typescript-eslint/tsconfig-utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "optional": true, + "node_modules/@typescript-eslint/types": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "optional": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "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/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/ansi-to-html": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "dependencies": { + "entities": "^2.2.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "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, + "license": "Python-2.0" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/browserslist": { @@ -1693,6 +2398,19 @@ } ] }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1730,51 +2448,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chrome-launcher": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", - "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-launcher/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chrome-remote-interface": { - "version": "0.33.2", - "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.2.tgz", - "integrity": "sha512-wvm9cOeBTrb218EC+6DteGt92iXr2iY0+XJP30f15JVDhqvWvJEVACh9GvUm8b9Yd8bxQivaLSb8k7mgrbyomQ==", - "dependencies": { - "commander": "2.11.x", - "ws": "^7.2.0" - }, - "bin": { - "chrome-remote-interface": "bin/client.js" - } - }, - "node_modules/chrome-remote-interface/node_modules/commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1796,6 +2469,16 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", + "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1818,21 +2501,26 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/cv3-test": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/cv3-test/-/cv3-test-0.1.8.tgz", - "integrity": "sha512-RJRj49DHm/KDioAfUV1oHe31tdAj/FmHZWhYspIdiopk9aOxJCBjDbpDsDNazJUGoDTnIKXDHger3P0wLjdAfQ==", - "bin": { - "cvtest": "bin/cvtest.mjs" + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "optionalDependencies": { - "pobot": "^0.1.4" + "engines": { + "node": ">= 8" } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1845,6 +2533,13 @@ } } }, + "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, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.35", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz", @@ -1874,6 +2569,268 @@ "node": ">=0.8.0" } }, + "node_modules/eslint": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "62.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz", + "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.86.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.6", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.4", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "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, + "license": "MIT", + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1882,6 +2839,40 @@ "node": ">=0.10.0" } }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1894,6 +2885,44 @@ "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -1966,13 +2995,25 @@ } }, "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==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "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, + "license": "ISC" + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1992,6 +3033,43 @@ "node": ">= 0.4" } }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2033,25 +3111,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "optional": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -2060,7 +3124,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "optional": true, + "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2077,22 +3141,78 @@ "node": ">=0.12.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, "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/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", + "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -2104,38 +3224,104 @@ "node": ">=6" } }, - "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" + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" + "uc.micro": "^2.0.0" } }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -2170,10 +3356,67 @@ "semver": "bin/semver" } }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", @@ -2186,11 +3429,31 @@ "node": "*" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "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==" }, + "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, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -2205,6 +3468,13 @@ "node": ">=0.10.0" } }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true, + "license": "MIT" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2213,6 +3483,83 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "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.5" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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", @@ -2221,6 +3568,16 @@ "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2306,6 +3663,14 @@ "resolved": "packages/xml", "link": true }, + "node_modules/php-wasm-xmlreader": { + "resolved": "packages/xmlreader", + "link": true + }, + "node_modules/php-wasm-xmlwriter": { + "resolved": "packages/xmlwriter", + "link": true + }, "node_modules/php-wasm-yaml": { "resolved": "packages/libyaml", "link": true @@ -2339,16 +3704,81 @@ "node": ">=6" } }, - "node_modules/pobot": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/pobot/-/pobot-0.1.5.tgz", - "integrity": "sha512-ys8LqH3vDFvg0+/zFSWTxKLCiOf6LecNeRTe8o28gnIDT/v7zq2J7IIHmrKeH75B1AVZBTB+dp1UF3J96Jdiaw==", + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "chrome-launcher": "^1.1.2", - "chrome-remote-interface": "^0.33.2" + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true, + "license": "Apache-2.0", "bin": { - "pobot": "bin/pobot.mjs" + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/readdirp": { @@ -2424,6 +3854,29 @@ "regjsparser": "bin/parser" } }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -2448,6 +3901,29 @@ "semver": "bin/semver.js" } }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -2456,6 +3932,55 @@ "node": ">=6" } }, + "node_modules/sm-no-saccade-style": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sm-no-saccade-style/-/sm-no-saccade-style-0.1.1.tgz", + "integrity": "sha512-oZkNiX437kNkAk1CiiyCpgPMdSiBaXOpXSAmaZKCbuq+RXXKB44WFnhkzrQ4EVE4N57BT0f5rQKZlI0SrJaISg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stylistic/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^8.46.2" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "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, + "license": "MIT", + "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", @@ -2478,6 +4003,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2498,10 +4071,83 @@ "node": ">=8.0" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", @@ -2568,6 +4214,16 @@ "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/vrzno": { "resolved": "packages/vrzno", "link": true @@ -2576,130 +4232,170 @@ "resolved": "packages/waitline", "link": true }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "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": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true, + "license": "Apache-2.0" }, "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/dom": { "name": "php-wasm-dom", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/gd": { "name": "php-wasm-gd", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/iconv": { "name": "php-wasm-iconv", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/intl": { "name": "php-wasm-intl", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/libxml": { "name": "php-wasm-libxml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/libyaml": { "name": "php-wasm-yaml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/libzip": { "name": "php-wasm-libzip", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/mbstring": { "name": "php-wasm-mbstring", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/openssl": { "name": "php-wasm-openssl", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/pdo-cfd1": { - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/pdo-pglite": { - "version": "0.0.9-alpha-33", + "version": "0.1.0", "optionalDependencies": { "@electric-sql/pglite": "^0.2.7" } }, "packages/phar": { "name": "php-wasm-phar", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/php-cgi-wasm": { - "version": "0.0.9-alpha-33", - "license": "Apache-2.0" + "version": "0.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=24.5.0" + } }, "packages/php-cli-wasm": { - "version": "0.0.9-alpha-32", + "version": "0.1.0", "license": "Apache-2.0" }, "packages/php-dbg-wasm": { - "version": "0.0.9-alpha-33", - "license": "Apache-2.0" + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "php-wasm": "^0.1.0" + } }, "packages/php-wasm": { - "version": "0.0.9-alpha-33", + "version": "0.1.0", "license": "Apache-2.0" }, "packages/sdl": { "name": "php-wasm-sdl", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/simplexml": { "name": "php-wasm-simplexml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/sqlite": { "name": "php-wasm-sqlite", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/tidy": { "name": "php-wasm-tidy", - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/vrzno": { - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/waitline": { - "version": "0.0.9-alpha-33" + "version": "0.1.0" }, "packages/xml": { "name": "php-wasm-xml", - "version": "0.0.9-alpha-33" + "version": "0.1.0" + }, + "packages/xmlreader": { + "name": "php-wasm-xmlreader", + "version": "0.1.0" + }, + "packages/xmlwriter": { + "name": "php-wasm-xmlwriter", + "version": "0.1.0" }, "packages/zlib": { "name": "php-wasm-zlib", - "version": "0.0.9-alpha-33" + "version": "0.1.0" } } } diff --git a/package.json b/package.json index 800db6344..b6b77fb49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "php-wasm-builder", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "description": "Builds php-wasm, php-cgi-wasm & dependencies.", "repository": "https://github.com/seanmorris/php-wasm", "author": "Sean Morris", @@ -12,7 +12,15 @@ "build": "make", "build-image": "make image", "clean": "make clean", - "test": "make test" + "lint": "eslint source/ packages/ test/", + "lint:fix": "eslint source/ packages/ test/ --fix", + "test:browser": "playwright test -c playwright.config.mjs", + "tsc": "tsc -p jsconfig.json --noEmit", + "test": "make test", + "test:packaging": "node --test test/packaging.test.mjs", + "test:docs": "node --test test/docs.test.mjs", + "test:docs-cgi": "node --test test/docs-cgi.test.mjs", + "docs:coverage": "node ./bin/docs-snippet-report.js" }, "dependencies": { "@babel/cli": "^7.8.4", @@ -20,30 +28,30 @@ "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/preset-env": "^7.0.0", "ansi-to-html": "^0.7.2", - "cv3-test": "^0.1.8", "pdo-cfd1": "./packages/pdo-cfd1", "pdo-pglite": "./packages/pdo-pglite", "php-cgi-wasm": "./packages/php-cgi-wasm", "php-cli-wasm": "./packages/php-cli-wasm", "php-dbg-wasm": "./packages/php-dbg-wasm", "php-wasm": "./packages/php-wasm", - "php-wasm-dom": "./packages/php-wasm-dom", - "php-wasm-gd": "./packages/php-wasm-gd", - "php-wasm-iconv": "./packages/php-wasm-iconv", - "php-wasm-intl": "./packages/php-wasm-intl", - "php-wasm-libxml": "./packages/php-wasm-libxml", - "php-wasm-libzip": "./packages/php-wasm-libzip", - "php-wasm-mbstring": "./packages/php-wasm-mbstring", - "php-wasm-openssl": "./packages/php-wasm-openssl", - "php-wasm-phar": "./packages/php-wasm-phar", - "php-wasm-sdl": "./packages/php-wasm-sdl", - "php-wasm-simplexml": "./packages/php-wasm-simplexml", - "php-wasm-sqlite": "./packages/php-wasm-sqlite", - "php-wasm-tidy": "./packages/php-wasm-tidy", - "php-wasm-xml": "./packages/php-wasm-xml", - "php-wasm-yaml": "./packages/php-wasm-yaml", - "php-wasm-zlib": "./packages/php-wasm-zlib", - "pobot": "^0.1.5", + "php-wasm-dom": "./packages/dom", + "php-wasm-gd": "./packages/gd", + "php-wasm-iconv": "./packages/iconv", + "php-wasm-intl": "./packages/intl", + "php-wasm-libxml": "./packages/libxml", + "php-wasm-libzip": "./packages/libzip", + "php-wasm-mbstring": "./packages/mbstring", + "php-wasm-openssl": "./packages/openssl", + "php-wasm-phar": "./packages/phar", + "php-wasm-sdl": "./packages/sdl", + "php-wasm-simplexml": "./packages/simplexml", + "php-wasm-sqlite": "./packages/sqlite", + "php-wasm-tidy": "./packages/tidy", + "php-wasm-xml": "./packages/xml", + "php-wasm-xmlreader": "./packages/xmlreader", + "php-wasm-xmlwriter": "./packages/xmlwriter", + "php-wasm-yaml": "./packages/libyaml", + "php-wasm-zlib": "./packages/zlib", "vrzno": "./packages/vrzno", "waitline": "./packages/waitline" }, @@ -66,6 +74,8 @@ "packages/vrzno", "packages/waitline", "packages/xml", + "packages/xmlreader", + "packages/xmlwriter", "packages/zlib", "packages/sdl" ], @@ -85,5 +95,15 @@ "wasm", "php-wasm", "vrzno" - ] + ], + "devDependencies": { + "@types/node": "^24.8.0", + "@playwright/test": "^1.55.0", + "eslint": "^10.2.1", + "eslint-plugin-jsdoc": "^62.9.0", + "globals": "^17.5.0", + "jsdoc": "^4.0.5", + "sm-no-saccade-style": "^0.1.1", + "typescript": "^6.0.3" + } } diff --git a/packages/dom/8.0.mjs b/packages/dom/8.0.mjs index f27cb887e..7c1d4dbb7 100644 --- a/packages/dom/8.0.mjs +++ b/packages/dom/8.0.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-dom.so', url: new URL('./php8.0-dom.so', import.meta.url).href, ini} + {name: 'php8.0-dom.so', url: new URL('./php8.0-dom.so', import.meta.url).href, ini} ]; export default {getLibs}; diff --git a/packages/dom/8.1.mjs b/packages/dom/8.1.mjs index 22692ba55..841ce31d5 100644 --- a/packages/dom/8.1.mjs +++ b/packages/dom/8.1.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-dom.so', url: new URL('./php8.1-dom.so', import.meta.url).href, ini} + {name: 'php8.1-dom.so', url: new URL('./php8.1-dom.so', import.meta.url).href, ini} ]; export default {getLibs}; diff --git a/packages/dom/8.2.mjs b/packages/dom/8.2.mjs index 7701f761f..f13485585 100644 --- a/packages/dom/8.2.mjs +++ b/packages/dom/8.2.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-dom.so', url: new URL('./php8.2-dom.so', import.meta.url).href, ini} + {name: 'php8.2-dom.so', url: new URL('./php8.2-dom.so', import.meta.url).href, ini} ]; export default {getLibs}; diff --git a/packages/dom/8.3.mjs b/packages/dom/8.3.mjs index b6f323fce..ccd98816b 100644 --- a/packages/dom/8.3.mjs +++ b/packages/dom/8.3.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-dom.so', url: new URL('./php8.3-dom.so', import.meta.url).href, ini} + {name: 'php8.3-dom.so', url: new URL('./php8.3-dom.so', import.meta.url).href, ini} ]; export default {getLibs}; diff --git a/packages/dom/8.4.mjs b/packages/dom/8.4.mjs index 8ebd3c55c..a5124b3cf 100644 --- a/packages/dom/8.4.mjs +++ b/packages/dom/8.4.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-dom.so', url: new URL('./php8.4-dom.so', import.meta.url).href, ini} + {name: 'php8.4-dom.so', url: new URL('./php8.4-dom.so', import.meta.url).href, ini} ]; export default {getLibs}; diff --git a/packages/dom/8.5.mjs b/packages/dom/8.5.mjs new file mode 100644 index 000000000..b3ded2a49 --- /dev/null +++ b/packages/dom/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-dom.so', url: new URL('./php8.5-dom.so', import.meta.url).href, ini} +]; + +export default {getLibs}; diff --git a/packages/dom/README.md b/packages/dom/README.md index fe8bbd604..e7b38b2ed 100644 --- a/packages/dom/README.md +++ b/packages/dom/README.md @@ -1,45 +1,39 @@ # php-wasm-dom -dom extension for php-wasm +`php-wasm-dom` provides the `dom` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-dom` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-dom') -]}); +```sh +npm install php-wasm php-wasm-libxml php-wasm-dom ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-dom.so']}); -``` +The package resolves the active runtime version to `php8.x-dom.so`. +Load `php-wasm-libxml` alongside it when you are using DOM as a shared or dynamic extension. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-dom.so']}); -``` +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import dom from 'php-wasm-dom'; -## Build options: +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, dom], +}); -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +await php.run(` PhpSharedLibrary[]; + getFiles?: () => PhpPreloadFile[]; +} + +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; + +declare const _default: { + getLibs: typeof getLibs; +}; + +export default _default; diff --git a/packages/dom/index.mjs b/packages/dom/index.mjs index 0a5c1b1b9..295a15efe 100644 --- a/packages/dom/index.mjs +++ b/packages/dom/index.mjs @@ -1,17 +1,24 @@ +import dom8_5 from './8.5.mjs'; import dom8_4 from './8.4.mjs'; -import dom8_3 from './8.3.mjs'; -import dom8_2 from './8.2.mjs'; -import dom8_1 from './8.1.mjs'; -import dom8_0 from './8.0.mjs'; +import dom8_3 from './8.3.mjs'; +import dom8_2 from './8.2.mjs'; +import dom8_1 from './8.1.mjs'; +import dom8_0 from './8.0.mjs'; const versionTable = { - '8.4': dom8_4, - '8.3': dom8_3, - '8.2': dom8_2, - '8.1': dom8_1, - '8.0': dom8_0, + '8.5': dom8_5 + , '8.4': dom8_4 + , '8.3': dom8_3 + , '8.2': dom8_2 + , '8.1': dom8_1 + , '8.0': dom8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/dom/package.json b/packages/dom/package.json index 822075817..4a8121c07 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -6,18 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "php8.3-dom.so", - "php8.2-dom.so", - "php8.1-dom.so", - "php8.0-dom.so" + "*.so" ] } diff --git a/packages/dom/static.mak b/packages/dom/static.mak index 3aade00b3..7e7962411 100644 --- a/packages/dom/static.mak +++ b/packages/dom/static.mak @@ -18,7 +18,6 @@ $(error WITH_DOM=static REQUIRES WITH_LIBXML=static. WITH_LIBXML: '${WITH_LIBXML endif CONFIGURE_FLAGS+= --enable-dom TEST_LIST+=$(shell ls packages/dom/test/*.mjs) -EXTRA_MODULES+= packages/dom/php${PHP_VERSION}-dom.so endif ifeq (${WITH_DOM},dynamic) @@ -31,7 +30,6 @@ endif third_party/php${PHP_VERSION}-dom/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/dom /src/third_party/php${PHP_VERSION}-dom - ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-dom/config.m4 packages/dom/php${PHP_VERSION}-dom.so: ${PHPIZE} third_party/php${PHP_VERSION}-dom/config.m4 ${DOCKER_RUN_IN_EXT_DOM} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; @@ -40,8 +38,9 @@ packages/dom/php${PHP_VERSION}-dom.so: ${PHPIZE} third_party/php${PHP_VERSION}-d ${DOCKER_RUN_IN_EXT_DOM} emconfigure ./configure PKG_CONFIG_PATH=${PKG_CONFIG_PATH} --prefix='/src/lib/php${PHP_VERSION}' --with-php-config=/src/lib/php${PHP_VERSION}/bin/php-config; ${DOCKER_RUN_IN_EXT_DOM} sed -i 's#-shared#-static#g' Makefile; ${DOCKER_RUN_IN_EXT_DOM} sed -i 's#-export-dynamic##g' Makefile; +ifeq (${PHP_VERSION},8.5) + ${DOCKER_RUN_IN_EXT_DOM} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src -I/src/third_party/php${PHP_VERSION}-src/ext/lexbor'; +else ${DOCKER_RUN_IN_EXT_DOM} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; +endif ${DOCKER_RUN_IN_EXT_DOM} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/dom.a /src/packages/libxml/libxml2.so - -$(addsuffix /php${PHP_VERSION}-dom.so,$(sort ${SHARED_ASSET_PATHS})): packages/dom/php${PHP_VERSION}-dom.so - cp -Lp $^ $@ diff --git a/packages/dom/test/basic.mjs b/packages/dom/test/basic.mjs index 67c610545..46193a02b 100644 --- a/packages/dom/test/basic.mjs +++ b/packages/dom/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import libxml from 'php-wasm-libxml'; @@ -87,4 +87,3 @@ test('DOM Extension is enabled (loaded via async module).', async () => { assert.equal(stdOut, `bool(true)\n`); assert.equal(stdErr, ''); }); - diff --git a/packages/gd/8.0.mjs b/packages/gd/8.0.mjs index ee6b7aec2..2f49cd1c8 100644 --- a/packages/gd/8.0.mjs +++ b/packages/gd/8.0.mjs @@ -2,12 +2,16 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-gd.so', url: new URL('./php8.0-gd.so', import.meta.url), ini}, - {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)}, + {name: 'php8.0-gd.so', url: new URL('./php8.0-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/gd/8.1.mjs b/packages/gd/8.1.mjs index b41941591..f6797a738 100644 --- a/packages/gd/8.1.mjs +++ b/packages/gd/8.1.mjs @@ -2,12 +2,16 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-gd.so', url: new URL('./php8.1-gd.so', import.meta.url), ini}, - {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)}, + {name: 'php8.1-gd.so', url: new URL('./php8.1-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/gd/8.2.mjs b/packages/gd/8.2.mjs index 7b7f5e03a..fd514cb6e 100644 --- a/packages/gd/8.2.mjs +++ b/packages/gd/8.2.mjs @@ -2,12 +2,16 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-gd.so', url: new URL('./php8.2-gd.so', import.meta.url), ini}, - {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)}, + {name: 'php8.2-gd.so', url: new URL('./php8.2-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/gd/8.3.mjs b/packages/gd/8.3.mjs index 859063148..4908b967e 100644 --- a/packages/gd/8.3.mjs +++ b/packages/gd/8.3.mjs @@ -2,12 +2,16 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-gd.so', url: new URL('./php8.3-gd.so', import.meta.url), ini}, - {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)}, + {name: 'php8.3-gd.so', url: new URL('./php8.3-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/gd/8.4.mjs b/packages/gd/8.4.mjs index b0bd5c485..3880bf08f 100644 --- a/packages/gd/8.4.mjs +++ b/packages/gd/8.4.mjs @@ -2,12 +2,16 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-gd.so', url: new URL('./php8.4-gd.so', import.meta.url), ini}, - {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)}, - {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)}, - {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)}, - {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)}, + {name: 'php8.4-gd.so', url: new URL('./php8.4-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/gd/8.5.mjs b/packages/gd/8.5.mjs new file mode 100644 index 000000000..f97ab596a --- /dev/null +++ b/packages/gd/8.5.mjs @@ -0,0 +1,17 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-gd.so', url: new URL('./php8.5-gd.so', import.meta.url), ini} + , {name: 'libfreetype.so', url: new URL('./libfreetype.so', import.meta.url)} + , {name: 'libwebp.so', url: new URL('./libwebp.so', import.meta.url)} + , {name: 'libjpeg.so', url: new URL('./libjpeg.so', import.meta.url)} + , {name: 'libpng.so', url: new URL('./libpng.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/gd/README.md b/packages/gd/README.md index cbe34ee8e..6064dab4a 100644 --- a/packages/gd/README.md +++ b/packages/gd/README.md @@ -1,74 +1,40 @@ # php-wasm-gd -gd for php-wasm +`php-wasm-gd` provides the `gd` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-gd` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-gd') -]}); +```sh +npm install php-wasm php-wasm-zlib php-wasm-gd ``` -The supporting libraries `libfreetype.so`, `libjpeg.so`, and `libpng.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-gd.so` and bundles `libfreetype.so`, `libjpeg.so`, `libpng.so`, and `libwebp.so`. +Load `php-wasm-zlib` alongside it because GD depends on `libz.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-gd.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import zlib from 'php-wasm-zlib'; +import gd from 'php-wasm-gd'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [zlib, gd], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-gd.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/gd/index.mjs b/packages/gd/index.mjs index 495485854..6b34ee9aa 100644 --- a/packages/gd/index.mjs +++ b/packages/gd/index.mjs @@ -1,17 +1,24 @@ +import gd8_5 from './8.5.mjs'; import gd8_4 from './8.4.mjs'; -import gd8_3 from './8.3.mjs'; -import gd8_2 from './8.2.mjs'; -import gd8_1 from './8.1.mjs'; -import gd8_0 from './8.0.mjs'; +import gd8_3 from './8.3.mjs'; +import gd8_2 from './8.2.mjs'; +import gd8_1 from './8.1.mjs'; +import gd8_0 from './8.0.mjs'; const versionTable = { - '8.4': gd8_4, - '8.3': gd8_3, - '8.2': gd8_2, - '8.1': gd8_1, - '8.0': gd8_0, + '8.5': gd8_5 + , '8.4': gd8_4 + , '8.3': gd8_3 + , '8.2': gd8_2 + , '8.1': gd8_1 + , '8.0': gd8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/gd/package.json b/packages/gd/package.json index 5febadd3f..f5aea5c4d 100644 --- a/packages/gd/package.json +++ b/packages/gd/package.json @@ -6,23 +6,18 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", "webp.mak", - "libfreetype.so", - "libjpeg.so", - "libpng.so", - "libwebp.so", - "php8.3-gd.so", - "php8.2-gd.so", - "php8.1-gd.so", - "php8.0-gd.so" + "*.so" ] } diff --git a/packages/gd/static.mak b/packages/gd/static.mak index 9cc059eb3..57670b459 100644 --- a/packages/gd/static.mak +++ b/packages/gd/static.mak @@ -18,7 +18,6 @@ ifeq (${WITH_GD}, static) CONFIGURE_FLAGS+= --enable-gd ${GD_FLAGS} PHP_CONFIGURE_DEPS+= ${GD_LIBS} TEST_LIST+= $(shell ls packages/gd/test/*.mjs) -EXTRA_MODULES+= packages/gd/php${PHP_VERSION}-gd.so endif ifeq (${WITH_GD}, dynamic) @@ -36,7 +35,6 @@ GD_FLAGS+= --with-freetype=/src/lib GD_LIBS+= packages/gd/libfreetype.so ifeq (${WITH_GD}, static) SHARED_LIBS+= packages/gd/libfreetype.so -PHP_ASSET_LIST+= libfreetype.so else ifeq (${WITH_GD}, dynamic) DYNAMIC_LIBS+= packages/gd/libfreetype.so endif @@ -47,7 +45,6 @@ GD_FLAGS+= --with-jpeg=/src/lib GD_LIBS+= packages/gd/libjpeg.so ifeq (${WITH_GD}, static) SHARED_LIBS+= packages/gd/libjpeg.so -PHP_ASSET_LIST+= libjpeg.so else ifeq (${WITH_GD}, dynamic) DYNAMIC_LIBS+= packages/gd/libjpeg.so endif @@ -57,7 +54,6 @@ ifeq (${WITH_LIBPNG},shared) GD_LIBS+= packages/gd/libpng.so ifeq (${WITH_GD}, static) SHARED_LIBS+= packages/gd/libpng.so -PHP_ASSET_LIST+= libpng.so else ifeq (${WITH_GD}, dynamic) DYNAMIC_LIBS+= packages/gd/libpng.so endif @@ -68,7 +64,6 @@ GD_FLAGS+= --with-webp=/src/lib GD_LIBS+= packages/gd/libwebp.so ifeq (${WITH_GD}, static) SHARED_LIBS+= packages/gd/libwebp.so -PHP_ASSET_LIST+= libwebp.so else ifeq (${WITH_GD}, dynamic) DYNAMIC_LIBS+= packages/gd/libwebp.so endif @@ -194,12 +189,9 @@ packages/gd/php${PHP_VERSION}-gd.so: ${PHPIZE} third_party/php${PHP_VERSION}-gd/ ${DOCKER_RUN_IN_EXT_GD} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_GD} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/gd.a $(addprefix /src/,${GD_LIBS}) -$(addsuffix /php${PHP_VERSION}-gd.so,$(sort ${SHARED_ASSET_PATHS})): packages/gd/php${PHP_VERSION}-gd.so - cp -Lp $^ $@ - third_party/freetype-${FREETYPE_VERSION}/README: @ echo -e "\e[33;4mDownloading FREETYPE\e[0m" - ${DOCKER_RUN} wget -q https://download-mirror.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://download-mirror.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz ${DOCKER_RUN} tar -xvzf freetype-${FREETYPE_VERSION}.tar.gz -C third_party ${DOCKER_RUN} rm freetype-${FREETYPE_VERSION}.tar.gz @@ -221,14 +213,11 @@ lib/lib/libfreetype.so: lib/lib/libfreetype.a lib/lib/libpng.so lib/lib/libz.a packages/gd/libfreetype.so: lib/lib/libfreetype.so cp -Lp $^ $@ -$(addsuffix /libfreetype.so,$(sort ${SHARED_ASSET_PATHS})): packages/gd/libfreetype.so - cp -Lp $^ $@ - third_party/jpeg-9f/README: @ echo -e "\e[33;4mDownloading LIBJPEG\e[0m" - ${DOCKER_RUN} wget -q https://ijg.org/files/jpegsrc.${JPEG_VERSION}.tar.gz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://ijg.org/files/jpegsrc.${JPEG_VERSION}.tar.gz ${DOCKER_RUN} tar -xvzf jpegsrc.${JPEG_VERSION}.tar.gz -C third_party ${DOCKER_RUN} rm jpegsrc.${JPEG_VERSION}.tar.gz @@ -244,9 +233,6 @@ lib/lib/libjpeg.so: lib/lib/libjpeg.a packages/gd/libjpeg.so: lib/lib/libjpeg.so cp -rL $^ $@ -$(addsuffix /libjpeg.so,$(sort ${SHARED_ASSET_PATHS})): packages/gd/libjpeg.so - cp -Lp $^ $@ - third_party/libpng/.gitignore: @@ -284,13 +270,10 @@ lib/lib/libpng.so: third_party/libpng/.gitignore lib/lib/libz.so packages/gd/libpng.so: lib/lib/libpng.so cp -rL $^ $@ -$(addsuffix /libpng.so,$(sort ${SHARED_ASSET_PATHS})): packages/gd/libpng.so - cp -Lp $^ $@ - third_party/libwebp-${LIBWEBP_TAG}/README.md: @ echo -e "\e[33;4mDownloading LIBWEBP\e[0m" - ${DOCKER_RUN} wget -q https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${LIBWEBP_TAG}.tar.gz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${LIBWEBP_TAG}.tar.gz ${DOCKER_RUN} tar -xvzf libwebp-${LIBWEBP_TAG}.tar.gz -C third_party ${DOCKER_RUN} rm libwebp-${LIBWEBP_TAG}.tar.gz @@ -306,6 +289,3 @@ lib/lib/libwebp.a: third_party/libwebp-${LIBWEBP_TAG}/README.md packages/gd/libwebp.so: lib/lib/libwebp.so cp -rL $^ $@ - -$(addsuffix /libwebp.so,$(sort ${SHARED_ASSET_PATHS})): packages/gd/libwebp.so - cp -Lp $^ $@ diff --git a/packages/gd/test/basic.mjs b/packages/gd/test/basic.mjs index 8e7fcd077..905826399 100644 --- a/packages/gd/test/basic.mjs +++ b/packages/gd/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import zlib from 'php-wasm-zlib' @@ -174,4 +174,4 @@ test('GD Extension is enabled (dynamic module loader).', async () => { assert.equal(exitCode, 0); assert.equal(stdOut, `bool(true)\n`); assert.equal(stdErr, ''); -}); \ No newline at end of file +}); diff --git a/packages/iconv/8.0.mjs b/packages/iconv/8.0.mjs index 264e962e1..96988cc73 100644 --- a/packages/iconv/8.0.mjs +++ b/packages/iconv/8.0.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-iconv.so', url: new URL('./php8.0-iconv.so', import.meta.url), ini}, - {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)}, + {name: 'php8.0-iconv.so', url: new URL('./php8.0-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/iconv/8.1.mjs b/packages/iconv/8.1.mjs index ad2f62a21..7ffe75162 100644 --- a/packages/iconv/8.1.mjs +++ b/packages/iconv/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-iconv.so', url: new URL('./php8.1-iconv.so', import.meta.url), ini}, - {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)}, + {name: 'php8.1-iconv.so', url: new URL('./php8.1-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/iconv/8.2.mjs b/packages/iconv/8.2.mjs index 355f15907..6d72e0ad7 100644 --- a/packages/iconv/8.2.mjs +++ b/packages/iconv/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-iconv.so', url: new URL('./php8.2-iconv.so', import.meta.url), ini}, - {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)}, + {name: 'php8.2-iconv.so', url: new URL('./php8.2-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/iconv/8.3.mjs b/packages/iconv/8.3.mjs index f8df7daac..efac76c51 100644 --- a/packages/iconv/8.3.mjs +++ b/packages/iconv/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-iconv.so', url: new URL('./php8.3-iconv.so', import.meta.url), ini}, - {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)}, + {name: 'php8.3-iconv.so', url: new URL('./php8.3-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/iconv/8.4.mjs b/packages/iconv/8.4.mjs index 9ee5f0945..ae4da926d 100644 --- a/packages/iconv/8.4.mjs +++ b/packages/iconv/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-iconv.so', url: new URL('./php8.4-iconv.so', import.meta.url), ini}, - {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)}, + {name: 'php8.4-iconv.so', url: new URL('./php8.4-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/iconv/8.5.mjs b/packages/iconv/8.5.mjs new file mode 100644 index 000000000..6a9a666f8 --- /dev/null +++ b/packages/iconv/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-iconv.so', url: new URL('./php8.5-iconv.so', import.meta.url), ini} + , {name: 'libiconv.so', url: new URL('./libiconv.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/iconv/README.md b/packages/iconv/README.md index 5cb57a75c..f6ba22aa7 100644 --- a/packages/iconv/README.md +++ b/packages/iconv/README.md @@ -1,47 +1,35 @@ # php-wasm-iconv -iconv extension for php-wasm +`php-wasm-iconv` provides the `iconv` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-iconv` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-iconv') -]}); +```sh +npm install php-wasm php-wasm-iconv ``` -The supporting library `libiconv.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-iconv.so` and bundles `libiconv.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-iconv.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import iconv from 'php-wasm-iconv'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [iconv], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-iconv.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/iconv/index.mjs b/packages/iconv/index.mjs index 5525d29c8..52f17381c 100644 --- a/packages/iconv/index.mjs +++ b/packages/iconv/index.mjs @@ -1,17 +1,24 @@ +import iconv8_5 from './8.5.mjs'; import iconv8_4 from './8.4.mjs'; import iconv8_3 from './8.3.mjs'; -import iconv8_2 from './8.2.mjs'; -import iconv8_1 from './8.1.mjs'; -import iconv8_0 from './8.0.mjs'; +import iconv8_2 from './8.2.mjs'; +import iconv8_1 from './8.1.mjs'; +import iconv8_0 from './8.0.mjs'; const versionTable = { - '8.4': iconv8_4, - '8.3': iconv8_3, - '8.2': iconv8_2, - '8.1': iconv8_1, - '8.0': iconv8_0, + '8.5': iconv8_5 + , '8.4': iconv8_4 + , '8.3': iconv8_3 + , '8.2': iconv8_2 + , '8.1': iconv8_1 + , '8.0': iconv8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/iconv/package.json b/packages/iconv/package.json index a2a0354ef..5681b1a26 100644 --- a/packages/iconv/package.json +++ b/packages/iconv/package.json @@ -6,19 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libiconv.so", - "php8.3-iconv.so", - "php8.2-iconv.so", - "php8.1-iconv.so", - "php8.0-iconv.so" + "*.so" ] } diff --git a/packages/iconv/static.mak b/packages/iconv/static.mak index 3ac9b231e..6d6fa2f47 100644 --- a/packages/iconv/static.mak +++ b/packages/iconv/static.mak @@ -21,7 +21,7 @@ CONFIGURE_FLAGS+= --with-iconv=/src/lib ARCHIVES+= lib/lib/libiconv.a SKIP_LIBS+= -liconv TEST_LIST+=$(shell ls packages/iconv/test/*.mjs) -EXTRA_MODULES+= packages/iconv/libiconv.so packages/iconv/php${PHP_VERSION}-iconv.so +EXTRA_MODULES+= packages/iconv/libiconv.so endif ifeq (${WITH_ICONV},shared) @@ -30,8 +30,7 @@ PHP_CONFIGURE_DEPS+= packages/iconv/libiconv.so TEST_LIST+=$(shell ls packages/iconv/test/*.mjs) SHARED_LIBS+= packages/iconv/libiconv.so SKIP_LIBS+= -liconv -EXTRA_MODULES+= packages/iconv/libiconv.so packages/iconv/php${PHP_VERSION}-iconv.so -PHP_ASSET_LIST+= libiconv.so +EXTRA_MODULES+= packages/iconv/libiconv.so endif ifeq (${WITH_ICONV},dynamic) @@ -50,7 +49,7 @@ ICONV_URL?=https://mirrors.ocf.berkeley.edu/gnu/libiconv/libiconv-${ICONV_VERSIO third_party/libiconv-1.17/README: @ echo -e "\e[33;4mDownloading Iconv\e[0m" - ${DOCKER_RUN} wget -q ${ICONV_URL} + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q ${ICONV_URL} ${DOCKER_RUN} tar -xvzf libiconv-1.17.tar.gz -C third_party ${DOCKER_RUN} rm libiconv-1.17.tar.gz @@ -67,9 +66,6 @@ lib/lib/libiconv.so: lib/lib/libiconv.a packages/iconv/libiconv.so: lib/lib/libiconv.so cp -Lp $^ $@ -$(addsuffix /libiconv.so,$(sort ${SHARED_ASSET_PATHS})): packages/iconv/libiconv.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-iconv/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/iconv /src/third_party/php${PHP_VERSION}-iconv ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-iconv/config.m4 @@ -83,6 +79,3 @@ packages/iconv/php${PHP_VERSION}-iconv.so: ${PHPIZE} packages/iconv/libiconv.so ${DOCKER_RUN_IN_EXT_ICONV} sed -i 's#-export-dynamic#-all-static#g' Makefile; ${DOCKER_RUN_IN_EXT_ICONV} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_ICONV} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/iconv.a /src/packages/iconv/libiconv.so - -$(addsuffix /php${PHP_VERSION}-iconv.so,$(sort ${SHARED_ASSET_PATHS})): packages/iconv/php${PHP_VERSION}-iconv.so - cp -Lp $^ $@ diff --git a/packages/iconv/test/basic.mjs b/packages/iconv/test/basic.mjs index ef1cbeeb8..faeb1a8ab 100644 --- a/packages/iconv/test/basic.mjs +++ b/packages/iconv/test/basic.mjs @@ -1,12 +1,12 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import iconv from 'php-wasm-iconv'; test('Iconv Extension is enabled. (loaded via strings)', async () => { - const php = env.WITH_INTL === 'dynamic' + const php = env.WITH_ICONV === 'dynamic' ? new PhpNode({sharedLibs:[ { url: `./packages/iconv/libiconv.so` }, `./packages/iconv/php${process.env.PHP_VERSION ?? '8.4'}-iconv.so`, @@ -28,7 +28,7 @@ test('Iconv Extension is enabled. (loaded via strings)', async () => { }); test('Iconv Extension is enabled. (loaded via URL objects)', async () => { - const php = env.WITH_INTL === 'dynamic' + const php = env.WITH_ICONV === 'dynamic' ? new PhpNode({sharedLibs:[ { url: new URL(`../../iconv/libiconv.so`, import.meta.url) }, new URL(`../../iconv/php${process.env.PHP_VERSION ?? '8.4'}-iconv.so`, import.meta.url), @@ -50,7 +50,7 @@ test('Iconv Extension is enabled. (loaded via URL objects)', async () => { }); test('Iconv Extension is enabled (loaded via module).', async () => { - const php = env.WITH_INTL === 'dynamic' + const php = env.WITH_ICONV === 'dynamic' ? new PhpNode({sharedLibs:[iconv]}) : new PhpNode; @@ -69,7 +69,7 @@ test('Iconv Extension is enabled (loaded via module).', async () => { }); test('Iconv Extension is enabled (loaded via async module).', async () => { - const php = env.WITH_INTL === 'dynamic' + const php = env.WITH_ICONV === 'dynamic' ? new PhpNode({sharedLibs:[await import('php-wasm-iconv')]}) : new PhpNode; diff --git a/packages/intl/8.0.mjs b/packages/intl/8.0.mjs index 23dee6508..2d9f3f5d8 100644 --- a/packages/intl/8.0.mjs +++ b/packages/intl/8.0.mjs @@ -2,22 +2,30 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-intl.so', url: new URL('./php8.0-intl.so', import.meta.url), ini}, - {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)}, + {name: 'php8.0-intl.so', url: new URL('./php8.0-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} ]; +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ export const getFiles = () => [ { - name: 'icudt72l.dat', - path: '/preload/icudt72l.dat', - url: new URL('./icudt72l.dat', import.meta.url) - }, + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } ]; export default {getLibs, getFiles}; diff --git a/packages/intl/8.1.mjs b/packages/intl/8.1.mjs index 70fb9c536..fbd3cfa30 100644 --- a/packages/intl/8.1.mjs +++ b/packages/intl/8.1.mjs @@ -2,22 +2,30 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-intl.so', url: new URL('./php8.1-intl.so', import.meta.url), ini}, - {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)}, + {name: 'php8.1-intl.so', url: new URL('./php8.1-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} ]; +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ export const getFiles = () => [ { - name: 'icudt72l.dat', - path: '/preload/icudt72l.dat', - url: new URL('./icudt72l.dat', import.meta.url) - }, + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } ]; export default {getLibs, getFiles}; diff --git a/packages/intl/8.2.mjs b/packages/intl/8.2.mjs index 1407bb59d..d7f253ad0 100644 --- a/packages/intl/8.2.mjs +++ b/packages/intl/8.2.mjs @@ -2,22 +2,30 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-intl.so', url: new URL('./php8.2-intl.so', import.meta.url), ini}, - {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)}, + {name: 'php8.2-intl.so', url: new URL('./php8.2-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} ]; +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ export const getFiles = () => [ { - name: 'icudt72l.dat', - path: '/preload/icudt72l.dat', - url: new URL('./icudt72l.dat', import.meta.url) - }, + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } ]; export default {getLibs, getFiles}; diff --git a/packages/intl/8.3.mjs b/packages/intl/8.3.mjs index 35762c904..aead58da0 100644 --- a/packages/intl/8.3.mjs +++ b/packages/intl/8.3.mjs @@ -2,22 +2,30 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-intl.so', url: new URL('./php8.3-intl.so', import.meta.url), ini}, - {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)}, + {name: 'php8.3-intl.so', url: new URL('./php8.3-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} ]; +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ export const getFiles = () => [ { - name: 'icudt72l.dat', - path: '/preload/icudt72l.dat', - url: new URL('./icudt72l.dat', import.meta.url) - }, + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } ]; export default {getLibs, getFiles}; diff --git a/packages/intl/8.4.mjs b/packages/intl/8.4.mjs index 67ba6a2a1..8c119ad98 100644 --- a/packages/intl/8.4.mjs +++ b/packages/intl/8.4.mjs @@ -2,22 +2,30 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-intl.so', url: new URL('./php8.4-intl.so', import.meta.url), ini}, - {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)}, - {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)}, - {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)}, - {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)}, - {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)}, - {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)}, + {name: 'php8.4-intl.so', url: new URL('./php8.4-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} ]; +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ export const getFiles = () => [ { - name: 'icudt72l.dat', - path: '/preload/icudt72l.dat', - url: new URL('./icudt72l.dat', import.meta.url) - }, + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } ]; export default {getLibs, getFiles}; diff --git a/packages/intl/8.5.mjs b/packages/intl/8.5.mjs new file mode 100644 index 000000000..e00a518fe --- /dev/null +++ b/packages/intl/8.5.mjs @@ -0,0 +1,31 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-intl.so', url: new URL('./php8.5-intl.so', import.meta.url), ini} + , {name: 'libicuuc.so', url: new URL('./libicuuc.so', import.meta.url)} + , {name: 'libicutu.so', url: new URL('./libicutu.so', import.meta.url)} + , {name: 'libicutest.so', url: new URL('./libicutest.so', import.meta.url)} + , {name: 'libicuio.so', url: new URL('./libicuio.so', import.meta.url)} + , {name: 'libicui18n.so', url: new URL('./libicui18n.so', import.meta.url)} + , {name: 'libicudata.so', url: new URL('./libicudata.so', import.meta.url)} +]; + +/** + * Returns preload file definitions for this package build. + * @returns {Array} Preload file definitions for the current package version. + */ +export const getFiles = () => [ + { + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: new URL('./icudt72l.dat', import.meta.url) + } +]; + +export default {getLibs, getFiles}; diff --git a/packages/intl/README.md b/packages/intl/README.md index d29a962eb..406a7ac4a 100644 --- a/packages/intl/README.md +++ b/packages/intl/README.md @@ -1,83 +1,71 @@ # php-wasm-intl -intl extenstion for php-wasm, includes libicu. +`php-wasm-intl` provides the `intl` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-intl` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-intl') -]}); +```sh +npm install php-wasm php-wasm-intl ``` -The following supporting libraries will automatically be pulled from the package: +## What It Loads -* libicuuc.so -* libicutu.so -* libicutest.so -* libicuio.so -* libicui18n.so -* libicudata.so +In dynamic builds, the package resolves the active runtime version to `php8.x-intl.so`, loads the ICU shared libraries, and preloads `icudt72l.dat` into `/preload`. -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +In shared builds, the `intl` extension is already built into the base runtime, so only the ICU `libicu*.so` support libraries and `icudt72l.dat` should be loaded at startup. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-intl.so']}); -``` +In static builds, `icudt72l.dat` is bundled into the runtime `.data` payload. -## Data files +Using the module form is the simplest way to get the right combination for dynamic builds. +Shared runtimes should load only the ICU support libraries and `icudt72l.dat`, not `php8.x-intl.so`. -If you're loading the library manually, you'll need to load `icudt72l.dat` into the `/preload` directory: - -```javascript -const sharedLibs = [`https://unpkg.com/php-wasm-intl/php\${PHP_VERSION}-intl.so`]; - -const files = [ - { - name: 'icudt72l.dat', - parent: '/preload/', - url: 'https://unpkg.com/php-wasm-intl/icudt72l.dat' - } -]; - -const php = new PhpWeb({sharedLibs, files}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import intl from 'php-wasm-intl'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [intl], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-intl.so']}); +await php.run(`format(100.00)); +`); ``` -## Build options: - -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +The example above is a dynamic-build example. -* WITH_INTL +For shared builds, keep the built-in `intl` extension and inject only the ICU support files: -### WITH_INTL +```js +const sharedLibs = [ + { name: 'libicuuc.so', url: 'https://unpkg.com/php-wasm-intl/libicuuc.so' }, + { name: 'libicutu.so', url: 'https://unpkg.com/php-wasm-intl/libicutu.so' }, + { name: 'libicutest.so', url: 'https://unpkg.com/php-wasm-intl/libicutest.so' }, + { name: 'libicuio.so', url: 'https://unpkg.com/php-wasm-intl/libicuio.so' }, + { name: 'libicui18n.so', url: 'https://unpkg.com/php-wasm-intl/libicui18n.so' }, + { name: 'libicudata.so', url: 'https://unpkg.com/php-wasm-intl/libicudata.so' }, +]; -`0|static|shared|dynamic` +const files = [ + { + name: 'icudt72l.dat', + path: '/preload/icudt72l.dat', + url: 'https://unpkg.com/php-wasm-intl/icudt72l.dat' + } +]; +``` -When compiled as a `dynamic`, or `shared` extension, this will produce the extension `php-8.𝑥-intl.so` & the following libraries: +## Custom Builds -* libicuuc.so -* libicutu.so -* libicutest.so -* libicuio.so -* libicui18n.so -* libicudata.so +Enable `WITH_INTL` in `.php-wasm-rc`. -The following data file will also be produced, and should be loaded to the `/preload` directory: +## Build Options -* icudt72l.dat +- `WITH_INTL`: defaults to `dynamic`. Allowed values: `0`, `1`, `static`, `shared`, `dynamic`. +- Dynamic builds emit the extension side-module, ICU side libraries, and the `icudt72l.dat` preload asset. +- Shared builds emit the ICU side libraries and the `icudt72l.dat` preload asset. +- Static builds bundle `icudt72l.dat` into the runtime preload archive. diff --git a/packages/intl/filter.json b/packages/intl/filter.json index ce22b50d3..45eeaeef7 100644 --- a/packages/intl/filter.json +++ b/packages/intl/filter.json @@ -1,9 +1,3 @@ { - "collationUCAData": "implicithan", - "localeFilter": { - "filterType": "locale", - "whitelist": [ - "en_US" - ] - } + "collationUCAData": "implicithan" } diff --git a/packages/intl/index.d.ts b/packages/intl/index.d.ts new file mode 100644 index 000000000..f8a0bd9f4 --- /dev/null +++ b/packages/intl/index.d.ts @@ -0,0 +1,8 @@ +export type PhpRuntimeVersion = '8.0' | '8.1' | '8.2' | '8.3' | '8.4' | '8.5'; +export interface PhpVersionedRuntime { phpVersion?: PhpRuntimeVersion; } +export interface PhpPreloadFile { url: string | URL; path?: string; parent?: string; name?: string; } +export interface PhpSharedLibrary { name?: string; url: string | URL; ini?: boolean; getLibs?: () => PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +export function getFiles(php: PhpVersionedRuntime): PhpPreloadFile[]; +declare const _default: { getLibs: typeof getLibs; getFiles: typeof getFiles }; +export default _default; diff --git a/packages/intl/index.mjs b/packages/intl/index.mjs index 9b8b1ec0b..dd55d4faa 100644 --- a/packages/intl/index.mjs +++ b/packages/intl/index.mjs @@ -1,18 +1,30 @@ +import intl8_5 from './8.5.mjs'; import intl8_4 from './8.4.mjs'; -import intl8_3 from './8.3.mjs'; -import intl8_2 from './8.2.mjs'; -import intl8_1 from './8.1.mjs'; -import intl8_0 from './8.0.mjs'; +import intl8_3 from './8.3.mjs'; +import intl8_2 from './8.2.mjs'; +import intl8_1 from './8.1.mjs'; +import intl8_0 from './8.0.mjs'; const versionTable = { - '8.4': intl8_4, - '8.3': intl8_3, - '8.2': intl8_2, - '8.1': intl8_1, - '8.0': intl8_0, + '8.5': intl8_5 + , '8.4': intl8_4 + , '8.3': intl8_3 + , '8.2': intl8_2 + , '8.1': intl8_1 + , '8.0': intl8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); +/** + * Returns preload file definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Preload file definitions for the active PHP version. + */ export const getFiles = php => versionTable[php.phpVersion].getFiles(); export default { getLibs, getFiles }; diff --git a/packages/intl/package.json b/packages/intl/package.json index 05c4a45e5..b20805953 100644 --- a/packages/intl/package.json +++ b/packages/intl/package.json @@ -6,28 +6,21 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", - "env.js", + "env.mjs", "filter.json", "LICENSE", "NOTICE", "README.md", "pre.mak", "static.mak", - "php8.3-intl.so", - "php8.2-intl.so", - "php8.1-intl.so", - "php8.0-intl.so", - "libicudata.so", - "libicui18n.so", - "libicuio.so", - "libicutest.so", - "libicutu.so", - "libicuuc.so", - "icudt72l.dat" + "*.so", + "*.dat" ] } diff --git a/packages/intl/pre.mak b/packages/intl/pre.mak index 5618b5944..447e0f561 100644 --- a/packages/intl/pre.mak +++ b/packages/intl/pre.mak @@ -42,30 +42,20 @@ EXTRA_MODULES+= packages/intl/libicudata.so \ packages/intl/libicutest.so \ packages/intl/libicutu.so \ packages/intl/libicuuc.so \ - packages/intl/php${PHP_VERSION}-intl.so \ packages/intl/$(notdir ${LIBICU_DATFILE}) endif ifeq (${WITH_INTL},shared) -PRELOAD_ASSETS+=${LIBICU_DATFILE} CONFIGURE_FLAGS+=--enable-intl PHP_CONFIGURE_DEPS+= packages/intl/libicudata.so packages/intl/libicui18n.so packages/intl/libicuio.so packages/intl/libicutest.so packages/intl/libicutu.so packages/intl/libicuuc.so SHARED_LIBS+= packages/intl/libicudata.so packages/intl/libicui18n.so packages/intl/libicuio.so packages/intl/libicutest.so packages/intl/libicutu.so packages/intl/libicuuc.so SKIP_LIBS+= -licuio -licui18n -licuuc -licudata -PHP_ASSET_LIST+= libicudata.so \ - libicui18n.so \ - libicuio.so \ - libicutest.so \ - libicutu.so \ - libicuuc.so \ - $(notdir ${LIBICU_DATFILE}) EXTRA_MODULES+= packages/intl/libicudata.so \ packages/intl/libicui18n.so \ packages/intl/libicuio.so \ packages/intl/libicutest.so \ packages/intl/libicutu.so \ packages/intl/libicuuc.so \ - packages/intl/php${PHP_VERSION}-intl.so \ packages/intl/$(notdir ${LIBICU_DATFILE}) endif @@ -83,4 +73,4 @@ EXTRA_MODULES+= packages/intl/libicudata.so \ packages/intl/$(notdir ${LIBICU_DATFILE}) endif -intl-libs: packages/intl/libicudata.so packages/intl/libicui18n.so packages/intl/libicuio.so packages/intl/libicutest.so packages/intl/libicutu.so packages/intl/libicuuc.so \ No newline at end of file +intl-libs: packages/intl/libicudata.so packages/intl/libicui18n.so packages/intl/libicuio.so packages/intl/libicutest.so packages/intl/libicutu.so packages/intl/libicuuc.so diff --git a/packages/intl/static.mak b/packages/intl/static.mak index b002970e8..112709f46 100644 --- a/packages/intl/static.mak +++ b/packages/intl/static.mak @@ -2,8 +2,8 @@ third_party/icu-${LIBICU_VERSION}/icu/readme.html: @ echo -e "\e[33;4mDownloading LIBICU\e[0m" - ${DOCKER_RUN} wget -q https://github.com/unicode-org/icu/releases/download/release-${LIBICU_VERSION}/icu4c-${LIBICU_VERSION_UNDERSCORE}-src.tgz - ${DOCKER_RUN} wget -q https://github.com/unicode-org/icu/releases/download/release-${LIBICU_VERSION}/icu4c-${LIBICU_VERSION_UNDERSCORE}-data.zip + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://github.com/unicode-org/icu/releases/download/release-${LIBICU_VERSION}/icu4c-${LIBICU_VERSION_UNDERSCORE}-src.tgz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://github.com/unicode-org/icu/releases/download/release-${LIBICU_VERSION}/icu4c-${LIBICU_VERSION_UNDERSCORE}-data.zip ${DOCKER_RUN} mkdir -p third_party/icu-${LIBICU_VERSION} ${DOCKER_RUN} tar -xvzf icu4c-${LIBICU_VERSION_UNDERSCORE}-src.tgz -C third_party/icu-${LIBICU_VERSION}/ ${DOCKER_RUN} rm -rf /src/third_party/icu-72-1/icu/source/data/ @@ -106,27 +106,6 @@ packages/intl/libicudata.so: lib/lib/libicudata.so packages/intl/$(notdir ${LIBICU_DATFILE}): ${LIBICU_DATFILE} cp -Lp $^ $@ -$(addsuffix /libicui18n.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicui18n.so - cp -Lp $^ $@ - -$(addsuffix /libicuio.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicuio.so - cp -Lp $^ $@ - -$(addsuffix /libicutest.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicutest.so - cp -Lp $^ $@ - -$(addsuffix /libicutu.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicutu.so - cp -Lp $^ $@ - -$(addsuffix /libicuuc.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicuuc.so - cp -Lp $^ $@ - -$(addsuffix /libicudata.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/libicudata.so - cp -Lp $^ $@ - -$(addsuffix /$(notdir ${LIBICU_DATFILE}),$(sort ${SHARED_ASSET_PATHS})): packages/intl/$(notdir ${LIBICU_DATFILE}) - cp -Lp $^ $@ - packages/intl/test/%.php${PHP_VERSION}.generated.mjs: third_party/php${PHP_VERSION}-src/ext/intl/tests/%.phpt node bin/translate-test.js --file $^ --phpVersion ${PHP_VERSION} --buildType static > $@ @@ -149,6 +128,3 @@ packages/intl/php${PHP_VERSION}-intl.so: ${PHPIZE} third_party/php${PHP_VERSION} /src/packages/intl/libicuio.so \ /src/packages/intl/libicutu.so \ /src/packages/intl/libicutest.so - -$(addsuffix /php${PHP_VERSION}-intl.so,$(sort ${SHARED_ASSET_PATHS})): packages/intl/php${PHP_VERSION}-intl.so - cp -Lp $^ $@ diff --git a/packages/intl/test/basic.mjs b/packages/intl/test/basic.mjs index 8fe90b9d1..8fcaed0ce 100644 --- a/packages/intl/test/basic.mjs +++ b/packages/intl/test/basic.mjs @@ -1,25 +1,45 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import intl from 'php-wasm-intl'; -test('Intl Extension is enabled. (loaded via strings)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({ +const isDynamicIntl = env.WITH_INTL === 'dynamic'; + +const createIntlPhp = (useUrlObjects = false) => { + if(isDynamicIntl) + { + return new PhpNode({ sharedLibs: [ - { url: `./packages/intl/libicudata.so`, ini: false }, - { url: `./packages/intl/libicui18n.so`, ini: false }, - { url: `./packages/intl/libicuio.so`, ini: false }, - { url: `./packages/intl/libicutest.so`, ini: false }, - { url: `./packages/intl/libicutu.so`, ini: false }, - { url: `./packages/intl/libicuuc.so`, ini: false }, - `./packages/intl/php${process.env.PHP_VERSION}-intl.so`, + { url: useUrlObjects ? new URL(`../../intl/libicudata.so`, import.meta.url) : `./packages/intl/libicudata.so`, ini: false }, + { url: useUrlObjects ? new URL(`../../intl/libicui18n.so`, import.meta.url) : `./packages/intl/libicui18n.so`, ini: false }, + { url: useUrlObjects ? new URL(`../../intl/libicuio.so`, import.meta.url) : `./packages/intl/libicuio.so`, ini: false }, + { url: useUrlObjects ? new URL(`../../intl/libicutest.so`, import.meta.url) : `./packages/intl/libicutest.so`, ini: false }, + { url: useUrlObjects ? new URL(`../../intl/libicutu.so`, import.meta.url) : `./packages/intl/libicutu.so`, ini: false }, + { url: useUrlObjects ? new URL(`../../intl/libicuuc.so`, import.meta.url) : `./packages/intl/libicuuc.so`, ini: false }, + useUrlObjects ? new URL(`../../intl/php${process.env.PHP_VERSION}-intl.so`, import.meta.url) : `./packages/intl/php${process.env.PHP_VERSION}-intl.so`, ] , files: [{parent: '/preload/', name: 'icudt72l.dat', url: './packages/intl/icudt72l.dat'}] - }) - : new PhpNode; + }); + } + + return new PhpNode; +}; + +const createModuleIntlPhp = async (useDynamicImport = false) => { + if(!isDynamicIntl) + { + return new PhpNode; + } + + return new PhpNode({ + sharedLibs: [useDynamicImport ? await import('php-wasm-intl') : intl] + }); +}; + +test('Intl Extension is enabled. (loaded via strings)', async () => { + const php = createIntlPhp(); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -35,20 +55,7 @@ test('Intl Extension is enabled. (loaded via strings)', async () => { }); test('Intl Extension is enabled. (loaded via URL objects)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({ - sharedLibs: [ - { url: new URL(`../../intl/libicudata.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicui18n.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicuio.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicutest.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicutu.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicuuc.so`, import.meta.url), ini: false }, - new URL(`../../intl/php${process.env.PHP_VERSION}-intl.so`, import.meta.url), - ] - , files: [{parent: '/preload/', name: 'icudt72l.dat', url: './packages/intl/icudt72l.dat'}] - }) - : new PhpNode; + const php = createIntlPhp(true); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -64,20 +71,7 @@ test('Intl Extension is enabled. (loaded via URL objects)', async () => { }); test('Intl can format numbers. (loaded via URL objects)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({ - sharedLibs: [ - { url: new URL(`../../intl/libicudata.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicui18n.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicuio.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicutest.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicutu.so`, import.meta.url), ini: false }, - { url: new URL(`../../intl/libicuuc.so`, import.meta.url), ini: false }, - new URL(`../../intl/php${process.env.PHP_VERSION}-intl.so`, import.meta.url), - ] - , files: [{parent: '/preload/', name: 'icudt72l.dat', url: './packages/intl/icudt72l.dat'}] - }) - : new PhpNode; + const php = createIntlPhp(true); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -97,9 +91,7 @@ test('Intl can format numbers. (loaded via URL objects)', async () => { }); test('Intl Extension is enabled. (loaded via module)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({sharedLibs: [intl]}) - : new PhpNode; + const php = await createModuleIntlPhp(); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -115,9 +107,7 @@ test('Intl Extension is enabled. (loaded via module)', async () => { }); test('Intl can format numbers. (loaded via module)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({sharedLibs: [intl]}) - : new PhpNode; + const php = await createModuleIntlPhp(); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -136,9 +126,7 @@ test('Intl can format numbers. (loaded via module)', async () => { }); test('Intl Extension is enabled. (dynamic module loader)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({sharedLibs: [ await import('php-wasm-intl') ]}) - : new PhpNode; + const php = await createModuleIntlPhp(true); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); @@ -154,9 +142,7 @@ test('Intl Extension is enabled. (dynamic module loader)', async () => { }); test('Intl can format numbers. (dynamic module loader)', async () => { - const php = env.WITH_INTL === 'dynamic' - ? new PhpNode({sharedLibs: [ await import('php-wasm-intl') ]}) - : new PhpNode; + const php = await createModuleIntlPhp(true); let stdOut = '', stdErr = ''; php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); diff --git a/packages/libxml/README.md b/packages/libxml/README.md index 4a5f10a32..00cd55160 100644 --- a/packages/libxml/README.md +++ b/packages/libxml/README.md @@ -1,35 +1,38 @@ # php-wasm-libxml -libxml extension for php-wasm +`php-wasm-libxml` provides the `libxml2.so` support library used by the XML-family extensions in `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm +```sh +npm install php-wasm php-wasm-libxml +``` -## Usage +## What It Loads -The library `libxml.so` is included by default with `php-wasm`, and will be loaded automatically. +This package does not register a separate PHP extension module. +It only supplies `libxml2.so` so packages like `php-wasm-dom`, `php-wasm-xml`, and `php-wasm-simplexml` can be loaded as shared or dynamic extensions. -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The stock `php-wasm` runtime already includes the core `libxml` extension, so most consumers only need this package when they are composing XML-related shared libraries explicitly. -You can provide a callback as the `locateFile` option to map library names to URLs: +## Usage -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import dom from 'php-wasm-dom'; -const php = new PhpWeb({locateFile}); +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, dom], +}); ``` -## Build options: - -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. - -* WITH_LIBXML +## Custom Builds -### WITH_LIBXML +Enable `WITH_LIBXML` in `.php-wasm-rc` when you want libxml built outside the base runtime. -`0|static|shared` +## Build Options -When compiled as a `shared` libary, this will produce the libary file `libxml.so`. +- `WITH_LIBXML`: defaults to `dynamic`. Allowed values: `0`, `1`, `static`, `shared`, `dynamic`. +- The `dynamic` mode is what the XML-family side-module packages rely on when they need `libxml2.so` at runtime. diff --git a/packages/libxml/index.d.ts b/packages/libxml/index.d.ts new file mode 100644 index 000000000..8aece6262 --- /dev/null +++ b/packages/libxml/index.d.ts @@ -0,0 +1,5 @@ +export interface PhpPreloadFile { url: string | URL; path?: string; parent?: string; name?: string; } +export interface PhpSharedLibrary { name?: string; url: string | URL; ini?: boolean; getLibs?: () => PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/libxml/index.mjs b/packages/libxml/index.mjs index e4cc990e6..fc05ec66b 100644 --- a/packages/libxml/index.mjs +++ b/packages/libxml/index.mjs @@ -1,3 +1,7 @@ +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ {name: 'libxml2.so', url: new URL('./libxml2.so', import.meta.url).href} ]; diff --git a/packages/libxml/package.json b/packages/libxml/package.json index 4e4a2f0b1..2f32618f4 100644 --- a/packages/libxml/package.json +++ b/packages/libxml/package.json @@ -6,15 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libxml2.so" + "*.so" ] } diff --git a/packages/libxml/static.mak b/packages/libxml/static.mak index 0700e7818..1ab1ad7e1 100644 --- a/packages/libxml/static.mak +++ b/packages/libxml/static.mak @@ -29,7 +29,6 @@ PHP_CONFIGURE_DEPS+= packages/libxml/libxml2.so TEST_LIST+=$(shell ls packages/libxml/test/*.mjs) SKIP_LIBS+= -lxml2 EXTRA_MODULES+= packages/libxml/libxml2.so -PHP_ASSET_LIST+= libxml2.so endif ifeq (${WITH_LIBXML},dynamic) @@ -65,9 +64,6 @@ lib/lib/libxml2.so: lib/lib/libxml2.a packages/libxml/libxml2.so: lib/lib/libxml2.so cp -L $^ $@ -$(addsuffix /libxml2.so,$(sort ${SHARED_ASSET_PATHS})): packages/libxml/libxml2.so - cp -Lp $^ $@ - ## EXPERIMENTAL!! third_party/php${PHP_VERSION}-libxml/config0.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/libxml /src/third_party/php${PHP_VERSION}-libxml diff --git a/packages/libxml/test/basic.mjs b/packages/libxml/test/basic.mjs index 847283fad..4d9f4346d 100644 --- a/packages/libxml/test/basic.mjs +++ b/packages/libxml/test/basic.mjs @@ -1,6 +1,15 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode as BasePhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { nodeRuntimeOptions } from '../../../test/lib/node-runtime-options.mjs'; + +class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions(args)); + } +} test('libXML Extension is enabled.', async () => { const php = new PhpNode(); diff --git a/packages/libyaml/8.0.mjs b/packages/libyaml/8.0.mjs index ae05e6d91..f63b02915 100644 --- a/packages/libyaml/8.0.mjs +++ b/packages/libyaml/8.0.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-yaml.so', url: new URL('./php8.0-yaml.so', import.meta.url), ini}, - {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)}, + {name: 'php8.0-yaml.so', url: new URL('./php8.0-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libyaml/8.1.mjs b/packages/libyaml/8.1.mjs index d259ba59e..8e81adadb 100644 --- a/packages/libyaml/8.1.mjs +++ b/packages/libyaml/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-yaml.so', url: new URL('./php8.1-yaml.so', import.meta.url), ini}, - {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)}, + {name: 'php8.1-yaml.so', url: new URL('./php8.1-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libyaml/8.2.mjs b/packages/libyaml/8.2.mjs index b0acd7101..27ca7914c 100644 --- a/packages/libyaml/8.2.mjs +++ b/packages/libyaml/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-yaml.so', url: new URL('./php8.2-yaml.so', import.meta.url), ini}, - {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)}, + {name: 'php8.2-yaml.so', url: new URL('./php8.2-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libyaml/8.3.mjs b/packages/libyaml/8.3.mjs index 50c52cc2a..474f8f8d7 100644 --- a/packages/libyaml/8.3.mjs +++ b/packages/libyaml/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-yaml.so', url: new URL('./php8.3-yaml.so', import.meta.url), ini}, - {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)}, + {name: 'php8.3-yaml.so', url: new URL('./php8.3-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libyaml/8.4.mjs b/packages/libyaml/8.4.mjs index 6ab2ab9cd..77d89551c 100644 --- a/packages/libyaml/8.4.mjs +++ b/packages/libyaml/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-yaml.so', url: new URL('./php8.4-yaml.so', import.meta.url), ini}, - {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)}, + {name: 'php8.4-yaml.so', url: new URL('./php8.4-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libyaml/8.5.mjs b/packages/libyaml/8.5.mjs new file mode 100644 index 000000000..8b1bd059d --- /dev/null +++ b/packages/libyaml/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-yaml.so', url: new URL('./php8.5-yaml.so', import.meta.url), ini} + , {name: 'libyaml.so', url: new URL('./libyaml.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/libyaml/README.md b/packages/libyaml/README.md index 2a8f1c01f..4980cd20d 100644 --- a/packages/libyaml/README.md +++ b/packages/libyaml/README.md @@ -1,47 +1,35 @@ -# php-wasm-libyaml +# php-wasm-yaml -libyaml extension for php-wasm +`php-wasm-yaml` provides the `yaml` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-libyaml` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-libyaml') -]}); +```sh +npm install php-wasm php-wasm-yaml ``` -The supporting library `libyaml.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-yaml.so` and bundles `libyaml.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-yaml.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import yaml from 'php-wasm-yaml'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [yaml], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-yaml.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/libyaml/index.mjs b/packages/libyaml/index.mjs index fc9131ab8..12ef2b9ae 100644 --- a/packages/libyaml/index.mjs +++ b/packages/libyaml/index.mjs @@ -1,17 +1,24 @@ +import yaml8_5 from './8.5.mjs'; import yaml8_4 from './8.4.mjs'; -import yaml8_3 from './8.3.mjs'; -import yaml8_2 from './8.2.mjs'; -import yaml8_1 from './8.1.mjs'; -import yaml8_0 from './8.0.mjs'; +import yaml8_3 from './8.3.mjs'; +import yaml8_2 from './8.2.mjs'; +import yaml8_1 from './8.1.mjs'; +import yaml8_0 from './8.0.mjs'; const versionTable = { - '8.4': yaml8_4, - '8.3': yaml8_3, - '8.2': yaml8_2, - '8.1': yaml8_1, - '8.0': yaml8_0, + '8.5': yaml8_5 + , '8.4': yaml8_4 + , '8.3': yaml8_3 + , '8.2': yaml8_2 + , '8.1': yaml8_1 + , '8.0': yaml8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/libyaml/package.json b/packages/libyaml/package.json index 1bec9f977..c53e60fce 100644 --- a/packages/libyaml/package.json +++ b/packages/libyaml/package.json @@ -6,17 +6,15 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "NOTICE", "README.md", "static.mak", - "libyaml.so", - "php8.3-yaml.so", - "php8.2-yaml.so", - "php8.1-yaml.so", - "php8.0-yaml.so" + "*.so" ] } diff --git a/packages/libyaml/static.mak b/packages/libyaml/static.mak index ae70ed700..efad75a8e 100644 --- a/packages/libyaml/static.mak +++ b/packages/libyaml/static.mak @@ -20,7 +20,7 @@ PHP_CONFIGURE_DEPS+= lib/lib/libyaml.a third_party/php${PHP_VERSION}-src/ext/yam TEST_LIST+=$(shell ls packages/libyaml/test/*.mjs) ARCHIVES+= lib/lib/libyaml.a SKIP_LIBS+= -lyaml -EXTRA_MODULES+= packages/libyaml/libyaml.so packages/libyaml/php${PHP_VERSION}-yaml.so +EXTRA_MODULES+= packages/libyaml/libyaml.so endif ifeq (${WITH_YAML},shared) @@ -29,8 +29,7 @@ PHP_CONFIGURE_DEPS+= third_party/php${PHP_VERSION}-src/ext/yaml/config.m4 packag TEST_LIST+=$(shell ls packages/libyaml/test/*.mjs) SHARED_LIBS+= packages/libyaml/libyaml.so SKIP_LIBS+= -lyaml -EXTRA_MODULES+= packages/libyaml/libyaml.so packages/libyaml/php${PHP_VERSION}-yaml.so -PHP_ASSET_LIST+= libyaml.so +EXTRA_MODULES+= packages/libyaml/libyaml.so endif ifeq (${WITH_YAML},dynamic) @@ -60,23 +59,24 @@ lib/lib/libyaml.a: third_party/libyaml/.gitignore lib/lib/libyaml.so: lib/lib/libyaml.a ${DOCKER_RUN_IN_LIB_YAML} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive /src/$^ +PHP_YAML_VERSION=2.3.0 + third_party/php${PHP_VERSION}-yaml/config.m4: @ echo -e "\e[33;4mDownloading ext-yaml\e[0m" - ${DOCKER_RUN} wget -q https://pecl.php.net/get/yaml-2.2.3.tgz - ${DOCKER_RUN} tar -C third_party -xvzf yaml-2.2.3.tgz yaml-2.2.3 - ${DOCKER_RUN} mv third_party/yaml-2.2.3 third_party/php${PHP_VERSION}-yaml - ${DOCKER_RUN} rm yaml-2.2.3.tgz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://pecl.php.net/get/yaml-${PHP_YAML_VERSION}.tgz + ${DOCKER_RUN} tar -C third_party -xvzf yaml-${PHP_YAML_VERSION}.tgz yaml-${PHP_YAML_VERSION} + ${DOCKER_RUN} mv third_party/yaml-${PHP_YAML_VERSION} third_party/php${PHP_VERSION}-yaml + ${DOCKER_RUN} rm yaml-${PHP_YAML_VERSION}.tgz third_party/php${PHP_VERSION}-src/ext/yaml/config.m4: third_party/php${PHP_VERSION}-yaml/config.m4 | third_party/php${PHP_VERSION}-src/patched @ echo -e "\e[33;4mImporting ext-yaml\e[0m" + ${DOCKER_RUN} bash -lc 'if [ -f third_party/php${PHP_VERSION}-yaml/Makefile ]; then make -C third_party/php${PHP_VERSION}-yaml distclean; fi' + ${DOCKER_RUN} rm -rf third_party/php${PHP_VERSION}-src/ext/yaml ${DOCKER_RUN} cp -rfv third_party/php${PHP_VERSION}-yaml third_party/php${PHP_VERSION}-src/ext/yaml packages/libyaml/libyaml.so: lib/lib/libyaml.so cp $^ $@ -$(addsuffix /libyaml.so,$(sort ${SHARED_ASSET_PATHS})): packages/libyaml/libyaml.so - cp -Lp $^ $@ - packages/libyaml/php${PHP_VERSION}-yaml.so: ${PHPIZE} packages/libyaml/libyaml.so third_party/php${PHP_VERSION}-yaml/config.m4 @ echo -e "\e[33;4mBuilding php-yaml\e[0m" ${DOCKER_RUN_IN_EXT_YAML} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; @@ -86,6 +86,3 @@ packages/libyaml/php${PHP_VERSION}-yaml.so: ${PHPIZE} packages/libyaml/libyaml.s ${DOCKER_RUN_IN_EXT_YAML} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_YAML} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_YAML} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/yaml.a /src/packages/libyaml/libyaml.so - -$(addsuffix /php${PHP_VERSION}-yaml.so,$(sort ${SHARED_ASSET_PATHS})): packages/libyaml/php${PHP_VERSION}-yaml.so - cp -Lp $^ $@ diff --git a/packages/libyaml/test/basic.mjs b/packages/libyaml/test/basic.mjs index b9a62c33e..4ea0c6a19 100644 --- a/packages/libyaml/test/basic.mjs +++ b/packages/libyaml/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import yaml from 'php-wasm-yaml'; diff --git a/packages/libzip/8.0.mjs b/packages/libzip/8.0.mjs index 5dfc16f56..107bac114 100644 --- a/packages/libzip/8.0.mjs +++ b/packages/libzip/8.0.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-zip.so', url: new URL('./php8.0-zip.so', import.meta.url), ini}, - {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)}, + {name: 'php8.0-zip.so', url: new URL('./php8.0-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libzip/8.1.mjs b/packages/libzip/8.1.mjs index 438c499ae..f8d718d35 100644 --- a/packages/libzip/8.1.mjs +++ b/packages/libzip/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-zip.so', url: new URL('./php8.1-zip.so', import.meta.url), ini}, - {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)}, + {name: 'php8.1-zip.so', url: new URL('./php8.1-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libzip/8.2.mjs b/packages/libzip/8.2.mjs index 5dd34e7f9..a2eaf3b4c 100644 --- a/packages/libzip/8.2.mjs +++ b/packages/libzip/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-zip.so', url: new URL('./php8.2-zip.so', import.meta.url), ini}, - {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)}, + {name: 'php8.2-zip.so', url: new URL('./php8.2-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libzip/8.3.mjs b/packages/libzip/8.3.mjs index 80cba98b5..2001a6a02 100644 --- a/packages/libzip/8.3.mjs +++ b/packages/libzip/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-zip.so', url: new URL('./php8.3-zip.so', import.meta.url), ini}, - {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)}, + {name: 'php8.3-zip.so', url: new URL('./php8.3-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libzip/8.4.mjs b/packages/libzip/8.4.mjs index f5034b3e8..5dffa0149 100644 --- a/packages/libzip/8.4.mjs +++ b/packages/libzip/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-zip.so', url: new URL('./php8.4-zip.so', import.meta.url), ini}, - {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)}, + {name: 'php8.4-zip.so', url: new URL('./php8.4-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/libzip/8.5.mjs b/packages/libzip/8.5.mjs new file mode 100644 index 000000000..ba82bd980 --- /dev/null +++ b/packages/libzip/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-zip.so', url: new URL('./php8.5-zip.so', import.meta.url), ini} + , {name: 'libzip.so', url: new URL('./libzip.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/libzip/README.md b/packages/libzip/README.md index 6a117b022..453414930 100644 --- a/packages/libzip/README.md +++ b/packages/libzip/README.md @@ -1,45 +1,35 @@ # php-wasm-libzip -libzip extension for php-wasm +`php-wasm-libzip` provides the `zip` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-libzip` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-libzip') -]}); +```sh +npm install php-wasm php-wasm-libzip ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-zip.so']}); -``` +The package resolves the active runtime version to `php8.x-zip.so` and bundles `libzip.so`. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-zip.so']}); -``` +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import zip from 'php-wasm-libzip'; -## Build options: +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [zip], +}); -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/libzip/index.mjs b/packages/libzip/index.mjs index fc9131ab8..12ef2b9ae 100644 --- a/packages/libzip/index.mjs +++ b/packages/libzip/index.mjs @@ -1,17 +1,24 @@ +import yaml8_5 from './8.5.mjs'; import yaml8_4 from './8.4.mjs'; -import yaml8_3 from './8.3.mjs'; -import yaml8_2 from './8.2.mjs'; -import yaml8_1 from './8.1.mjs'; -import yaml8_0 from './8.0.mjs'; +import yaml8_3 from './8.3.mjs'; +import yaml8_2 from './8.2.mjs'; +import yaml8_1 from './8.1.mjs'; +import yaml8_0 from './8.0.mjs'; const versionTable = { - '8.4': yaml8_4, - '8.3': yaml8_3, - '8.2': yaml8_2, - '8.1': yaml8_1, - '8.0': yaml8_0, + '8.5': yaml8_5 + , '8.4': yaml8_4 + , '8.3': yaml8_3 + , '8.2': yaml8_2 + , '8.1': yaml8_1 + , '8.0': yaml8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/libzip/package.json b/packages/libzip/package.json index 6c79d9d2b..641c90d92 100644 --- a/packages/libzip/package.json +++ b/packages/libzip/package.json @@ -6,19 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libzip.so", - "php8.3-zip.so", - "php8.2-zip.so", - "php8.1-zip.so", - "php8.0-zip.so" + "*.so" ] } diff --git a/packages/libzip/static.mak b/packages/libzip/static.mak index 96c4a8243..e36c4504c 100644 --- a/packages/libzip/static.mak +++ b/packages/libzip/static.mak @@ -28,7 +28,6 @@ TEST_LIST+=$(shell ls packages/libzip/test/*.mjs) SHARED_LIBS+= packages/libzip/libzip.so SKIP_LIBS+= -lzip EXTRA_MODULES+= packages/libzip/libzip.so packages/libzip/php${PHP_VERSION}-zip.so -PHP_ASSET_LIST+= libzip.so endif ifeq (${WITH_LIBZIP},dynamic) @@ -65,9 +64,6 @@ lib/lib/libzip.so: lib/lib/libzip.a packages/libzip/libzip.so: lib/lib/libzip.so cp -Lp $^ $@ -$(addsuffix /libzip.so,$(sort ${SHARED_ASSET_PATHS})): packages/libzip/libzip.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-zip/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/zip /src/third_party/php${PHP_VERSION}-zip ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-zip/config.m4 @@ -81,6 +77,3 @@ packages/libzip/php${PHP_VERSION}-zip.so: ${PHPIZE} packages/libzip/libzip.so th ${DOCKER_RUN_IN_EXT_ZIP} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_ZIP} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_ZIP} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/zip.a /src/packages/libzip/libzip.so - -$(addsuffix /php${PHP_VERSION}-zip.so,$(sort ${SHARED_ASSET_PATHS})): packages/libzip/php${PHP_VERSION}-zip.so - cp -Lp $^ $@ diff --git a/packages/libzip/test/basic.mjs b/packages/libzip/test/basic.mjs index 326e2b40b..06ea9a85e 100644 --- a/packages/libzip/test/basic.mjs +++ b/packages/libzip/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import zip from 'php-wasm-libzip'; diff --git a/packages/mbstring/8.0.mjs b/packages/mbstring/8.0.mjs index 34fd78fd8..57f88f018 100644 --- a/packages/mbstring/8.0.mjs +++ b/packages/mbstring/8.0.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-mbstring.so', url: new URL('./php8.0-mbstring.so', import.meta.url), ini}, - {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)}, + {name: 'php8.0-mbstring.so', url: new URL('./php8.0-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/mbstring/8.1.mjs b/packages/mbstring/8.1.mjs index 5a9e8eccf..321a90795 100644 --- a/packages/mbstring/8.1.mjs +++ b/packages/mbstring/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-mbstring.so', url: new URL('./php8.1-mbstring.so', import.meta.url), ini}, - {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)}, + {name: 'php8.1-mbstring.so', url: new URL('./php8.1-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/mbstring/8.2.mjs b/packages/mbstring/8.2.mjs index 7515ab525..e6bc4cf54 100644 --- a/packages/mbstring/8.2.mjs +++ b/packages/mbstring/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-mbstring.so', url: new URL('./php8.2-mbstring.so', import.meta.url), ini}, - {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)}, + {name: 'php8.2-mbstring.so', url: new URL('./php8.2-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/mbstring/8.3.mjs b/packages/mbstring/8.3.mjs index 3afb28bb2..174a8bf91 100644 --- a/packages/mbstring/8.3.mjs +++ b/packages/mbstring/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-mbstring.so', url: new URL('./php8.3-mbstring.so', import.meta.url), ini}, - {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)}, + {name: 'php8.3-mbstring.so', url: new URL('./php8.3-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/mbstring/8.4.mjs b/packages/mbstring/8.4.mjs index fb058ff57..75733485e 100644 --- a/packages/mbstring/8.4.mjs +++ b/packages/mbstring/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-mbstring.so', url: new URL('./php8.4-mbstring.so', import.meta.url), ini}, - {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)}, + {name: 'php8.4-mbstring.so', url: new URL('./php8.4-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/mbstring/8.5.mjs b/packages/mbstring/8.5.mjs new file mode 100644 index 000000000..92149c835 --- /dev/null +++ b/packages/mbstring/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-mbstring.so', url: new URL('./php8.5-mbstring.so', import.meta.url), ini} + , {name: 'libonig.so', url: new URL('./libonig.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/mbstring/README.md b/packages/mbstring/README.md index e7d142068..5861d2afe 100644 --- a/packages/mbstring/README.md +++ b/packages/mbstring/README.md @@ -1,53 +1,37 @@ # php-wasm-mbstring -mbstring extension for php-wasm +`php-wasm-mbstring` provides the `mbstring` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-mbstring` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-mbstring') -]}); -``` -The supporting library `libonig.so` will automatically be pulled from the package. - -You can rely on the default loading behavior if `.so` files are served from the same directory as your `.wasm` files. - -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-mbstring.so']}); +```sh +npm install php-wasm php-wasm-mbstring ``` -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; - -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-mbstring.so']}); -``` +## What It Loads -## Build options: +The package resolves the active runtime version to `php8.x-mbstring.so` and bundles `libonig.so`. -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +## Usage -* WITH_MBSTRING -* WITH_ONIGURUMA +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import mbstring from 'php-wasm-mbstring'; -### WITH_MBSTRING +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [mbstring], +}); -`0|static|shared|dynamic` +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/mbstring/index.mjs b/packages/mbstring/index.mjs index 9ee34ed4e..42a11b154 100644 --- a/packages/mbstring/index.mjs +++ b/packages/mbstring/index.mjs @@ -1,17 +1,24 @@ +import mbstring8_5 from './8.5.mjs'; import mbstring8_4 from './8.4.mjs'; -import mbstring8_3 from './8.3.mjs'; -import mbstring8_2 from './8.2.mjs'; -import mbstring8_1 from './8.1.mjs'; -import mbstring8_0 from './8.0.mjs'; +import mbstring8_3 from './8.3.mjs'; +import mbstring8_2 from './8.2.mjs'; +import mbstring8_1 from './8.1.mjs'; +import mbstring8_0 from './8.0.mjs'; const versionTable = { - '8.4': mbstring8_4, - '8.3': mbstring8_3, - '8.2': mbstring8_2, - '8.1': mbstring8_1, - '8.0': mbstring8_0, + '8.5': mbstring8_5 + , '8.4': mbstring8_4 + , '8.3': mbstring8_3 + , '8.2': mbstring8_2 + , '8.1': mbstring8_1 + , '8.0': mbstring8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/mbstring/package.json b/packages/mbstring/package.json index 1ed85ede6..c25f38316 100644 --- a/packages/mbstring/package.json +++ b/packages/mbstring/package.json @@ -6,17 +6,16 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ + "index.mjs", + "index.d.ts", "LICENSE", "NOTICE", "README.md", "static.mak", - "libonig.so", - "php8.3-mbstring.so", - "php8.2-mbstring.so", - "php8.1-mbstring.so", - "php8.0-mbstring.so" + "*.so" ] } diff --git a/packages/mbstring/static.mak b/packages/mbstring/static.mak index c0b9cae8f..5d4866523 100644 --- a/packages/mbstring/static.mak +++ b/packages/mbstring/static.mak @@ -15,12 +15,10 @@ endif ifeq (${WITH_MBSTRING},1) WITH_MBSTRING=dynamic -EXTRA_MODULES+= packages/mbstring/php${PHP_VERSION}-mbstring.so endif ifeq (${WITH_MBSTRING},static) CONFIGURE_FLAGS+= --with-mbstring -EXTRA_MODULES+= packages/mbstring/php${PHP_VERSION}-mbstring.so endif ifeq (${WITH_MBSTRING},dynamic) @@ -54,7 +52,6 @@ PHP_CONFIGURE_DEPS+= packages/mbstring/libonig.so SHARED_LIBS+= packages/mbstring/libonig.so SKIP_LIBS+= -lonig EXTRA_MODULES+= packages/mbstring/libonig.so -PHP_ASSET_LIST+= libonig.so endif ifeq (${WITH_ONIGURUMA},dynamic) @@ -86,9 +83,6 @@ lib/lib/libonig.so: lib/lib/libonig.a packages/mbstring/libonig.so: lib/lib/libonig.so cp -Lp $^ $@ -$(addsuffix /libonig.so,$(sort ${SHARED_ASSET_PATHS})): packages/mbstring/libonig.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-mbstring/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/mbstring /src/third_party/php${PHP_VERSION}-mbstring ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-mbstring/config.m4 @@ -102,6 +96,3 @@ packages/mbstring/php${PHP_VERSION}-mbstring.so: ${PHPIZE} third_party/php${PHP_ ${DOCKER_RUN_IN_EXT_MBSTRING} sed -i 's#include "libmbfl/config.h"#include "config.h#g' Makefile; ${DOCKER_RUN_IN_EXT_MBSTRING} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_MBSTRING} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O1 -Wl,--whole-archive .libs/mbstring.a /src/packages/mbstring/libonig.so - -$(addsuffix /php${PHP_VERSION}-mbstring.so,$(sort ${SHARED_ASSET_PATHS})): packages/mbstring/php${PHP_VERSION}-mbstring.so - cp -Lp $^ $@ diff --git a/packages/openssl/8.0.mjs b/packages/openssl/8.0.mjs index 97f416a8d..48f449041 100644 --- a/packages/openssl/8.0.mjs +++ b/packages/openssl/8.0.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-openssl.so', url: new URL('./php8.0-openssl.so', import.meta.url), ini}, - {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)}, + {name: 'php8.0-openssl.so', url: new URL('./php8.0-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/openssl/8.1.mjs b/packages/openssl/8.1.mjs index ecf85d2fe..d2ebf01d9 100644 --- a/packages/openssl/8.1.mjs +++ b/packages/openssl/8.1.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-openssl.so', url: new URL('./php8.1-openssl.so', import.meta.url), ini}, - {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)}, + {name: 'php8.1-openssl.so', url: new URL('./php8.1-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/openssl/8.2.mjs b/packages/openssl/8.2.mjs index 38a9cd131..be2c9119a 100644 --- a/packages/openssl/8.2.mjs +++ b/packages/openssl/8.2.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-openssl.so', url: new URL('./php8.2-openssl.so', import.meta.url), ini}, - {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)}, + {name: 'php8.2-openssl.so', url: new URL('./php8.2-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/openssl/8.3.mjs b/packages/openssl/8.3.mjs index c861f4db6..157b30b16 100644 --- a/packages/openssl/8.3.mjs +++ b/packages/openssl/8.3.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-openssl.so', url: new URL('./php8.3-openssl.so', import.meta.url), ini}, - {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)}, + {name: 'php8.3-openssl.so', url: new URL('./php8.3-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/openssl/8.4.mjs b/packages/openssl/8.4.mjs index 08b798311..bcf17251b 100644 --- a/packages/openssl/8.4.mjs +++ b/packages/openssl/8.4.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-openssl.so', url: new URL('./php8.4-openssl.so', import.meta.url), ini}, - {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)}, - {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)}, + {name: 'php8.4-openssl.so', url: new URL('./php8.4-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/openssl/8.5.mjs b/packages/openssl/8.5.mjs new file mode 100644 index 000000000..836b84db9 --- /dev/null +++ b/packages/openssl/8.5.mjs @@ -0,0 +1,15 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-openssl.so', url: new URL('./php8.5-openssl.so', import.meta.url), ini} + , {name: 'libssl.so', url: new URL('./libssl.so', import.meta.url)} + , {name: 'libcrypto.so', url: new URL('./libcrypto.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/openssl/README.md b/packages/openssl/README.md index 0634d22a5..e9a89d11c 100644 --- a/packages/openssl/README.md +++ b/packages/openssl/README.md @@ -1,47 +1,36 @@ # php-wasm-openssl -openssl extenstion for php-wasm. +`php-wasm-openssl` provides the `openssl` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-openssl` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-openssl') -]}); +```sh +npm install php-wasm php-wasm-openssl ``` -The supporting libraries `libssl.so` and `libcrypto.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-openssl.so` and bundles `libssl.so` plus `libcrypto.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-openssl.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import openssl from 'php-wasm-openssl'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [openssl], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-openssl.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/openssl/index.mjs b/packages/openssl/index.mjs index 12ba11038..45b4f7c77 100644 --- a/packages/openssl/index.mjs +++ b/packages/openssl/index.mjs @@ -1,17 +1,24 @@ +import openssl8_5 from './8.5.mjs'; import openssl8_4 from './8.4.mjs'; -import openssl8_3 from './8.3.mjs'; -import openssl8_2 from './8.2.mjs'; -import openssl8_1 from './8.1.mjs'; -import openssl8_0 from './8.0.mjs'; +import openssl8_3 from './8.3.mjs'; +import openssl8_2 from './8.2.mjs'; +import openssl8_1 from './8.1.mjs'; +import openssl8_0 from './8.0.mjs'; const versionTable = { - '8.4': openssl8_4, - '8.3': openssl8_3, - '8.2': openssl8_2, - '8.1': openssl8_1, - '8.0': openssl8_0, + '8.5': openssl8_5 + , '8.4': openssl8_4 + , '8.3': openssl8_3 + , '8.2': openssl8_2 + , '8.1': openssl8_1 + , '8.0': openssl8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(php); export default {getLibs}; diff --git a/packages/openssl/package.json b/packages/openssl/package.json index ca82641a9..e2c98a72e 100644 --- a/packages/openssl/package.json +++ b/packages/openssl/package.json @@ -6,20 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libcrypto.so", - "libssl.so", - "php8.3-openssl.so", - "php8.2-openssl.so", - "php8.1-openssl.so", - "php8.0-openssl.so" + "*.so" ] } diff --git a/packages/openssl/static.mak b/packages/openssl/static.mak index 2ccb333a9..8ff54960a 100644 --- a/packages/openssl/static.mak +++ b/packages/openssl/static.mak @@ -4,18 +4,18 @@ WITH_OPENSSL?=dynamic OPENSSL_TAG?=OpenSSL_1_1_1-stable DOCKER_RUN_IN_OPENSSL =${DOCKER_ENV} \ - -eCC='emcc -fPIC -flto -O${OPTIMIZE} -sLINKABLE' \ - -eCXX='emcc -fPIC -flto -O${OPTIMIZE} -sLINKABLE' \ + -eCC='emcc -fPIC ${LTO_FLAG} -O${OPTIMIZE} -sLINKABLE' \ + -eCXX='emcc -fPIC ${LTO_FLAG} -O${OPTIMIZE} -sLINKABLE' \ -w /src/third_party/openssl/ \ emscripten-builder DOCKER_RUN_IN_EXT_OPENSSL =${DOCKER_ENV} \ - -eCC='emcc -fPIC -flto -O${OPTIMIZE}' \ + -eCC='emcc -fPIC ${LTO_FLAG} -O${OPTIMIZE}' \ -eCXX='emcc -fPIC -O${OPTIMIZE}' \ -w /src/third_party/php${PHP_VERSION}-openssl/ \ emscripten-builder -ifeq ($(filter ${WITH_OPENSSL},0 1 shared dynamic),) -$(error WITH_OPENSSL MUST BE 0, 1, shared, or dynamic (cannot be static). WITH_OPENSSL: '${WITH_OPENSSL}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +ifeq ($(filter ${WITH_OPENSSL},0 1 static shared dynamic),) +$(error WITH_OPENSSL MUST BE 0, 1, static, shared, or dynamic. WITH_OPENSSL: '${WITH_OPENSSL}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) endif ifeq (${WITH_OPENSSL},1) @@ -28,10 +28,12 @@ TEST_LIST+= packages/openssl/test/basic.mjs endif ifeq (${WITH_OPENSSL},static) +# Full LTO corrupts static OpenSSL builds; ThinLTO keeps startup intact. +LTO_FLAG=-flto=thin CONFIGURE_FLAGS+= --with-openssl ARCHIVES+= lib/lib/libssl.a lib/lib/libcrypto.a STATIC_LIB_CONFIG+="openssl", -EXTRA_MODULES+= packages/openssl/libssl.so packages/openssl/libcrypto.so packages/openssl/php${PHP_VERSION}-openssl.so +SKIP_LIBS+= -lssl -lcrypto endif ifeq (${WITH_OPENSSL},shared) @@ -40,8 +42,7 @@ PHP_CONFIGURE_DEPS+= packages/openssl/libssl.so packages/openssl/libcrypto.so SHARED_LIBS+= packages/openssl/libssl.so packages/openssl/libcrypto.so SKIP_LIBS+= -lssl -lcrypto SHARED_LIB_CONFIG+="openssl", -EXTRA_MODULES+= packages/openssl/libssl.so packages/openssl/libcrypto.so packages/openssl/php${PHP_VERSION}-openssl.so -PHP_ASSET_LIST+= libssl.so libcrypto.so +EXTRA_MODULES+= packages/openssl/libssl.so packages/openssl/libcrypto.so endif ifeq (${WITH_OPENSSL},dynamic) @@ -81,15 +82,6 @@ packages/openssl/libssl.so: lib/lib/libssl.so packages/openssl/libcrypto.so: lib/lib/libcrypto.so cp -Lp $^ $@ -$(addsuffix /libcrypto.so,$(sort ${SHARED_ASSET_PATHS})): packages/openssl/libcrypto.so - cp -Lp $^ $@ - -$(addsuffix /libssl.so,$(sort ${SHARED_ASSET_PATHS})): packages/openssl/libssl.so - cp -Lp $^ $@ - -$(addsuffix /php${PHP_VERSION}-openssl.so,$(sort ${SHARED_ASSET_PATHS})): packages/openssl/php${PHP_VERSION}-openssl.so - cp -Lp $^ $@ - packages/openssl/test/%.php${PHP_VERSION}.generated.mjs: third_party/php${PHP_VERSION}-src/ext/openssl/tests/%.phpt node bin/translate-test.js --file $^ --phpVersion ${PHP_VERSION} --buildType static > $@ diff --git a/packages/openssl/test/basic.mjs b/packages/openssl/test/basic.mjs index a45cd13df..ae67d39f6 100644 --- a/packages/openssl/test/basic.mjs +++ b/packages/openssl/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import openssl from 'php-wasm-openssl'; diff --git a/packages/pdo-cfd1/README.md b/packages/pdo-cfd1/README.md index 7887db8a7..ca2684e72 100644 --- a/packages/pdo-cfd1/README.md +++ b/packages/pdo-cfd1/README.md @@ -1,6 +1,74 @@ -# php-pdo-cfd1 +# pdo-cfd1 -cloudflare D1 driver for pdo +`pdo-cfd1` is the Cloudflare D1 PDO driver extension used by `php-wasm`. -https://github.com/seanmorris/php-wasm -https://www.npmjs.com/package/php-wasm +This package exists mainly so custom `php-wasm` builds can vendor and compile the `pdo_cfd1` extension. +It does not ship a separate JavaScript entrypoint from this folder. +At runtime, support is enabled by passing Cloudflare D1 bindings into the PHP runtime. + +`pdo_cfd1` requires PHP 8.1 or newer. + +## Runtime Setup + +Pass your Worker's D1 bindings into the `cfd1` object when you construct the runtime. +Each key becomes a PDO target name inside PHP. + +```js +import { PhpWorker } from 'php-wasm/PhpWorker.mjs'; + +export default { + async fetch(request, env) { + const php = new PhpWorker({ + version: '8.4', + cfd1: { + mainDb: env.mainDb, + }, + }); + + await php.run(`` as the DSN: + +```js +await php.run(`prepare( + 'SELECT PageTitle, PageContent FROM WikiPages WHERE PageTitle = ?' + ); + + $select->execute(['Home']); + + $page = $select->fetch(PDO::FETCH_ASSOC); + var_dump($page); +`); +``` + +## Scope + +- This is for `php-wasm` runtimes that execute in a Cloudflare Worker-compatible environment. +- Most consumers of the published `php-wasm` packages do not import anything from this package directly. +- If you are only using browser or Node runtimes, this extension is usually irrelevant. + +## Custom Builds + +Enable the extension in `.php-wasm-rc`: + +```sh +WITH_PDO_CFD1=1 +``` + +Build-related variables: + +- `WITH_PDO_CFD1`: defaults to `0`. Set it to `1` to compile the extension into a custom build. +- `PDO_CFD1_DEV_PATH`: optional local checkout used instead of cloning the upstream repository during the build. diff --git a/packages/pdo-cfd1/package.json b/packages/pdo-cfd1/package.json index 638be6d6f..dcf83f4ea 100644 --- a/packages/pdo-cfd1/package.json +++ b/packages/pdo-cfd1/package.json @@ -6,7 +6,7 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "files": [ "README.md", "pre.mak", diff --git a/packages/pdo-pglite/README.md b/packages/pdo-pglite/README.md index e285dde84..2e9cb660b 100644 --- a/packages/pdo-pglite/README.md +++ b/packages/pdo-pglite/README.md @@ -1,6 +1,42 @@ -# php-pdo-pglite +# pdo-pglite -pglite driver for pdo +`pdo-pglite` is the PostgreSQL-compatible PDO driver extension used by `php-wasm` via `@electric-sql/pglite`. -https://github.com/seanmorris/php-wasm -https://www.npmjs.com/package/php-wasm +This package mainly exists so custom `php-wasm` builds can compile in the `pdo_pglite` extension. +It does not expose a separate JavaScript entrypoint from this folder. At runtime, support is activated by passing a `PGlite` constructor into the `php-wasm` runtime. + +## Requirements + +`pdo_pglite` requires PHP 8.1 or newer. + +## Install + +```sh +npm install php-wasm pdo-pglite @electric-sql/pglite +``` + +## Usage + +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import { PGlite } from '@electric-sql/pglite'; + +const php = new PhpWeb({ + version: '8.4', + PGlite, +}); + +await php.run(`", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "files": [ "README.md", "pre.mak", diff --git a/packages/pdo-pglite/test/basic.mjs b/packages/pdo-pglite/test/basic.mjs index c87eb019b..4d09d5742 100644 --- a/packages/pdo-pglite/test/basic.mjs +++ b/packages/pdo-pglite/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; test('Can do something.', async () => { diff --git a/packages/phar/8.0.mjs b/packages/phar/8.0.mjs index fa6bc9b7d..8cbe6a8aa 100644 --- a/packages/phar/8.0.mjs +++ b/packages/phar/8.0.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-phar.so', url: new URL('./php8.0-phar.so', import.meta.url), ini}, + {name: 'php8.0-phar.so', url: new URL('./php8.0-phar.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/phar/8.1.mjs b/packages/phar/8.1.mjs index b58b91f9c..63bdd90c8 100644 --- a/packages/phar/8.1.mjs +++ b/packages/phar/8.1.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-phar.so', url: new URL('./php8.1-phar.so', import.meta.url), ini}, + {name: 'php8.1-phar.so', url: new URL('./php8.1-phar.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/phar/8.2.mjs b/packages/phar/8.2.mjs index 9b5e3c317..dcc049ed0 100644 --- a/packages/phar/8.2.mjs +++ b/packages/phar/8.2.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-phar.so', url: new URL('./php8.2-phar.so', import.meta.url), ini}, + {name: 'php8.2-phar.so', url: new URL('./php8.2-phar.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/phar/8.3.mjs b/packages/phar/8.3.mjs index 018b52265..c04078417 100644 --- a/packages/phar/8.3.mjs +++ b/packages/phar/8.3.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-phar.so', url: new URL('./php8.3-phar.so', import.meta.url), ini}, + {name: 'php8.3-phar.so', url: new URL('./php8.3-phar.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/phar/8.4.mjs b/packages/phar/8.4.mjs index 4080fe65a..3eb5de885 100644 --- a/packages/phar/8.4.mjs +++ b/packages/phar/8.4.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-phar.so', url: new URL('./php8.4-phar.so', import.meta.url), ini}, + {name: 'php8.4-phar.so', url: new URL('./php8.4-phar.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/phar/8.5.mjs b/packages/phar/8.5.mjs new file mode 100644 index 000000000..539a49d64 --- /dev/null +++ b/packages/phar/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-phar.so', url: new URL('./php8.5-phar.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/phar/README.md b/packages/phar/README.md index 9fc6358af..289df763c 100644 --- a/packages/phar/README.md +++ b/packages/phar/README.md @@ -1,45 +1,35 @@ # php-wasm-phar -phar extenstion for php-wasm. +`php-wasm-phar` provides the `phar` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-phar` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-phar') -]}); +```sh +npm install php-wasm php-wasm-phar ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-phar.so']}); -``` +The package resolves the active runtime version to `php8.x-phar.so`. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-phar.so']}); -``` +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import phar from 'php-wasm-phar'; -## Build options: +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [phar], +}); -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/phar/index.mjs b/packages/phar/index.mjs index 9add6e1cb..e417b61db 100644 --- a/packages/phar/index.mjs +++ b/packages/phar/index.mjs @@ -1,17 +1,24 @@ +import phar8_5 from './8.5.mjs'; import phar8_4 from './8.4.mjs'; -import phar8_3 from './8.3.mjs'; -import phar8_2 from './8.2.mjs'; -import phar8_1 from './8.1.mjs'; -import phar8_0 from './8.0.mjs'; +import phar8_3 from './8.3.mjs'; +import phar8_2 from './8.2.mjs'; +import phar8_1 from './8.1.mjs'; +import phar8_0 from './8.0.mjs'; const versionTable = { - '8.4': phar8_4, - '8.3': phar8_3, - '8.2': phar8_2, - '8.1': phar8_1, - '8.0': phar8_0, + '8.5': phar8_5 + , '8.4': phar8_4 + , '8.3': phar8_3 + , '8.2': phar8_2 + , '8.1': phar8_1 + , '8.0': phar8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/phar/package.json b/packages/phar/package.json index fa6f0e548..5facce4fd 100644 --- a/packages/phar/package.json +++ b/packages/phar/package.json @@ -6,18 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "php8.3-phar.so", - "php8.2-phar.so", - "php8.1-phar.so", - "php8.0-phar.so" + "*.so" ] } diff --git a/packages/phar/static.mak b/packages/phar/static.mak index e9a51cfa7..9a40fcdaa 100644 --- a/packages/phar/static.mak +++ b/packages/phar/static.mak @@ -8,13 +8,11 @@ endif ifeq (${WITH_PHAR},1) WITH_PHAR=dynamic -EXTRA_MODULES+= packages/phar/php${PHP_VERSION}-phar.so endif ifeq (${WITH_PHAR},static) CONFIGURE_FLAGS+= --enable-phar TEST_LIST+=packages/phar/test/basic.mjs -EXTRA_MODULES+= packages/phar/php${PHP_VERSION}-phar.so endif ifeq (${WITH_PHAR},dynamic) @@ -40,6 +38,3 @@ packages/phar/php${PHP_VERSION}-phar.so: ${PHPIZE} third_party/php${PHP_VERSION} ${DOCKER_RUN_IN_EXT_PHAR} cp ../../packages/phar/phar.mak . ${DOCKER_RUN_IN_EXT_PHAR} emmake make -f phar.mak -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src -I/src/lib/include/'; ${DOCKER_RUN_IN_EXT_PHAR} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/phar.a - -$(addsuffix /php${PHP_VERSION}-phar.so,$(sort ${SHARED_ASSET_PATHS})): packages/phar/php${PHP_VERSION}-phar.so - cp -Lp $^ $@ diff --git a/packages/phar/test/basic.mjs b/packages/phar/test/basic.mjs index ab3f5abc8..3575e7a34 100644 --- a/packages/phar/test/basic.mjs +++ b/packages/phar/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import phar from 'php-wasm-phar'; diff --git a/packages/php-cgi-wasm/PhpCgiBase.d.mts b/packages/php-cgi-wasm/PhpCgiBase.d.mts new file mode 100644 index 000000000..b7e8b7187 --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiBase.d.mts @@ -0,0 +1 @@ +export * from './public'; diff --git a/packages/php-cgi-wasm/PhpCgiNode.d.mts b/packages/php-cgi-wasm/PhpCgiNode.d.mts new file mode 100644 index 000000000..8fe6a56e9 --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiNode.d.mts @@ -0,0 +1,7 @@ +import type { PhpCgiRuntimeArgs, RuntimeRequest } from './public'; +import { PhpCgiBase } from './PhpCgiBase.mjs'; + +export class PhpCgiNode extends PhpCgiBase { + constructor(args?: PhpCgiRuntimeArgs); + request(request: RuntimeRequest): Promise; +} diff --git a/packages/php-cgi-wasm/PhpCgiWeb.d.mts b/packages/php-cgi-wasm/PhpCgiWeb.d.mts new file mode 100644 index 000000000..58df48dd2 --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiWeb.d.mts @@ -0,0 +1,6 @@ +import type { PhpCgiRuntimeArgs } from './public'; +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; + +export class PhpCgiWeb extends PhpCgiWebBase { + constructor(args?: PhpCgiRuntimeArgs); +} diff --git a/packages/php-cgi-wasm/PhpCgiWebBase.d.mts b/packages/php-cgi-wasm/PhpCgiWebBase.d.mts new file mode 100644 index 000000000..01c9f076f --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiWebBase.d.mts @@ -0,0 +1,10 @@ +import type { PhpCgiRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpCgiBase } from './PhpCgiBase.mjs'; + +export class PhpCgiWebBase extends PhpCgiBase { + constructor(phpBinLoader: Promise<{ default: new (args: object) => object }>, args?: PhpCgiRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-cgi-wasm/PhpCgiWebview.d.mts b/packages/php-cgi-wasm/PhpCgiWebview.d.mts new file mode 100644 index 000000000..484118bf2 --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiWebview.d.mts @@ -0,0 +1,6 @@ +import type { PhpCgiRuntimeArgs } from './public'; +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; + +export class PhpCgiWebview extends PhpCgiWebBase { + constructor(args?: PhpCgiRuntimeArgs); +} diff --git a/packages/php-cgi-wasm/PhpCgiWorker.d.mts b/packages/php-cgi-wasm/PhpCgiWorker.d.mts new file mode 100644 index 000000000..d2825ca80 --- /dev/null +++ b/packages/php-cgi-wasm/PhpCgiWorker.d.mts @@ -0,0 +1,6 @@ +import type { PhpCgiRuntimeArgs } from './public'; +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; + +export class PhpCgiWorker extends PhpCgiWebBase { + constructor(args?: PhpCgiRuntimeArgs); +} diff --git a/packages/php-cgi-wasm/README.md b/packages/php-cgi-wasm/README.md index 65b475ba6..676d73199 100644 --- a/packages/php-cgi-wasm/README.md +++ b/packages/php-cgi-wasm/README.md @@ -4,7 +4,7 @@ find php-cgi-wasm on [npm](https://npmjs.com/package/php-cgi-wasm) _The CGI Counterpart to [php-wasm](https://npmjs.com/package/php-wasm)._ -This package encompasses the CGI-specific build artifacts of php-wasm. The goal of this part of the project is to provide a version of PHP that more closely resembles the environment facilitated by PHP when running under web servers like Apache and nginx. This is achieved by building a binary artifact of PHP-CGI, rather than PHP-CLI to Web Assembly. The resulting WASM binary can then be run under nodejs with express, in a webpage, or inside a service worker. +This package encompasses the CGI-specific build artifacts of php-wasm. The goal of this part of the project is to provide a version of PHP that more closely resembles the environment facilitated by PHP when running under web servers like Apache and nginx. This is achieved by building a binary artifact of PHP-CGI, rather than PHP-CLI to Web Assembly. The resulting WASM binary can then be run under Node.js with Express or inside a service worker. ## Example Service Worker @@ -12,7 +12,7 @@ This package encompasses the CGI-specific build artifacts of php-wasm. The goal import { PhpCgiWorker } from "php-cgi-wasm/PhpCgiWorker"; // Spawn the PHP-CGI binary -const php = new PhpCgi({ +const php = new PhpCgiWorker({ prefix: '/php-wasm' , docroot: '/persist/www' , types: { @@ -30,3 +30,16 @@ self.addEventListener('activate', event => php.handleActivateEvent(event)); self.addEventListener('fetch', event => php.handleFetchEvent(event)); self.addEventListener('message', event => php.handleMessageEvent(event)); ``` + +On current Node releases, the core `PhpCgiNode` entrypoint can be consumed from either ESM or CommonJS: + +```javascript +const { PhpCgiNode } = require('php-cgi-wasm/PhpCgiNode'); + +const php = new PhpCgiNode({ + prefix: '/php-wasm/cgi-bin/', + docroot: '/persist/www', +}); +``` + +Runtime-loadable extension helper JS packages remain ESM-only; pass extension assets manually when you need to manage them directly. diff --git a/packages/php-cgi-wasm/package.json b/packages/php-cgi-wasm/package.json index 186fb6a41..0022740ca 100644 --- a/packages/php-cgi-wasm/package.json +++ b/packages/php-cgi-wasm/package.json @@ -1,13 +1,60 @@ { "name": "php-cgi-wasm", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "description": "php-cgi for wasm.", + "main": "./PhpCgiNode.js", + "module": "./PhpCgiNode.mjs", + "types": "./public.d.ts", + "exports": { + ".": { + "types": "./public.d.ts", + "import": "./PhpCgiNode.mjs", + "require": "./PhpCgiNode.js", + "default": "./PhpCgiNode.mjs" + }, + "./package.json": "./package.json", + "./public": { + "types": "./public.d.ts", + "default": "./public.d.ts" + }, + "./PhpCgiBase": { + "types": "./PhpCgiBase.d.mts", + "import": "./PhpCgiBase.mjs", + "require": "./PhpCgiBase.js", + "default": "./PhpCgiBase.mjs" + }, + "./PhpCgiNode": { + "types": "./PhpCgiNode.d.mts", + "import": "./PhpCgiNode.mjs", + "require": "./PhpCgiNode.js", + "default": "./PhpCgiNode.mjs" + }, + "./PhpCgiWebBase": { + "types": "./PhpCgiWebBase.d.mts", + "import": "./PhpCgiWebBase.mjs", + "require": "./PhpCgiWebBase.js", + "default": "./PhpCgiWebBase.mjs" + }, + "./PhpCgiWorker": { + "types": "./PhpCgiWorker.d.mts", + "import": "./PhpCgiWorker.mjs", + "require": "./PhpCgiWorker.js", + "default": "./PhpCgiWorker.mjs" + }, + "./*.mjs": "./*.mjs", + "./*.js": "./*.js", + "./*.data": "./*.data", + "./*.wasm": "./*.wasm" + }, "repository": { "type": "git", "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", "license": "Apache-2.0", + "engines": { + "node": ">=24.5.0" + }, "contributors": [ { "name": "Sean Morris", @@ -16,7 +63,7 @@ } ], "scripts": { - "postpublish": "ls *.mjs *.js *.wasm *.data | while read FILENAME; do echo -n \"curl -X PURGE $FILENAME ... \"; curl -X PURGE https://cdn.jsdelivr.net/npm/php-wasm/$FILENAME; echo; done;" + "postpublish": "ls *.mjs *.js *.wasm *.data | while read FILENAME; do echo -n \"curl -X PURGE $FILENAME ... \"; curl -X PURGE https://cdn.jsdelivr.net/npm/php-cgi-wasm/$FILENAME; echo; done;" }, "keywords": [ "php", @@ -26,45 +73,15 @@ "vrzno" ], "files": [ + "*.js", + "*.mjs", "*.wasm", + "*.data", + "*.d.ts", + "*.d.mts", "LICENSE", "NOTICE", "README.md", - "package.json", - "libxml2.so", - "PhpCgiBase.js", - "PhpCgiBase.mjs", - "PhpCgiNode.js", - "PhpCgiNode.mjs", - "PhpCgiWeb.js", - "PhpCgiWeb.mjs", - "PhpCgiWebBase.js", - "PhpCgiWebBase.mjs", - "PhpCgiWebview.js", - "PhpCgiWebview.mjs", - "PhpCgiWorker.js", - "PhpCgiWorker.mjs", - "php-cgi-web.js", - "php-cgi-web.mjs", - "php-cgi-worker.js", - "php-cgi-worker.mjs", - "php-cgi-node.js", - "php-cgi-node.mjs", - "php-cgi-webview.js", - "php-cgi-webview.mjs", - "breakoutRequest.js", - "breakoutRequest.mjs", - "config.js", - "config.mjs", - "fsOps.js", - "fsOps.mjs", - "msg-bus.js", - "msg-bus.mjs", - "parseResponse.mjs", - "parseResponse.js", - "resolveDependencies.js", - "resolveDependencies.mjs", - "webTransactions.js", - "webTransactions.mjs" + "package.json" ] } diff --git a/packages/php-cgi-wasm/public.d.ts b/packages/php-cgi-wasm/public.d.ts new file mode 100644 index 000000000..04318457a --- /dev/null +++ b/packages/php-cgi-wasm/public.d.ts @@ -0,0 +1,96 @@ +export type PhpRuntimeVersion = '8.0' | '8.1' | '8.2' | '8.3' | '8.4' | '8.5'; +export type PhpRuntimeValue = object | string | number | boolean | Uint8Array | null | undefined | void; + +export interface PhpPreloadFile { + url: string | URL; + path?: string; + parent?: string; + name?: string; +} + +export interface PhpSharedLibrary { + name?: string; + url: string | URL; + ini?: boolean; + getLibs?: () => PhpSharedLibrary[]; + getFiles?: () => PhpPreloadFile[]; +} + +export interface PhpVhost { + pathPrefix: string; + directory: string; + entrypoint: string; +} + +export interface RuntimeRequest { + url: string | URL; + method?: string; + headers?: Headers | Map | Record; + connection?: { encrypted?: boolean }; + socket?: { encrypted?: boolean }; + body?: ReadableStream; + arrayBuffer?: () => Promise; + on?: (event: string, callback: (...params: object[]) => void) => void; +} + +export type PhpRuntimeHook = (request: RuntimeRequest, response?: Response) => void; +export type PhpNotFoundHook = (request: RuntimeRequest) => Response | string | undefined; + +export interface PhpCgiRuntimeArgs { + version?: PhpRuntimeVersion; + docroot?: string; + prefix?: string; + exclude?: string[]; + rewrite?: (path: string) => string | { scriptName: string; path: string }; + entrypoint?: string; + cookies?: string; + types?: Record; + onRequest?: PhpRuntimeHook; + notFound?: PhpNotFoundHook; + sharedLibs?: Array; + dynamicLibs?: Array; + actions?: Record) => PhpRuntimeValue | Promise>; + files?: PhpPreloadFile[]; + autoTransaction?: boolean; + maxRequestAge?: number; + staticCacheTime?: number; + dynamicCacheTime?: number; + vHosts?: PhpVhost[]; + env?: Record; + ini?: string; + staticFS?: boolean; + persist?: object | object[]; + locateFile?: (path: string, directory?: string) => string | URL | undefined; +} + +export interface PhpCgiSettings { + docroot: string; + maxRequestAge: number; + staticCacheTime: number; + dynamicCacheTime: number; + vHosts: PhpVhost[]; +} + +export declare class PhpCgiBase extends EventTarget { + constructor(phpBinLoader: Promise<{ default: new (args: object) => object }>, args?: PhpCgiRuntimeArgs); + phpVersion?: PhpRuntimeVersion; + binary: Promise; + refresh(): Promise; + request(request: RuntimeRequest): Promise; + analyzePath(path: string): Promise; + readdir(path: string): Promise; + readFile(path: string, options?: object): Promise; + stat(path: string): Promise; + mkdir(path: string): Promise; + rmdir(path: string): Promise; + rename(path: string, newPath: string): Promise; + writeFile(path: string, data: string | Uint8Array | ArrayBufferLike | Iterable, options?: object): Promise; + unlink(path: string): Promise; + putEnv(name: string, value: string): Promise; + getSettings(): Promise; + setSettings(settings: Partial): void; + getEnvs(): Promise>; + setEnvs(env: Record): void; + storeInit(): Promise; + loadInit(binary: object): void; +} diff --git a/packages/php-cgi-wasm/static.mak b/packages/php-cgi-wasm/static.mak index 652470f99..1f61bd12a 100644 --- a/packages/php-cgi-wasm/static.mak +++ b/packages/php-cgi-wasm/static.mak @@ -137,25 +137,25 @@ cgi-helpers-mjs: $(addprefix ${PHP_CGI_DIST_DIR}/,${CGI_MJS_HELPERS_WEB} ${MJS_H cgi-helpers-cjs: $(addprefix ${PHP_CGI_DIST_DIR}/,${CGI_CJS_HELPERS_WEB} ${CJS_HELPERS_WEB}) ifneq (${PRE_JS_FILES},) -CGI_DEPENDENCIES+= .cache/pre.js +CGI_DEPENDENCIES+= ${PRE_JS_CACHE} endif CGI_DEPENDENCIES+= third_party/php${PHP_VERSION}-src/configured -${PHP_CGI_DIST_DIR}/%.js: source/%.js +${PHP_CGI_DIST_DIR}/%.js: source/%.mjs npx babel $< --out-dir ${PHP_CGI_DIST_DIR}/ - perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|' ${PHP_CGI_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|g' ${PHP_CGI_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|require\("(\..+?).mjs"\)|require("\1.js")|g' ${PHP_CGI_DIST_DIR}/$(notdir $@) -${PHP_CGI_DIST_DIR}/%.mjs: source/%.js +${PHP_CGI_DIST_DIR}/%.mjs: source/%.mjs cp $< $@; - perl -pi -w -e "s~\b(import.+ from )(['\"])(?!node\:)([^'\"]+)\2~\1\2\3.mjs\2~g" $@; ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.js: BUILD_TYPE=js ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.js: ENVIRONMENT=web ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.js: FS_TYPE=${WEB_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.js: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -174,7 +174,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.mjs: ENVIRONMENT=web ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.mjs: FS_TYPE=${WEB_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-web.mjs: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -193,7 +193,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.js: ENVIRONMENT=worker ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.js: FS_TYPE=${WORKER_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.js: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -212,7 +212,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.mjs: ENVIRONMENT=worker ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.mjs: FS_TYPE=${WORKER_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-worker.mjs: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -231,7 +231,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.js: ENVIRONMENT=node ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.js: FS_TYPE=${NODE_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.js: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -250,13 +250,14 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.mjs: ENVIRONMENT=node ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.mjs: FS_TYPE=${NODE_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.mjs: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} cp -Lprf third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}* ${PHP_CGI_DIST_DIR}/ perl -pi -w -e 's|import(name)|import(/* webpackIgnore: true */ name)|g' $@ perl -pi -w -e 's|require("fs")|require(/* webpackIgnore: true */ "fs")|g' $@ + perl -pi -w -e 's|from '\''module'\''|from '\''node:module'\''|g' $@ - cp -Lprf ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.* ${PHP_CGI_ASSET_DIR} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.mjs.wasm.map.MAPPED: ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-node.mjs @@ -267,7 +268,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.js: ENVIRONMENT=webview ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.js: FS_TYPE=${WEB_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.js: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} @@ -286,7 +287,7 @@ ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.mjs: ENVIRONMENT=webview ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.mjs: FS_TYPE=${WEB_FS_TYPE} ${PHP_CGI_DIST_DIR}/php${PHP_SUFFIX}-cgi-webview.mjs: ${CGI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding PHP-CGI ${PHP_VERSION} for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cgi install-cgi install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cgi WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cgi/php${PHP_SUFFIX}-cgi-${ENVIRONMENT}.${BUILD_TYPE} diff --git a/packages/php-cli-wasm/PhpBase.d.mts b/packages/php-cli-wasm/PhpBase.d.mts new file mode 100644 index 000000000..b7e8b7187 --- /dev/null +++ b/packages/php-cli-wasm/PhpBase.d.mts @@ -0,0 +1 @@ +export * from './public'; diff --git a/packages/php-cli-wasm/PhpCliNode.d.mts b/packages/php-cli-wasm/PhpCliNode.d.mts new file mode 100644 index 000000000..67d398cf9 --- /dev/null +++ b/packages/php-cli-wasm/PhpCliNode.d.mts @@ -0,0 +1,12 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpCliNode extends PhpBase { + interactive: boolean; + script?: string; + code?: string; + constructor(args?: PhpRuntimeArgs); + provideInput(line: string): Promise; + run(flags?: string[]): Promise; + _run(flags?: string[]): Promise; +} diff --git a/packages/php-cli-wasm/PhpCliWeb.d.mts b/packages/php-cli-wasm/PhpCliWeb.d.mts new file mode 100644 index 000000000..1ff8df033 --- /dev/null +++ b/packages/php-cli-wasm/PhpCliWeb.d.mts @@ -0,0 +1,15 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpCliWeb extends PhpBase { + interactive: boolean; + script?: string; + code?: string; + constructor(args?: PhpRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + provideInput(line: string): Promise; + run(flags?: string[]): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-cli-wasm/README.md b/packages/php-cli-wasm/README.md index 4298104e8..e0e04517a 100644 --- a/packages/php-cli-wasm/README.md +++ b/packages/php-cli-wasm/README.md @@ -1,3 +1,37 @@ # [![seanmorris/php-cli-wasm](https://github.com/seanmorris/php-wasm/blob/master/docs/sean-icon.png)](https://github.com/seanmorris/php-wasm) php-cli-wasm -*to be documented* \ No newline at end of file +Find `php-cli-wasm` on [npm](https://npmjs.com/package/php-cli-wasm) + +Run the PHP CLI runtime in Node.js or ESM-capable browser contexts. + +## Install + +```bash +npm install php-cli-wasm +``` + +## Quickstart + +```javascript +import { PhpCliNode } from 'php-cli-wasm/PhpCliNode'; + +const php = new PhpCliNode({code: 'echo "Hello, world!\\n";'}); + +await php.run(); +``` + +On current Node releases, the core `PhpCliNode` entrypoint can be consumed from either ESM or CommonJS: + +```javascript +const { PhpCliNode } = require('php-cli-wasm/PhpCliNode'); + +const php = new PhpCliNode({code: 'echo "Hello, world!\\n";'}); + +await php.run(); +``` + +Runtime-loadable extension helper JS packages remain ESM-only; provide extension assets manually through the runtime constructor options when you need to bypass the helper packages. + +For broader project documentation, see: + +https://github.com/seanmorris/php-wasm diff --git a/packages/php-cli-wasm/package.json b/packages/php-cli-wasm/package.json index c95b999ba..254768905 100644 --- a/packages/php-cli-wasm/package.json +++ b/packages/php-cli-wasm/package.json @@ -1,7 +1,45 @@ { "name": "php-cli-wasm", - "version": "0.0.9-alpha-32", + "version": "0.1.0", "description": "php-cli for wasm.", + "main": "./PhpCliNode.js", + "module": "./PhpCliNode.mjs", + "types": "./PhpCliNode.d.mts", + "exports": { + ".": { + "types": "./PhpCliNode.d.mts", + "import": "./PhpCliNode.mjs", + "require": "./PhpCliNode.js", + "default": "./PhpCliNode.mjs" + }, + "./package.json": "./package.json", + "./public": { + "types": "./public.d.ts", + "default": "./public.d.ts" + }, + "./PhpBase": { + "types": "./PhpBase.d.mts", + "import": "./PhpBase.mjs", + "require": "./PhpBase.js", + "default": "./PhpBase.mjs" + }, + "./PhpCliNode": { + "types": "./PhpCliNode.d.mts", + "import": "./PhpCliNode.mjs", + "require": "./PhpCliNode.js", + "default": "./PhpCliNode.mjs" + }, + "./PhpCliWeb": { + "types": "./PhpCliWeb.d.mts", + "import": "./PhpCliWeb.mjs", + "require": "./PhpCliWeb.js", + "default": "./PhpCliWeb.mjs" + }, + "./*.mjs": "./*.mjs", + "./*.js": "./*.js", + "./*.data": "./*.data", + "./*.wasm": "./*.wasm" + }, "repository": { "type": "git", "url": "git+https://github.com/seanmorris/php-wasm.git" @@ -26,23 +64,16 @@ "vrzno" ], "files": [ + "*.js", + "*.mjs", "*.wasm", + "*.data", + "*.d.ts", + "*.d.mts", "LICENSE", "NOTICE", "README.md", "package.json", - "libxml2.so", - "PhpCliWeb.js", - "PhpCliWeb.mjs", - "php-cli-web.js", - "php-cli-web.mjs", - "config.js", - "config.mjs", - "fsOps.js", - "fsOps.mjs", - "webTransactions.js", - "webTransactions.mjs", - "resolveDependencies.js", - "resolveDependencies.mjs" + "public.d.ts" ] } diff --git a/packages/php-cli-wasm/public.d.ts b/packages/php-cli-wasm/public.d.ts new file mode 100644 index 000000000..cb5299efd --- /dev/null +++ b/packages/php-cli-wasm/public.d.ts @@ -0,0 +1,65 @@ +export type PhpRuntimeVersion = '8.0' | '8.1' | '8.2' | '8.3' | '8.4' | '8.5'; +export type PhpRuntimeValue = object | string | number | boolean | Uint8Array | null | undefined | void; + +export interface PhpPreloadFile { + url: string | URL; + path?: string; + parent?: string; + name?: string; +} + +export interface PhpSharedLibrary { + name?: string; + url: string | URL; + ini?: boolean; + getLibs?: () => PhpSharedLibrary[]; + getFiles?: () => PhpPreloadFile[]; +} + +export interface PhpRuntimeArgs { + autoTransaction?: boolean; + version?: PhpRuntimeVersion; + interactive?: boolean; + script?: string; + code?: string; + shared?: Record; + locateFile?: (path: string, directory?: string) => string | URL | undefined; + files?: PhpPreloadFile[]; + sharedLibs?: Array; + dynamicLibs?: Array; + debug?: boolean; + ini?: string; + persist?: object; + [key: string]: object | string | number | boolean | undefined; +} + +export interface PhpBaseModuleFactory { + default: new (args: object) => object; +} + +export declare class PhpBase extends EventTarget { + constructor(phpBinLoader: Promise, args?: PhpRuntimeArgs, sapi?: string); + autoTransaction: boolean; + transactionStarted: boolean | Promise; + phpVersion?: PhpRuntimeVersion; + phpArgs: PhpRuntimeArgs; + binary: Promise; + inputString(byteString: string): void; + input(items: Iterable): void; + flush(): void; + tokenize(phpCode: string): string[]; + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + run(phpCode: string): Promise; + exec(phpCode: string): Promise; + refresh(): Promise; + analyzePath(path: string): Promise; + readdir(path: string): Promise; + readFile(path: string, options?: object): Promise; + stat(path: string): Promise; + mkdir(path: string): Promise; + rmdir(path: string): Promise; + rename(path: string, newPath: string): Promise; + writeFile(path: string, data: string | Uint8Array | ArrayBufferLike | Iterable, options?: object): Promise; + unlink(path: string): Promise; +} diff --git a/packages/php-cli-wasm/static.mak b/packages/php-cli-wasm/static.mak index 5939578bf..30dfc1327 100644 --- a/packages/php-cli-wasm/static.mak +++ b/packages/php-cli-wasm/static.mak @@ -15,13 +15,13 @@ NOTPARALLEL+=\ node-cli-js WEB_CLI_MJS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWeb.mjs PhpBase.mjs php${PHP_SUFFIX}-cli-web.mjs ${MJS_HELPERS_WEB}) -WEB_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWeb.js php${PHP_SUFFIX}-cli-web.js ${CJS_HELPERS_WEB}) +WEB_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpBase.js PhpCliWeb.js php${PHP_SUFFIX}-cli-web.js ${CJS_HELPERS_WEB}) WORKER_CLI_MJS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWorker.mjs php${PHP_SUFFIX}-cli-worker.mjs ${MJS_HELPERS_WEB}) -WORKER_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWorker.js php${PHP_SUFFIX}-cli-worker.js ${CJS_HELPERS_WEB}) +WORKER_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpBase.js PhpCliWorker.js php${PHP_SUFFIX}-cli-worker.js ${CJS_HELPERS_WEB}) WEBVIEW_CLI_MJS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWebview.mjs php${PHP_SUFFIX}-cli-webview.mjs ${MJS_HELPERS_WEB}) -WEBVIEW_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliWebview.js php${PHP_SUFFIX}-cli-webview.js ${CJS_HELPERS_WEB}) +WEBVIEW_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpBase.js PhpCliWebview.js php${PHP_SUFFIX}-cli-webview.js ${CJS_HELPERS_WEB}) NODE_CLI_MJS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliNode.mjs php${PHP_SUFFIX}-cli-node.mjs ${MJS_HELPERS_WEB}) -NODE_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpCliNode.js php${PHP_SUFFIX}-cli-node.js ${CJS_HELPERS}) +NODE_CLI_JS=$(addprefix ${PHP_CLI_DIST_DIR}/,PhpBase.js PhpCliNode.js php${PHP_SUFFIX}-cli-node.js ${CJS_HELPERS}) WEB_CLI_MJS_ASSETS= $(addprefix ${PHP_CLI_ASSET_DIR}/,${PHP_ASSET_LIST}) ${EXTRA_MODULES} ${HELPER_MJS} WEB_CLI_JS_ASSETS= $(addprefix ${PHP_CLI_ASSET_DIR}/,${PHP_ASSET_LIST}) ${EXTRA_MODULES} @@ -114,31 +114,31 @@ cli-all: # $(MAKE) node-cli-mjs # $(MAKE) node-cli-js -cli-mjs: ${CLI_MJS} +cli-mjs: $(MAKE) web-cli-mjs # $(MAKE) worker-cli-mjs # $(MAKE) webview-cli-mjs # $(MAKE) node-cli-mjs -cli-cjs: ${CLI_CJS} +cli-cjs: $(MAKE) web-cli-js # $(MAKE) worker-cli-js # $(MAKE) webview-cli-js # $(MAKE) node-cli-js ifneq (${PRE_JS_FILES},) -CLI_DEPENDENCIES+= .cache/pre.js +CLI_DEPENDENCIES+= ${PRE_JS_CACHE} endif CLI_DEPENDENCIES+= third_party/php${PHP_VERSION}-src/configured -${PHP_CLI_DIST_DIR}/%.js: source/%.js +${PHP_CLI_DIST_DIR}/%.js: source/%.mjs npx babel $< --out-dir ${PHP_CLI_DIST_DIR}/ - perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|' ${PHP_CLI_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|g' ${PHP_CLI_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|require\("(\..+?).mjs"\)|require("\1.js")|g' ${PHP_CLI_DIST_DIR}/$(notdir $@) -${PHP_CLI_DIST_DIR}/%.mjs: source/%.js +${PHP_CLI_DIST_DIR}/%.mjs: source/%.mjs cp $< $@; - perl -pi -w -e "s~\b(import.+ from )(['\"])(?!node\:)([^'\"]+)\2~\1\2\3.mjs\2~g" $@; ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.js: BUILD_TYPE=js ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.js: ENVIRONMENT=web @@ -147,7 +147,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.js: SAPI_CLI_PATH=sapi/cli/php${PHP ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.js: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.js: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -168,7 +168,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.mjs: SAPI_CLI_PATH=sapi/cli/php${PH ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.mjs: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-web.mjs: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -189,7 +189,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.js: SAPI_CLI_PATH=sapi/cli/php${ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.js: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.js: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -210,7 +210,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.mjs: SAPI_CLI_PATH=sapi/cli/php$ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.mjs: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-worker.mjs: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -231,7 +231,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.js: SAPI_CLI_PATH=sapi/cli/php${PH ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.js: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.js: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -252,14 +252,14 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.mjs: SAPI_CLI_PATH=sapi/cli/php${P ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.mjs: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.mjs: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} cp -Lprf third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}* ${PHP_CLI_DIST_DIR}/ perl -pi -w -e 's|import(name)|import(/* webpackIgnore: true */ name)|g' $@ perl -pi -w -e 's|require("fs")|require(/* webpackIgnore: true */ "fs")|g' $@ - perl -pi -w -e 's|REMOTE_PACKAGE_BASE="(.+?)"|REMOTE_PACKAGE_BASE=new URL("\1", import.meta.url).href|g' $@ + perl -pi -w -e 's|from '\''module'\''|from '\''node:module'\''|g' $@ - cp -Lprf ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.* ${PHP_CLI_ASSET_DIR} ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.mjs.wasm.map.MAPPED: ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-node.mjs @@ -272,7 +272,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.js: SAPI_CLI_PATH=sapi/cli/php$ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.js: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.js: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} @@ -293,7 +293,7 @@ ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.mjs: SAPI_CLI_PATH=sapi/cli/php ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.mjs: PHP_CLI_OBJS=sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo sapi/cli/ps_title.lo sapi/cli/php_cli_process_title.lo ${PHP_CLI_DIST_DIR}/php${PHP_SUFFIX}-cli-webview.mjs: ${CLI_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php-cli for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make cli install-cli install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=cli WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/cli/php${PHP_SUFFIX}-cli-${ENVIRONMENT}${RELEASE_SUFFIX}.${BUILD_TYPE} diff --git a/packages/php-dbg-wasm/PhpDbgNode.d.mts b/packages/php-dbg-wasm/PhpDbgNode.d.mts new file mode 100644 index 000000000..505846491 --- /dev/null +++ b/packages/php-dbg-wasm/PhpDbgNode.d.mts @@ -0,0 +1,27 @@ +import type { PhpRuntimeArgs } from 'php-wasm/PhpBase.mjs'; +import { PhpBase } from 'php-wasm/PhpBase.mjs'; + +export class PhpDbgNode extends PhpBase { + running: boolean; + paused: boolean; + currentFilePtr: number | null; + currentLinePtr: number | null; + bpCountPtr: number | null; + constructor(args?: PhpRuntimeArgs); + run(): Promise; + provideInput(line: string): Promise; + getPrompt(): Promise; + isExecuting(): Promise; + isRunning(): Promise; + currentFile(): Promise; + currentLine(): Promise; + bpCount(): Promise; + dumpVars(): Promise; + dumpGlobals(): Promise; + dumpConstants(): Promise; + dumpFunctions(): Promise; + dumpClasses(): Promise; + dumpFiles(): Promise; + dumpBacktrace(): Promise>; + switchFrame(frame: number): Promise; +} diff --git a/packages/php-dbg-wasm/PhpDbgWeb.d.mts b/packages/php-dbg-wasm/PhpDbgWeb.d.mts new file mode 100644 index 000000000..9b33b426b --- /dev/null +++ b/packages/php-dbg-wasm/PhpDbgWeb.d.mts @@ -0,0 +1,30 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from 'php-wasm/PhpBase.mjs'; +import { PhpBase } from 'php-wasm/PhpBase.mjs'; + +export class PhpDbgWeb extends PhpBase { + running: boolean; + paused: boolean; + currentFilePtr: number | null; + currentLinePtr: number | null; + bpCountPtr: number | null; + constructor(args?: PhpRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + run(): Promise; + provideInput(line: string): Promise; + getPrompt(): Promise; + isExecuting(): Promise; + currentFile(): Promise; + currentLine(): Promise; + bpCount(): Promise; + dumpVars(): Promise; + dumpGlobals(): Promise; + dumpConstants(): Promise; + dumpFunctions(): Promise; + dumpClasses(): Promise; + dumpFiles(): Promise; + dumpBacktrace(): Promise; + switchFrame(frame: number): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-dbg-wasm/README.md b/packages/php-dbg-wasm/README.md index b26d80456..7f910a62d 100644 --- a/packages/php-dbg-wasm/README.md +++ b/packages/php-dbg-wasm/README.md @@ -1,3 +1,39 @@ # [![seanmorris/php-dbg-wasm](https://github.com/seanmorris/php-wasm/blob/master/docs/sean-icon.png)](https://github.com/seanmorris/php-wasm) php-dbg-wasm -*to be documented* \ No newline at end of file +Find `php-dbg-wasm` on [npm](https://npmjs.com/package/php-dbg-wasm) + +Run the `phpdbg` runtime in Node.js or ESM-capable browser contexts. + +## Install + +```bash +npm install php-dbg-wasm +``` + +## Quickstart + +```javascript +import { PhpDbgNode } from 'php-dbg-wasm/PhpDbgNode'; + +const php = new PhpDbgNode(); + +await php.run(); +await php.provideInput('help'); +``` + +On current Node releases, the core `PhpDbgNode` entrypoint can be consumed from either ESM or CommonJS: + +```javascript +const { PhpDbgNode } = require('php-dbg-wasm/PhpDbgNode'); + +const php = new PhpDbgNode(); + +await php.run(); +await php.provideInput('help'); +``` + +Runtime-loadable extension helper JS packages remain ESM-only; provide extension assets manually through the runtime constructor options when you need to bypass the helper packages. + +For broader project documentation, see: + +https://github.com/seanmorris/php-wasm diff --git a/packages/php-dbg-wasm/package.json b/packages/php-dbg-wasm/package.json index 60c8cbae7..0a8fbb351 100644 --- a/packages/php-dbg-wasm/package.json +++ b/packages/php-dbg-wasm/package.json @@ -1,7 +1,35 @@ { "name": "php-dbg-wasm", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "description": "phpdbg for wasm.", + "main": "./PhpDbgNode.js", + "module": "./PhpDbgNode.mjs", + "types": "./PhpDbgNode.d.mts", + "exports": { + ".": { + "types": "./PhpDbgNode.d.mts", + "import": "./PhpDbgNode.mjs", + "require": "./PhpDbgNode.js", + "default": "./PhpDbgNode.mjs" + }, + "./package.json": "./package.json", + "./PhpDbgNode": { + "types": "./PhpDbgNode.d.mts", + "import": "./PhpDbgNode.mjs", + "require": "./PhpDbgNode.js", + "default": "./PhpDbgNode.mjs" + }, + "./PhpDbgWeb": { + "types": "./PhpDbgWeb.d.mts", + "import": "./PhpDbgWeb.mjs", + "require": "./PhpDbgWeb.js", + "default": "./PhpDbgWeb.mjs" + }, + "./*.mjs": "./*.mjs", + "./*.js": "./*.js", + "./*.data": "./*.data", + "./*.wasm": "./*.wasm" + }, "repository": { "type": "git", "url": "git+https://github.com/seanmorris/php-wasm.git" @@ -15,8 +43,11 @@ "url": "https://seanmorr.is" } ], + "dependencies": { + "php-wasm": "^0.1.0" + }, "scripts": { - "postpublish": "ls *.mjs *.js *.wasm *.data | while read FILENAME; do echo -n \"curl -X PURGE $FILENAME ... \"; curl -X PURGE https://cdn.jsdelivr.net/npm/php-wasm/$FILENAME; echo; done;" + "postpublish": "ls *.mjs *.js *.wasm *.data | while read FILENAME; do echo -n \"curl -X PURGE $FILENAME ... \"; curl -X PURGE https://cdn.jsdelivr.net/npm/php-dbg-wasm/$FILENAME; echo; done;" }, "keywords": [ "php", @@ -26,23 +57,15 @@ "vrzno" ], "files": [ + "*.js", + "*.mjs", "*.wasm", + "*.data", + "*.d.mts", "LICENSE", "NOTICE", "README.md", "package.json", - "libxml2.so", - "PhpDbgWeb.js", - "PhpDbgWeb.mjs", - "php-dbg-web.js", - "php-dbg-web.mjs", - "config.js", - "config.mjs", - "fsOps.js", - "fsOps.mjs", - "webTransactions.js", - "webTransactions.mjs", - "resolveDependencies.js", - "resolveDependencies.mjs" + "*.d.ts" ] } diff --git a/packages/php-dbg-wasm/static.mak b/packages/php-dbg-wasm/static.mak index 9e3cd3938..a33046936 100644 --- a/packages/php-dbg-wasm/static.mak +++ b/packages/php-dbg-wasm/static.mak @@ -14,14 +14,14 @@ NOTPARALLEL+=\ webview-dbg-js \ node-dbg-js -WEB_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWeb.mjs php${PHP_SUFFIX}-dbg-web.mjs ${MJS_HELPERS_WEB}) -WEB_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWeb.js php${PHP_SUFFIX}-dbg-web.js ${CJS_HELPERS_WEB}) +WEB_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.mjs PhpDbgWeb.mjs php${PHP_SUFFIX}-dbg-web.mjs ${MJS_HELPERS_WEB}) +WEB_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.js PhpDbgWeb.js php${PHP_SUFFIX}-dbg-web.js ${CJS_HELPERS_WEB}) WORKER_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWorker.mjs php${PHP_SUFFIX}-dbg-worker.mjs ${MJS_HELPERS_WEB}) -WORKER_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWorker.js php${PHP_SUFFIX}-dbg-worker.js ${CJS_HELPERS_WEB}) +WORKER_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.js PhpDbgWorker.js php${PHP_SUFFIX}-dbg-worker.js ${CJS_HELPERS_WEB}) WEBVIEW_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWebview.mjs php${PHP_SUFFIX}-dbg-webview.mjs ${MJS_HELPERS_WEB}) -WEBVIEW_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgWebview.js php${PHP_SUFFIX}-dbg-webview.js ${CJS_HELPERS_WEB}) -NODE_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgNode.mjs php${PHP_SUFFIX}-dbg-node.mjs ${MJS_HELPERS_WEB}) -NODE_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpDbgNode.js php${PHP_SUFFIX}-dbg-node.js ${CJS_HELPERS}) +WEBVIEW_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.js PhpDbgWebview.js php${PHP_SUFFIX}-dbg-webview.js ${CJS_HELPERS_WEB}) +NODE_DBG_MJS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.mjs PhpDbgNode.mjs php${PHP_SUFFIX}-dbg-node.mjs ${MJS_HELPERS_WEB}) +NODE_DBG_JS=$(addprefix ${PHP_DBG_DIST_DIR}/,PhpBase.js PhpDbgNode.js php${PHP_SUFFIX}-dbg-node.js ${CJS_HELPERS}) WEB_DBG_MJS_ASSETS= $(addprefix ${PHP_DBG_ASSET_DIR}/,${PHP_ASSET_LIST}) ${EXTRA_MODULES} ${HELPER_MJS} WEB_DBG_JS_ASSETS= $(addprefix ${PHP_DBG_ASSET_DIR}/,${PHP_ASSET_LIST}) ${EXTRA_MODULES} @@ -114,38 +114,38 @@ dbg-all: # $(MAKE) node-dbg-mjs # $(MAKE) node-dbg-js -dbg-mjs: ${DBG_MJS} +dbg-mjs: $(MAKE) web-dbg-mjs # $(MAKE) worker-dbg-mjs # $(MAKE) webview-dbg-mjs # $(MAKE) node-dbg-mjs -dbg-cjs: ${DBG_CJS} +dbg-cjs: $(MAKE) web-dbg-js # $(MAKE) worker-dbg-js # $(MAKE) webview-dbg-js # $(MAKE) node-dbg-js ifneq (${PRE_JS_FILES},) -DBG_DEPENDENCIES+= .cache/pre.js +DBG_DEPENDENCIES+= ${PRE_JS_CACHE} endif DBG_DEPENDENCIES+= third_party/php${PHP_VERSION}-src/configured -${PHP_DBG_DIST_DIR}/%.js: source/%.js +${PHP_DBG_DIST_DIR}/%.js: source/%.mjs npx babel $< --out-dir ${PHP_DBG_DIST_DIR}/ - perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|' ${PHP_DBG_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|g' ${PHP_DBG_DIST_DIR}/$(notdir $@) + perl -pi -w -e 's|require\("(\..+?).mjs"\)|require("\1.js")|g' ${PHP_DBG_DIST_DIR}/$(notdir $@) -${PHP_DBG_DIST_DIR}/%.mjs: source/%.js +${PHP_DBG_DIST_DIR}/%.mjs: source/%.mjs cp $< $@; - perl -pi -w -e "s~\b(import.+ from )(['\"])(?!node\:)([^'\"]+)\2~\1\2\3.mjs\2~g" $@; ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.js: BUILD_TYPE=js ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.js: ENVIRONMENT=web ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.js: FS_TYPE=${WEB_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.js: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -164,7 +164,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.mjs: ENVIRONMENT=web ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.mjs: FS_TYPE=${WEB_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-web.mjs: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -183,7 +183,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.js: ENVIRONMENT=worker ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.js: FS_TYPE=${WORKER_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.js: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -202,7 +202,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.mjs: ENVIRONMENT=worker ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.mjs: FS_TYPE=${WORKER_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-worker.mjs: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -221,7 +221,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.js: ENVIRONMENT=node ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.js: FS_TYPE=${NODE_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.js: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -240,14 +240,14 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.mjs: ENVIRONMENT=node ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.mjs: FS_TYPE=${NODE_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.mjs: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} cp -Lprf third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}* ${PHP_DBG_DIST_DIR}/ perl -pi -w -e 's|import(name)|import(/* webpackIgnore: true */ name)|g' $@ perl -pi -w -e 's|require("fs")|require(/* webpackIgnore: true */ "fs")|g' $@ - perl -pi -w -e 's|REMOTE_PACKAGE_BASE="(.+?)"|REMOTE_PACKAGE_BASE=new URL("\1", import.meta.url).href|g' $@ + perl -pi -w -e 's|from '\''module'\''|from '\''node:module'\''|g' $@ - cp -Lprf ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.* ${PHP_DBG_ASSET_DIR} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.mjs.wasm.map.MAPPED: ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-node.mjs @@ -258,7 +258,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.js: ENVIRONMENT=webview ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.js: FS_TYPE=${WEB_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.js: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} @@ -277,7 +277,7 @@ ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.mjs: ENVIRONMENT=webview ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.mjs: FS_TYPE=${WEB_FS_TYPE} ${PHP_DBG_DIST_DIR}/php${PHP_SUFFIX}-dbg-webview.mjs: ${DBG_DEPENDENCIES} | ${ORDER_ONLY} @ echo -e "\e[33;4mBuilding php${PHP_SUFFIX}-dbg for ${ENVIRONMENT} {${BUILD_TYPE}}\e[0m" - ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers -e ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" + ${DOCKER_RUN_IN_PHP} emmake make phpdbg install-phpdbg install-build install-programs install-headers ${BUILD_FLAGS} PHP_BINARIES=phpdbg WASM_SHARED_LIBS="$(addprefix /src/,${SHARED_LIBS})" ${DOCKER_RUN_IN_PHP} mv -f \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE}.${BUILD_TYPE} \ /src/third_party/php${PHP_VERSION}-src/sapi/phpdbg/php${PHP_SUFFIX}-dbg-${ENVIRONMENT}.${BUILD_TYPE} diff --git a/packages/php-wasm/PhpBase.d.mts b/packages/php-wasm/PhpBase.d.mts new file mode 100644 index 000000000..b7e8b7187 --- /dev/null +++ b/packages/php-wasm/PhpBase.d.mts @@ -0,0 +1 @@ +export * from './public'; diff --git a/packages/php-wasm/PhpNode.d.mts b/packages/php-wasm/PhpNode.d.mts new file mode 100644 index 000000000..7da218fe1 --- /dev/null +++ b/packages/php-wasm/PhpNode.d.mts @@ -0,0 +1,6 @@ +import type { PhpRuntimeArgs } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpNode extends PhpBase { + constructor(args?: PhpRuntimeArgs); +} diff --git a/packages/php-wasm/PhpWeb.d.mts b/packages/php-wasm/PhpWeb.d.mts new file mode 100644 index 000000000..9650d518b --- /dev/null +++ b/packages/php-wasm/PhpWeb.d.mts @@ -0,0 +1,10 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpWeb extends PhpBase { + constructor(args?: PhpRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-wasm/PhpWebview.d.mts b/packages/php-wasm/PhpWebview.d.mts new file mode 100644 index 000000000..977761b65 --- /dev/null +++ b/packages/php-wasm/PhpWebview.d.mts @@ -0,0 +1,10 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpWebview extends PhpBase { + constructor(args?: PhpRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-wasm/PhpWorker.d.mts b/packages/php-wasm/PhpWorker.d.mts new file mode 100644 index 000000000..f4ee5414d --- /dev/null +++ b/packages/php-wasm/PhpWorker.d.mts @@ -0,0 +1,10 @@ +import type { PhpRuntimeArgs, PhpRuntimeValue } from './public'; +import { PhpBase } from './PhpBase.mjs'; + +export class PhpWorker extends PhpBase { + constructor(args?: PhpRuntimeArgs); + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + refresh(): Promise; + _enqueue(callback: (...params: Array) => Promise, params?: Array, readOnly?: boolean): Promise; +} diff --git a/packages/php-wasm/README.md b/packages/php-wasm/README.md index e69de29bb..b0b6acb28 100644 --- a/packages/php-wasm/README.md +++ b/packages/php-wasm/README.md @@ -0,0 +1,37 @@ +# [![seanmorris/php-wasm](https://github.com/seanmorris/php-wasm/blob/master/docs/sean-icon.png)](https://github.com/seanmorris/php-wasm) php-wasm + +Find `php-wasm` on [npm](https://npmjs.com/package/php-wasm) + +Run PHP directly in the browser, in a worker, or in Node.js. + +## Install + +```bash +npm install php-wasm +``` + +## Quickstart + +```javascript +import { PhpWeb } from 'php-wasm/PhpWeb'; + +const php = new PhpWeb(); + +await php.run('; + +export interface PhpPreloadFile { + url: string | URL; + path?: string; + parent?: string; + name?: string; +} + +export interface PhpSharedLibrary { + name?: string; + url: string | URL; + ini?: boolean; + getLibs?: Function; + getFiles?: Function; +} + +export interface PhpVhost { + pathPrefix: string; + directory: string; + entrypoint: string; +} + +export interface PhpRuntimeArgs { + autoTransaction?: boolean; + version?: PhpRuntimeVersion; + variant?: PhpRuntimeVariant; + interactive?: boolean; + script?: string; + code?: string; + shared?: Record; + locateFile?: (path: string, directory?: string) => string | URL | undefined; + files?: PhpPreloadFile[]; + sharedLibs?: Array; + dynamicLibs?: Array; + debug?: boolean; + ini?: string; + persist?: object; + staticFS?: boolean; + vHosts?: PhpVhost[]; + [key: string]: object | string | number | boolean | Function | undefined; +} + +export interface PhpBaseModuleFactory { + default: new (args: object) => object; +} + +export interface PhpBinaryRuntime { + inputDataQueue?: string[]; + awaitingInput?: ((value: string | undefined) => void) | null; + triggerStdin?: () => void; + persist?: boolean; + ccall?: Function; + lengthBytesUTF8?: Function; + _malloc?: Function; + _free?: Function; + stringToUTF8?: Function; + setValue?: Function; + UTF8ToString?: Function; + getValue?: Function; + HEAP8?: Int8Array; + hasVrzno?: boolean; + zvalToJS?: Function; + onRefresh?: Set; + FS?: { + syncfs?: (populate: boolean, callback: (error?: Error) => void) => void; + } & object; +} + +export declare class PhpBase extends EventTarget { + constructor(phpBinLoader: Promise, args?: PhpRuntimeArgs, sapi?: string); + autoTransaction: boolean; + transactionStarted: boolean | Promise; + phpVersion?: PhpRuntimeVersion; + phpVariant?: PhpRuntimeVariant; + phpArgs: PhpRuntimeArgs; + queue: Array<[Function, Array, (value?: PhpRuntimeValue) => void, (reason?: object | string | number | boolean | Error) => void]>; + binary: Promise; + inputString(byteString: string): void; + input(items: Iterable): void; + flush(): void; + tokenize(phpCode: string): string[]; + startTransaction(): Promise; + commitTransaction(readOnly?: boolean): Promise; + run(phpCode: string): Promise; + exec(phpCode: string): Promise; + x(fragments: TemplateStringsArray, ...values: PhpTemplateValue[]): Promise; + r(fragments: TemplateStringsArray, ...values: PhpTemplateValue[]): Promise; + refresh(): Promise; + analyzePath(path: string): Promise; + readdir(path: string): Promise; + readFile(path: string, options?: object): Promise; + stat(path: string): Promise; + mkdir(path: string): Promise; + rmdir(path: string): Promise; + rename(path: string, newPath: string): Promise; + writeFile(path: string, data: string | Uint8Array | ArrayBufferLike | Iterable, options?: object): Promise; + unlink(path: string): Promise; +} diff --git a/packages/sdl/8.0.mjs b/packages/sdl/8.0.mjs deleted file mode 100644 index 39b8f5e5e..000000000 --- a/packages/sdl/8.0.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const importMeta = import.meta; -const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); -const ini = !!(Number( url.searchParams.get('ini') ?? true )); - -export const getLibs = php => [ - {name: `php8.0-sdl.so`, url: new URL(`./php8.0-sdl.so`, import.meta.url), ini}, - {name: `libSDL2.so`, url: new URL(`./libSDL2.so`, import.meta.url)}, - {name: `libGL.so`, url: new URL(`./libGL.so`, import.meta.url)}, -]; - -export default {getLibs}; diff --git a/packages/sdl/8.1.mjs b/packages/sdl/8.1.mjs deleted file mode 100644 index fbbe048f1..000000000 --- a/packages/sdl/8.1.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const importMeta = import.meta; -const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); -const ini = !!(Number( url.searchParams.get('ini') ?? true )); - -export const getLibs = php => [ - {name: `php8.1-sdl.so`, url: new URL(`./php8.1-sdl.so`, import.meta.url), ini}, - {name: `libSDL2.so`, url: new URL(`./libSDL2.so`, import.meta.url)}, - {name: `libGL.so`, url: new URL(`./libGL.so`, import.meta.url)}, -]; - -export default {getLibs}; diff --git a/packages/sdl/8.2.mjs b/packages/sdl/8.2.mjs deleted file mode 100644 index c4b00c54c..000000000 --- a/packages/sdl/8.2.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const importMeta = import.meta; -const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); -const ini = !!(Number( url.searchParams.get('ini') ?? true )); - -export const getLibs = php => [ - {name: `php8.2-sdl.so`, url: new URL(`./php8.2-sdl.so`, import.meta.url), ini}, - {name: `libSDL2.so`, url: new URL(`./libSDL2.so`, import.meta.url)}, - {name: `libGL.so`, url: new URL(`./libGL.so`, import.meta.url)}, -]; - -export default {getLibs}; diff --git a/packages/sdl/8.3.mjs b/packages/sdl/8.3.mjs deleted file mode 100644 index 182acb3b1..000000000 --- a/packages/sdl/8.3.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const importMeta = import.meta; -const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); -const ini = !!(Number( url.searchParams.get('ini') ?? true )); - -export const getLibs = php => [ - {name: `php8.3-sdl.so`, url: new URL(`./php8.3-sdl.so`, import.meta.url), ini}, - {name: `libSDL2.so`, url: new URL(`./libSDL2.so`, import.meta.url)}, - {name: `libGL.so`, url: new URL(`./libGL.so`, import.meta.url)}, -]; - -export default {getLibs}; diff --git a/packages/sdl/8.4.mjs b/packages/sdl/8.4.mjs deleted file mode 100644 index ba2bc4910..000000000 --- a/packages/sdl/8.4.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const importMeta = import.meta; -const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); -const ini = !!(Number( url.searchParams.get('ini') ?? true )); - -export const getLibs = php => [ - {name: `php8.4-sdl.so`, url: new URL(`./php8.4-sdl.so`, import.meta.url), ini}, - {name: `libSDL2.so`, url: new URL(`./libSDL2.so`, import.meta.url)}, - {name: `libGL.so`, url: new URL(`./libGL.so`, import.meta.url)}, -]; - -export default {getLibs}; diff --git a/packages/sdl/README.md b/packages/sdl/README.md index afbd305c8..691a9e469 100644 --- a/packages/sdl/README.md +++ b/packages/sdl/README.md @@ -1,43 +1,40 @@ # php-wasm-sdl -sdl extension for php-wasm +`php-wasm-sdl` is a compatibility shim for SDL-enabled `php-wasm` runtimes. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm +```sh +npm install php-wasm +``` -## Usage +## What It Does -`php-wasm-sdl` can be loaded via dynamic imports: +SDL support now lives entirely in the `_sdl` runtime variant. +There is no separate `php8.x-sdl.so` payload to load at runtime. -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-sdl') -]}); -``` +Existing code that imports `php-wasm-sdl` still works, but the package now resolves to an empty shared-library list. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-sdl.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + variant: '_sdl', +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-sdl.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/sdl/index.mjs b/packages/sdl/index.mjs index 933971ac9..5777f510b 100644 --- a/packages/sdl/index.mjs +++ b/packages/sdl/index.mjs @@ -1,17 +1,9 @@ -import sdl8_4 from './8.4.mjs'; -import sdl8_3 from './8.3.mjs'; -import sdl8_2 from './8.2.mjs'; -import sdl8_1 from './8.1.mjs'; -import sdl8_0 from './8.0.mjs'; - -const versionTable = { - '8.4': sdl8_4, - '8.3': sdl8_3, - '8.2': sdl8_2, - '8.1': sdl8_1, - '8.0': sdl8_0, -}; - -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Compatibility shim for historical `php-wasm-sdl` imports. + * SDL support now lives in the `_sdl` runtime variant and does not require extra shared libraries. + * + * @returns {Array} Always returns an empty list. + */ +export const getLibs = () => []; export default {getLibs}; diff --git a/packages/sdl/package.json b/packages/sdl/package.json index 944ae0bca..270b732fd 100644 --- a/packages/sdl/package.json +++ b/packages/sdl/package.json @@ -1,23 +1,19 @@ { "name": "php-wasm-sdl", - "description": "sdl for php-wasm.", + "description": "Compatibility shim and build config for SDL-enabled php-wasm runtimes.", "repository": { "type": "git", "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", + "LICENSE", "NOTICE", - "README.md", - "static.mak", - "libSDL2.so", - "libGL.so", - "php8.3-sdl.so", - "php8.2-sdl.so", - "php8.1-sdl.so", - "php8.0-sdl.so" + "README.md" ] } diff --git a/packages/sdl/pre.mak b/packages/sdl/pre.mak index 0b75655cd..710dab376 100644 --- a/packages/sdl/pre.mak +++ b/packages/sdl/pre.mak @@ -1,42 +1,21 @@ #!/usr/bin/env make -# WITH_SDL?=dynamic +# WITH_SDL?=1 WITH_SDL?=0 LIBSDL_TAG?=release-2.28.4 DOCKER_RUN_IN_LIB_SDL=${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY' -w /emsdk/upstream/emscripten/cache/ports/sdl2/SDL-${LIBSDL_TAG} emscripten-builder -DOCKER_RUN_IN_LIB_GL =${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY' -w /emsdk/upstream/emscripten/cache/ports/gl emscripten-builder -DOCKER_RUN_IN_EXT_SDL=${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY -sUSE_SDL=2' -w /src/third_party/php${PHP_VERSION}-sdl/ emscripten-builder -ifeq ($(filter ${WITH_SDL},0 1 shared static dynamic),) -$(error WITH_SDL MUST BE 0, 1, static, shared, OR dynamic. WITH_SDL: '${WITH_SDL}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +ifeq ($(filter ${WITH_SDL},0 1 dynamic),) +$(error WITH_SDL MUST BE 0, 1, OR dynamic. WITH_SDL: '${WITH_SDL}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) endif ifneq ($(filter ${WITH_SDL},1 dynamic),) -WITH_SDL=dynamic -EXTRA_CFLAGS+= --use-port=sdl2 -sFULL_ES2 -sFULL_ES3 -lEGL -lGL -EXTRA_MODULES+= packages/sdl/libSDL2.so packages/sdl/libGL.so packages/sdl/php${PHP_VERSION}-sdl.so +WITH_SDL=1 +CONFIGURE_FLAGS+= --with-sdl=/src/lib/bin/sdl2-config +EXTRA_FLAGS+= -sFULL_ES2 -sFULL_ES3 -lEGL -lGL +PHP_CONFIGURE_DEPS+= third_party/php${PHP_VERSION}-src/ext/sdl/config.m4 lib/bin/sdl2-config +ZEND_EXTRA_LIBS+= -lhtml5 TEST_LIST+=$(shell ls packages/sdl/test/*.mjs) -SKIP_LIBS+= -lsdl -lgl PHP_VARIANT:=${PHP_VARIANT}_sdl endif - -ifeq (${WITH_SDL},static) -CONFIGURE_FLAGS+= --with-sdl -# EXTRA_CFLAGS+= -sUSE_SDL=2 -sFULL_ES2 -sFULL_ES3 -lEGL -lGL -lSDL2 -EXTRA_MODULES+= packages/sdl/libSDL2.so packages/sdl/libGL.so packages/sdl/php${PHP_VERSION}-sdl.so -PHP_CONFIGURE_DEPS+= lib/lib/libSDL2.a third_party/php${PHP_VERSION}-src/ext/sdl/config.m4 -# TEST_LIST+=$(shell ls packages/sdl/test/*.mjs) -ARCHIVES+= lib/lib/libSDL2.a -# SKIP_LIBS+= -lsdl -lgl -PHP_VARIANT:=${PHP_VARIANT}_sdl -endif - -# ifeq (${WITH_SDL},shared) -# CONFIGURE_FLAGS+= --with-sdl -# PHP_CONFIGURE_DEPS+= third_party/php${PHP_VERSION}-src/ext/sdl/config.m4 packages/sdl/libSDL2.so packages/sdl/libGL.so -# TEST_LIST+=$(shell ls packages/sdl/test/*.mjs) -# SHARED_LIBS+= packages/sdl/libSDL2.so packages/sdl/libGL.so -# # PHP_ASSET_LIST+= libSDL2.so libGL.so -# # SKIP_LIBS+= -lsdl -lgl -# endif diff --git a/packages/sdl/sdl2-config.in b/packages/sdl/sdl2-config.in new file mode 100644 index 000000000..1c32910d0 --- /dev/null +++ b/packages/sdl/sdl2-config.in @@ -0,0 +1,55 @@ +#!/bin/sh + +bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)") +prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)") +exec_prefix=${prefix} +exec_prefix_set=no +libdir=${exec_prefix}/lib + +usage="\ +Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=?*) optarg=$(echo "$1" | sed 's/[-_a-zA-Z0-9]*=//') ;; + *) optarg= ;; + esac + + case "$1" in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo @SDL_VERSION@ + ;; + --cflags) + echo -I${prefix}/include/SDL2 -D_REENTRANT + ;; + --libs|--static-libs) + echo -L${exec_prefix}/lib -lSDL2 -lm -lpthread + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/packages/sdl/static.mak b/packages/sdl/static.mak index 278ca9daf..0feeac2db 100644 --- a/packages/sdl/static.mak +++ b/packages/sdl/static.mak @@ -1,110 +1,40 @@ #!/usr/bin/env make -# WITH_SDL?=dynamic -WITH_SDL?=0 - -# LIBSDL_TAG?=release-2.28.4 -# DOCKER_RUN_IN_LIB_SDL=${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY' -w /emsdk/upstream/emscripten/cache/ports/sdl2/SDL-${LIBSDL_TAG} emscripten-builder -# DOCKER_RUN_IN_LIB_GL =${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY' -w /emsdk/upstream/emscripten/cache/ports/gl emscripten-builder DOCKER_RUN_IN_EXT_SDL=${DOCKER_ENV} -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE} -sASYNCIFY -sUSE_SDL=2' -w /src/third_party/php${PHP_VERSION}-sdl/ emscripten-builder -## @ TODO: Implement static & shared builds -ifeq ($(filter ${WITH_SDL},0 1 dynamic),) -$(error WITH_SDL MUST BE 0, 1, OR dynamic. WITH_SDL: '${WITH_SDL}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) -endif - -ifeq (${WITH_SDL},static) -CONFIGURE_FLAGS+= --with-sdl -PHP_CONFIGURE_DEPS+= lib/lib/libSDL2.a third_party/php${PHP_VERSION}-src/ext/sdl/config.m4 -TEST_LIST+=$(shell ls packages/sdl/test/*.mjs) -# ARCHIVES+= lib/lib/libSDL2.a libGL.so -# SKIP_LIBS+= -lsdl -lgl -EXTRA_MODULES+= packages/sdl/php${PHP_VERSION}-sdl.so packages/sdl/libGL.so packages/sdl/php${PHP_VERSION}-sdl.so -endif - -ifeq (${WITH_SDL},shared) -CONFIGURE_FLAGS+= --with-sdl -PHP_CONFIGURE_DEPS+= third_party/php${PHP_VERSION}-src/ext/sdl/config.m4 packages/sdl/libSDL2.so packages/sdl/libGL.so -SHARED_LIBS+= packages/sdl/libSDL2.so packages/sdl/libGL.so -EXTRA_MODULES+= packages/sdl/php${PHP_VERSION}-sdl.so packages/sdl/libGL.so packages/sdl/php${PHP_VERSION}-sdl.so -# SKIP_LIBS+= -lsdl -lgl -endif - -ifeq (${WITH_SDL},dynamic) -DYNAMIC_LIBS+= packages/sdl/libSDL2.so packages/sdl/libGL.so -DYNAMIC_LIBS_GROUPED+= sdl-libs -TEST_LIST+=$(shell ls packages/sdl/test/*.mjs) -EXTRA_MODULES+= packages/sdl/php${PHP_VERSION}-sdl.so packages/sdl/libGL.so packages/sdl/php${PHP_VERSION}-sdl.so -# SKIP_LIBS+= -lsdl -lgl -endif - -sdl-libs: packages/sdl/libSDL2.so packages/sdl/libGL.so - third_party/php${PHP_VERSION}-sdl/config.m4: @ echo -e "\e[33;4mDownloading ext-sdl\e[0m" - ${DOCKER_RUN} wget -q https://pecl.php.net/get/sdl-2.7.0.tgz + ${DOCKER_RUN} wget --tries=5 --waitretry=2 --timeout=20 -q https://pecl.php.net/get/sdl-2.7.0.tgz ${DOCKER_RUN} tar -C third_party -xvzf sdl-2.7.0.tgz sdl-2.7.0 ${DOCKER_RUN} mv third_party/sdl-2.7.0 third_party/php${PHP_VERSION}-sdl ${DOCKER_RUN} rm sdl-2.7.0.tgz +ifeq (${PHP_VERSION},8.5) + ${DOCKER_RUN_IN_EXT_SDL} find . -type f -exec perl -pi -e 's/zend_exception_get_default\(\)/zend_ce_exception/g;' {} + +endif third_party/php${PHP_VERSION}-src/ext/sdl/config.m4: third_party/php${PHP_VERSION}-sdl/config.m4 | third_party/php${PHP_VERSION}-src/patched @ echo -e "\e[33;4mImporting ext-sdl\e[0m" ${DOCKER_RUN} cp -rfv third_party/php${PHP_VERSION}-sdl third_party/php${PHP_VERSION}-src/ext/sdl - ${DOCKER_RUN} cp -rfv third_party/php${PHP_VERSION}-src/ext/sdl/src/* third_party/php${PHP_VERSION}-src/ext/sdl - + ${DOCKER_RUN} rm -rf third_party/php${PHP_VERSION}-src/ext/sdl/.libs third_party/php${PHP_VERSION}-src/ext/sdl/autom4te.cache third_party/php${PHP_VERSION}-src/ext/sdl/modules third_party/php${PHP_VERSION}-src/ext/sdl/build + ${DOCKER_RUN} find third_party/php${PHP_VERSION}-src/ext/sdl/src -type f \( -name '*.dep' -o -name '*.lo' \) -delete + ${DOCKER_RUN} rm -rf third_party/php${PHP_VERSION}-src/ext/sdl/src/.libs + ${DOCKER_RUN} find third_party/php${PHP_VERSION}-src/ext/sdl -maxdepth 1 -type f \( -name 'Makefile*' -o -name 'config.h' -o -name 'config.log' -o -name 'config.nice' -o -name 'config.status' -o -name 'configure' -o -name 'configure~' -o -name 'libtool' -o -name 'sdl.la' -o -name 'a.wasm' \) -delete + ${DOCKER_RUN} cp -fv third_party/php${PHP_VERSION}-src/ext/sdl/src/php_sdl.h third_party/php${PHP_VERSION}-src/ext/sdl/php_sdl.h -lib/lib/libSDL2.a: - @ echo -e "\e[33;4mBuilding LIBSDL\e[0m" - ${DOCKER_RUN} embuilder.py build sdl2 -# ${DOCKER_RUN} embuilder --pic --lto build sdl2 -# ${DOCKER_RUN} cp /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/lto-pic/libSDL2.a lib/lib/libSDL2.a - ${DOCKER_RUN_IN_LIB_SDL} ls -al - ${DOCKER_RUN_IN_LIB_SDL} chmod +x configure - ${DOCKER_RUN_IN_LIB_SDL} emconfigure ./configure --prefix=/src/lib/ --enable-shared=no --enable-static=yes --cache-file=/tmp/config-cache - ${DOCKER_RUN_IN_LIB_SDL} emmake make -j${CPU_COUNT} - ${DOCKER_RUN_IN_LIB_SDL} emmake make install +lib/bin/sdl2-config: packages/sdl/sdl2-config.in lib/lib/libSDL2.a lib/lib/libGL.a + ${DOCKER_RUN} mkdir -p /src/lib/bin + ${DOCKER_RUN} bash -lc "sed 's/@SDL_VERSION@/$(patsubst release-%,%,$(LIBSDL_TAG))/g' /src/packages/sdl/sdl2-config.in > /src/$@" + ${DOCKER_RUN} chmod +x /src/$@ lib/lib/libGL.a: @ echo -e "\e[33;4mBuilding LIBGL\e[0m" ${DOCKER_RUN} embuilder build libGL-mt-webgl2-ofb-full_es3-getprocaddr --lto --pic --verbose ${DOCKER_RUN} cp /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/lto-pic/libGL-mt-webgl2-ofb-full_es3-getprocaddr.a /src/$@ -# ${DOCKER_RUN} embuilder build USER -# ${DOCKER_RUN_IN_LIB_GL} ls -al .. -# ${DOCKER_RUN_IN_LIB_GL} ls -al . -# ${DOCKER_RUN_IN_LIB_GL} chmod +x configure -# ${DOCKER_RUN_IN_LIB_GL} emconfigure ./configure --prefix=/src/lib/ --enable-shared=no --enable-static=yes --cache-file=/tmp/config-cache -# ${DOCKER_RUN_IN_LIB_GL} emmake make -j${CPU_COUNT} -# ${DOCKER_RUN_IN_LIB_GL} emmake make install - -lib/lib/libSDL2.so: lib/lib/libSDL2.a - ${DOCKER_RUN} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive /src/$^ - -lib/lib/libGL.so: lib/lib/libGL.a - ${DOCKER_RUN} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive /src/$^ - - -packages/sdl/libSDL2.so: lib/lib/libSDL2.so - cp $^ $@ -packages/sdl/libGL.so: lib/lib/libGL.so - cp $^ $@ - -$(addsuffix /libSDL2.so,$(sort ${SHARED_ASSET_PATHS})): packages/sdl/libSDL2.so - cp -Lp $^ $@ - -$(addsuffix /libGL.so,$(sort ${SHARED_ASSET_PATHS})): packages/sdl/libGL.so - cp -Lp $^ $@ - -packages/sdl/php${PHP_VERSION}-sdl.so: ${PHPIZE} third_party/php${PHP_VERSION}-sdl/config.m4 packages/sdl/libSDL2.so # packages/sdl/libGL.so - @ echo -e "\e[33;4mBuilding php-sdl\e[0m" - ${DOCKER_RUN_IN_EXT_SDL} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; - ${DOCKER_RUN_IN_EXT_SDL} /src/third_party/php${PHP_VERSION}-src/scripts/phpize; - ${DOCKER_RUN_IN_EXT_SDL} emconfigure ./configure PKG_CONFIG_PATH=${PKG_CONFIG_PATH} --prefix='/src/lib/php${PHP_VERSION}' --with-php-config=/src/lib/php${PHP_VERSION}/bin/php-config --cache-file=/tmp/config-cache; - ${DOCKER_RUN_IN_EXT_SDL} sed -i 's#-shared#-static#g' Makefile; - ${DOCKER_RUN_IN_EXT_SDL} sed -i 's#-export-dynamic##g' Makefile; - ${DOCKER_RUN_IN_EXT_SDL} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; - ${DOCKER_RUN_IN_EXT_SDL} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -sASYNCIFY -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/sdl.a -# ${DOCKER_RUN_IN_EXT_SDL} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -sASYNCIFY -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/sdl.a --use-port=sdl2 -sLEGACY_GL_EMULATION - -$(addsuffix /php${PHP_VERSION}-sdl.so,$(sort ${SHARED_ASSET_PATHS})): packages/sdl/php${PHP_VERSION}-sdl.so - cp -Lp $^ $@ +lib/lib/libSDL2.a: + @ echo -e "\e[33;4mBuilding LIBSDL\e[0m" + ${DOCKER_RUN} embuilder build sdl2 --lto --pic --verbose + ${DOCKER_RUN} mkdir -p /src/lib/include /src/lib/lib + ${DOCKER_RUN} rm -rf /src/lib/include/SDL2 + ${DOCKER_RUN} cp -r /emsdk/upstream/emscripten/cache/sysroot/include/SDL2 /src/lib/include/SDL2 + ${DOCKER_RUN} cp /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/lto-pic/libSDL2.a /src/$@ diff --git a/packages/sdl/test/basic.mjs b/packages/sdl/test/basic.mjs index 7bf21e12e..bafded39f 100644 --- a/packages/sdl/test/basic.mjs +++ b/packages/sdl/test/basic.mjs @@ -1,71 +1,23 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; import sdl from 'php-wasm-sdl'; -test('SDL Extension is enabled.', async () => { - const php = process.env.WITH_SDL === 'dynamic' - ? new PhpNode({sharedLibs:[`php${process.env.PHP_VERSION ?? '8.4'}-sdl.so`]}) - : new PhpNode; - - let stdOut = '', stdErr = ''; - - php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); - php.addEventListener('error', (event) => event.detail.forEach(line => void (stdErr += line))); - - await php.binary; - - const exitCode = await php.run(` x); - const lastLine = lines.length && lines[lines.length + -1]; - - assert.equal(exitCode, 0); - assert.equal(lastLine, `bool(true)`); - assert.equal(stdErr, ''); +test('SDL compatibility shim resolves no runtime shared libraries.', () => { + const libs = sdl.getLibs({phpVersion: '8.4'}); + assert.deepEqual(libs, []); }); -test('SDL Extension is enabled (static module loader).', async () => { - const php = process.env.WITH_SDL === 'dynamic' - ? new PhpNode({sharedLibs:[sdl]}) - : new PhpNode; - - let stdOut = '', stdErr = ''; - - php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); - php.addEventListener('error', (event) => event.detail.forEach(line => void (stdErr += line))); - - await php.binary; - - const exitCode = await php.run(` x); - const lastLine = lines.length && lines[lines.length + -1]; - - assert.equal(exitCode, 0); - assert.equal(lastLine, `bool(true)`); - assert.equal(stdErr, ''); +test('SDL compatibility shim ignores version selection.', () => { + for(const version of ['8.0', '8.1', '8.2', '8.3', '8.4', '8.5']) + { + const libs = sdl.getLibs({phpVersion: version}); + assert.deepEqual(libs, []); + } }); -test('SDL Extension is enabled (dynamic module loader).', async () => { - const php = process.env.WITH_SDL === 'dynamic' - ? new PhpNode({sharedLibs:[await import('php-wasm-sdl')]}) - : new PhpNode; - - let stdOut = '', stdErr = ''; - - php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); - php.addEventListener('error', (event) => event.detail.forEach(line => void (stdErr += line))); - - await php.binary; - - const exitCode = await php.run(` x); - const lastLine = lines.length && lines[lines.length + -1]; - - assert.equal(exitCode, 0); - assert.equal(lastLine, `bool(true)`); - assert.equal(stdErr, ''); +test('SDL package module loader stays shape-compatible.', async () => { + const module = await import('php-wasm-sdl'); + const libs = module.default.getLibs({phpVersion: '8.4'}); + assert.deepEqual(libs, []); }); diff --git a/packages/simplexml/8.0.mjs b/packages/simplexml/8.0.mjs index 2d2d83e3c..9789947e3 100644 --- a/packages/simplexml/8.0.mjs +++ b/packages/simplexml/8.0.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-simplexml.so', url: new URL('./php8.0-simplexml.so', import.meta.url), ini}, + {name: 'php8.0-simplexml.so', url: new URL('./php8.0-simplexml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/simplexml/8.1.mjs b/packages/simplexml/8.1.mjs index 100cdbe73..d5af1c4e2 100644 --- a/packages/simplexml/8.1.mjs +++ b/packages/simplexml/8.1.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-simplexml.so', url: new URL('./php8.1-simplexml.so', import.meta.url), ini}, + {name: 'php8.1-simplexml.so', url: new URL('./php8.1-simplexml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/simplexml/8.2.mjs b/packages/simplexml/8.2.mjs index c06865457..6331372e0 100644 --- a/packages/simplexml/8.2.mjs +++ b/packages/simplexml/8.2.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-simplexml.so', url: new URL('./php8.2-simplexml.so', import.meta.url), ini}, + {name: 'php8.2-simplexml.so', url: new URL('./php8.2-simplexml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/simplexml/8.3.mjs b/packages/simplexml/8.3.mjs index 7cdd20675..305048e92 100644 --- a/packages/simplexml/8.3.mjs +++ b/packages/simplexml/8.3.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-simplexml.so', url: new URL('./php8.3-simplexml.so', import.meta.url), ini}, + {name: 'php8.3-simplexml.so', url: new URL('./php8.3-simplexml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/simplexml/8.4.mjs b/packages/simplexml/8.4.mjs index 25b5ca8ed..662bdba53 100644 --- a/packages/simplexml/8.4.mjs +++ b/packages/simplexml/8.4.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-simplexml.so', url: new URL('./php8.4-simplexml.so', import.meta.url), ini}, + {name: 'php8.4-simplexml.so', url: new URL('./php8.4-simplexml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/simplexml/8.5.mjs b/packages/simplexml/8.5.mjs new file mode 100644 index 000000000..9579cb97a --- /dev/null +++ b/packages/simplexml/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-simplexml.so', url: new URL('./php8.5-simplexml.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/simplexml/README.md b/packages/simplexml/README.md index 6a61b0f21..146abf52a 100644 --- a/packages/simplexml/README.md +++ b/packages/simplexml/README.md @@ -1,45 +1,39 @@ # php-wasm-simplexml -simplexml extension for php-wasm +`php-wasm-simplexml` provides the `SimpleXML` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-simplexml` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-simplexml') -]}); +```sh +npm install php-wasm php-wasm-libxml php-wasm-simplexml ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-simplexml.so']}); -``` +The package resolves the active runtime version to `php8.x-simplexml.so`. +Load `php-wasm-libxml` alongside it when you are using SimpleXML as a shared or dynamic extension. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-simplexml.so']}); -``` +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import simplexml from 'php-wasm-simplexml'; -## Build options: +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, simplexml], +}); -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/simplexml/index.mjs b/packages/simplexml/index.mjs index 0b0ef8500..0289f1095 100644 --- a/packages/simplexml/index.mjs +++ b/packages/simplexml/index.mjs @@ -1,17 +1,24 @@ +import simplexml8_5 from './8.5.mjs'; import simplexml8_4 from './8.4.mjs'; -import simplexml8_3 from './8.3.mjs'; -import simplexml8_2 from './8.2.mjs'; -import simplexml8_1 from './8.1.mjs'; -import simplexml8_0 from './8.0.mjs'; +import simplexml8_3 from './8.3.mjs'; +import simplexml8_2 from './8.2.mjs'; +import simplexml8_1 from './8.1.mjs'; +import simplexml8_0 from './8.0.mjs'; const versionTable = { - '8.4': simplexml8_4, - '8.3': simplexml8_3, - '8.2': simplexml8_2, - '8.1': simplexml8_1, - '8.0': simplexml8_0, + '8.5': simplexml8_5 + , '8.4': simplexml8_4 + , '8.3': simplexml8_3 + , '8.2': simplexml8_2 + , '8.1': simplexml8_1 + , '8.0': simplexml8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/simplexml/package.json b/packages/simplexml/package.json index 1a92fc709..09cb8ac12 100644 --- a/packages/simplexml/package.json +++ b/packages/simplexml/package.json @@ -6,18 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "php8.3-simplexml.so", - "php8.2-simplexml.so", - "php8.1-simplexml.so", - "php8.0-simplexml.so" + "*.so" ] } diff --git a/packages/simplexml/static.mak b/packages/simplexml/static.mak index b7b4fde22..c886e4ebe 100644 --- a/packages/simplexml/static.mak +++ b/packages/simplexml/static.mak @@ -10,7 +10,6 @@ endif ifeq (${WITH_SIMPLEXML},1) WITH_SIMPLEXML=dynamic -EXTRA_MODULES+= packages/simplexml/php${PHP_VERSION}-simplexml.so endif ifeq (${WITH_SIMPLEXML},static) @@ -19,7 +18,6 @@ $(error WITH_SIMPLEXML=static REQUIRES WITH_LIBXML=static. WITH_LIBXML: '${WITH_ endif CONFIGURE_FLAGS+= --enable-simplexml TEST_LIST+=$(shell ls packages/simplexml/test/*.mjs) -EXTRA_MODULES+= packages/simplexml/php${PHP_VERSION}-simplexml.so endif ifeq (${WITH_SIMPLEXML},dynamic) @@ -43,6 +41,3 @@ packages/simplexml/php${PHP_VERSION}-simplexml.so: ${PHPIZE} third_party/php${PH ${DOCKER_RUN_IN_EXT_SIMPLEXML} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_SIMPLEXML} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_SIMPLEXML} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/simplexml.a /src/packages/libxml/libxml2.so - -$(addsuffix /php${PHP_VERSION}-simplexml.so,$(sort ${SHARED_ASSET_PATHS})): packages/simplexml/php${PHP_VERSION}-simplexml.so - cp -Lp $^ $@ diff --git a/packages/simplexml/test/basic.mjs b/packages/simplexml/test/basic.mjs index 5406407d0..05b8e4803 100644 --- a/packages/simplexml/test/basic.mjs +++ b/packages/simplexml/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import libxml from 'php-wasm-libxml'; diff --git a/packages/sqlite/8.0.mjs b/packages/sqlite/8.0.mjs index 81a053f97..aae6785a9 100644 --- a/packages/sqlite/8.0.mjs +++ b/packages/sqlite/8.0.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-sqlite.so', url: new URL('./php8.0-sqlite.so', import.meta.url), ini}, - {name: 'php8.0-pdo-sqlite.so', url: new URL('./php8.0-pdo-sqlite.so', import.meta.url), ini}, - {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)}, + {name: 'php8.0-sqlite.so', url: new URL('./php8.0-sqlite.so', import.meta.url), ini} + , {name: 'php8.0-pdo-sqlite.so', url: new URL('./php8.0-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/sqlite/8.1.mjs b/packages/sqlite/8.1.mjs index ce25571c4..c4727c23d 100644 --- a/packages/sqlite/8.1.mjs +++ b/packages/sqlite/8.1.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-sqlite.so', url: new URL('./php8.1-sqlite.so', import.meta.url), ini}, - {name: 'php8.1-pdo-sqlite.so', url: new URL('./php8.1-pdo-sqlite.so', import.meta.url), ini}, - {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)}, + {name: 'php8.1-sqlite.so', url: new URL('./php8.1-sqlite.so', import.meta.url), ini} + , {name: 'php8.1-pdo-sqlite.so', url: new URL('./php8.1-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/sqlite/8.2.mjs b/packages/sqlite/8.2.mjs index 32dcf0e5d..fb84c694f 100644 --- a/packages/sqlite/8.2.mjs +++ b/packages/sqlite/8.2.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-sqlite.so', url: new URL('./php8.2-sqlite.so', import.meta.url), ini}, - {name: 'php8.2-pdo-sqlite.so', url: new URL('./php8.2-pdo-sqlite.so', import.meta.url), ini}, - {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)}, + {name: 'php8.2-sqlite.so', url: new URL('./php8.2-sqlite.so', import.meta.url), ini} + , {name: 'php8.2-pdo-sqlite.so', url: new URL('./php8.2-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/sqlite/8.3.mjs b/packages/sqlite/8.3.mjs index bafa011db..3d3c83327 100644 --- a/packages/sqlite/8.3.mjs +++ b/packages/sqlite/8.3.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-sqlite.so', url: new URL('./php8.3-sqlite.so', import.meta.url), ini}, - {name: 'php8.3-pdo-sqlite.so', url: new URL('./php8.3-pdo-sqlite.so', import.meta.url), ini}, - {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)}, + {name: 'php8.3-sqlite.so', url: new URL('./php8.3-sqlite.so', import.meta.url), ini} + , {name: 'php8.3-pdo-sqlite.so', url: new URL('./php8.3-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/sqlite/8.4.mjs b/packages/sqlite/8.4.mjs index c0b403b88..3006ce5da 100644 --- a/packages/sqlite/8.4.mjs +++ b/packages/sqlite/8.4.mjs @@ -2,10 +2,14 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-sqlite.so', url: new URL('./php8.4-sqlite.so', import.meta.url), ini}, - {name: 'php8.4-pdo-sqlite.so', url: new URL('./php8.4-pdo-sqlite.so', import.meta.url), ini}, - {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)}, + {name: 'php8.4-sqlite.so', url: new URL('./php8.4-sqlite.so', import.meta.url), ini} + , {name: 'php8.4-pdo-sqlite.so', url: new URL('./php8.4-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/sqlite/8.5.mjs b/packages/sqlite/8.5.mjs new file mode 100644 index 000000000..849cbd869 --- /dev/null +++ b/packages/sqlite/8.5.mjs @@ -0,0 +1,15 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-sqlite.so', url: new URL('./php8.5-sqlite.so', import.meta.url), ini} + , {name: 'php8.5-pdo-sqlite.so', url: new URL('./php8.5-pdo-sqlite.so', import.meta.url), ini} + , {name: 'libsqlite3.so', url: new URL('./libsqlite3.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/sqlite/README.md b/packages/sqlite/README.md index 4f195bccc..9e8eaea27 100644 --- a/packages/sqlite/README.md +++ b/packages/sqlite/README.md @@ -1,45 +1,41 @@ # php-wasm-sqlite -sqlite extenstion for php-wasm. +`php-wasm-sqlite` provides the `sqlite3` and `pdo_sqlite` extensions for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-sqlite` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-sqlite') -]}); +```sh +npm install php-wasm php-wasm-sqlite ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-sqlite.so']}); -``` +The package resolves the active runtime version to `php8.x-sqlite.so` and `php8.x-pdo-sqlite.so`, and bundles `libsqlite3.so`. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-sqlite.so']}); +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import sqlite from 'php-wasm-sqlite'; + +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [sqlite], +}); + +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/sqlite/index.mjs b/packages/sqlite/index.mjs index c4e05d1f8..1cfa121aa 100644 --- a/packages/sqlite/index.mjs +++ b/packages/sqlite/index.mjs @@ -1,17 +1,24 @@ +import sqlite8_5 from './8.5.mjs'; import sqlite8_4 from './8.4.mjs'; -import sqlite8_3 from './8.3.mjs'; -import sqlite8_2 from './8.2.mjs'; -import sqlite8_1 from './8.1.mjs'; -import sqlite8_0 from './8.0.mjs'; +import sqlite8_3 from './8.3.mjs'; +import sqlite8_2 from './8.2.mjs'; +import sqlite8_1 from './8.1.mjs'; +import sqlite8_0 from './8.0.mjs'; const versionTable = { - '8.4': sqlite8_4, - '8.3': sqlite8_3, - '8.2': sqlite8_2, - '8.1': sqlite8_1, - '8.0': sqlite8_0, + '8.5': sqlite8_5 + , '8.4': sqlite8_4 + , '8.3': sqlite8_3 + , '8.2': sqlite8_2 + , '8.1': sqlite8_1 + , '8.0': sqlite8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/sqlite/package.json b/packages/sqlite/package.json index 6bb187442..45ab7181e 100644 --- a/packages/sqlite/package.json +++ b/packages/sqlite/package.json @@ -6,23 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libsqlite3.so", - "php8.3-pdo-sqlite.so", - "php8.3-sqlite.so", - "php8.2-pdo-sqlite.so", - "php8.2-sqlite.so", - "php8.1-pdo-sqlite.so", - "php8.1-sqlite.so", - "php8.0-pdo-sqlite.so", - "php8.0-sqlite.so" + "*.so" ] } diff --git a/packages/sqlite/static.mak b/packages/sqlite/static.mak index 20e6eab69..dae73efe9 100644 --- a/packages/sqlite/static.mak +++ b/packages/sqlite/static.mak @@ -22,7 +22,7 @@ CONFIGURE_FLAGS+= --enable-pdo --with-sqlite3 --with-pdo-sqlite ARCHIVES+= lib/lib/libsqlite3.a TEST_LIST+=$(shell ls packages/sqlite/test/*.mjs) SKIP_LIBS+= -lsqlite3 -EXTRA_MODULES+= packages/sqlite/libsqlite3.so packages/sqlite/php${PHP_VERSION}-sqlite.so packages/sqlite/php${PHP_VERSION}-pdo-sqlite.so +EXTRA_MODULES+= packages/sqlite/libsqlite3.so endif ifeq (${WITH_SQLITE},shared) @@ -31,8 +31,7 @@ PHP_CONFIGURE_DEPS+= packages/sqlite/libsqlite3.so TEST_LIST+=$(shell ls packages/sqlite/test/*.mjs) SHARED_LIBS+= packages/sqlite/libsqlite3.so SKIP_LIBS+= -lsqlite3 -EXTRA_MODULES+= packages/sqlite/libsqlite3.so packages/sqlite/php${PHP_VERSION}-sqlite.so packages/sqlite/php${PHP_VERSION}-pdo-sqlite.so -PHP_ASSET_LIST+= libsqlite3.so +EXTRA_MODULES+= packages/sqlite/libsqlite3.so endif ifeq (${WITH_SQLITE},dynamic) @@ -48,7 +47,7 @@ libsqlite-libs: packages/sqlite/libsqlite3.so third_party/${SQLITE_DIR}/sqlite3.c: @ echo -e "\e[33;4mDownloading SQLite\e[0m" - wget -q https://sqlite.org/2024/sqlite-autoconf-${SQLITE_VERSION}.tar.gz + wget --tries=5 --waitretry=2 --timeout=20 -q https://sqlite.org/2024/sqlite-autoconf-${SQLITE_VERSION}.tar.gz ${DOCKER_RUN} tar -xzf sqlite-autoconf-${SQLITE_VERSION}.tar.gz ${DOCKER_RUN} rm -r sqlite-autoconf-${SQLITE_VERSION}.tar.gz ${DOCKER_RUN} rm -rf third_party/${SQLITE_DIR} @@ -66,9 +65,6 @@ lib/lib/libsqlite3.so: lib/lib/libsqlite3.a packages/sqlite/libsqlite3.so: lib/lib/libsqlite3.so cp -Lp $^ $@ -$(addsuffix /libsqlite3.so,$(sort ${SHARED_ASSET_PATHS})): packages/sqlite/libsqlite3.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-sqlite/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/sqlite3 /src/third_party/php${PHP_VERSION}-sqlite ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-sqlite/config.m4 @@ -85,9 +81,6 @@ packages/sqlite/php${PHP_VERSION}-sqlite.so: ${PHPIZE} third_party/php${PHP_VERS ${DOCKER_RUN_IN_EXT_SQLITE} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src -I/src/lib/include'; ${DOCKER_RUN_IN_EXT_SQLITE} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -DHAVE_CONFIG_H -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/sqlite3.a /src/packages/sqlite/libsqlite3.so -$(addsuffix /php${PHP_VERSION}-sqlite.so,$(sort ${SHARED_ASSET_PATHS})): packages/sqlite/php${PHP_VERSION}-sqlite.so - cp -Lp $^ $@ - # third_party/php${PHP_VERSION}-pdo/config.m4: third_party/php${PHP_VERSION}-src/patched # ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/pdo /src/third_party/php${PHP_VERSION}-pdo @@ -103,7 +96,7 @@ $(addsuffix /php${PHP_VERSION}-sqlite.so,$(sort ${SHARED_ASSET_PATHS})): package # ${DOCKER_RUN_IN_EXT_PDO} emmake make install # ${DOCKER_RUN_IN_EXT_PDO} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -DHAVE_CONFIG_H -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/pdo.a -# $(addsuffix /php${PHP_VERSION}-pdo.so,$(sort ${SHARED_ASSET_PATHS})): packages/sqlite/php${PHP_VERSION}-pdo.so +# ${PHP_ASSET_DIR}/php${PHP_VERSION}-pdo.so: packages/sqlite/php${PHP_VERSION}-pdo.so # cp -Lp $^ $@ third_party/php${PHP_VERSION}-pdo-sqlite/config.m4: third_party/php${PHP_VERSION}-src/patched @@ -126,6 +119,3 @@ packages/sqlite/php${PHP_VERSION}-pdo-sqlite.so: ${PHPIZE} third_party/php${PHP_ ${DOCKER_RUN_IN_EXT_PDO_SQLITE} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_PDO_SQLITE} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src -I/src/lib/include' RE2C=re2c; ${DOCKER_RUN_IN_EXT_PDO_SQLITE} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -DHAVE_CONFIG_H -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/pdo_sqlite.a /src/packages/sqlite/libsqlite3.so - -$(addsuffix /php${PHP_VERSION}-pdo-sqlite.so,$(sort ${SHARED_ASSET_PATHS})): packages/sqlite/php${PHP_VERSION}-pdo-sqlite.so - cp -Lp $^ $@ diff --git a/packages/sqlite/test/basic.mjs b/packages/sqlite/test/basic.mjs index fdb6b227a..32791119f 100644 --- a/packages/sqlite/test/basic.mjs +++ b/packages/sqlite/test/basic.mjs @@ -1,10 +1,19 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode as BasePhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; import { env } from 'node:process'; +import { nodeRuntimeOptions } from '../../../test/lib/node-runtime-options.mjs'; import sqlite from 'php-wasm-sqlite'; +class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions(args)); + } +} + test('Sqlite3 Extension is enabled.', async () => { const php = env.WITH_SQLITE === 'dynamic' ? new PhpNode({sharedLibs:[ @@ -149,4 +158,4 @@ test('Sqlite3 Extension & PDO_Sqlite is enabled (dynamic module loader).', async assert.equal(stdOut, `bool(true)\n`); assert.equal(stdErr, ''); } -}); \ No newline at end of file +}); diff --git a/packages/tidy/8.0.mjs b/packages/tidy/8.0.mjs index 4ad58f11e..ee5a9891d 100644 --- a/packages/tidy/8.0.mjs +++ b/packages/tidy/8.0.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-tidy.so', url: new URL('./php8.0-tidy.so', import.meta.url), ini}, - {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)}, + {name: 'php8.0-tidy.so', url: new URL('./php8.0-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/tidy/8.1.mjs b/packages/tidy/8.1.mjs index 48afe94dd..e7a2d1477 100644 --- a/packages/tidy/8.1.mjs +++ b/packages/tidy/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-tidy.so', url: new URL('./php8.1-tidy.so', import.meta.url), ini}, - {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)}, + {name: 'php8.1-tidy.so', url: new URL('./php8.1-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/tidy/8.2.mjs b/packages/tidy/8.2.mjs index ffb5a7098..c8348c39a 100644 --- a/packages/tidy/8.2.mjs +++ b/packages/tidy/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-tidy.so', url: new URL('./php8.2-tidy.so', import.meta.url), ini}, - {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)}, + {name: 'php8.2-tidy.so', url: new URL('./php8.2-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/tidy/8.3.mjs b/packages/tidy/8.3.mjs index 8fa13716d..0a6eeb191 100644 --- a/packages/tidy/8.3.mjs +++ b/packages/tidy/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-tidy.so', url: new URL('./php8.3-tidy.so', import.meta.url), ini}, - {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)}, + {name: 'php8.3-tidy.so', url: new URL('./php8.3-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/tidy/8.4.mjs b/packages/tidy/8.4.mjs index eb085a9f1..536a0210f 100644 --- a/packages/tidy/8.4.mjs +++ b/packages/tidy/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-tidy.so', url: new URL('./php8.4-tidy.so', import.meta.url), ini}, - {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)}, + {name: 'php8.4-tidy.so', url: new URL('./php8.4-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} ]; export default {getLibs}; diff --git a/packages/tidy/8.5.mjs b/packages/tidy/8.5.mjs new file mode 100644 index 000000000..23e9bf2f5 --- /dev/null +++ b/packages/tidy/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-tidy.so', url: new URL('./php8.5-tidy.so', import.meta.url), ini} + , {name: 'libtidy.so', url: new URL('./libtidy.so', import.meta.url)} +]; + +export default {getLibs}; diff --git a/packages/tidy/README.md b/packages/tidy/README.md index 55063b699..859b7b8c4 100644 --- a/packages/tidy/README.md +++ b/packages/tidy/README.md @@ -1,47 +1,37 @@ # php-wasm-tidy -tidy extenstion for php-wasm. +`php-wasm-tidy` provides the `tidy` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-tidy` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-tidy') -]}); +```sh +npm install php-wasm php-wasm-tidy ``` -The supporting library `libtidy.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-tidy.so` and bundles `libtidy.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-tidy.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import tidy from 'php-wasm-tidy'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [tidy], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-tidy.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/tidy/index.mjs b/packages/tidy/index.mjs index 9add6e1cb..e417b61db 100644 --- a/packages/tidy/index.mjs +++ b/packages/tidy/index.mjs @@ -1,17 +1,24 @@ +import phar8_5 from './8.5.mjs'; import phar8_4 from './8.4.mjs'; -import phar8_3 from './8.3.mjs'; -import phar8_2 from './8.2.mjs'; -import phar8_1 from './8.1.mjs'; -import phar8_0 from './8.0.mjs'; +import phar8_3 from './8.3.mjs'; +import phar8_2 from './8.2.mjs'; +import phar8_1 from './8.1.mjs'; +import phar8_0 from './8.0.mjs'; const versionTable = { - '8.4': phar8_4, - '8.3': phar8_3, - '8.2': phar8_2, - '8.1': phar8_1, - '8.0': phar8_0, + '8.5': phar8_5 + , '8.4': phar8_4 + , '8.3': phar8_3 + , '8.2': phar8_2 + , '8.1': phar8_1 + , '8.0': phar8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/tidy/package.json b/packages/tidy/package.json index dcf44609e..144907c90 100644 --- a/packages/tidy/package.json +++ b/packages/tidy/package.json @@ -6,19 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "libtidy.so", - "php8.3-tidy.so", - "php8.2-tidy.so", - "php8.1-tidy.so", - "php8.0-tidy.so" + "*.so" ] } diff --git a/packages/tidy/static.mak b/packages/tidy/static.mak index 95ec68170..08146ff87 100644 --- a/packages/tidy/static.mak +++ b/packages/tidy/static.mak @@ -37,7 +37,7 @@ CONFIGURE_FLAGS+= --with-tidy=/src/lib ARCHIVES+= lib/lib/libtidy.a TEST_LIST+=$(shell ls packages/tidy/test/*.mjs) SKIP_LIBS+= -ltidy -EXTRA_MODULES+= packages/tidy/libtidy.so packages/tidy/php${PHP_VERSION}-tidy.so +EXTRA_MODULES+= packages/tidy/libtidy.so endif ifeq (${WITH_TIDY},shared) @@ -46,8 +46,7 @@ PHP_CONFIGURE_DEPS+= packages/tidy/libtidy.so TEST_LIST+=$(shell ls packages/tidy/test/*.mjs) SHARED_LIBS+= packages/tidy/libtidy.so SKIP_LIBS+= -ltidy -EXTRA_MODULES+= packages/tidy/libtidy.so packages/tidy/php${PHP_VERSION}-tidy.so -PHP_ASSET_LIST+= libtidy.so +EXTRA_MODULES+= packages/tidy/libtidy.so endif ifeq (${WITH_TIDY},dynamic) @@ -83,9 +82,6 @@ lib/lib/libtidy.so: lib/lib/libtidy.a packages/tidy/libtidy.so: lib/lib/libtidy.so cp -rL $^ $@ -$(addsuffix /libtidy.so,$(sort ${SHARED_ASSET_PATHS})): packages/tidy/libtidy.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-tidy/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/tidy /src/third_party/php${PHP_VERSION}-tidy ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-tidy/config.m4 @@ -99,6 +95,3 @@ packages/tidy/php${PHP_VERSION}-tidy.so: ${PHPIZE} packages/tidy/libtidy.so thir ${DOCKER_RUN_IN_EXT_TIDY} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_TIDY} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_TIDY} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/tidy.a /src/packages/tidy/libtidy.so - -$(addsuffix /php${PHP_VERSION}-tidy.so,$(sort ${SHARED_ASSET_PATHS})): packages/tidy/php${PHP_VERSION}-tidy.so - cp -Lp $^ $@ diff --git a/packages/tidy/test/basic.mjs b/packages/tidy/test/basic.mjs index 7ea1ba8cd..68ed80876 100644 --- a/packages/tidy/test/basic.mjs +++ b/packages/tidy/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import tidy from 'php-wasm-tidy'; diff --git a/packages/vrzno/README.md b/packages/vrzno/README.md index 87cd6003e..8fbdca754 100644 --- a/packages/vrzno/README.md +++ b/packages/vrzno/README.md @@ -1,6 +1,42 @@ # vrzno -vrzno extension for php-wasm +`vrzno` is the PHP-to-JavaScript bridge extension used by `php-wasm`. -https://github.com/seanmorris/php-wasm -https://www.npmjs.com/package/php-wasm +It lets PHP code interact with JavaScript objects, classes, promises, callbacks, and values on `globalThis`. +The standard `php-wasm` runtime already includes Vrzno by default, so most consumers do not need to import anything from this package directly. This folder mainly exists for custom-build plumbing. + +## Usage + +```js +import { PhpNode } from 'php-wasm/PhpNode.mjs'; + +const php = new PhpNode({ + version: '8.4', + answer: 42, +}); + +await php.run(`Date->now() > 0); +`); +``` + +## Useful PHP APIs + +Use `new Vrzno` to get a handle to `globalThis`. +Use `vrzno_env()` to read values passed into the runtime constructor. +Use `vrzno_await()` to wait on promise-like values from PHP. +Use `vrzno_import()` to dynamically import JavaScript modules from PHP. + +## Custom Builds + +Enable `WITH_VRZNO=1` in `.php-wasm-rc`. +That is the default for the main `php-wasm` runtime. + +## Build Options + +- `WITH_VRZNO`: defaults to `1`. Set it to `0` to remove the extension from a custom build. +- `VRZNO_BRANCH`: optional upstream branch override. Defaults to `master`. +- `VRZNO_DEV_PATH`: optional local source checkout to use instead of cloning the upstream `vrzno` repository during the build. diff --git a/packages/vrzno/package.json b/packages/vrzno/package.json index b55709cd7..d0a4483cd 100644 --- a/packages/vrzno/package.json +++ b/packages/vrzno/package.json @@ -6,7 +6,7 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "files": [ "README.md", "pre.mak", diff --git a/packages/vrzno/test/basic.mjs b/packages/vrzno/test/basic.mjs index b38a22c4b..19b97d7f5 100644 --- a/packages/vrzno/test/basic.mjs +++ b/packages/vrzno/test/basic.mjs @@ -1,6 +1,15 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode as BasePhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { nodeRuntimeOptions } from '../../../test/lib/node-runtime-options.mjs'; + +class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions(args)); + } +} test('Can access JS integers via php.r function.', async () => { @@ -366,6 +375,48 @@ test('Can access PHP callbacks that return objects via php.x function: Two level assert.equal(stdErr, ''); }); +test('Preserves JS identity for recursive PHP arrays.', async () => { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', (event) => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const returnValue = await php.x`(function() { + $array = []; + $array['self'] = &$array; + return $array; + })()`; + + assert.equal(returnValue.self, returnValue); + assert.equal(returnValue.self.self, returnValue); + assert.equal(stdOut, ''); + assert.equal(stdErr, ''); +}); + +test('Preserves JS identity for recursive PHP objects.', async () => { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + php.addEventListener('output', (event) => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', (event) => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const returnValue = await php.x`(function() { + $object = (object) []; + $object->self = $object; + return $object; + })()`; + + assert.equal(returnValue.self, returnValue); + assert.equal(returnValue.self.self, returnValue); + assert.equal(stdOut, ''); + assert.equal(stdErr, ''); +}); + test('Can get the date with strtotime() and format it with date().', async () => { const php = new PhpNode(); @@ -380,9 +431,9 @@ test('Can get the date with strtotime() and format it with date().', async () => const yesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000)); const jsFormatted = `${yesterday.getFullYear()}-${String(1 + yesterday.getMonth()).padStart(2, '0')}-${String(yesterday.getDate()).padStart(2, '0')} 13:00:00`; - // Extract the functions from PHP... - const strtotime = await php.x`strtotime(...)`; - const date = await php.x`date(...)`; + // Export wrapper callbacks that remain compatible with PHP 8.0. + const strtotime = await php.x`function($time) { return strtotime($time); }`; + const date = await php.x`function($format, $time) { return date($format, $time); }`; // Set the timezone... await php.x`date_default_timezone_set(${Intl.DateTimeFormat().resolvedOptions().timeZone})`; @@ -406,18 +457,17 @@ test('Can get the date from a native object with strtotime() and format it with await php.binary; - // Get yesterday's date and format in JS... - const yesterday = new Date(); - const jsFormatted = `${yesterday.getFullYear()}-${String(1 + yesterday.getMonth()).padStart(2, '0')}-${String(yesterday.getDate()).padStart(2, '0')}` - + ` ${String(yesterday.getHours()).padStart(2, '0')}:${String(yesterday.getMinutes()).padStart(2, '0')}:${String(yesterday.getSeconds()).padStart(2, '0')}`; + // Reuse the same native Date object on both sides so this test doesn't race across a second boundary. + const now = new Date(); + const jsFormatted = `${now.getFullYear()}-${String(1 + now.getMonth()).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}` + + ` ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; // Set the timezone... await php.x`date_default_timezone_set(${Intl.DateTimeFormat().resolvedOptions().timeZone})`; // Create a formateDate callback in PHP... const formatDate = await php.x`function() { - $nativeJsDateClass = ${Date}; - $nativeJsDateObject = new $nativeJsDateClass; + $nativeJsDateObject = ${now}; $isoString = $nativeJsDateObject->toISOString(); $timestamp = strtotime($isoString); $formatted = date('Y-m-d H:i:s', $timestamp); diff --git a/packages/waitline/README.md b/packages/waitline/README.md index 94917bace..2f8327d18 100644 --- a/packages/waitline/README.md +++ b/packages/waitline/README.md @@ -1,6 +1,37 @@ # waitline -waitline extension for php-wasm +`waitline` is the line-reader extension used by `php-wasm` for interactive CLI and debugger input. -https://github.com/seanmorris/php-wasm -https://www.npmjs.com/package/php-wasm +This package exists so the build system can vendor the upstream `waitline` extension into `php-cli-wasm` and related builds. +It does not expose a separate JavaScript API from this folder. + +## What It Is For + +`waitline` replaces normal blocking STDIN reads with an async, JavaScript-backed line source. +That is what makes browser-hosted `php -a` sessions and `phpdbg` prompts workable in wasm-hosted environments. + +## Do You Need To Install It Directly? + +Usually no. + +If you are using the published CLI/debug runtime packages, `waitline` is expected to already be included. +You normally only care about this package when you are maintaining custom builds, debugging interactive input behavior, or overriding the vendored source checkout. + +## Custom Builds + +For raw custom builds, enable it in `.php-wasm-rc`: + +```sh +WITH_WAITLINE=1 +``` + +Important distinction: + +- published CLI/debug artifacts generally enable `waitline` +- the custom builder default for `WITH_WAITLINE` is still `0` + +## Build Options + +- `WITH_WAITLINE`: defaults to `0` in the custom builder. Set it to `1` to compile the extension in. +- `WAITLINE_BRANCH`: optional upstream branch override. Defaults to `master`. +- `WAITLINE_DEV_PATH`: optional local source checkout to use instead of cloning the upstream `waitline` repository during the build. diff --git a/packages/waitline/package.json b/packages/waitline/package.json index 0e509ae3d..a81e93e95 100644 --- a/packages/waitline/package.json +++ b/packages/waitline/package.json @@ -6,7 +6,7 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "files": [ "README.md", "pre.mak", diff --git a/packages/waitline/test/basic.mjs b/packages/waitline/test/basic.mjs index fcd6dde96..f4131b231 100644 --- a/packages/waitline/test/basic.mjs +++ b/packages/waitline/test/basic.mjs @@ -1,3 +1,3 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; diff --git a/packages/xml/8.0.mjs b/packages/xml/8.0.mjs index 47ddc7ffb..291015506 100644 --- a/packages/xml/8.0.mjs +++ b/packages/xml/8.0.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-xml.so', url: new URL('./php8.0-xml.so', import.meta.url), ini}, + {name: 'php8.0-xml.so', url: new URL('./php8.0-xml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/xml/8.1.mjs b/packages/xml/8.1.mjs index ed47651cc..fdea01c85 100644 --- a/packages/xml/8.1.mjs +++ b/packages/xml/8.1.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-xml.so', url: new URL('./php8.1-xml.so', import.meta.url), ini}, + {name: 'php8.1-xml.so', url: new URL('./php8.1-xml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/xml/8.2.mjs b/packages/xml/8.2.mjs index ce4549794..e2f9a495e 100644 --- a/packages/xml/8.2.mjs +++ b/packages/xml/8.2.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-xml.so', url: new URL('./php8.2-xml.so', import.meta.url), ini}, + {name: 'php8.2-xml.so', url: new URL('./php8.2-xml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/xml/8.3.mjs b/packages/xml/8.3.mjs index 7ae6d283f..df9376d8b 100644 --- a/packages/xml/8.3.mjs +++ b/packages/xml/8.3.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-xml.so', url: new URL('./php8.3-xml.so', import.meta.url), ini}, + {name: 'php8.3-xml.so', url: new URL('./php8.3-xml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/xml/8.4.mjs b/packages/xml/8.4.mjs index 5e44e2630..e7ab45ecb 100644 --- a/packages/xml/8.4.mjs +++ b/packages/xml/8.4.mjs @@ -2,8 +2,12 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-xml.so', url: new URL('./php8.4-xml.so', import.meta.url), ini}, + {name: 'php8.4-xml.so', url: new URL('./php8.4-xml.so', import.meta.url), ini} ]; export default {getLibs}; diff --git a/packages/xml/8.5.mjs b/packages/xml/8.5.mjs new file mode 100644 index 000000000..974c43d07 --- /dev/null +++ b/packages/xml/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-xml.so', url: new URL('./php8.5-xml.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xml/README.md b/packages/xml/README.md index 591964416..c0f6cf053 100644 --- a/packages/xml/README.md +++ b/packages/xml/README.md @@ -1,45 +1,39 @@ # php-wasm-xml -xml extenstion for php-wasm. +`php-wasm-xml` provides the `xml` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-xml` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-xml') -]}); +```sh +npm install php-wasm php-wasm-libxml php-wasm-xml ``` -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +## What It Loads -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-xml.so']}); -``` +The package resolves the active runtime version to `php8.x-xml.so`. +Load `php-wasm-libxml` alongside it when you are using XML as a shared or dynamic extension. -You can provide a callback as the `locateFile` option to map library names to URLs: - -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +## Usage -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-xml.so']}); -``` +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import xml from 'php-wasm-xml'; -## Build options: +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, xml], +}); -The following options may be set in `.php-wasm-rc` for custom builds of `php-wasm` & `php-cgi-wasm`. +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/xml/index.mjs b/packages/xml/index.mjs index 7f36dcb25..cc0e2c13c 100644 --- a/packages/xml/index.mjs +++ b/packages/xml/index.mjs @@ -1,17 +1,24 @@ +import xml8_5 from './8.5.mjs'; import xml8_4 from './8.4.mjs'; -import xml8_3 from './8.3.mjs'; -import xml8_2 from './8.2.mjs'; -import xml8_1 from './8.1.mjs'; -import xml8_0 from './8.0.mjs'; +import xml8_3 from './8.3.mjs'; +import xml8_2 from './8.2.mjs'; +import xml8_1 from './8.1.mjs'; +import xml8_0 from './8.0.mjs'; const versionTable = { - '8.4': xml8_4, - '8.3': xml8_3, - '8.2': xml8_2, - '8.1': xml8_1, - '8.0': xml8_0, + '8.5': xml8_5 + , '8.4': xml8_4 + , '8.3': xml8_3 + , '8.2': xml8_2 + , '8.1': xml8_1 + , '8.0': xml8_0 }; -export const getLibs = php => versionTable[php.phpVersion].getLibs() +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/xml/package.json b/packages/xml/package.json index 4e5879b42..7134e2d3d 100644 --- a/packages/xml/package.json +++ b/packages/xml/package.json @@ -6,18 +6,17 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "test/basic.mjs", "LICENSE", "NOTICE", "README.md", "static.mak", - "php8.3-xml.so", - "php8.2-xml.so", - "php8.1-xml.so", - "php8.0-xml.so" + "*.so" ] } diff --git a/packages/xml/static.mak b/packages/xml/static.mak index 94668c3bb..d76601952 100644 --- a/packages/xml/static.mak +++ b/packages/xml/static.mak @@ -18,7 +18,6 @@ $(error WITH_XML=static REQUIRES WITH_LIBXML=static. WITH_LIBXML: '${WITH_LIBXML endif CONFIGURE_FLAGS+= --enable-xml TEST_LIST+=$(shell ls packages/xml/test/*.mjs) -EXTRA_MODULES+= packages/xml/php${PHP_VERSION}-xml.so endif ifeq (${WITH_XML},dynamic) @@ -37,11 +36,9 @@ packages/xml/php${PHP_VERSION}-xml.so: ${PHPIZE} third_party/php${PHP_VERSION}-x ${DOCKER_RUN_IN_EXT_XML} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; ${DOCKER_RUN_IN_EXT_XML} /src/third_party/php${PHP_VERSION}-src/scripts/phpize; ${DOCKER_RUN_IN_EXT_XML} sed -i 's|#include "php.h"|#include "config.h"\n#include "php.h"\n|g' xml.c; + ${DOCKER_RUN_IN_EXT_XML} sed -i 's|#include "php.h"|#include "config.h"\n#include "php.h"\n|g' compat.c; ${DOCKER_RUN_IN_EXT_XML} emconfigure ./configure PKG_CONFIG_PATH=${PKG_CONFIG_PATH} --prefix='/src/lib/php${PHP_VERSION}' --with-php-config=/src/lib/php${PHP_VERSION}/bin/php-config; ${DOCKER_RUN_IN_EXT_XML} sed -i 's#-shared#-static#g' Makefile; ${DOCKER_RUN_IN_EXT_XML} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_XML} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_XML} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/xml.a /src/packages/libxml/libxml2.so - -$(addsuffix /php${PHP_VERSION}-xml.so,$(sort ${SHARED_ASSET_PATHS})): packages/xml/php${PHP_VERSION}-xml.so - cp -Lp $^ $@ diff --git a/packages/xml/test/basic.mjs b/packages/xml/test/basic.mjs index 3aba4c6c9..7d2539eea 100644 --- a/packages/xml/test/basic.mjs +++ b/packages/xml/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import libxml from 'php-wasm-libxml'; @@ -87,4 +87,3 @@ test('XML Extension is enabled. (loaded via async module)', async () => { assert.equal(stdOut, `bool(true)\n`); assert.equal(stdErr, ''); }); - diff --git a/packages/xmlreader/8.0.mjs b/packages/xmlreader/8.0.mjs new file mode 100644 index 000000000..9486bd90f --- /dev/null +++ b/packages/xmlreader/8.0.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.0-xmlreader.so', url: new URL('./php8.0-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/8.1.mjs b/packages/xmlreader/8.1.mjs new file mode 100644 index 000000000..be2e82ff9 --- /dev/null +++ b/packages/xmlreader/8.1.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.1-xmlreader.so', url: new URL('./php8.1-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/8.2.mjs b/packages/xmlreader/8.2.mjs new file mode 100644 index 000000000..01877fbab --- /dev/null +++ b/packages/xmlreader/8.2.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.2-xmlreader.so', url: new URL('./php8.2-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/8.3.mjs b/packages/xmlreader/8.3.mjs new file mode 100644 index 000000000..3c15c63ed --- /dev/null +++ b/packages/xmlreader/8.3.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.3-xmlreader.so', url: new URL('./php8.3-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/8.4.mjs b/packages/xmlreader/8.4.mjs new file mode 100644 index 000000000..60ea23313 --- /dev/null +++ b/packages/xmlreader/8.4.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.4-xmlreader.so', url: new URL('./php8.4-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/8.5.mjs b/packages/xmlreader/8.5.mjs new file mode 100644 index 000000000..408d6f39d --- /dev/null +++ b/packages/xmlreader/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-xmlreader.so', url: new URL('./php8.5-xmlreader.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlreader/README.md b/packages/xmlreader/README.md new file mode 100644 index 000000000..12323bdbd --- /dev/null +++ b/packages/xmlreader/README.md @@ -0,0 +1,52 @@ +# php-wasm-xmlreader + +`php-wasm-xmlreader` provides the `xmlreader` extension for `php-wasm`. + +## Install + +```sh +npm install php-wasm php-wasm-libxml php-wasm-dom php-wasm-xmlreader +``` + +## What It Loads + +Dynamic builds resolve the active runtime version to `php8.x-xmlreader.so`. +Load `php-wasm-libxml` and `php-wasm-dom` alongside it when those dependencies are also dynamic. + +Shared and static builds may already include some or all of the `libxml`, `dom`, and `xmlreader` pieces in the base runtime. In those modes, callers should only explicitly load the packages whose own `WITH_*` mode is `dynamic`. + +## Usage + +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import dom from 'php-wasm-dom'; +import xmlreader from 'php-wasm-xmlreader'; + +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, dom, xmlreader], +}); + +await php.run(`} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); + +export default {getLibs}; diff --git a/packages/xmlreader/package.json b/packages/xmlreader/package.json new file mode 100644 index 000000000..8b1d14d92 --- /dev/null +++ b/packages/xmlreader/package.json @@ -0,0 +1,20 @@ +{ + "name": "php-wasm-xmlreader", + "description": "xmlreader for php-wasm.", + "repository": { + "type": "git", + "url": "git+https://github.com/seanmorris/php-wasm.git" + }, + "author": "Sean Morris ", + "version": "0.1.0", + "main": "index.mjs", + "types": "index.d.ts", + "files": [ + "index.mjs", + "index.d.ts", + "test/basic.mjs", + "README.md", + "static.mak", + "*.so" + ] +} diff --git a/packages/xmlreader/static.mak b/packages/xmlreader/static.mak new file mode 100644 index 000000000..89dea08d3 --- /dev/null +++ b/packages/xmlreader/static.mak @@ -0,0 +1,47 @@ +#!/usr/bin/env make + +DOCKER_RUN_IN_EXT_XMLREADER =${DOCKER_ENV} -e NOCONFIGURE=1 -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE}' -w /src/third_party/php${PHP_VERSION}-xmlreader/ emscripten-builder + +WITH_XMLREADER?=dynamic + +ifeq ($(filter ${WITH_XMLREADER},0 1 static dynamic),) +$(error WITH_XMLREADER MUST BE 0, 1, static, OR dynamic. WITH_XMLREADER: '${WITH_XMLREADER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif + +ifeq (${WITH_XMLREADER},1) +WITH_XMLREADER=dynamic +endif + +ifeq (${WITH_XMLREADER},static) +ifeq ($(filter ${WITH_LIBXML},static),) +$(error WITH_XMLREADER=static REQUIRES WITH_LIBXML=static. WITH_LIBXML: '${WITH_LIBXML}' WITH_XMLREADER: '${WITH_XMLREADER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +ifeq ($(filter ${WITH_DOM},static),) +$(error WITH_XMLREADER=static REQUIRES WITH_DOM=static. WITH_DOM: '${WITH_DOM}' WITH_XMLREADER: '${WITH_XMLREADER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +CONFIGURE_FLAGS+= --enable-xmlreader +TEST_LIST+=$(shell ls packages/xmlreader/test/*.mjs) +endif + +ifeq (${WITH_XMLREADER},dynamic) +ifeq ($(filter ${WITH_LIBXML},1 static shared dynamic),) +$(error WITH_XMLREADER=dynamic REQUIRES WITH_LIBXML=[static|shared|dynamic]. WITH_LIBXML: '${WITH_LIBXML}' WITH_XMLREADER: '${WITH_XMLREADER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +ifeq ($(filter ${WITH_DOM},1 static shared dynamic),) +$(error WITH_XMLREADER=dynamic REQUIRES WITH_DOM=[static|shared|dynamic]. WITH_DOM: '${WITH_DOM}' WITH_XMLREADER: '${WITH_XMLREADER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +TEST_LIST+=$(shell ls packages/xmlreader/test/*.mjs) +EXTRA_MODULES+= packages/xmlreader/php${PHP_VERSION}-xmlreader.so +endif + +third_party/php${PHP_VERSION}-xmlreader/config.m4: third_party/php${PHP_VERSION}-src/patched + ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/xmlreader /src/third_party/php${PHP_VERSION}-xmlreader + +packages/xmlreader/php${PHP_VERSION}-xmlreader.so: ${PHPIZE} third_party/php${PHP_VERSION}-xmlreader/config.m4 + ${DOCKER_RUN_IN_EXT_XMLREADER} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; + ${DOCKER_RUN_IN_EXT_XMLREADER} /src/third_party/php${PHP_VERSION}-src/scripts/phpize; + ${DOCKER_RUN_IN_EXT_XMLREADER} emconfigure ./configure PKG_CONFIG_PATH=${PKG_CONFIG_PATH} --prefix='/src/lib/php${PHP_VERSION}' --with-php-config=/src/lib/php${PHP_VERSION}/bin/php-config; + ${DOCKER_RUN_IN_EXT_XMLREADER} sed -i 's#-shared#-static#g' Makefile; + ${DOCKER_RUN_IN_EXT_XMLREADER} sed -i 's#-export-dynamic##g' Makefile; + ${DOCKER_RUN_IN_EXT_XMLREADER} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; + ${DOCKER_RUN_IN_EXT_XMLREADER} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/xmlreader.a /src/packages/libxml/libxml2.so diff --git a/packages/xmlreader/test/basic.mjs b/packages/xmlreader/test/basic.mjs new file mode 100644 index 000000000..3051965fc --- /dev/null +++ b/packages/xmlreader/test/basic.mjs @@ -0,0 +1,61 @@ +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; +import { env } from 'node:process'; + +import libxml from 'php-wasm-libxml'; +import dom from 'php-wasm-dom'; +import xmlreader from 'php-wasm-xmlreader'; + +const phpVersion = process.env.PHP_VERSION ?? '8.4'; +const isDynamic = flag => env[flag] === 'dynamic'; + +const stringSharedLibs = [ + isDynamic('WITH_LIBXML') && { url: './packages/libxml/libxml2.so', ini: false }, + isDynamic('WITH_DOM') && `./packages/dom/php${phpVersion}-dom.so`, + isDynamic('WITH_XMLREADER') && `./packages/xmlreader/php${phpVersion}-xmlreader.so` +].filter(Boolean); + +const moduleSharedLibs = [ + isDynamic('WITH_LIBXML') && libxml, + isDynamic('WITH_DOM') && dom, + isDynamic('WITH_XMLREADER') && xmlreader +].filter(Boolean); + +test('XMLReader Extension is enabled. (loaded via strings)', async () => { + const php = stringSharedLibs.length + ? new PhpNode({ sharedLibs: stringSharedLibs }) + : new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = moduleSharedLibs.length + ? new PhpNode({ sharedLibs: moduleSharedLibs }) + : new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(`} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.0-xmlwriter.so', url: new URL('./php8.0-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/8.1.mjs b/packages/xmlwriter/8.1.mjs new file mode 100644 index 000000000..02b68f3ef --- /dev/null +++ b/packages/xmlwriter/8.1.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.1-xmlwriter.so', url: new URL('./php8.1-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/8.2.mjs b/packages/xmlwriter/8.2.mjs new file mode 100644 index 000000000..61c348d17 --- /dev/null +++ b/packages/xmlwriter/8.2.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.2-xmlwriter.so', url: new URL('./php8.2-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/8.3.mjs b/packages/xmlwriter/8.3.mjs new file mode 100644 index 000000000..5226e5950 --- /dev/null +++ b/packages/xmlwriter/8.3.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.3-xmlwriter.so', url: new URL('./php8.3-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/8.4.mjs b/packages/xmlwriter/8.4.mjs new file mode 100644 index 000000000..b7ac83f1f --- /dev/null +++ b/packages/xmlwriter/8.4.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.4-xmlwriter.so', url: new URL('./php8.4-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/8.5.mjs b/packages/xmlwriter/8.5.mjs new file mode 100644 index 000000000..705ede372 --- /dev/null +++ b/packages/xmlwriter/8.5.mjs @@ -0,0 +1,13 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number(url.searchParams.get('ini') ?? true)); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-xmlwriter.so', url: new URL('./php8.5-xmlwriter.so', import.meta.url), ini} +]; + +export default {getLibs}; diff --git a/packages/xmlwriter/README.md b/packages/xmlwriter/README.md new file mode 100644 index 000000000..9e81e0152 --- /dev/null +++ b/packages/xmlwriter/README.md @@ -0,0 +1,39 @@ +# php-wasm-xmlwriter + +`php-wasm-xmlwriter` provides the `xmlwriter` extension for `php-wasm`. + +## Install + +```sh +npm install php-wasm php-wasm-libxml php-wasm-xmlwriter +``` + +## What It Loads + +The package resolves the active runtime version to `php8.x-xmlwriter.so`. +Load `php-wasm-libxml` alongside it when you are using XMLWriter as a shared or dynamic extension. + +## Usage + +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import libxml from 'php-wasm-libxml'; +import xmlwriter from 'php-wasm-xmlwriter'; + +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [libxml, xmlwriter], +}); + +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/xmlwriter/index.mjs b/packages/xmlwriter/index.mjs new file mode 100644 index 000000000..4508d2e12 --- /dev/null +++ b/packages/xmlwriter/index.mjs @@ -0,0 +1,24 @@ +import xmlwriter8_5 from './8.5.mjs'; +import xmlwriter8_4 from './8.4.mjs'; +import xmlwriter8_3 from './8.3.mjs'; +import xmlwriter8_2 from './8.2.mjs'; +import xmlwriter8_1 from './8.1.mjs'; +import xmlwriter8_0 from './8.0.mjs'; + +const versionTable = { + '8.5': xmlwriter8_5, + '8.4': xmlwriter8_4, + '8.3': xmlwriter8_3, + '8.2': xmlwriter8_2, + '8.1': xmlwriter8_1, + '8.0': xmlwriter8_0 +}; + +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ +export const getLibs = php => versionTable[php.phpVersion].getLibs(); + +export default {getLibs}; diff --git a/packages/xmlwriter/package.json b/packages/xmlwriter/package.json new file mode 100644 index 000000000..9e7d33507 --- /dev/null +++ b/packages/xmlwriter/package.json @@ -0,0 +1,20 @@ +{ + "name": "php-wasm-xmlwriter", + "description": "xmlwriter for php-wasm.", + "repository": { + "type": "git", + "url": "git+https://github.com/seanmorris/php-wasm.git" + }, + "author": "Sean Morris ", + "version": "0.1.0", + "main": "index.mjs", + "types": "index.d.ts", + "files": [ + "index.mjs", + "index.d.ts", + "test/basic.mjs", + "README.md", + "static.mak", + "*.so" + ] +} diff --git a/packages/xmlwriter/static.mak b/packages/xmlwriter/static.mak new file mode 100644 index 000000000..0728ac0b1 --- /dev/null +++ b/packages/xmlwriter/static.mak @@ -0,0 +1,41 @@ +#!/usr/bin/env make + +DOCKER_RUN_IN_EXT_XMLWRITER =${DOCKER_ENV} -e NOCONFIGURE=1 -e EMCC_CFLAGS='-fPIC -flto -O${SUB_OPTIMIZE}' -w /src/third_party/php${PHP_VERSION}-xmlwriter/ emscripten-builder + +WITH_XMLWRITER?=dynamic + +ifeq ($(filter ${WITH_XMLWRITER},0 1 static dynamic),) +$(error WITH_XMLWRITER MUST BE 0, 1, static, OR dynamic. WITH_XMLWRITER: '${WITH_XMLWRITER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif + +ifeq (${WITH_XMLWRITER},1) +WITH_XMLWRITER=dynamic +endif + +ifeq (${WITH_XMLWRITER},static) +ifeq ($(filter ${WITH_LIBXML},static),) +$(error WITH_XMLWRITER=static REQUIRES WITH_LIBXML=static. WITH_LIBXML: '${WITH_LIBXML}' WITH_XMLWRITER: '${WITH_XMLWRITER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +CONFIGURE_FLAGS+= --enable-xmlwriter +TEST_LIST+=$(shell ls packages/xmlwriter/test/*.mjs) +endif + +ifeq (${WITH_XMLWRITER},dynamic) +ifeq ($(filter ${WITH_LIBXML},1 static shared dynamic),) +$(error WITH_XMLWRITER=dynamic REQUIRES WITH_LIBXML=[static|shared]. WITH_LIBXML: '${WITH_LIBXML}' WITH_XMLWRITER: '${WITH_XMLWRITER}' PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE})) +endif +TEST_LIST+=$(shell ls packages/xmlwriter/test/*.mjs) +EXTRA_MODULES+= packages/xmlwriter/php${PHP_VERSION}-xmlwriter.so +endif + +third_party/php${PHP_VERSION}-xmlwriter/config.m4: third_party/php${PHP_VERSION}-src/patched + ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/xmlwriter /src/third_party/php${PHP_VERSION}-xmlwriter + +packages/xmlwriter/php${PHP_VERSION}-xmlwriter.so: ${PHPIZE} third_party/php${PHP_VERSION}-xmlwriter/config.m4 + ${DOCKER_RUN_IN_EXT_XMLWRITER} chmod +x /src/third_party/php${PHP_VERSION}-src/scripts/phpize; + ${DOCKER_RUN_IN_EXT_XMLWRITER} /src/third_party/php${PHP_VERSION}-src/scripts/phpize; + ${DOCKER_RUN_IN_EXT_XMLWRITER} emconfigure ./configure PKG_CONFIG_PATH=${PKG_CONFIG_PATH} --prefix='/src/lib/php${PHP_VERSION}' --with-php-config=/src/lib/php${PHP_VERSION}/bin/php-config; + ${DOCKER_RUN_IN_EXT_XMLWRITER} sed -i 's#-shared#-static#g' Makefile; + ${DOCKER_RUN_IN_EXT_XMLWRITER} sed -i 's#-export-dynamic##g' Makefile; + ${DOCKER_RUN_IN_EXT_XMLWRITER} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; + ${DOCKER_RUN_IN_EXT_XMLWRITER} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -O${SUB_OPTIMIZE} -Wl,--whole-archive .libs/xmlwriter.a /src/packages/libxml/libxml2.so diff --git a/packages/xmlwriter/test/basic.mjs b/packages/xmlwriter/test/basic.mjs new file mode 100644 index 000000000..b44040e7c --- /dev/null +++ b/packages/xmlwriter/test/basic.mjs @@ -0,0 +1,48 @@ +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; +import { env } from 'node:process'; + +import libxml from 'php-wasm-libxml'; +import xmlwriter from 'php-wasm-xmlwriter'; + +test('XMLWriter Extension is enabled. (loaded via strings)', async () => { + const php = env.WITH_XMLWRITER === 'dynamic' + ? new PhpNode({sharedLibs:[ + { url: './packages/libxml/libxml2.so', ini: false }, + `./packages/xmlwriter/php${process.env.PHP_VERSION ?? '8.4'}-xmlwriter.so` + ]}) + : new PhpNode; + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = env.WITH_XMLWRITER === 'dynamic' + ? new PhpNode({sharedLibs:[libxml, xmlwriter]}) + : new PhpNode; + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(`} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.0-zlib.so', url: new URL('./php8.0-zlib.so', import.meta.url).href, ini}, - {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href}, + {name: 'php8.0-zlib.so', url: new URL('./php8.0-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} ]; export default {getLibs}; diff --git a/packages/zlib/8.1.mjs b/packages/zlib/8.1.mjs index bfcee2304..3126d8815 100644 --- a/packages/zlib/8.1.mjs +++ b/packages/zlib/8.1.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.1-zlib.so', url: new URL('./php8.1-zlib.so', import.meta.url).href, ini}, - {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href}, + {name: 'php8.1-zlib.so', url: new URL('./php8.1-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} ]; export default {getLibs}; diff --git a/packages/zlib/8.2.mjs b/packages/zlib/8.2.mjs index b69d7476e..c911ba70b 100644 --- a/packages/zlib/8.2.mjs +++ b/packages/zlib/8.2.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.2-zlib.so', url: new URL('./php8.2-zlib.so', import.meta.url).href, ini}, - {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href}, + {name: 'php8.2-zlib.so', url: new URL('./php8.2-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} ]; export default {getLibs}; diff --git a/packages/zlib/8.3.mjs b/packages/zlib/8.3.mjs index 90c2c1c0f..1111e8da0 100644 --- a/packages/zlib/8.3.mjs +++ b/packages/zlib/8.3.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.3-zlib.so', url: new URL('./php8.3-zlib.so', import.meta.url).href, ini}, - {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href}, + {name: 'php8.3-zlib.so', url: new URL('./php8.3-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} ]; export default {getLibs}; diff --git a/packages/zlib/8.4.mjs b/packages/zlib/8.4.mjs index 8859c403e..e778912d8 100644 --- a/packages/zlib/8.4.mjs +++ b/packages/zlib/8.4.mjs @@ -2,9 +2,13 @@ const importMeta = import.meta; const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); const ini = !!(Number( url.searchParams.get('ini') ?? true )); +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ export const getLibs = () => [ - {name: 'php8.4-zlib.so', url: new URL('./php8.4-zlib.so', import.meta.url).href, ini}, - {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href}, + {name: 'php8.4-zlib.so', url: new URL('./php8.4-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} ]; export default {getLibs}; diff --git a/packages/zlib/8.5.mjs b/packages/zlib/8.5.mjs new file mode 100644 index 000000000..6417bb424 --- /dev/null +++ b/packages/zlib/8.5.mjs @@ -0,0 +1,14 @@ +const importMeta = import.meta; +const url = new URL(importMeta.url ?? 'http://example.com#this-is-an-error-supression-hack'); +const ini = !!(Number( url.searchParams.get('ini') ?? true )); + +/** + * Returns the shared library definitions for this package build. + * @returns {Array} Shared library definitions for the current package version. + */ +export const getLibs = () => [ + {name: 'php8.5-zlib.so', url: new URL('./php8.5-zlib.so', import.meta.url).href, ini} + , {name: 'libz.so', url: new URL('./libz.so', import.meta.url).href} +]; + +export default {getLibs}; diff --git a/packages/zlib/README.md b/packages/zlib/README.md index 5664dce9e..ed87b308a 100644 --- a/packages/zlib/README.md +++ b/packages/zlib/README.md @@ -1,47 +1,35 @@ # php-wasm-zlib -zlib extenstion for php-wasm. +`php-wasm-zlib` provides the `zlib` extension for `php-wasm`. -https://github.com/seanmorris/php-wasm +## Install -https://www.npmjs.com/package/php-wasm - -## Usage - -`php-wasm-zlib` can be loaded via dynamic imports: - -```javascript -const php = new PhpWeb({sharedLibs: [ - await import('https://unpkg.com/php-wasm-zlib') -]}); +```sh +npm install php-wasm php-wasm-zlib ``` -The supporting library `libz.so` will automatically be pulled from the package. +## What It Loads -You can rely on the default loading behavior if all `.so` files are served from the same directory as your `.wasm` files. +The package resolves the active runtime version to `php8.x-zlib.so` and bundles `libz.so`. -```javascript -const php = new PhpWeb({sharedLibs: ['php8.3-zlib.so']}); -``` +## Usage -You can provide a callback as the `locateFile` option to map library names to URLs: +```js +import { PhpWeb } from 'php-wasm/PhpWeb.mjs'; +import zlib from 'php-wasm-zlib'; -```javascript -const locateFile = (libName) => { - return `https://my-example-server.site/path/to/libs/${libName}`; -}; +const php = new PhpWeb({ + version: '8.4', + sharedLibs: [zlib], +}); -const php = new PhpWeb({locateFile, sharedLibs: ['php8.3-zlib.so']}); +await php.run(` PhpSharedLibrary[]; getFiles?: () => PhpPreloadFile[]; } +export function getLibs(php: PhpVersionedRuntime): PhpSharedLibrary[]; +declare const _default: { getLibs: typeof getLibs }; +export default _default; diff --git a/packages/zlib/index.mjs b/packages/zlib/index.mjs index 5f1cdeb47..ab06d2fda 100644 --- a/packages/zlib/index.mjs +++ b/packages/zlib/index.mjs @@ -1,17 +1,24 @@ +import zlib8_5 from './8.5.mjs'; import zlib8_4 from './8.4.mjs'; -import zlib8_3 from './8.3.mjs'; -import zlib8_2 from './8.2.mjs'; -import zlib8_1 from './8.1.mjs'; -import zlib8_0 from './8.0.mjs'; +import zlib8_3 from './8.3.mjs'; +import zlib8_2 from './8.2.mjs'; +import zlib8_1 from './8.1.mjs'; +import zlib8_0 from './8.0.mjs'; const versionTable = { - '8.4': zlib8_4, - '8.3': zlib8_3, - '8.2': zlib8_2, - '8.1': zlib8_1, - '8.0': zlib8_0, + '8.5': zlib8_5 + , '8.4': zlib8_4 + , '8.3': zlib8_3 + , '8.2': zlib8_2 + , '8.1': zlib8_1 + , '8.0': zlib8_0 }; +/** + * Returns the shared library definitions for the active PHP version. + * @param {object} php PHP runtime wrapper used to select the versioned package build. + * @returns {Array} Shared library definitions for the active PHP version. + */ export const getLibs = php => versionTable[php.phpVersion].getLibs(); export default {getLibs}; diff --git a/packages/zlib/package.json b/packages/zlib/package.json index f543a783e..5b4a235c2 100644 --- a/packages/zlib/package.json +++ b/packages/zlib/package.json @@ -6,18 +6,16 @@ "url": "git+https://github.com/seanmorris/php-wasm.git" }, "author": "Sean Morris ", - "version": "0.0.9-alpha-33", + "version": "0.1.0", "main": "index.mjs", + "types": "index.d.ts", "files": [ "index.mjs", + "index.d.ts", "LICENSE", "NOTICE", "README.md", "static.mak", - "libz.so", - "php8.3-zlib.so", - "php8.2-zlib.so", - "php8.1-zlib.so", - "php8.0-zlib.so" + "*.so" ] } diff --git a/packages/zlib/static.mak b/packages/zlib/static.mak index 8fc0123fe..7dcf29487 100644 --- a/packages/zlib/static.mak +++ b/packages/zlib/static.mak @@ -19,7 +19,7 @@ CONFIGURE_FLAGS+= --with-zlib ARCHIVES+= lib/lib/libz.a TEST_LIST+=$(shell ls packages/zlib/test/*.mjs) SKIP_LIBS+= -lz -EXTRA_MODULES+= packages/zlib/libz.so packages/zlib/php${PHP_VERSION}-zlib.so +EXTRA_MODULES+= packages/zlib/libz.so endif ifeq (${WITH_ZLIB},shared) @@ -28,8 +28,7 @@ PHP_CONFIGURE_DEPS+= packages/zlib/libz.so TEST_LIST+=$(shell ls packages/zlib/test/*.mjs) SHARED_LIBS+= packages/zlib/libz.so SKIP_LIBS+= -lz -EXTRA_MODULES+= packages/zlib/libz.so packages/zlib/php${PHP_VERSION}-zlib.so -PHP_ASSET_LIST+= libz.so +EXTRA_MODULES+= packages/zlib/libz.so endif ifeq (${WITH_ZLIB},dynamic) @@ -62,9 +61,6 @@ lib/lib/libz.so: lib/lib/libz.a packages/zlib/libz.so: lib/lib/libz.so cp -Lp $^ $@ -$(addsuffix /libz.so,$(sort ${SHARED_ASSET_PATHS})): packages/zlib/libz.so - cp -Lp $^ $@ - third_party/php${PHP_VERSION}-zlib/config.m4: third_party/php${PHP_VERSION}-src/patched ${DOCKER_RUN} cp -Lprf /src/third_party/php${PHP_VERSION}-src/ext/zlib /src/third_party/php${PHP_VERSION}-zlib ${DOCKER_RUN} touch third_party/php${PHP_VERSION}-zlib/config.m4 @@ -79,6 +75,3 @@ packages/zlib/php${PHP_VERSION}-zlib.so: ${PHPIZE} packages/zlib/libz.so third_p ${DOCKER_RUN_IN_EXT_ZLIB} sed -i 's#-export-dynamic##g' Makefile; ${DOCKER_RUN_IN_EXT_ZLIB} emmake make -j${CPU_COUNT} EXTRA_INCLUDES='-I/src/third_party/php${PHP_VERSION}-src'; ${DOCKER_RUN_IN_EXT_ZLIB} emcc -shared -o /src/$@ -fPIC -flto -sSIDE_MODULE=1 -s EXPORT_ALL=1 -O0 -Wl,--whole-archive .libs/zlib.a /src/packages/zlib/libz.so - -$(addsuffix /php${PHP_VERSION}-zlib.so,$(sort ${SHARED_ASSET_PATHS})): packages/zlib/php${PHP_VERSION}-zlib.so - cp -Lp $^ $@ diff --git a/packages/zlib/test/basic.mjs b/packages/zlib/test/basic.mjs index f5c51ad5f..7b7fce4bf 100644 --- a/packages/zlib/test/basic.mjs +++ b/packages/zlib/test/basic.mjs @@ -1,6 +1,6 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpNode } from '../../../test/lib/PhpNode.mjs'; import { env } from 'node:process'; import zlib from 'php-wasm-zlib'; diff --git a/patch/php8.0.patch b/patch/php8.0.patch index 764d214c1..f23ae4d38 100644 --- a/patch/php8.0.patch +++ b/patch/php8.0.patch @@ -1,8 +1,8 @@ diff --git a/third_party/php8.0-src/ext/libxml/libxml.c b/third_party/php8.0-src/ext/libxml/libxml.c -index 73486ae..5e0cdc3 100644 +index 73486ae..256ba55 100644 --- a/third_party/php8.0-src/ext/libxml/libxml.c +++ b/third_party/php8.0-src/ext/libxml/libxml.c -@@ -43,6 +43,17 @@ +@@ -43,6 +43,23 @@ #include "php_libxml.h" #include "libxml_arginfo.h" @@ -15,22 +15,36 @@ index 73486ae..5e0cdc3 100644 +__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); +__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); +__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) +#endif + #define PHP_LIBXML_ERROR 0 #define PHP_LIBXML_CTX_ERROR 1 #define PHP_LIBXML_CTX_WARNING 2 -@@ -795,6 +806,28 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) +@@ -795,6 +812,36 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) static PHP_MINIT_FUNCTION(libxml) { ++#ifdef LIBXML_DYNAMIC_LOAD + if (xmlParserVersion == NULL) { + void *handle = DL_LOAD("libxml2.so"); -+ const char** xmlParserVersionPtr = (const char**)dlsym(handle, "xmlParserVersion"); -+ if (xmlParserVersionPtr) { -+ xmlParserVersion = *xmlParserVersionPtr; ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); + } + } ++#endif + + if (xmlParserVersion == NULL) { + zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); @@ -49,7 +63,7 @@ index 73486ae..5e0cdc3 100644 zend_class_entry ce; php_libxml_initialize(); -@@ -903,6 +936,8 @@ static PHP_MINIT_FUNCTION(libxml) +@@ -903,6 +950,8 @@ static PHP_MINIT_FUNCTION(libxml) static PHP_RINIT_FUNCTION(libxml) { @@ -58,7 +72,7 @@ index 73486ae..5e0cdc3 100644 if (_php_libxml_per_request_initialization) { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); -@@ -921,6 +956,8 @@ static PHP_RINIT_FUNCTION(libxml) +@@ -921,6 +970,8 @@ static PHP_RINIT_FUNCTION(libxml) static PHP_RSHUTDOWN_FUNCTION(libxml) { @@ -67,7 +81,7 @@ index 73486ae..5e0cdc3 100644 _php_libxml_destroy_fci(&LIBXML(entity_loader).fci, &LIBXML(entity_loader).object); return SUCCESS; -@@ -928,6 +965,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) +@@ -928,6 +979,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) static PHP_MSHUTDOWN_FUNCTION(libxml) { @@ -76,7 +90,7 @@ index 73486ae..5e0cdc3 100644 if (!_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -941,6 +980,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) +@@ -941,6 +994,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) static zend_result php_libxml_post_deactivate(void) { @@ -85,16 +99,21 @@ index 73486ae..5e0cdc3 100644 /* reset libxml generic error handling */ if (_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -966,6 +1007,8 @@ static zend_result php_libxml_post_deactivate(void) +@@ -966,6 +1021,13 @@ static zend_result php_libxml_post_deactivate(void) static PHP_MINFO_FUNCTION(libxml) { -+ if (xmlParserVersion == NULL) return; ++ if (xmlParserVersion == NULL) { ++ php_info_print_table_start(); ++ php_info_print_table_row(2, "libXML support", "NOT ACTIVE"); ++ php_info_print_table_end(); ++ return; ++ } + php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); -@@ -978,6 +1021,8 @@ static PHP_MINFO_FUNCTION(libxml) +@@ -978,6 +1040,8 @@ static PHP_MINFO_FUNCTION(libxml) /* {{{ Set the streams context for the next libxml document load or write */ PHP_FUNCTION(libxml_set_streams_context) { @@ -103,7 +122,7 @@ index 73486ae..5e0cdc3 100644 zval *arg; ZEND_PARSE_PARAMETERS_START(1, 1) -@@ -995,6 +1040,8 @@ PHP_FUNCTION(libxml_set_streams_context) +@@ -995,6 +1059,8 @@ PHP_FUNCTION(libxml_set_streams_context) /* {{{ Disable libxml errors and allow user to fetch error information as needed */ PHP_FUNCTION(libxml_use_internal_errors) { @@ -112,7 +131,7 @@ index 73486ae..5e0cdc3 100644 xmlStructuredErrorFunc current_handler; zend_bool use_errors, use_errors_is_null = 1, retval; -@@ -1035,6 +1082,8 @@ PHP_FUNCTION(libxml_use_internal_errors) +@@ -1035,6 +1101,8 @@ PHP_FUNCTION(libxml_use_internal_errors) /* {{{ Retrieve last error from libxml */ PHP_FUNCTION(libxml_get_last_error) { @@ -121,7 +140,7 @@ index 73486ae..5e0cdc3 100644 xmlErrorPtr error; ZEND_PARSE_PARAMETERS_NONE(); -@@ -1066,6 +1115,7 @@ PHP_FUNCTION(libxml_get_last_error) +@@ -1066,6 +1134,7 @@ PHP_FUNCTION(libxml_get_last_error) /* {{{ Retrieve array of errors */ PHP_FUNCTION(libxml_get_errors) { @@ -129,7 +148,7 @@ index 73486ae..5e0cdc3 100644 xmlErrorPtr error; -@@ -1107,6 +1157,8 @@ PHP_FUNCTION(libxml_get_errors) +@@ -1107,6 +1176,8 @@ PHP_FUNCTION(libxml_get_errors) /* {{{ Clear last error from libxml */ PHP_FUNCTION(libxml_clear_errors) { @@ -138,7 +157,7 @@ index 73486ae..5e0cdc3 100644 ZEND_PARSE_PARAMETERS_NONE(); xmlResetLastError(); -@@ -1127,6 +1179,8 @@ PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /* +@@ -1127,6 +1198,8 @@ PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /* /* {{{ Disable/Enable ability to load external entities */ PHP_FUNCTION(libxml_disable_entity_loader) { @@ -147,7 +166,7 @@ index 73486ae..5e0cdc3 100644 zend_bool disable = 1; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1141,6 +1195,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) +@@ -1141,6 +1214,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) /* {{{ Changes the default external entity loader */ PHP_FUNCTION(libxml_set_external_entity_loader) { @@ -156,6 +175,21 @@ index 73486ae..5e0cdc3 100644 zend_fcall_info fci; zend_fcall_info_cache fcc; +diff --git a/third_party/php8.0-src/ext/openssl/openssl.c b/third_party/php8.0-src/ext/openssl/openssl.c +index 45a7e79..8dae3f4 100644 +--- a/third_party/php8.0-src/ext/openssl/openssl.c ++++ b/third_party/php8.0-src/ext/openssl/openssl.c +@@ -1402,8 +1402,8 @@ PHP_MINIT_FUNCTION(openssl) + /* override the default tcp socket provider */ + php_stream_xport_register("tcp", php_openssl_ssl_socket_factory); + +- php_register_url_stream_wrapper("https", &php_stream_http_wrapper); +- php_register_url_stream_wrapper("ftps", &php_stream_ftp_wrapper); ++ // php_register_url_stream_wrapper("https", &php_stream_http_wrapper); ++ // php_register_url_stream_wrapper("ftps", &php_stream_ftp_wrapper); + + REGISTER_INI_ENTRIES(); + diff --git a/third_party/php8.0-src/ext/pdo_sqlite/pdo_sqlite.c b/third_party/php8.0-src/ext/pdo_sqlite/pdo_sqlite.c index 60cd4c3..1aceeed 100644 --- a/third_party/php8.0-src/ext/pdo_sqlite/pdo_sqlite.c @@ -221,6 +255,21 @@ index 58789ca..dd5e6a7 100644 -@chmod +x $(builddir)/phar.phar install-pharcmd: pharcmd +diff --git a/third_party/php8.0-src/ext/standard/basic_functions.c b/third_party/php8.0-src/ext/standard/basic_functions.c +index 876ef34..7b94c21 100755 +--- a/third_party/php8.0-src/ext/standard/basic_functions.c ++++ b/third_party/php8.0-src/ext/standard/basic_functions.c +@@ -396,8 +396,8 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ + php_register_url_stream_wrapper("glob", &php_glob_stream_wrapper); + #endif + php_register_url_stream_wrapper("data", &php_stream_rfc2397_wrapper); +- php_register_url_stream_wrapper("http", &php_stream_http_wrapper); +- php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); ++ // php_register_url_stream_wrapper("http", &php_stream_http_wrapper); ++ // php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); + + #if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC + # if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS diff --git a/third_party/php8.0-src/ext/tokenizer/tokenizer.c b/third_party/php8.0-src/ext/tokenizer/tokenizer.c index 7567a27..fd155f7 100644 --- a/third_party/php8.0-src/ext/tokenizer/tokenizer.c @@ -246,6 +295,19 @@ index bb9c2b2..c1176df 100644 } is_fastcgi = 0; if (allowed_clients) { +diff --git a/third_party/php8.0-src/sapi/cgi/Makefile.frag b/third_party/php8.0-src/sapi/cgi/Makefile.frag +index 79e2afe..0956f43 100644 +--- a/third_party/php8.0-src/sapi/cgi/Makefile.frag ++++ b/third_party/php8.0-src/sapi/cgi/Makefile.frag +@@ -1,7 +1,7 @@ + cgi: $(SAPI_CGI_PATH) + + $(SAPI_CGI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_FASTCGI_OBJS) $(PHP_CGI_OBJS) +- $(BUILD_CGI) ++ $(BUILD_CGI) $(WASM_SHARED_LIBS) + + install-cgi: $(SAPI_CGI_PATH) + @echo "Installing PHP CGI binary: $(INSTALL_ROOT)$(bindir)/" diff --git a/third_party/php8.0-src/sapi/cgi/cgi_main.c b/third_party/php8.0-src/sapi/cgi/cgi_main.c index 0d52941..ac46a7a 100644 --- a/third_party/php8.0-src/sapi/cgi/cgi_main.c @@ -300,6 +362,19 @@ index 0d52941..ac46a7a 100644 +{ + return _sapi_cgi_putenv(name, strlen(name), value); +} +diff --git a/third_party/php8.0-src/sapi/cli/Makefile.frag b/third_party/php8.0-src/sapi/cli/Makefile.frag +index aa1d642..649533d 100644 +--- a/third_party/php8.0-src/sapi/cli/Makefile.frag ++++ b/third_party/php8.0-src/sapi/cli/Makefile.frag +@@ -1,7 +1,7 @@ + cli: $(SAPI_CLI_PATH) + + $(SAPI_CLI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CLI_OBJS) +- $(BUILD_CLI) ++ $(BUILD_CLI) $(WASM_SHARED_LIBS) + + install-cli: $(SAPI_CLI_PATH) + @echo "Installing PHP CLI binary: $(INSTALL_ROOT)$(bindir)/" diff --git a/third_party/php8.0-src/sapi/embed/php_embed.c b/third_party/php8.0-src/sapi/embed/php_embed.c index b510d51..97cc812 100644 --- a/third_party/php8.0-src/sapi/embed/php_embed.c @@ -315,34 +390,8 @@ index b510d51..97cc812 100644 php_register_variable("PHP_SELF", "-", NULL); return SUCCESS; -diff --git a/third_party/php8.0-src/sapi/cgi/Makefile.frag b/third_party/php8.0-src/sapi/cgi/Makefile.frag -index 79e2afe..0956f43 100644 ---- a/third_party/php8.0-src/sapi/cgi/Makefile.frag -+++ b/third_party/php8.0-src/sapi/cgi/Makefile.frag -@@ -1,7 +1,7 @@ - cgi: $(SAPI_CGI_PATH) - - $(SAPI_CGI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_FASTCGI_OBJS) $(PHP_CGI_OBJS) -- $(BUILD_CGI) -+ $(BUILD_CGI) $(WASM_SHARED_LIBS) - - install-cgi: $(SAPI_CGI_PATH) - @echo "Installing PHP CGI binary: $(INSTALL_ROOT)$(bindir)/" -diff --git a/third_party/php8.0-src/sapi/cli/Makefile.frag b/third_party/php8.0-src/sapi/cli/Makefile.frag -index aa1d642..649533d 100644 ---- a/third_party/php8.0-src/sapi/cli/Makefile.frag -+++ b/third_party/php8.0-src/sapi/cli/Makefile.frag -@@ -1,7 +1,7 @@ - cli: $(SAPI_CLI_PATH) - - $(SAPI_CLI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CLI_OBJS) -- $(BUILD_CLI) -+ $(BUILD_CLI) $(WASM_SHARED_LIBS) - - install-cli: $(SAPI_CLI_PATH) - @echo "Installing PHP CLI binary: $(INSTALL_ROOT)$(bindir)/" diff --git a/third_party/php8.0-src/sapi/phpdbg/Makefile.frag b/third_party/php8.0-src/sapi/phpdbg/Makefile.frag -index 2e2faf80..9cbb0486 100644 +index 1572bfd..dd0ea4f 100644 --- a/third_party/php8.0-src/sapi/phpdbg/Makefile.frag +++ b/third_party/php8.0-src/sapi/phpdbg/Makefile.frag @@ -6,7 +6,7 @@ $(BUILD_SHARED): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) @@ -354,3 +403,260 @@ index 2e2faf80..9cbb0486 100644 %.c: %.y %.c: %.l +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg.c +index ce32caa..160d36f 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "phpdbg.h" + #include "phpdbg_prompt.h" + #include "phpdbg_bp.h" +@@ -184,6 +186,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ + pg->last_line = 0; + } /* }}} */ + ++const char* phpdbg_wasm_current_file = NULL; ++uint32_t phpdbg_wasm_current_line = NULL; ++ ++const char** EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_file(void) ++{ ++ return &phpdbg_wasm_current_file; ++} ++ ++uint32_t* EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_line(void) ++{ ++ return &phpdbg_wasm_current_line; ++} ++ ++int* EMSCRIPTEN_KEEPALIVE php_wasm_get_bpcount(void) ++{ ++ return &PHPDBG_G(bp_count); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} ++ + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + { + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); +@@ -219,6 +249,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + + static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ + { ++ phpdbg_wasm_current_file = NULL; ++ phpdbg_wasm_current_line = NULL; ++ + zend_hash_destroy(&PHPDBG_G(registered)); + phpdbg_destroy_watchpoints(); + +@@ -1292,7 +1325,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * + return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); + } /* }}} */ + +-int main(int argc, char **argv) /* {{{ */ ++int EMSCRIPTEN_KEEPALIVE main(int argc, char **argv) /* {{{ */ + { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *sapi_name; +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg.h b/third_party/php8.0-src/sapi/phpdbg/phpdbg.h +index e5db725..60e9916 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg.h ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg.h +@@ -208,7 +208,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); + #ifndef _WIN32 + # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) + #else +-# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) ++# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED ) + #endif /* }}} */ + + /* {{{ output descriptors */ +@@ -329,6 +329,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + long lines; /* max number of lines to display */ + ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ + ++extern const char* phpdbg_wasm_current_file; ++extern uint32_t phpdbg_wasm_current_line; ++ + #endif + + #endif /* PHPDBG_H */ +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg_cmd.c +index 757d48e..577c3a3 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg_cmd.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg_cmd.c +@@ -753,7 +753,7 @@ PHPDBG_API char *phpdbg_read_input(const char *buffered) /* {{{ */ + if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE) || !isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) + #endif + { +- phpdbg_write("prompt", "", "%s", phpdbg_get_prompt()); ++ // phpdbg_write("prompt", "", "%s", phpdbg_get_prompt()); + phpdbg_consume_stdin_line(buf); + buffer = estrdup(buf); + } +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg_info.c +index 7836810..5db1329 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg_info.c +@@ -157,7 +157,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg_io.c +index 30857ac..5ec5b0e 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg_io.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg_io.c +@@ -14,6 +14,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #ifdef HAVE_CONFIG_H + #include "config.h" + #endif +@@ -45,52 +47,40 @@ + + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +-/* is easy to generalize ... but not needed for now */ +-PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { +- int bytes = PHPDBG_G(input_buflen), len = 0; ++EM_ASYNC_JS(int, phpdbg_internal_consume_stdin_line, (char *buf, int max_length), { + +- if (PHPDBG_G(input_buflen)) { +- memcpy(buf, PHPDBG_G(input_buffer), bytes); ++ let input; ++ ++ Module.triggerStdin(); ++ ++ if(Module.inputDataQueue.length) ++ { ++ input = String(Module.inputDataQueue.shift()); ++ } ++ else ++ { ++ let a, r; ++ const promise = new Promise((accept, reject) => [a, r] = [ accept, reject ]); ++ Module.awaitingInput = a; ++ input = String(await promise); + } + +- PHPDBG_G(last_was_newline) = 1; ++ if(input.length >= max_length) ++ { ++ input = input.slice(0, max_length - 1); ++ } + +- do { +- int i; +- if (bytes <= 0) { +- continue; +- } ++ stringToUTF8(input, buf, input.length + 1); + +- for (i = len; i < len + bytes; i++) { +- if (buf[i] == '\x03') { +- if (i != len + bytes - 1) { +- memmove(buf + i, buf + i + 1, len + bytes - i - 1); +- } +- len--; +- i--; +- continue; +- } +- if (buf[i] == '\n') { +- PHPDBG_G(input_buflen) = len + bytes - 1 - i; +- if (PHPDBG_G(input_buflen)) { +- memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); +- } +- if (i != PHPDBG_MAX_CMD - 1) { +- buf[i + 1] = 0; +- } +- return i; +- } +- } + +- len += bytes; +- } while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1)) > 0); + +- if (bytes <= 0) { +- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING | PHPDBG_IS_DISCONNECTED; +- zend_bailout(); +- } ++ return input.length; ++}); + +- return bytes; ++ ++/* is easy to generalize ... but not needed for now */ ++PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { ++ return phpdbg_internal_consume_stdin_line(buf, PHPDBG_MAX_CMD); + } + + PHPDBG_API int phpdbg_consume_bytes(int sock, char *ptr, int len, int tmo) { +@@ -223,13 +213,6 @@ PHPDBG_API int phpdbg_mixed_write(int sock, const char *ptr, int len) { + return phpdbg_send_bytes(sock, ptr, len); + } + +- if ((PHPDBG_G(flags) & PHPDBG_HAS_PAGINATION) +- && !(PHPDBG_G(flags) & PHPDBG_WRITE_XML) +- && PHPDBG_G(io)[PHPDBG_STDOUT].fd == sock +- && PHPDBG_G(lines) > 0) { +- return phpdbg_output_pager(sock, ptr, len); +- } +- + return write(sock, ptr, len); + } + +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg_prompt.c +index adb31d1..8c2163e 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg_prompt.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg_prompt.c +@@ -1690,6 +1690,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ + PHPDBG_G(in_execution) = 1; + + while (1) { ++ phpdbg_wasm_current_file = zend_get_executed_filename(); ++ phpdbg_wasm_current_line = zend_get_executed_lineno(); + zend_object *exception = EG(exception); + + if ((PHPDBG_G(flags) & PHPDBG_BP_RESOLVE_MASK)) { +diff --git a/third_party/php8.0-src/sapi/phpdbg/phpdbg_utils.c b/third_party/php8.0-src/sapi/phpdbg/phpdbg_utils.c +index 56fb654..3517ee0 100644 +--- a/third_party/php8.0-src/sapi/phpdbg/phpdbg_utils.c ++++ b/third_party/php8.0-src/sapi/phpdbg/phpdbg_utils.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "zend.h" + + #include "php.h" +@@ -294,7 +296,7 @@ PHPDBG_API void phpdbg_set_prompt(const char *prompt) /* {{{ */ + PHPDBG_G(prompt)[0] = strdup(prompt); + } /* }}} */ + +-PHPDBG_API const char *phpdbg_get_prompt(void) /* {{{ */ ++PHPDBG_API const char EMSCRIPTEN_KEEPALIVE *phpdbg_get_prompt(void) /* {{{ */ + { + /* find cached prompt */ + if (PHPDBG_G(prompt)[1]) { diff --git a/patch/php8.1.patch b/patch/php8.1.patch index 661774205..59ba89b46 100644 --- a/patch/php8.1.patch +++ b/patch/php8.1.patch @@ -1,8 +1,8 @@ diff --git a/third_party/php8.1-src/ext/libxml/libxml.c b/third_party/php8.1-src/ext/libxml/libxml.c -index 3959b36..262d34f 100644 +index 3959b36..80ac927 100644 --- a/third_party/php8.1-src/ext/libxml/libxml.c +++ b/third_party/php8.1-src/ext/libxml/libxml.c -@@ -43,6 +43,17 @@ +@@ -43,6 +43,23 @@ #include "php_libxml.h" #include "libxml_arginfo.h" @@ -15,22 +15,36 @@ index 3959b36..262d34f 100644 +__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); +__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); +__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) +#endif + #define PHP_LIBXML_ERROR 0 #define PHP_LIBXML_CTX_ERROR 1 #define PHP_LIBXML_CTX_WARNING 2 -@@ -799,6 +810,28 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) +@@ -799,6 +816,36 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) static PHP_MINIT_FUNCTION(libxml) { ++#ifdef LIBXML_DYNAMIC_LOAD + if (xmlParserVersion == NULL) { + void *handle = DL_LOAD("libxml2.so"); -+ const char** xmlParserVersionPtr = (const char**)dlsym(handle, "xmlParserVersion"); -+ if (xmlParserVersionPtr) { -+ xmlParserVersion = *xmlParserVersionPtr; ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); + } + } ++#endif + + if (xmlParserVersion == NULL) { + zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); @@ -49,7 +63,7 @@ index 3959b36..262d34f 100644 php_libxml_initialize(); REGISTER_LONG_CONSTANT("LIBXML_VERSION", LIBXML_VERSION, CONST_CS | CONST_PERSISTENT); -@@ -877,6 +910,8 @@ static PHP_MINIT_FUNCTION(libxml) +@@ -877,6 +924,8 @@ static PHP_MINIT_FUNCTION(libxml) static PHP_RINIT_FUNCTION(libxml) { @@ -58,7 +72,7 @@ index 3959b36..262d34f 100644 if (_php_libxml_per_request_initialization) { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); -@@ -895,6 +930,8 @@ static PHP_RINIT_FUNCTION(libxml) +@@ -895,6 +944,8 @@ static PHP_RINIT_FUNCTION(libxml) static PHP_RSHUTDOWN_FUNCTION(libxml) { @@ -67,7 +81,7 @@ index 3959b36..262d34f 100644 _php_libxml_destroy_fci(&LIBXML(entity_loader).fci, &LIBXML(entity_loader).object); return SUCCESS; -@@ -902,6 +939,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) +@@ -902,6 +953,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) static PHP_MSHUTDOWN_FUNCTION(libxml) { @@ -76,7 +90,7 @@ index 3959b36..262d34f 100644 if (!_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -915,6 +954,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) +@@ -915,6 +968,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) static zend_result php_libxml_post_deactivate(void) { @@ -85,16 +99,21 @@ index 3959b36..262d34f 100644 /* reset libxml generic error handling */ if (_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -940,6 +981,8 @@ static zend_result php_libxml_post_deactivate(void) +@@ -940,6 +995,13 @@ static zend_result php_libxml_post_deactivate(void) static PHP_MINFO_FUNCTION(libxml) { -+ if (xmlParserVersion == NULL) return; ++ if (xmlParserVersion == NULL) { ++ php_info_print_table_start(); ++ php_info_print_table_row(2, "libXML support", "NOT ACTIVE"); ++ php_info_print_table_end(); ++ return; ++ } + php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); -@@ -952,6 +995,8 @@ static PHP_MINFO_FUNCTION(libxml) +@@ -952,6 +1014,8 @@ static PHP_MINFO_FUNCTION(libxml) /* {{{ Set the streams context for the next libxml document load or write */ PHP_FUNCTION(libxml_set_streams_context) { @@ -103,7 +122,7 @@ index 3959b36..262d34f 100644 zval *arg; ZEND_PARSE_PARAMETERS_START(1, 1) -@@ -969,6 +1014,8 @@ PHP_FUNCTION(libxml_set_streams_context) +@@ -969,6 +1033,8 @@ PHP_FUNCTION(libxml_set_streams_context) /* {{{ Disable libxml errors and allow user to fetch error information as needed */ PHP_FUNCTION(libxml_use_internal_errors) { @@ -112,7 +131,7 @@ index 3959b36..262d34f 100644 xmlStructuredErrorFunc current_handler; bool use_errors, use_errors_is_null = 1, retval; -@@ -1009,6 +1056,8 @@ PHP_FUNCTION(libxml_use_internal_errors) +@@ -1009,6 +1075,8 @@ PHP_FUNCTION(libxml_use_internal_errors) /* {{{ Retrieve last error from libxml */ PHP_FUNCTION(libxml_get_last_error) { @@ -121,7 +140,7 @@ index 3959b36..262d34f 100644 xmlErrorPtr error; ZEND_PARSE_PARAMETERS_NONE(); -@@ -1040,6 +1089,7 @@ PHP_FUNCTION(libxml_get_last_error) +@@ -1040,6 +1108,7 @@ PHP_FUNCTION(libxml_get_last_error) /* {{{ Retrieve array of errors */ PHP_FUNCTION(libxml_get_errors) { @@ -129,7 +148,7 @@ index 3959b36..262d34f 100644 xmlErrorPtr error; -@@ -1081,6 +1131,8 @@ PHP_FUNCTION(libxml_get_errors) +@@ -1081,6 +1150,8 @@ PHP_FUNCTION(libxml_get_errors) /* {{{ Clear last error from libxml */ PHP_FUNCTION(libxml_clear_errors) { @@ -138,7 +157,7 @@ index 3959b36..262d34f 100644 ZEND_PARSE_PARAMETERS_NONE(); xmlResetLastError(); -@@ -1101,6 +1153,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ +@@ -1101,6 +1172,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ /* {{{ Disable/Enable ability to load external entities */ PHP_FUNCTION(libxml_disable_entity_loader) { @@ -147,7 +166,7 @@ index 3959b36..262d34f 100644 bool disable = 1; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1115,6 +1169,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) +@@ -1115,6 +1188,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) /* {{{ Changes the default external entity loader */ PHP_FUNCTION(libxml_set_external_entity_loader) { @@ -352,7 +371,7 @@ index 1679246..2802cfc 100644 return SUCCESS; diff --git a/third_party/php8.1-src/sapi/phpdbg/Makefile.frag b/third_party/php8.1-src/sapi/phpdbg/Makefile.frag -index 2e2faf80..9cbb0486 100644 +index 2e2faf8..9cbb048 100644 --- a/third_party/php8.1-src/sapi/phpdbg/Makefile.frag +++ b/third_party/php8.1-src/sapi/phpdbg/Makefile.frag @@ -6,7 +6,7 @@ $(BUILD_SHARED): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) @@ -364,3 +383,256 @@ index 2e2faf80..9cbb0486 100644 %.c: %.y %.c: %.l +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg.c +index e1824ec..96af7bc 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "phpdbg.h" + #include "phpdbg_prompt.h" + #include "phpdbg_bp.h" +@@ -142,6 +144,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ + pg->last_line = 0; + } /* }}} */ + ++const char* phpdbg_wasm_current_file = NULL; ++uint32_t phpdbg_wasm_current_line = NULL; ++ ++const char** EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_file(void) ++{ ++ return &phpdbg_wasm_current_file; ++} ++ ++uint32_t* EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_line(void) ++{ ++ return &phpdbg_wasm_current_line; ++} ++ ++int* EMSCRIPTEN_KEEPALIVE php_wasm_get_bpcount(void) ++{ ++ return &PHPDBG_G(bp_count); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} ++ + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + { + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); +@@ -175,6 +205,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + + static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ + { ++ phpdbg_wasm_current_file = NULL; ++ phpdbg_wasm_current_line = NULL; ++ + zend_hash_destroy(&PHPDBG_G(registered)); + phpdbg_destroy_watchpoints(); + +@@ -1113,7 +1146,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * + return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); + } /* }}} */ + +-int main(int argc, char **argv) /* {{{ */ ++int EMSCRIPTEN_KEEPALIVE main(int argc, char **argv) /* {{{ */ + { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *sapi_name; +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg.h b/third_party/php8.1-src/sapi/phpdbg/phpdbg.h +index 789abec..72992d7 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg.h ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg.h +@@ -186,7 +186,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); + #ifndef _WIN32 + # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) + #else +-# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) ++# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED ) + #endif /* }}} */ + + /* {{{ output descriptors */ +@@ -310,4 +310,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + zend_ulong lines; /* max number of lines to display */ + ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ + ++extern const char* phpdbg_wasm_current_file; ++extern uint32_t phpdbg_wasm_current_line; ++ + #endif /* PHPDBG_H */ +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg_cmd.c +index 7e6a87f..f4e01e3 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg_cmd.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg_cmd.c +@@ -757,7 +757,7 @@ PHPDBG_API char *phpdbg_read_input(const char *buffered) /* {{{ */ + buffer = estrdup(cmd); + free(cmd); + #else +- phpdbg_write("%s", phpdbg_get_prompt()); ++ // phpdbg_write("%s", phpdbg_get_prompt()); + phpdbg_consume_stdin_line(buf); + buffer = estrdup(buf); + #endif +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg_info.c +index e63ec89..7dbc2e3 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg_info.c +@@ -159,7 +159,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg_io.c +index 14ae71a..cd11272 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg_io.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg_io.c +@@ -14,6 +14,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #ifdef HAVE_CONFIG_H + #include "config.h" + #endif +@@ -22,52 +24,40 @@ + + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +-/* is easy to generalize ... but not needed for now */ +-PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { +- int bytes = PHPDBG_G(input_buflen), len = 0; ++EM_ASYNC_JS(int, phpdbg_internal_consume_stdin_line, (char *buf, int max_length), { ++ ++ let input; ++ ++ Module.triggerStdin(); + +- if (PHPDBG_G(input_buflen)) { +- memcpy(buf, PHPDBG_G(input_buffer), bytes); ++ if(Module.inputDataQueue.length) ++ { ++ input = String(Module.inputDataQueue.shift()); ++ } ++ else ++ { ++ let a, r; ++ const promise = new Promise((accept, reject) => [a, r] = [ accept, reject ]); ++ Module.awaitingInput = a; ++ input = String(await promise); + } + +- PHPDBG_G(last_was_newline) = 1; ++ if(input.length >= max_length) ++ { ++ input = input.slice(0, max_length - 1); ++ } + +- do { +- int i; +- if (bytes <= 0) { +- continue; +- } ++ stringToUTF8(input, buf, input.length + 1); + +- for (i = len; i < len + bytes; i++) { +- if (buf[i] == '\x03') { +- if (i != len + bytes - 1) { +- memmove(buf + i, buf + i + 1, len + bytes - i - 1); +- } +- len--; +- i--; +- continue; +- } +- if (buf[i] == '\n') { +- PHPDBG_G(input_buflen) = len + bytes - 1 - i; +- if (PHPDBG_G(input_buflen)) { +- memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); +- } +- if (i != PHPDBG_MAX_CMD - 1) { +- buf[i + 1] = 0; +- } +- return i; +- } +- } + +- len += bytes; +- } while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1)) > 0); + +- if (bytes <= 0) { +- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; +- zend_bailout(); +- } ++ return input.length; ++}); + +- return bytes; ++ ++/* is easy to generalize ... but not needed for now */ ++PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { ++ return phpdbg_internal_consume_stdin_line(buf, PHPDBG_MAX_CMD); + } + + PHPDBG_API int phpdbg_mixed_read(int fd, char *ptr, int len, int tmo) { +@@ -111,11 +101,5 @@ static int phpdbg_output_pager(int fd, const char *ptr, int len) { + } + + PHPDBG_API int phpdbg_mixed_write(int fd, const char *ptr, int len) { +- if ((PHPDBG_G(flags) & PHPDBG_HAS_PAGINATION) +- && PHPDBG_G(io)[PHPDBG_STDOUT].fd == fd +- && PHPDBG_G(lines) > 0) { +- return phpdbg_output_pager(fd, ptr, len); +- } +- + return write(fd, ptr, len); + } +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg_prompt.c +index 8ca6d83..d0ffc42 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg_prompt.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg_prompt.c +@@ -1657,6 +1657,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ + PHPDBG_G(in_execution) = 1; + + while (1) { ++ phpdbg_wasm_current_file = zend_get_executed_filename(); ++ phpdbg_wasm_current_line = zend_get_executed_lineno(); + zend_object *exception = EG(exception); + + if ((PHPDBG_G(flags) & PHPDBG_BP_RESOLVE_MASK)) { +diff --git a/third_party/php8.1-src/sapi/phpdbg/phpdbg_utils.c b/third_party/php8.1-src/sapi/phpdbg/phpdbg_utils.c +index f638d60..4c50f0f 100644 +--- a/third_party/php8.1-src/sapi/phpdbg/phpdbg_utils.c ++++ b/third_party/php8.1-src/sapi/phpdbg/phpdbg_utils.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "zend.h" + + #include "php.h" +@@ -293,7 +295,7 @@ PHPDBG_API void phpdbg_set_prompt(const char *prompt) /* {{{ */ + PHPDBG_G(prompt)[0] = strdup(prompt); + } /* }}} */ + +-PHPDBG_API const char *phpdbg_get_prompt(void) /* {{{ */ ++PHPDBG_API const char EMSCRIPTEN_KEEPALIVE *phpdbg_get_prompt(void) /* {{{ */ + { + /* find cached prompt */ + if (PHPDBG_G(prompt)[1]) { diff --git a/patch/php8.2.patch b/patch/php8.2.patch index bf3b53c5c..58e53581c 100644 --- a/patch/php8.2.patch +++ b/patch/php8.2.patch @@ -12,10 +12,10 @@ index 617cde0..fe9cba5 100644 #elif ZEND_GCC_PREREQ(4, 7) #define HAVE_GNUC_ATOMICS 1 diff --git a/third_party/php8.2-src/ext/libxml/libxml.c b/third_party/php8.2-src/ext/libxml/libxml.c -index 22eb190..6089d36 100644 +index 22eb190..776dea1 100644 --- a/third_party/php8.2-src/ext/libxml/libxml.c +++ b/third_party/php8.2-src/ext/libxml/libxml.c -@@ -49,6 +49,17 @@ +@@ -49,6 +49,23 @@ #include "libxml_arginfo.h" @@ -28,22 +28,36 @@ index 22eb190..6089d36 100644 +__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); +__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); +__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) +#endif + /* a true global for initialization */ static int _php_libxml_initialized = 0; static int _php_libxml_per_request_initialization = 1; -@@ -788,6 +799,29 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) +@@ -788,6 +805,37 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) static PHP_MINIT_FUNCTION(libxml) { ++#ifdef LIBXML_DYNAMIC_LOAD + if (xmlParserVersion == NULL) { + void *handle = DL_LOAD("libxml2.so"); -+ const char** xmlParserVersionPtr = (const char**)dlsym(handle, "xmlParserVersion"); -+ if (xmlParserVersionPtr) { -+ xmlParserVersion = *xmlParserVersionPtr; ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); + } + } ++#endif + + if (xmlParserVersion == NULL) { + zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); @@ -63,7 +77,7 @@ index 22eb190..6089d36 100644 php_libxml_initialize(); register_libxml_symbols(module_number); -@@ -823,6 +857,8 @@ static PHP_MINIT_FUNCTION(libxml) +@@ -823,6 +871,8 @@ static PHP_MINIT_FUNCTION(libxml) static PHP_RINIT_FUNCTION(libxml) { @@ -72,7 +86,7 @@ index 22eb190..6089d36 100644 if (_php_libxml_per_request_initialization) { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); -@@ -841,6 +877,8 @@ static PHP_RINIT_FUNCTION(libxml) +@@ -841,6 +891,8 @@ static PHP_RINIT_FUNCTION(libxml) static PHP_RSHUTDOWN_FUNCTION(libxml) { @@ -81,7 +95,7 @@ index 22eb190..6089d36 100644 LIBXML(entity_loader).fci.size = 0; zval_ptr_dtor_nogc(&LIBXML(entity_loader).callback); ZVAL_NULL(&LIBXML(entity_loader).callback); -@@ -850,6 +888,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) +@@ -850,6 +902,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) static PHP_MSHUTDOWN_FUNCTION(libxml) { @@ -90,7 +104,7 @@ index 22eb190..6089d36 100644 if (!_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -863,6 +903,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) +@@ -863,6 +917,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) static zend_result php_libxml_post_deactivate(void) { @@ -99,16 +113,21 @@ index 22eb190..6089d36 100644 /* reset libxml generic error handling */ if (_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -888,6 +930,8 @@ static zend_result php_libxml_post_deactivate(void) +@@ -888,6 +944,13 @@ static zend_result php_libxml_post_deactivate(void) static PHP_MINFO_FUNCTION(libxml) { -+ if (xmlParserVersion == NULL) return; ++ if (xmlParserVersion == NULL) { ++ php_info_print_table_start(); ++ php_info_print_table_row(2, "libXML support", "NOT ACTIVE"); ++ php_info_print_table_end(); ++ return; ++ } + php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); -@@ -900,6 +944,8 @@ static PHP_MINFO_FUNCTION(libxml) +@@ -900,6 +963,8 @@ static PHP_MINFO_FUNCTION(libxml) /* {{{ Set the streams context for the next libxml document load or write */ PHP_FUNCTION(libxml_set_streams_context) { @@ -117,7 +136,7 @@ index 22eb190..6089d36 100644 zval *arg; ZEND_PARSE_PARAMETERS_START(1, 1) -@@ -917,6 +963,8 @@ PHP_FUNCTION(libxml_set_streams_context) +@@ -917,6 +982,8 @@ PHP_FUNCTION(libxml_set_streams_context) /* {{{ Disable libxml errors and allow user to fetch error information as needed */ PHP_FUNCTION(libxml_use_internal_errors) { @@ -126,7 +145,7 @@ index 22eb190..6089d36 100644 xmlStructuredErrorFunc current_handler; bool use_errors, use_errors_is_null = 1, retval; -@@ -957,6 +1005,8 @@ PHP_FUNCTION(libxml_use_internal_errors) +@@ -957,6 +1024,8 @@ PHP_FUNCTION(libxml_use_internal_errors) /* {{{ Retrieve last error from libxml */ PHP_FUNCTION(libxml_get_last_error) { @@ -135,7 +154,7 @@ index 22eb190..6089d36 100644 xmlErrorPtr error; ZEND_PARSE_PARAMETERS_NONE(); -@@ -988,6 +1038,7 @@ PHP_FUNCTION(libxml_get_last_error) +@@ -988,6 +1057,7 @@ PHP_FUNCTION(libxml_get_last_error) /* {{{ Retrieve array of errors */ PHP_FUNCTION(libxml_get_errors) { @@ -143,7 +162,7 @@ index 22eb190..6089d36 100644 xmlErrorPtr error; -@@ -1029,6 +1080,8 @@ PHP_FUNCTION(libxml_get_errors) +@@ -1029,6 +1099,8 @@ PHP_FUNCTION(libxml_get_errors) /* {{{ Clear last error from libxml */ PHP_FUNCTION(libxml_clear_errors) { @@ -152,7 +171,7 @@ index 22eb190..6089d36 100644 ZEND_PARSE_PARAMETERS_NONE(); xmlResetLastError(); -@@ -1049,6 +1102,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ +@@ -1049,6 +1121,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ /* {{{ Disable/Enable ability to load external entities */ PHP_FUNCTION(libxml_disable_entity_loader) { @@ -161,7 +180,7 @@ index 22eb190..6089d36 100644 bool disable = 1; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1063,6 +1118,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) +@@ -1063,6 +1137,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) /* {{{ Changes the default external entity loader */ PHP_FUNCTION(libxml_set_external_entity_loader) { @@ -170,7 +189,7 @@ index 22eb190..6089d36 100644 zval *callback; zend_fcall_info fci; zend_fcall_info_cache fcc; -@@ -1088,6 +1145,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) +@@ -1088,6 +1164,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) /* {{{ Get the current external entity loader, or null if the default loader is installer. */ PHP_FUNCTION(libxml_get_external_entity_loader) { @@ -478,7 +497,7 @@ index 4b94bd9..fc44d30 100644 return SUCCESS; diff --git a/third_party/php8.2-src/sapi/phpdbg/Makefile.frag b/third_party/php8.2-src/sapi/phpdbg/Makefile.frag -index 2e2faf80..9cbb0486 100644 +index 2e2faf8..9cbb048 100644 --- a/third_party/php8.2-src/sapi/phpdbg/Makefile.frag +++ b/third_party/php8.2-src/sapi/phpdbg/Makefile.frag @@ -6,7 +6,7 @@ $(BUILD_SHARED): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) @@ -490,3 +509,244 @@ index 2e2faf80..9cbb0486 100644 %.c: %.y %.c: %.l +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg.c +index d4ffcdf..9b1b339 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "phpdbg.h" + #include "phpdbg_prompt.h" + #include "phpdbg_bp.h" +@@ -148,6 +150,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ + #endif + } /* }}} */ + ++const char* phpdbg_wasm_current_file = NULL; ++uint32_t phpdbg_wasm_current_line = NULL; ++ ++const char** EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_file(void) ++{ ++ return &phpdbg_wasm_current_file; ++} ++ ++uint32_t* EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_line(void) ++{ ++ return &phpdbg_wasm_current_line; ++} ++ ++int* EMSCRIPTEN_KEEPALIVE php_wasm_get_bpcount(void) ++{ ++ return &PHPDBG_G(bp_count); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} ++ + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + { + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); +@@ -177,6 +207,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + + static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ + { ++ phpdbg_wasm_current_file = NULL; ++ phpdbg_wasm_current_line = NULL; ++ + zend_hash_destroy(&PHPDBG_G(registered)); + phpdbg_destroy_watchpoints(); + +@@ -1118,7 +1151,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * + return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); + } /* }}} */ + +-int main(int argc, char **argv) /* {{{ */ ++int EMSCRIPTEN_KEEPALIVE main(int argc, char **argv) /* {{{ */ + { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *sapi_name; +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg.h b/third_party/php8.2-src/sapi/phpdbg/phpdbg.h +index 76630dc..ecfe515 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg.h ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg.h +@@ -182,7 +182,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); + #ifndef _WIN32 + # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) + #else +-# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) ++# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED ) + #endif /* }}} */ + + /* {{{ output descriptors */ +@@ -310,4 +310,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + zend_ulong lines; /* max number of lines to display */ + ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ + ++extern const char* phpdbg_wasm_current_file; ++extern uint32_t phpdbg_wasm_current_line; ++ + #endif /* PHPDBG_H */ +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg_cmd.c +index 7e6a87f..f4e01e3 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg_cmd.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg_cmd.c +@@ -757,7 +757,7 @@ PHPDBG_API char *phpdbg_read_input(const char *buffered) /* {{{ */ + buffer = estrdup(cmd); + free(cmd); + #else +- phpdbg_write("%s", phpdbg_get_prompt()); ++ // phpdbg_write("%s", phpdbg_get_prompt()); + phpdbg_consume_stdin_line(buf); + buffer = estrdup(buf); + #endif +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg_info.c +index 0a1e757..a3d53cb 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg_info.c +@@ -159,7 +159,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg_io.c +index 14ae71a..8163757 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg_io.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg_io.c +@@ -14,6 +14,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #ifdef HAVE_CONFIG_H + #include "config.h" + #endif +@@ -22,52 +24,40 @@ + + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +-/* is easy to generalize ... but not needed for now */ +-PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { +- int bytes = PHPDBG_G(input_buflen), len = 0; ++EM_ASYNC_JS(int, phpdbg_internal_consume_stdin_line, (char *buf, int max_length), { ++ ++ let input; ++ ++ Module.triggerStdin(); + +- if (PHPDBG_G(input_buflen)) { +- memcpy(buf, PHPDBG_G(input_buffer), bytes); ++ if(Module.inputDataQueue.length) ++ { ++ input = String(Module.inputDataQueue.shift()); ++ } ++ else ++ { ++ let a, r; ++ const promise = new Promise((accept, reject) => [a, r] = [ accept, reject ]); ++ Module.awaitingInput = a; ++ input = String(await promise); + } + +- PHPDBG_G(last_was_newline) = 1; ++ if(input.length >= max_length) ++ { ++ input = input.slice(0, max_length - 1); ++ } + +- do { +- int i; +- if (bytes <= 0) { +- continue; +- } ++ stringToUTF8(input, buf, input.length + 1); + +- for (i = len; i < len + bytes; i++) { +- if (buf[i] == '\x03') { +- if (i != len + bytes - 1) { +- memmove(buf + i, buf + i + 1, len + bytes - i - 1); +- } +- len--; +- i--; +- continue; +- } +- if (buf[i] == '\n') { +- PHPDBG_G(input_buflen) = len + bytes - 1 - i; +- if (PHPDBG_G(input_buflen)) { +- memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); +- } +- if (i != PHPDBG_MAX_CMD - 1) { +- buf[i + 1] = 0; +- } +- return i; +- } +- } + +- len += bytes; +- } while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1)) > 0); + +- if (bytes <= 0) { +- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; +- zend_bailout(); +- } ++ return input.length; ++}); + +- return bytes; ++ ++/* is easy to generalize ... but not needed for now */ ++PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { ++ return phpdbg_internal_consume_stdin_line(buf, PHPDBG_MAX_CMD); + } + + PHPDBG_API int phpdbg_mixed_read(int fd, char *ptr, int len, int tmo) { +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg_prompt.c +index 2464e39..533e118 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg_prompt.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg_prompt.c +@@ -1655,6 +1655,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ + PHPDBG_G(in_execution) = 1; + + while (1) { ++ phpdbg_wasm_current_file = zend_get_executed_filename(); ++ phpdbg_wasm_current_line = zend_get_executed_lineno(); + zend_object *exception = EG(exception); + + if ((PHPDBG_G(flags) & PHPDBG_BP_RESOLVE_MASK)) { +diff --git a/third_party/php8.2-src/sapi/phpdbg/phpdbg_utils.c b/third_party/php8.2-src/sapi/phpdbg/phpdbg_utils.c +index f638d60..4c50f0f 100644 +--- a/third_party/php8.2-src/sapi/phpdbg/phpdbg_utils.c ++++ b/third_party/php8.2-src/sapi/phpdbg/phpdbg_utils.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "zend.h" + + #include "php.h" +@@ -293,7 +295,7 @@ PHPDBG_API void phpdbg_set_prompt(const char *prompt) /* {{{ */ + PHPDBG_G(prompt)[0] = strdup(prompt); + } /* }}} */ + +-PHPDBG_API const char *phpdbg_get_prompt(void) /* {{{ */ ++PHPDBG_API const char EMSCRIPTEN_KEEPALIVE *phpdbg_get_prompt(void) /* {{{ */ + { + /* find cached prompt */ + if (PHPDBG_G(prompt)[1]) { diff --git a/patch/php8.3.patch b/patch/php8.3.patch index 171d7fd46..1a1d013f3 100644 --- a/patch/php8.3.patch +++ b/patch/php8.3.patch @@ -1,8 +1,8 @@ diff --git a/third_party/php8.3-src/ext/libxml/libxml.c b/third_party/php8.3-src/ext/libxml/libxml.c -index 0c252e5..0163b8d 100644 +index 0c252e5..d6262de 100644 --- a/third_party/php8.3-src/ext/libxml/libxml.c +++ b/third_party/php8.3-src/ext/libxml/libxml.c -@@ -50,6 +50,17 @@ +@@ -50,6 +50,23 @@ #include "libxml_arginfo.h" @@ -15,22 +15,36 @@ index 0c252e5..0163b8d 100644 +__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); +__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); +__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) +#endif + /* a true global for initialization */ static int _php_libxml_initialized = 0; static int _php_libxml_per_request_initialization = 1; -@@ -937,6 +948,29 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) +@@ -937,6 +954,37 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) static PHP_MINIT_FUNCTION(libxml) { ++#ifdef LIBXML_DYNAMIC_LOAD + if (xmlParserVersion == NULL) { + void *handle = DL_LOAD("libxml2.so"); -+ const char** xmlParserVersionPtr = (const char**)dlsym(handle, "xmlParserVersion"); -+ if (xmlParserVersionPtr) { -+ xmlParserVersion = *xmlParserVersionPtr; ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); + } + } ++#endif + + if (xmlParserVersion == NULL) { + zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); @@ -50,7 +64,7 @@ index 0c252e5..0163b8d 100644 php_libxml_initialize(); register_libxml_symbols(module_number); -@@ -972,6 +1006,8 @@ static PHP_MINIT_FUNCTION(libxml) +@@ -972,6 +1020,8 @@ static PHP_MINIT_FUNCTION(libxml) static PHP_RINIT_FUNCTION(libxml) { @@ -59,7 +73,7 @@ index 0c252e5..0163b8d 100644 if (_php_libxml_per_request_initialization) { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); -@@ -990,6 +1026,8 @@ static PHP_RINIT_FUNCTION(libxml) +@@ -990,6 +1040,8 @@ static PHP_RINIT_FUNCTION(libxml) static PHP_RSHUTDOWN_FUNCTION(libxml) { @@ -68,7 +82,7 @@ index 0c252e5..0163b8d 100644 if (ZEND_FCC_INITIALIZED(LIBXML(entity_loader_callback))) { zend_fcc_dtor(&LIBXML(entity_loader_callback)); } -@@ -999,6 +1037,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) +@@ -999,6 +1051,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) static PHP_MSHUTDOWN_FUNCTION(libxml) { @@ -77,7 +91,7 @@ index 0c252e5..0163b8d 100644 if (!_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -1012,6 +1052,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) +@@ -1012,6 +1066,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) static zend_result php_libxml_post_deactivate(void) { @@ -86,7 +100,7 @@ index 0c252e5..0163b8d 100644 /* reset libxml generic error handling */ if (_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -1037,6 +1079,13 @@ static zend_result php_libxml_post_deactivate(void) +@@ -1037,6 +1093,13 @@ static zend_result php_libxml_post_deactivate(void) static PHP_MINFO_FUNCTION(libxml) { @@ -100,7 +114,7 @@ index 0c252e5..0163b8d 100644 php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); -@@ -1049,6 +1098,8 @@ static PHP_MINFO_FUNCTION(libxml) +@@ -1049,6 +1112,8 @@ static PHP_MINFO_FUNCTION(libxml) /* {{{ Set the streams context for the next libxml document load or write */ PHP_FUNCTION(libxml_set_streams_context) { @@ -109,7 +123,7 @@ index 0c252e5..0163b8d 100644 zval *arg; ZEND_PARSE_PARAMETERS_START(1, 1) -@@ -1066,6 +1117,8 @@ PHP_FUNCTION(libxml_set_streams_context) +@@ -1066,6 +1131,8 @@ PHP_FUNCTION(libxml_set_streams_context) /* {{{ Disable libxml errors and allow user to fetch error information as needed */ PHP_FUNCTION(libxml_use_internal_errors) { @@ -118,7 +132,7 @@ index 0c252e5..0163b8d 100644 xmlStructuredErrorFunc current_handler; bool use_errors, use_errors_is_null = 1, retval; -@@ -1106,6 +1159,8 @@ PHP_FUNCTION(libxml_use_internal_errors) +@@ -1106,6 +1173,8 @@ PHP_FUNCTION(libxml_use_internal_errors) /* {{{ Retrieve last error from libxml */ PHP_FUNCTION(libxml_get_last_error) { @@ -127,7 +141,7 @@ index 0c252e5..0163b8d 100644 ZEND_PARSE_PARAMETERS_NONE(); const xmlError *error = xmlGetLastError(); -@@ -1135,6 +1190,7 @@ PHP_FUNCTION(libxml_get_last_error) +@@ -1135,6 +1204,7 @@ PHP_FUNCTION(libxml_get_last_error) /* {{{ Retrieve array of errors */ PHP_FUNCTION(libxml_get_errors) { @@ -135,7 +149,7 @@ index 0c252e5..0163b8d 100644 xmlErrorPtr error; -@@ -1176,6 +1232,8 @@ PHP_FUNCTION(libxml_get_errors) +@@ -1176,6 +1246,8 @@ PHP_FUNCTION(libxml_get_errors) /* {{{ Clear last error from libxml */ PHP_FUNCTION(libxml_clear_errors) { @@ -144,7 +158,7 @@ index 0c252e5..0163b8d 100644 ZEND_PARSE_PARAMETERS_NONE(); xmlResetLastError(); -@@ -1196,6 +1254,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ +@@ -1196,6 +1268,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ /* {{{ Disable/Enable ability to load external entities */ PHP_FUNCTION(libxml_disable_entity_loader) { @@ -153,7 +167,7 @@ index 0c252e5..0163b8d 100644 bool disable = 1; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1210,6 +1270,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) +@@ -1210,6 +1284,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) /* {{{ Changes the default external entity loader */ PHP_FUNCTION(libxml_set_external_entity_loader) { @@ -162,7 +176,7 @@ index 0c252e5..0163b8d 100644 zend_fcall_info fci; zend_fcall_info_cache fcc; -@@ -1237,6 +1299,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) +@@ -1237,6 +1313,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) /* {{{ Get the current external entity loader, or null if the default loader is installer. */ PHP_FUNCTION(libxml_get_external_entity_loader) { @@ -454,7 +468,7 @@ index 2e2faf8..9cbb048 100644 %.c: %.y %.c: %.l diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg.c b/third_party/php8.3-src/sapi/phpdbg/phpdbg.c -index a583854..49f0301 100644 +index a583854..435a42c 100644 --- a/third_party/php8.3-src/sapi/phpdbg/phpdbg.c +++ b/third_party/php8.3-src/sapi/phpdbg/phpdbg.c @@ -16,6 +16,8 @@ @@ -466,7 +480,7 @@ index a583854..49f0301 100644 #include "phpdbg.h" #include "phpdbg_prompt.h" #include "phpdbg_bp.h" -@@ -148,6 +150,24 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ +@@ -148,6 +150,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ #endif } /* }}} */ @@ -487,11 +501,21 @@ index a583854..49f0301 100644 +{ + return &PHPDBG_G(bp_count); +} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); -@@ -177,6 +197,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ +@@ -177,6 +207,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ { @@ -501,7 +525,7 @@ index a583854..49f0301 100644 zend_hash_destroy(&PHPDBG_G(registered)); phpdbg_destroy_watchpoints(); -@@ -1118,7 +1141,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * +@@ -1118,7 +1151,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); } /* }}} */ @@ -511,7 +535,7 @@ index a583854..49f0301 100644 sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *sapi_name; diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg.h b/third_party/php8.3-src/sapi/phpdbg/phpdbg.h -index 8857816..6b18f62 100644 +index 8857816..29782f7 100644 --- a/third_party/php8.3-src/sapi/phpdbg/phpdbg.h +++ b/third_party/php8.3-src/sapi/phpdbg/phpdbg.h @@ -182,7 +182,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); @@ -523,13 +547,12 @@ index 8857816..6b18f62 100644 #endif /* }}} */ /* {{{ output descriptors */ -@@ -311,4 +311,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) +@@ -311,4 +311,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_ulong lines; /* max number of lines to display */ ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ +extern const char* phpdbg_wasm_current_file; +extern uint32_t phpdbg_wasm_current_line; -+ + #endif /* PHPDBG_H */ diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.3-src/sapi/phpdbg/phpdbg_cmd.c @@ -545,8 +568,21 @@ index 6249e79..e3e7c34 100644 phpdbg_consume_stdin_line(buf); buffer = estrdup(buf); #endif +diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.3-src/sapi/phpdbg/phpdbg_info.c +index b6c48d5..b1dae7a 100644 +--- a/third_party/php8.3-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.3-src/sapi/phpdbg/phpdbg_info.c +@@ -159,7 +159,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.3-src/sapi/phpdbg/phpdbg_io.c -index 14ae71a..8163757 100644 +index 14ae71a..cd11272 100644 --- a/third_party/php8.3-src/sapi/phpdbg/phpdbg_io.c +++ b/third_party/php8.3-src/sapi/phpdbg/phpdbg_io.c @@ -14,6 +14,8 @@ @@ -637,6 +673,18 @@ index 14ae71a..8163757 100644 } PHPDBG_API int phpdbg_mixed_read(int fd, char *ptr, int len, int tmo) { +@@ -111,11 +101,5 @@ static int phpdbg_output_pager(int fd, const char *ptr, int len) { + } + + PHPDBG_API int phpdbg_mixed_write(int fd, const char *ptr, int len) { +- if ((PHPDBG_G(flags) & PHPDBG_HAS_PAGINATION) +- && PHPDBG_G(io)[PHPDBG_STDOUT].fd == fd +- && PHPDBG_G(lines) > 0) { +- return phpdbg_output_pager(fd, ptr, len); +- } +- + return write(fd, ptr, len); + } diff --git a/third_party/php8.3-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.3-src/sapi/phpdbg/phpdbg_prompt.c index c054326..0c81d93 100644 --- a/third_party/php8.3-src/sapi/phpdbg/phpdbg_prompt.c diff --git a/patch/php8.4.patch b/patch/php8.4.patch index 888a5ad22..5f311ec48 100644 --- a/patch/php8.4.patch +++ b/patch/php8.4.patch @@ -1,8 +1,8 @@ diff --git a/third_party/php8.4-src/ext/libxml/libxml.c b/third_party/php8.4-src/ext/libxml/libxml.c -index f07b321..4a1a2da 100644 +index f07b321..9218794 100644 --- a/third_party/php8.4-src/ext/libxml/libxml.c +++ b/third_party/php8.4-src/ext/libxml/libxml.c -@@ -48,6 +48,17 @@ +@@ -48,6 +48,23 @@ #include "libxml_arginfo.h" @@ -15,22 +15,36 @@ index f07b321..4a1a2da 100644 +__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); +__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); +__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) +#endif + /* a true global for initialization */ static int _php_libxml_initialized = 0; static int _php_libxml_per_request_initialization = 1; -@@ -938,6 +949,29 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) +@@ -938,6 +955,37 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext) static PHP_MINIT_FUNCTION(libxml) { ++#ifdef LIBXML_DYNAMIC_LOAD + if (xmlParserVersion == NULL) { + void *handle = DL_LOAD("libxml2.so"); -+ const char** xmlParserVersionPtr = (const char**)dlsym(handle, "xmlParserVersion"); -+ if (xmlParserVersionPtr) { -+ xmlParserVersion = *xmlParserVersionPtr; ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); + } + } ++#endif + + if (xmlParserVersion == NULL) { + zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); @@ -50,7 +64,7 @@ index f07b321..4a1a2da 100644 php_libxml_initialize(); register_libxml_symbols(module_number); -@@ -973,6 +1007,8 @@ static PHP_MINIT_FUNCTION(libxml) +@@ -973,6 +1021,8 @@ static PHP_MINIT_FUNCTION(libxml) static PHP_RINIT_FUNCTION(libxml) { @@ -59,7 +73,7 @@ index f07b321..4a1a2da 100644 if (_php_libxml_per_request_initialization) { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); -@@ -1000,6 +1036,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) +@@ -1000,6 +1050,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) static PHP_MSHUTDOWN_FUNCTION(libxml) { @@ -68,7 +82,7 @@ index f07b321..4a1a2da 100644 if (!_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -1013,6 +1051,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) +@@ -1013,6 +1065,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) static zend_result php_libxml_post_deactivate(void) { @@ -77,16 +91,21 @@ index f07b321..4a1a2da 100644 /* reset libxml generic error handling */ if (_php_libxml_per_request_initialization) { xmlSetGenericErrorFunc(NULL, NULL); -@@ -1038,6 +1078,8 @@ static zend_result php_libxml_post_deactivate(void) +@@ -1038,6 +1092,13 @@ static zend_result php_libxml_post_deactivate(void) static PHP_MINFO_FUNCTION(libxml) { -+ if (xmlParserVersion == NULL) return; ++ if (xmlParserVersion == NULL) { ++ php_info_print_table_start(); ++ php_info_print_table_row(2, "libXML support", "NOT ACTIVE"); ++ php_info_print_table_end(); ++ return; ++ } + php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); -@@ -1050,6 +1092,8 @@ static PHP_MINFO_FUNCTION(libxml) +@@ -1050,6 +1111,8 @@ static PHP_MINFO_FUNCTION(libxml) /* {{{ Set the streams context for the next libxml document load or write */ PHP_FUNCTION(libxml_set_streams_context) { @@ -95,7 +114,7 @@ index f07b321..4a1a2da 100644 zval *arg; ZEND_PARSE_PARAMETERS_START(1, 1) -@@ -1073,6 +1117,8 @@ PHP_LIBXML_API bool php_libxml_uses_internal_errors(void) +@@ -1073,6 +1136,8 @@ PHP_LIBXML_API bool php_libxml_uses_internal_errors(void) /* {{{ Disable libxml errors and allow user to fetch error information as needed */ PHP_FUNCTION(libxml_use_internal_errors) { @@ -104,7 +123,7 @@ index f07b321..4a1a2da 100644 bool use_errors, use_errors_is_null = true; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1126,6 +1172,8 @@ static void php_libxml_create_error_object(zval *return_value, const xmlError *e +@@ -1126,6 +1191,8 @@ static void php_libxml_create_error_object(zval *return_value, const xmlError *e /* {{{ Retrieve last error from libxml */ PHP_FUNCTION(libxml_get_last_error) { @@ -113,7 +132,7 @@ index f07b321..4a1a2da 100644 ZEND_PARSE_PARAMETERS_NONE(); const xmlError *error; -@@ -1147,6 +1195,8 @@ PHP_FUNCTION(libxml_get_last_error) +@@ -1147,6 +1214,8 @@ PHP_FUNCTION(libxml_get_last_error) /* {{{ Retrieve array of errors */ PHP_FUNCTION(libxml_get_errors) { @@ -122,7 +141,7 @@ index f07b321..4a1a2da 100644 xmlErrorPtr error; ZEND_PARSE_PARAMETERS_NONE(); -@@ -1170,6 +1220,8 @@ PHP_FUNCTION(libxml_get_errors) +@@ -1170,6 +1239,8 @@ PHP_FUNCTION(libxml_get_errors) /* {{{ Clear last error from libxml */ PHP_FUNCTION(libxml_clear_errors) { @@ -131,7 +150,7 @@ index f07b321..4a1a2da 100644 ZEND_PARSE_PARAMETERS_NONE(); xmlResetLastError(); -@@ -1190,6 +1242,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ +@@ -1190,6 +1261,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ /* {{{ Disable/Enable ability to load external entities */ PHP_FUNCTION(libxml_disable_entity_loader) { @@ -140,7 +159,7 @@ index f07b321..4a1a2da 100644 bool disable = 1; ZEND_PARSE_PARAMETERS_START(0, 1) -@@ -1204,6 +1258,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) +@@ -1204,6 +1277,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) /* {{{ Changes the default external entity loader */ PHP_FUNCTION(libxml_set_external_entity_loader) { @@ -149,7 +168,7 @@ index f07b321..4a1a2da 100644 zend_fcall_info fci; zend_fcall_info_cache fcc; -@@ -1225,6 +1281,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) +@@ -1225,6 +1300,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) /* {{{ Get the current external entity loader, or null if the default loader is installer. */ PHP_FUNCTION(libxml_get_external_entity_loader) { @@ -396,7 +415,7 @@ index c18480d..787687f 100644 return SUCCESS; diff --git a/third_party/php8.4-src/sapi/phpdbg/Makefile.frag b/third_party/php8.4-src/sapi/phpdbg/Makefile.frag -index a069a236..e37658af 100644 +index a069a23..e37658a 100644 --- a/third_party/php8.4-src/sapi/phpdbg/Makefile.frag +++ b/third_party/php8.4-src/sapi/phpdbg/Makefile.frag @@ -6,7 +6,7 @@ $(BUILD_SHARED): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) @@ -408,3 +427,244 @@ index a069a236..e37658af 100644 %.c: %.y %.c: %.l +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg.c +index 76b3c7f..6cf12a9 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "phpdbg.h" + #include "phpdbg_prompt.h" + #include "phpdbg_bp.h" +@@ -149,6 +151,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ + #endif + } /* }}} */ + ++const char* phpdbg_wasm_current_file = NULL; ++uint32_t phpdbg_wasm_current_line = NULL; ++ ++const char** EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_file(void) ++{ ++ return &phpdbg_wasm_current_file; ++} ++ ++uint32_t* EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_line(void) ++{ ++ return &phpdbg_wasm_current_line; ++} ++ ++int* EMSCRIPTEN_KEEPALIVE php_wasm_get_bpcount(void) ++{ ++ return &PHPDBG_G(bp_count); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} ++ + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + { + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); +@@ -178,6 +208,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + + static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ + { ++ phpdbg_wasm_current_file = NULL; ++ phpdbg_wasm_current_line = NULL; ++ + zend_hash_destroy(&PHPDBG_G(registered)); + phpdbg_destroy_watchpoints(); + +@@ -1119,7 +1152,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * + return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); + } /* }}} */ + +-int main(int argc, char **argv) /* {{{ */ ++int EMSCRIPTEN_KEEPALIVE main(int argc, char **argv) /* {{{ */ + { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *sapi_name; +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg.h b/third_party/php8.4-src/sapi/phpdbg/phpdbg.h +index 41fe8fa..b4fea58 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg.h ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg.h +@@ -182,7 +182,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); + #ifndef _WIN32 + # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) + #else +-# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) ++# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED) + #endif /* }}} */ + + /* {{{ output descriptors */ +@@ -311,4 +311,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + zend_ulong lines; /* max number of lines to display */ + ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ + ++extern const char* phpdbg_wasm_current_file; ++extern uint32_t phpdbg_wasm_current_line; ++ + #endif /* PHPDBG_H */ +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg_cmd.c +index 9877d60..fb181d2 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg_cmd.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg_cmd.c +@@ -774,7 +774,7 @@ PHPDBG_API char *phpdbg_read_input(const char *buffered) /* {{{ */ + } + #else + char buf[PHPDBG_MAX_CMD]; +- phpdbg_write("%s", phpdbg_get_prompt()); ++ // phpdbg_write("%s", phpdbg_get_prompt()); + phpdbg_consume_stdin_line(buf); + buffer = estrdup(buf); + #endif +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg_info.c +index d647037..9c6c016 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg_info.c +@@ -159,7 +159,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg_io.c +index 261a67c..d614628 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg_io.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg_io.c +@@ -14,6 +14,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #ifdef HAVE_CONFIG_H + #include + #endif +@@ -22,52 +24,40 @@ + + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +-/* is easy to generalize ... but not needed for now */ +-PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { +- int bytes = PHPDBG_G(input_buflen), len = 0; ++EM_ASYNC_JS(int, phpdbg_internal_consume_stdin_line, (char *buf, int max_length), { ++ ++ let input; ++ ++ Module.triggerStdin(); + +- if (PHPDBG_G(input_buflen)) { +- memcpy(buf, PHPDBG_G(input_buffer), bytes); ++ if(Module.inputDataQueue.length) ++ { ++ input = String(Module.inputDataQueue.shift()); ++ } ++ else ++ { ++ let a, r; ++ const promise = new Promise((accept, reject) => [a, r] = [ accept, reject ]); ++ Module.awaitingInput = a; ++ input = String(await promise); + } + +- PHPDBG_G(last_was_newline) = 1; ++ if(input.length >= max_length) ++ { ++ input = input.slice(0, max_length - 1); ++ } + +- do { +- int i; +- if (bytes <= 0) { +- continue; +- } ++ stringToUTF8(input, buf, input.length + 1); + +- for (i = len; i < len + bytes; i++) { +- if (buf[i] == '\x03') { +- if (i != len + bytes - 1) { +- memmove(buf + i, buf + i + 1, len + bytes - i - 1); +- } +- len--; +- i--; +- continue; +- } +- if (buf[i] == '\n') { +- PHPDBG_G(input_buflen) = len + bytes - 1 - i; +- if (PHPDBG_G(input_buflen)) { +- memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); +- } +- if (i != PHPDBG_MAX_CMD - 1) { +- buf[i + 1] = 0; +- } +- return i; +- } +- } + +- len += bytes; +- } while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1)) > 0); + +- if (bytes <= 0) { +- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; +- zend_bailout(); +- } ++ return input.length; ++}); + +- return bytes; ++ ++/* is easy to generalize ... but not needed for now */ ++PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { ++ return phpdbg_internal_consume_stdin_line(buf, PHPDBG_MAX_CMD); + } + + PHPDBG_API int phpdbg_mixed_read(int fd, char *ptr, int len, int tmo) { +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg_prompt.c +index 6333fdc..d709eb3 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg_prompt.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg_prompt.c +@@ -1662,6 +1662,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ + #endif /* ZEND_CHECK_STACK_LIMIT */ + + while (1) { ++ phpdbg_wasm_current_file = zend_get_executed_filename(); ++ phpdbg_wasm_current_line = zend_get_executed_lineno(); + zend_object *exception = EG(exception); + + if ((PHPDBG_G(flags) & PHPDBG_BP_RESOLVE_MASK)) { +diff --git a/third_party/php8.4-src/sapi/phpdbg/phpdbg_utils.c b/third_party/php8.4-src/sapi/phpdbg/phpdbg_utils.c +index 329ee9a..2b6d83e 100644 +--- a/third_party/php8.4-src/sapi/phpdbg/phpdbg_utils.c ++++ b/third_party/php8.4-src/sapi/phpdbg/phpdbg_utils.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "zend.h" + + #include "php.h" +@@ -293,7 +295,7 @@ PHPDBG_API void phpdbg_set_prompt(const char *prompt) /* {{{ */ + PHPDBG_G(prompt)[0] = strdup(prompt); + } /* }}} */ + +-PHPDBG_API const char *phpdbg_get_prompt(void) /* {{{ */ ++PHPDBG_API const char EMSCRIPTEN_KEEPALIVE *phpdbg_get_prompt(void) /* {{{ */ + { + /* find cached prompt */ + if (PHPDBG_G(prompt)[1]) { diff --git a/patch/php8.5.patch b/patch/php8.5.patch new file mode 100644 index 000000000..8f3366f0f --- /dev/null +++ b/patch/php8.5.patch @@ -0,0 +1,756 @@ +diff --git a/third_party/php8.5-src/Zend/zend_API.c b/third_party/php8.5-src/Zend/zend_API.c +index b5c8b7a..58aae9f 100644 +--- a/third_party/php8.5-src/Zend/zend_API.c ++++ b/third_party/php8.5-src/Zend/zend_API.c +@@ -3707,6 +3707,70 @@ ZEND_API void zend_disable_functions(const char *function_list) /* {{{ */ + } + /* }}} */ + ++static ZEND_COLD zend_object *display_disabled_class(zend_class_entry *class_type) /* {{{ */ ++{ ++ zend_object *intern; ++ ++ intern = zend_objects_new(class_type); ++ ++ /* Initialize default properties */ ++ if (EXPECTED(class_type->default_properties_count != 0)) { ++ zval *p = intern->properties_table; ++ zval *end = p + class_type->default_properties_count; ++ do { ++ ZVAL_UNDEF(p); ++ p++; ++ } while (p != end); ++ } ++ ++ zend_error(E_WARNING, "%s() has been disabled for security reasons", ZSTR_VAL(class_type->name)); ++ return intern; ++} ++ ++static const zend_function_entry disabled_class_new[] = { ++ ZEND_FE_END ++}; ++ ++ZEND_API zend_result zend_disable_class(const char *class_name, size_t class_name_length) /* {{{ */ ++{ ++ zend_class_entry *disabled_class; ++ zend_string *key; ++ zend_function *fn; ++ zend_property_info *prop; ++ ++ key = zend_string_alloc(class_name_length, 0); ++ zend_str_tolower_copy(ZSTR_VAL(key), class_name, class_name_length); ++ disabled_class = zend_hash_find_ptr(CG(class_table), key); ++ zend_string_release_ex(key, 0); ++ if (!disabled_class) { ++ return FAILURE; ++ } ++ ++ /* Will be reset by INIT_CLASS_ENTRY. */ ++ free(disabled_class->interfaces); ++ ++ INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new); ++ disabled_class->create_object = display_disabled_class; ++ ++ ZEND_HASH_MAP_FOREACH_PTR(&disabled_class->function_table, fn) { ++ if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && ++ fn->common.scope == disabled_class) { ++ zend_free_internal_arg_info(&fn->internal_function); ++ } ++ } ZEND_HASH_FOREACH_END(); ++ zend_hash_clean(&disabled_class->function_table); ++ ZEND_HASH_MAP_FOREACH_PTR(&disabled_class->properties_info, prop) { ++ if (prop->ce == disabled_class) { ++ zend_string_release(prop->name); ++ zend_type_release(prop->type, /* persistent */ 1); ++ free(prop); ++ } ++ } ZEND_HASH_FOREACH_END(); ++ zend_hash_clean(&disabled_class->properties_info); ++ return SUCCESS; ++} ++/* }}} */ ++ + static zend_always_inline zend_class_entry *get_scope(zend_execute_data *frame) + { + return frame && frame->func ? frame->func->common.scope : NULL; +diff --git a/third_party/php8.5-src/Zend/zend_API.h b/third_party/php8.5-src/Zend/zend_API.h +index 8cde831..f06c07a 100644 +--- a/third_party/php8.5-src/Zend/zend_API.h ++++ b/third_party/php8.5-src/Zend/zend_API.h +@@ -405,6 +405,7 @@ static zend_always_inline zend_result zend_register_class_alias(const char *name + zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce, 1) + + ZEND_API void zend_disable_functions(const char *function_list); ++ZEND_API zend_result zend_disable_class(const char *class_name, size_t class_name_length); + + ZEND_API ZEND_COLD void zend_wrong_param_count(void); + ZEND_API ZEND_COLD void zend_wrong_property_read(zval *object, zval *property); +diff --git a/third_party/php8.5-src/ext/libxml/libxml.c b/third_party/php8.5-src/ext/libxml/libxml.c +index 0105106..34ebefa 100644 +--- a/third_party/php8.5-src/ext/libxml/libxml.c ++++ b/third_party/php8.5-src/ext/libxml/libxml.c +@@ -50,6 +50,25 @@ + + #include "libxml_arginfo.h" + ++#ifdef LIBXML_DYNAMIC_LOAD ++__attribute__((weak)) const char *xmlParserVersion = {0}; ++__attribute__((weak)) int xmlLoadExtDtdDefaultValue = 0; ++__attribute__((weak)) int xmlDoValidityCheckingDefaultValue = 0; ++__attribute__((weak)) void (*xmlFree)(void *); ++__attribute__((weak)) void *(*xmlMalloc)(size_t); ++__attribute__((weak)) void *(*xmlMallocAtomic)(size_t); ++__attribute__((weak)) char *(*xmlMemStrdup)(const char *); ++__attribute__((weak)) void *(*xmlRealloc)(void *, size_t); ++__attribute__((weak)) void (*xmlGenericError)(void *, const char *, ...); ++__attribute__((weak)) void (*xmlStructuredError)(void *, xmlErrorPtr); ++#define PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, symbol) do { \ ++ __typeof__(symbol) *symbol##_ptr = (__typeof__(symbol) *) dlsym((handle), #symbol); \ ++ if (symbol##_ptr) { \ ++ symbol = *symbol##_ptr; \ ++ } \ ++} while (0) ++#endif ++ + /* a true global for initialization */ + static bool php_libxml_initialized = false; + static bool php_libxml_per_request_initialization = true; +@@ -983,6 +1002,39 @@ PHP_LIBXML_API void php_libxml_switch_context(const zval *context, zval *oldcont + + static PHP_MINIT_FUNCTION(libxml) + { ++#ifdef LIBXML_DYNAMIC_LOAD ++ if (xmlParserVersion == NULL) { ++ void *handle = DL_LOAD("libxml2.so"); ++ if (handle) { ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlParserVersion); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlLoadExtDtdDefaultValue); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlDoValidityCheckingDefaultValue); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlFree); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMalloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMallocAtomic); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlMemStrdup); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlRealloc); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlGenericError); ++ PHP_LIBXML_RESOLVE_WEAK_SYMBOL(handle, xmlStructuredError); ++ } ++ } ++#endif ++ ++ if (xmlParserVersion == NULL) { ++ zend_disable_class("LibXMLError", sizeof("LibXMLError") - 1); ++ zend_disable_functions( ++ "libxml_set_streams_context," ++ "libxml_use_internal_errors," ++ "libxml_get_last_error," ++ "libxml_get_errors," ++ "libxml_clear_errors," ++ "libxml_disable_entity_loader," ++ "libxml_set_external_entity_loader," ++ "libxml_get_external_entity_loader," ++ ); ++ return SUCCESS; ++ } ++ + php_libxml_initialize(); + + register_libxml_symbols(module_number); +@@ -1020,6 +1072,8 @@ static PHP_MINIT_FUNCTION(libxml) + + static PHP_RINIT_FUNCTION(libxml) + { ++ if (xmlParserVersion == NULL) return SUCCESS; ++ + if (php_libxml_per_request_initialization) { + /* report errors via handler rather than stderr */ + xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); +@@ -1047,6 +1101,8 @@ static PHP_RSHUTDOWN_FUNCTION(libxml) + + static PHP_MSHUTDOWN_FUNCTION(libxml) + { ++ if (xmlParserVersion == NULL) return SUCCESS; ++ + if (!php_libxml_per_request_initialization) { + xmlSetGenericErrorFunc(NULL, NULL); + +@@ -1060,6 +1116,8 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) + + static zend_result php_libxml_post_deactivate(void) + { ++ if (xmlParserVersion == NULL) return SUCCESS; ++ + /* reset libxml generic error handling */ + if (php_libxml_per_request_initialization) { + xmlSetGenericErrorFunc(NULL, NULL); +@@ -1085,6 +1143,13 @@ static zend_result php_libxml_post_deactivate(void) + + static PHP_MINFO_FUNCTION(libxml) + { ++ if (xmlParserVersion == NULL) { ++ php_info_print_table_start(); ++ php_info_print_table_row(2, "libXML support", "NOT ACTIVE"); ++ php_info_print_table_end(); ++ return; ++ } ++ + php_info_print_table_start(); + php_info_print_table_row(2, "libXML support", "active"); + php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); +@@ -1097,6 +1162,8 @@ static PHP_MINFO_FUNCTION(libxml) + /* {{{ Set the streams context for the next libxml document load or write */ + PHP_FUNCTION(libxml_set_streams_context) + { ++ if (xmlParserVersion == NULL) return; ++ + zval *arg; + + ZEND_PARSE_PARAMETERS_START(1, 1) +@@ -1120,6 +1187,8 @@ PHP_LIBXML_API bool php_libxml_uses_internal_errors(void) + /* {{{ Disable libxml errors and allow user to fetch error information as needed */ + PHP_FUNCTION(libxml_use_internal_errors) + { ++ if (xmlParserVersion == NULL) return; ++ + bool use_errors, use_errors_is_null = true; + + ZEND_PARSE_PARAMETERS_START(0, 1) +@@ -1173,6 +1242,8 @@ static void php_libxml_create_error_object(zval *return_value, const xmlError *e + /* {{{ Retrieve last error from libxml */ + PHP_FUNCTION(libxml_get_last_error) + { ++ if (xmlParserVersion == NULL) return; ++ + ZEND_PARSE_PARAMETERS_NONE(); + + const xmlError *error; +@@ -1194,6 +1265,8 @@ PHP_FUNCTION(libxml_get_last_error) + /* {{{ Retrieve array of errors */ + PHP_FUNCTION(libxml_get_errors) + { ++ if (xmlParserVersion == NULL) return; ++ + ZEND_PARSE_PARAMETERS_NONE(); + + if (LIBXML(error_list)) { +@@ -1215,6 +1288,8 @@ PHP_FUNCTION(libxml_get_errors) + /* {{{ Clear last error from libxml */ + PHP_FUNCTION(libxml_clear_errors) + { ++ if (xmlParserVersion == NULL) return; ++ + ZEND_PARSE_PARAMETERS_NONE(); + + xmlResetLastError(); +@@ -1235,6 +1310,8 @@ PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */ + /* {{{ Disable/Enable ability to load external entities */ + PHP_FUNCTION(libxml_disable_entity_loader) + { ++ if (xmlParserVersion == NULL) return; ++ + bool disable = true; + + ZEND_PARSE_PARAMETERS_START(0, 1) +@@ -1249,6 +1326,8 @@ PHP_FUNCTION(libxml_disable_entity_loader) + /* {{{ Changes the default external entity loader */ + PHP_FUNCTION(libxml_set_external_entity_loader) + { ++ if (xmlParserVersion == NULL) return; ++ + zend_fcall_info fci; + zend_fcall_info_cache fcc; + +@@ -1270,6 +1349,8 @@ PHP_FUNCTION(libxml_set_external_entity_loader) + /* {{{ Get the current external entity loader, or null if the default loader is installer. */ + PHP_FUNCTION(libxml_get_external_entity_loader) + { ++ if (xmlParserVersion == NULL) return; ++ + ZEND_PARSE_PARAMETERS_NONE(); + + if (ZEND_FCC_INITIALIZED(LIBXML(entity_loader_callback))) { +diff --git a/third_party/php8.5-src/ext/openssl/openssl.c b/third_party/php8.5-src/ext/openssl/openssl.c +index cb134e9..b1ef0af 100644 +--- a/third_party/php8.5-src/ext/openssl/openssl.c ++++ b/third_party/php8.5-src/ext/openssl/openssl.c +@@ -437,8 +437,8 @@ PHP_MINIT_FUNCTION(openssl) + /* override the default tcp socket provider */ + php_stream_xport_register("tcp", php_openssl_ssl_socket_factory); + +- php_register_url_stream_wrapper("https", &php_stream_http_wrapper); +- php_register_url_stream_wrapper("ftps", &php_stream_ftp_wrapper); ++ // php_register_url_stream_wrapper("https", &php_stream_http_wrapper); ++ // php_register_url_stream_wrapper("ftps", &php_stream_ftp_wrapper); + + REGISTER_INI_ENTRIES(); + +@@ -2304,7 +2304,7 @@ PHP_FUNCTION(openssl_pkey_get_details) + array_init(return_value); + add_assoc_long(return_value, "bits", EVP_PKEY_bits(pkey)); + add_assoc_stringl(return_value, "key", pbio, pbio_len); +- ++ + zend_long ktype = php_openssl_pkey_get_details(return_value, pkey); + + add_assoc_long(return_value, "type", ktype); +diff --git a/third_party/php8.5-src/ext/pdo_sqlite/pdo_sqlite.c b/third_party/php8.5-src/ext/pdo_sqlite/pdo_sqlite.c +index 667948f..96ee360 100644 +--- a/third_party/php8.5-src/ext/pdo_sqlite/pdo_sqlite.c ++++ b/third_party/php8.5-src/ext/pdo_sqlite/pdo_sqlite.c +@@ -22,8 +22,8 @@ + #include "php_ini.h" + #include "ext/standard/info.h" + #include "SAPI.h" +-#include "ext/pdo/php_pdo.h" +-#include "ext/pdo/php_pdo_driver.h" ++#include "../ext/pdo/php_pdo.h" ++#include "../ext/pdo/php_pdo_driver.h" + #include "php_pdo_sqlite.h" + #include "php_pdo_sqlite_int.h" + #include "zend_exceptions.h" +diff --git a/third_party/php8.5-src/ext/pdo_sqlite/sqlite_driver.c b/third_party/php8.5-src/ext/pdo_sqlite/sqlite_driver.c +index 537aefa..a55cbd5 100644 +--- a/third_party/php8.5-src/ext/pdo_sqlite/sqlite_driver.c ++++ b/third_party/php8.5-src/ext/pdo_sqlite/sqlite_driver.c +@@ -21,8 +21,8 @@ + #include "php.h" + #include "php_ini.h" + #include "ext/standard/info.h" +-#include "ext/pdo/php_pdo.h" +-#include "ext/pdo/php_pdo_driver.h" ++#include "../ext/pdo/php_pdo.h" ++#include "../ext/pdo/php_pdo_driver.h" + #include "php_pdo_sqlite.h" + #include "php_pdo_sqlite_int.h" + #include "zend_exceptions.h" +diff --git a/third_party/php8.5-src/ext/standard/basic_functions.c b/third_party/php8.5-src/ext/standard/basic_functions.c +index 8b72fff..6f8a63c 100644 +--- a/third_party/php8.5-src/ext/standard/basic_functions.c ++++ b/third_party/php8.5-src/ext/standard/basic_functions.c +@@ -342,8 +342,8 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ + php_register_url_stream_wrapper("file", &php_plain_files_wrapper); + php_register_url_stream_wrapper("glob", &php_glob_stream_wrapper); + php_register_url_stream_wrapper("data", &php_stream_rfc2397_wrapper); +- php_register_url_stream_wrapper("http", &php_stream_http_wrapper); +- php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); ++ // php_register_url_stream_wrapper("http", &php_stream_http_wrapper); ++ // php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); + + return SUCCESS; + } +diff --git a/third_party/php8.5-src/ext/standard/credits.c b/third_party/php8.5-src/ext/standard/credits.c +index 4e8722d..1343330 100644 +--- a/third_party/php8.5-src/ext/standard/credits.c ++++ b/third_party/php8.5-src/ext/standard/credits.c +@@ -33,6 +33,11 @@ PHPAPI ZEND_COLD void php_print_credits(int flag) /* {{{ */ + PUTS("PHP Credits\n"); + } + ++ php_info_print_table_start(); ++ php_info_print_table_header(1, "php-wasm"); ++ php_info_print_table_row(1, "Sean Morris & Oraoto"); ++ php_info_print_table_end(); ++ + if (flag & PHP_CREDITS_GROUP) { + /* Group */ + +diff --git a/third_party/php8.5-src/ext/standard/credits_ext.h b/third_party/php8.5-src/ext/standard/credits_ext.h +index 509135a..981ea04 100644 +--- a/third_party/php8.5-src/ext/standard/credits_ext.h ++++ b/third_party/php8.5-src/ext/standard/credits_ext.h +@@ -44,10 +44,12 @@ CREDIT_LINE("ODBC", "Stig Bakken, Andreas Karajannis, Frank M. Kromann, Daniel R + CREDIT_LINE("Opcache", "Andi Gutmans, Zeev Suraski, Stanislav Malyshev, Dmitry Stogov, Xinchen Hui"); + CREDIT_LINE("OpenSSL", "Stig Venaas, Wez Furlong, Sascha Kettler, Scott MacVicar, Eliot Lear"); + CREDIT_LINE("pcntl", "Jason Greene, Arnaud Le Blanc"); ++CREDIT_LINE("pdo-pglite", "Sean Morris"); + CREDIT_LINE("Perl Compatible Regexps", "Andrei Zmievski"); + CREDIT_LINE("PHP Archive", "Gregory Beaver, Marcus Boerger"); + CREDIT_LINE("PHP Data Objects", "Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle, Ilia Alshanetsky"); + CREDIT_LINE("PHP hash", "Sara Golemon, Rasmus Lerdorf, Stefan Esser, Michael Wallner, Scott MacVicar"); ++CREDIT_LINE("pib", "Oraoto, Sean Morris"); + CREDIT_LINE("Posix", "Kristian Koehntopp"); + CREDIT_LINE("PostgreSQL driver for PDO", "Edin Kadribasic, Ilia Alshanetsky"); + CREDIT_LINE("PostgreSQL", "Jouni Ahto, Zeev Suraski, Yasuo Ohgaki, Chris Kings-Lynne"); +@@ -70,6 +72,8 @@ CREDIT_LINE("System V Shared Memory", "Christian Cartus"); + CREDIT_LINE("tidy", "John Coggeshall, Ilia Alshanetsky"); + CREDIT_LINE("tokenizer", "Andrei Zmievski, Johannes Schlueter"); + CREDIT_LINE("uri", "Máté Kocsis, Tim Düsterhus, Ignace Nyamagana Butera, Arnaud Le Blanc, Dennis Snell, Niels Dossche, Nicolas Grekas"); ++CREDIT_LINE("Vrzno", "Sean Morris"); ++CREDIT_LINE("waitline", "Sean Morris"); + CREDIT_LINE("XML", "Stig Bakken, Thies C. Arntzen, Sterling Hughes"); + CREDIT_LINE("XMLReader", "Rob Richards"); + CREDIT_LINE("XMLWriter", "Rob Richards, Pierre-Alain Joye"); +diff --git a/third_party/php8.5-src/ext/tokenizer/tokenizer.c b/third_party/php8.5-src/ext/tokenizer/tokenizer.c +index 203a9b9..0d78de1 100644 +--- a/third_party/php8.5-src/ext/tokenizer/tokenizer.c ++++ b/third_party/php8.5-src/ext/tokenizer/tokenizer.c +@@ -318,7 +318,7 @@ static void add_token( + zend_hash_next_index_insert_new(return_value_ht, &token); + } + +-static bool tokenize(zval *return_value, zend_string *source, zend_class_entry *token_class) ++bool tokenize(zval *return_value, zend_string *source, zend_class_entry *token_class) + { + zval source_zval; + zend_lex_state original_lex_state; +diff --git a/third_party/php8.5-src/main/fastcgi.c b/third_party/php8.5-src/main/fastcgi.c +index 448576a..7209487 100644 +--- a/third_party/php8.5-src/main/fastcgi.c ++++ b/third_party/php8.5-src/main/fastcgi.c +@@ -551,6 +551,7 @@ void fcgi_shutdown(void) + { + if (is_initialized) { + zend_hash_destroy(&fcgi_mgmt_vars); ++ is_initialized = 0; + } + is_fastcgi = 0; + if (allowed_clients) { +diff --git a/third_party/php8.5-src/sapi/cgi/Makefile.frag b/third_party/php8.5-src/sapi/cgi/Makefile.frag +index 79e2afe..0956f43 100644 +--- a/third_party/php8.5-src/sapi/cgi/Makefile.frag ++++ b/third_party/php8.5-src/sapi/cgi/Makefile.frag +@@ -1,7 +1,7 @@ + cgi: $(SAPI_CGI_PATH) + + $(SAPI_CGI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_FASTCGI_OBJS) $(PHP_CGI_OBJS) +- $(BUILD_CGI) ++ $(BUILD_CGI) $(WASM_SHARED_LIBS) + + install-cgi: $(SAPI_CGI_PATH) + @echo "Installing PHP CGI binary: $(INSTALL_ROOT)$(bindir)/" +diff --git a/third_party/php8.5-src/sapi/cgi/cgi_main.c b/third_party/php8.5-src/sapi/cgi/cgi_main.c +index 6db96a4..1ff31d7 100644 +--- a/third_party/php8.5-src/sapi/cgi/cgi_main.c ++++ b/third_party/php8.5-src/sapi/cgi/cgi_main.c +@@ -19,6 +19,7 @@ + +----------------------------------------------------------------------+ + */ + ++#include + #include "php.h" + #include "php_globals.h" + #include "php_variables.h" +@@ -1870,7 +1871,8 @@ int main(int argc, char *argv[]) + SG(request_info).path_translated = NULL; + #endif + +- cgi_sapi_module.executable_location = argv[0]; ++ // cgi_sapi_module.executable_location = argv[0]; ++ cgi_sapi_module.executable_location = NULL; + if (!cgi && !fastcgi && !bindpath) { + cgi_sapi_module.additional_functions = additional_functions; + } +@@ -1952,9 +1954,10 @@ consult the installation file that came with this distribution, or visit \n\ + } + + /* make php call us to get _ENV vars */ +- php_php_import_environment_variables = php_import_environment_variables; +- php_import_environment_variables = cgi_php_import_environment_variables; +- ++ if(php_import_environment_variables != cgi_php_import_environment_variables) { ++ php_php_import_environment_variables = php_import_environment_variables; ++ php_import_environment_variables = cgi_php_import_environment_variables; ++ } + if (fastcgi) { + /* How many times to run PHP scripts before dying */ + if (getenv("PHP_FCGI_MAX_REQUESTS")) { +@@ -2677,3 +2680,18 @@ consult the installation file that came with this distribution, or visit \n\ + return exit_status; + } + /* }}} */ ++ ++void EMSCRIPTEN_KEEPALIVE wasm_sapi_cgi_init(void) ++{ ++ putenv("USE_ZEND_ALLOC=0"); ++} ++ ++char* EMSCRIPTEN_KEEPALIVE wasm_sapi_cgi_getenv(char *name) ++{ ++ return getenv(name); ++} ++ ++char* EMSCRIPTEN_KEEPALIVE wasm_sapi_cgi_putenv(char *name, char *value) ++{ ++ return _sapi_cgi_putenv(name, strlen(name), value); ++} +diff --git a/third_party/php8.5-src/sapi/cli/Makefile.frag b/third_party/php8.5-src/sapi/cli/Makefile.frag +index aa1d642..649533d 100644 +--- a/third_party/php8.5-src/sapi/cli/Makefile.frag ++++ b/third_party/php8.5-src/sapi/cli/Makefile.frag +@@ -1,7 +1,7 @@ + cli: $(SAPI_CLI_PATH) + + $(SAPI_CLI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CLI_OBJS) +- $(BUILD_CLI) ++ $(BUILD_CLI) $(WASM_SHARED_LIBS) + + install-cli: $(SAPI_CLI_PATH) + @echo "Installing PHP CLI binary: $(INSTALL_ROOT)$(bindir)/" +diff --git a/third_party/php8.5-src/sapi/embed/php_embed.c b/third_party/php8.5-src/sapi/embed/php_embed.c +index 06cd1fb..5fb7754 100644 +--- a/third_party/php8.5-src/sapi/embed/php_embed.c ++++ b/third_party/php8.5-src/sapi/embed/php_embed.c +@@ -241,8 +241,8 @@ EMBED_SAPI_API int php_embed_init(int argc, char **argv) + return FAILURE; + } + +- SG(headers_sent) = 1; +- SG(request_info).no_headers = 1; ++ SG(headers_sent) = 0; ++ SG(request_info).no_headers = 0; + php_register_variable("PHP_SELF", "-", NULL); + + return SUCCESS; +diff --git a/third_party/php8.5-src/sapi/phpdbg/Makefile.frag b/third_party/php8.5-src/sapi/phpdbg/Makefile.frag +index 3b09f6a..263b3ff 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/Makefile.frag ++++ b/third_party/php8.5-src/sapi/phpdbg/Makefile.frag +@@ -6,7 +6,7 @@ $(SAPI_PHPDBG_SHARED_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_O + $(BUILD_PHPDBG_SHARED) + + $(SAPI_PHPDBG_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) +- $(BUILD_PHPDBG) ++ $(BUILD_PHPDBG) $(WASM_SHARED_LIBS) + + %.c: %.y + %.c: %.l +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg.c +index 4ef83be..3875975 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "phpdbg.h" + #include "phpdbg_prompt.h" + #include "phpdbg_bp.h" +@@ -144,6 +146,34 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ + #endif + } /* }}} */ + ++const char* phpdbg_wasm_current_file = NULL; ++uint32_t phpdbg_wasm_current_line = NULL; ++ ++const char** EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_file(void) ++{ ++ return &phpdbg_wasm_current_file; ++} ++ ++uint32_t* EMSCRIPTEN_KEEPALIVE phpdbg_wasm_get_current_line(void) ++{ ++ return &phpdbg_wasm_current_line; ++} ++ ++int* EMSCRIPTEN_KEEPALIVE php_wasm_get_bpcount(void) ++{ ++ return &PHPDBG_G(bp_count); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_executing(void) ++{ ++ return PHPDBG_G(in_execution) || (PHPDBG_G(flags) & PHPDBG_IS_STOPPING); ++} ++ ++bool EMSCRIPTEN_KEEPALIVE php_wasm_is_running(void) ++{ ++ return PHPDBG_G(flags) & PHPDBG_IS_RUNNING; ++} ++ + static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + { + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); +@@ -173,6 +203,9 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ + + static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ + { ++ phpdbg_wasm_current_file = NULL; ++ phpdbg_wasm_current_line = NULL; ++ + zend_hash_destroy(&PHPDBG_G(registered)); + phpdbg_destroy_watchpoints(); + +@@ -1111,7 +1144,7 @@ php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char * + return PHPDBG_G(orig_url_wrap_php)->wops->stream_opener(wrapper, path, mode, options, opened_path, context STREAMS_CC); + } /* }}} */ + +-int main(int argc, char **argv) /* {{{ */ ++int EMSCRIPTEN_KEEPALIVE main(int argc, char **argv) /* {{{ */ + { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *sapi_name; +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg.h b/third_party/php8.5-src/sapi/phpdbg/phpdbg.h +index e5f6413..487a2e6 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg.h ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg.h +@@ -182,7 +182,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input); + #ifndef _WIN32 + # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) + #else +-# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION) ++# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED) + #endif /* }}} */ + + /* {{{ output descriptors */ +@@ -313,4 +313,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + zend_ulong lines; /* max number of lines to display */ + ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ + ++extern const char* phpdbg_wasm_current_file; ++extern uint32_t phpdbg_wasm_current_line; ++ + #endif /* PHPDBG_H */ +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg_cmd.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg_cmd.c +index 9877d60..d27a228 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg_cmd.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg_cmd.c +@@ -754,7 +754,7 @@ PHPDBG_API char *phpdbg_read_input(const char *buffered) /* {{{ */ + ignored if compiled without readline integration. */ + if (!isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) { + char buf[PHPDBG_MAX_CMD]; +- phpdbg_write("%s", phpdbg_get_prompt()); ++ // phpdbg_write("%s", phpdbg_get_prompt()); + phpdbg_consume_stdin_line(buf); + buffer = estrdup(buf); + } else +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg_info.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg_info.c +index b329bda..4dde04a 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg_info.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg_info.c +@@ -159,7 +159,7 @@ PHPDBG_INFO(constants) /* {{{ */ + return SUCCESS; + } /* }}} */ + +-static int phpdbg_arm_auto_global(zval *ptrzv) { ++int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + + if (auto_global->armed) { +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg_io.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg_io.c +index 261a67c..d614628 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg_io.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg_io.c +@@ -14,6 +14,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #ifdef HAVE_CONFIG_H + #include + #endif +@@ -22,52 +24,40 @@ + + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +-/* is easy to generalize ... but not needed for now */ +-PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { +- int bytes = PHPDBG_G(input_buflen), len = 0; ++EM_ASYNC_JS(int, phpdbg_internal_consume_stdin_line, (char *buf, int max_length), { ++ ++ let input; ++ ++ Module.triggerStdin(); + +- if (PHPDBG_G(input_buflen)) { +- memcpy(buf, PHPDBG_G(input_buffer), bytes); ++ if(Module.inputDataQueue.length) ++ { ++ input = String(Module.inputDataQueue.shift()); ++ } ++ else ++ { ++ let a, r; ++ const promise = new Promise((accept, reject) => [a, r] = [ accept, reject ]); ++ Module.awaitingInput = a; ++ input = String(await promise); + } + +- PHPDBG_G(last_was_newline) = 1; ++ if(input.length >= max_length) ++ { ++ input = input.slice(0, max_length - 1); ++ } + +- do { +- int i; +- if (bytes <= 0) { +- continue; +- } ++ stringToUTF8(input, buf, input.length + 1); + +- for (i = len; i < len + bytes; i++) { +- if (buf[i] == '\x03') { +- if (i != len + bytes - 1) { +- memmove(buf + i, buf + i + 1, len + bytes - i - 1); +- } +- len--; +- i--; +- continue; +- } +- if (buf[i] == '\n') { +- PHPDBG_G(input_buflen) = len + bytes - 1 - i; +- if (PHPDBG_G(input_buflen)) { +- memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); +- } +- if (i != PHPDBG_MAX_CMD - 1) { +- buf[i + 1] = 0; +- } +- return i; +- } +- } + +- len += bytes; +- } while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1)) > 0); + +- if (bytes <= 0) { +- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; +- zend_bailout(); +- } ++ return input.length; ++}); + +- return bytes; ++ ++/* is easy to generalize ... but not needed for now */ ++PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { ++ return phpdbg_internal_consume_stdin_line(buf, PHPDBG_MAX_CMD); + } + + PHPDBG_API int phpdbg_mixed_read(int fd, char *ptr, int len, int tmo) { +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg_prompt.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg_prompt.c +index 7215888..a3bfbb2 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg_prompt.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg_prompt.c +@@ -1645,6 +1645,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ + #endif /* ZEND_CHECK_STACK_LIMIT */ + + while (1) { ++ phpdbg_wasm_current_file = zend_get_executed_filename(); ++ phpdbg_wasm_current_line = zend_get_executed_lineno(); + zend_object *exception = EG(exception); + + if ((PHPDBG_G(flags) & PHPDBG_BP_RESOLVE_MASK)) { +diff --git a/third_party/php8.5-src/sapi/phpdbg/phpdbg_utils.c b/third_party/php8.5-src/sapi/phpdbg/phpdbg_utils.c +index 329ee9a..2b6d83e 100644 +--- a/third_party/php8.5-src/sapi/phpdbg/phpdbg_utils.c ++++ b/third_party/php8.5-src/sapi/phpdbg/phpdbg_utils.c +@@ -16,6 +16,8 @@ + +----------------------------------------------------------------------+ + */ + ++#include ++ + #include "zend.h" + + #include "php.h" +@@ -293,7 +295,7 @@ PHPDBG_API void phpdbg_set_prompt(const char *prompt) /* {{{ */ + PHPDBG_G(prompt)[0] = strdup(prompt); + } /* }}} */ + +-PHPDBG_API const char *phpdbg_get_prompt(void) /* {{{ */ ++PHPDBG_API const char EMSCRIPTEN_KEEPALIVE *phpdbg_get_prompt(void) /* {{{ */ + { + /* find cached prompt */ + if (PHPDBG_G(prompt)[1]) { diff --git a/playwright.config.mjs b/playwright.config.mjs new file mode 100644 index 000000000..9986d6582 --- /dev/null +++ b/playwright.config.mjs @@ -0,0 +1,19 @@ +import { defineConfig } from '@playwright/test'; + +import { getPlaywrightLaunchOptions } from './test/lib/playwright-browser.mjs'; + +export default defineConfig({ + testDir: './test/browser', + testMatch: ['**/*.spec.mjs'], + fullyParallel: false, + workers: 1, + timeout: 180000, + reporter: 'list', + use: { + baseURL: `http://127.0.0.1:${process.env.BROWSER_TEST_PORT ?? 9000}/php-wasm/`, + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'off', + ...getPlaywrightLaunchOptions() + }, +}); diff --git a/publish-packages.sh b/publish-packages.sh index 04328653f..2839aae5c 100755 --- a/publish-packages.sh +++ b/publish-packages.sh @@ -1,80 +1,116 @@ #!/usr/bin/env bash -NPM_TAG=${1}; -OTP=${2}; - -if [ -z "${NPM_TAG}" ]; then { - echo "A tag is required."; - exit 1;} -fi - -echo -e "Getting ready to publish to channel: \033[33m${NPM_TAG}\033[0m" - -sleep 3; - -# THIS SCRIPT SHOULD QUIT IMMEDIATELY UPON ERRORS set -euo pipefail -ls packages | while read PACKAGE; do { +usage() { + echo "Usage: $0 [--real] [--registry=]" + echo + echo "Publishes package directories under ./packages serially." + echo "Dry-run is the default. Use --real for an actual publish." + echo "Do not pass OTP on the command line; let npm prompt if needed." +} - if [[ ${PACKAGE} == "sdl" ]]; then - continue; - fi; +NPM_TAG="${1:-}" +shift || true - echo -e "Checking package.json[files] in \033[1m${PACKAGE}\033[0m" +if [[ -z "${NPM_TAG}" ]]; then + usage + exit 1 +fi - cd "packages/${PACKAGE}" +DRY_RUN=1 +REGISTRY="${NPM_REGISTRY:-}" + +for ARG in "$@"; do + case "${ARG}" in + --real) + DRY_RUN=0 + ;; + --dry-run) + DRY_RUN=1 + ;; + --registry=*) + REGISTRY="${ARG#*=}" + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown argument: ${ARG}" >&2 + usage + exit 1 + ;; + esac +done + +if [[ "${DRY_RUN}" -eq 0 && -n "${CI:-}" ]]; then + echo "Refusing to run a real publish from CI with the local publish script." >&2 + echo "Use a trusted publishing workflow instead." >&2 + exit 1 +fi - jq -r '.files | join("\n")' < package.json | while read FILE; do { +echo -e "Getting ready to publish to channel: \033[33m${NPM_TAG}\033[0m" +if [[ "${DRY_RUN}" -eq 1 ]]; then + echo "Mode: dry-run" +else + echo "Mode: real publish" +fi +sleep 3 - if [[ ${FILE} == php8.[01234]* ]]; then - continue; - fi; +PACKAGES=() +for PACKAGE_DIR in packages/*; do + [[ -d "${PACKAGE_DIR}" ]] || continue + [[ -f "${PACKAGE_DIR}/package.json" ]] || continue - if [[ ${FILE} == 'mapped/*' ]] || [[ ${FILE} == *.map ]]; then - continue; - fi; + PACKAGE="$(basename "${PACKAGE_DIR}")" + if [[ "${PACKAGE}" == "sdl" ]]; then + continue + fi - if [[ ${FILE} == '*.wasm' ]] || [[ ${FILE} == *.map ]]; then - continue; - fi; + if [[ "$(jq -r '.private // false' < "${PACKAGE_DIR}/package.json")" == "true" ]]; then + continue + fi - if [ ! -e ${FILE} ]; then - echo -e "\033[31mMISSING ${FILE} in ${PACKAGE}!\033[0m" - exit 1; - fi; + PACKAGES+=("${PACKAGE}") +done - }; done; +IFS=$'\n' PACKAGES=($(printf '%s\n' "${PACKAGES[@]}" | sort)) +unset IFS - cd "../.."; +for PACKAGE in "${PACKAGES[@]}"; do + echo -e "Checking packlist in \033[1m${PACKAGE}\033[0m" + cd "packages/${PACKAGE}" -}; done + PACK_INFO="$(npm pack --dry-run --json)" + jq -e '(length > 0) and ((.[0].files | length) > 0)' <<< "${PACK_INFO}" >/dev/null + jq -r '.[0] | " packlist: \(.files | length) files, \(.size) bytes tarball, \(.unpackedSize) bytes unpacked"' <<< "${PACK_INFO}" -set -euo pipefail + cd "../.." +done -ls packages | while read PACKAGE; do { - if [[ ${PACKAGE} == "sdl" ]]; then - continue; - fi; +for PACKAGE in "${PACKAGES[@]}"; do cd "packages/${PACKAGE}" - echo -e "\033[33mChanged files in \033[1m${PACKAGE}:\033[0m"; - npm diff --tag ${NPM_TAG} --diff-name-only || ( cd ../.. && continue ) + echo -e "\033[33mChanged files in \033[1m${PACKAGE}:\033[0m" + npm diff --tag "${NPM_TAG}" --diff-name-only || true cd "../.." -}; done; +done -ls packages | while read PACKAGE; do { - if [[ ${PACKAGE} == "sdl" ]]; then - continue; - fi; +for PACKAGE in "${PACKAGES[@]}"; do cd "packages/${PACKAGE}" - if [[ "${NOT_DRY_RUN:-}" == "real" ]]; then - set -x - npm publish --tag ${NPM_TAG} --otp ${OTP} & - set +x - else - set -x - npm publish --tag ${NPM_TAG} --dry-run & - set +x + + PUBLISH_ARGS=(publish --tag "${NPM_TAG}") + + if [[ -n "${REGISTRY}" ]]; then + PUBLISH_ARGS+=(--registry "${REGISTRY}") + fi + + if [[ "${DRY_RUN}" -eq 1 ]]; then + PUBLISH_ARGS+=(--dry-run) fi + + echo -e "\033[32mPublishing \033[1m${PACKAGE}\033[0m" + npm "${PUBLISH_ARGS[@]}" + cd "../.." -}; done; +done diff --git a/serve-demo-web-from-actions.sh b/serve-demo-web-from-actions.sh new file mode 100755 index 000000000..f291b68bc --- /dev/null +++ b/serve-demo-web-from-actions.sh @@ -0,0 +1,200 @@ +#!/usr/bin/env bash + +set -euo pipefail + +DEFAULT_ACTIONS_URL="https://github.com/seanmorris/php-wasm/actions/runs/25331839202" +DEFAULT_LIB_TYPE="dynamic" +DEFAULT_TMP_ROOT="/tmp" + +artifact_name="${ARTIFACT_NAME:-}" +artifact_name_explicit=0 +lib_type="${LIB_TYPE:-$DEFAULT_LIB_TYPE}" +port="${PORT:-}" +tmp_root="${TMP_ROOT:-$DEFAULT_TMP_ROOT}" +actions_url="" +repo_slug="" +run_id="" + +usage() { + cat < + -p, --port PORT Port for http-server. + Default: let http-server decide + -d, --tmp-root DIR Parent directory for downloaded files. + Default: ${DEFAULT_TMP_ROOT} + -h, --help Show this help and exit. + +Defaults: + If no URL or run id is provided, the script uses: + ${DEFAULT_ACTIONS_URL} + +Examples: + $(basename "$0") + $(basename "$0") https://github.com/seanmorris/php-wasm/actions/runs/25331839202 + $(basename "$0") --url ${DEFAULT_ACTIONS_URL} + $(basename "$0") --run-id 25331839202 --repo seanmorris/php-wasm + $(basename "$0") --lib-type shared --port 8091 + $(basename "$0") --artifact-name php-demo-web-dynamic +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -u|--url) + actions_url="${2:-}" + shift 2 + ;; + -r|--run-id) + run_id="${2:-}" + shift 2 + ;; + -R|--repo) + repo_slug="${2:-}" + shift 2 + ;; + -l|--lib-type) + lib_type="${2:-}" + shift 2 + ;; + -a|--artifact-name) + artifact_name="${2:-}" + artifact_name_explicit=1 + shift 2 + ;; + -p|--port) + port="${2:-}" + shift 2 + ;; + -d|--tmp-root) + tmp_root="${2:-}" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift + break + ;; + -*) + echo "Unknown option: $1" >&2 + usage >&2 + exit 1 + ;; + *) + if [[ -z "$actions_url" && -z "$run_id" ]]; then + actions_url="$1" + shift + continue + fi + + echo "Unexpected argument: $1" >&2 + usage >&2 + exit 1 + ;; + esac +done + +case "$lib_type" in + dynamic|shared|static) + ;; + *) + echo "Unsupported lib type: ${lib_type}" >&2 + echo "Expected one of: dynamic, shared, static" >&2 + exit 1 + ;; +esac + +if [[ "$artifact_name_explicit" -eq 0 && -z "$artifact_name" ]]; then + artifact_name="php-demo-web-${lib_type}" +fi + +if [[ -n "$actions_url" && -n "$run_id" ]]; then + echo "Use either --url or --run-id, not both." >&2 + exit 1 +fi + +if [[ -z "$actions_url" && -z "$run_id" ]]; then + actions_url="$DEFAULT_ACTIONS_URL" +fi + +if [[ -n "$actions_url" ]]; then + if [[ "$actions_url" =~ ^https://github\.com/([^/]+)/([^/]+)/actions/runs/([0-9]+)(/.*)?$ ]]; then + owner="${BASH_REMATCH[1]}" + repo="${BASH_REMATCH[2]}" + repo_slug="${owner}/${repo}" + run_id="${BASH_REMATCH[3]}" + else + echo "Expected a GitHub Actions run URL like:" >&2 + echo " https://github.com///actions/runs/" >&2 + exit 1 + fi +elif [[ -n "$run_id" ]]; then + if [[ ! "$repo_slug" =~ ^[^/]+/[^/]+$ ]]; then + echo "--repo OWNER/REPO is required when using --run-id." >&2 + exit 1 + fi +else + echo "Unable to determine a workflow run." >&2 + exit 1 +fi + +if ! command -v gh >/dev/null 2>&1; then + echo "`gh` is required but was not found in PATH." >&2 + exit 1 +fi + +run_root="${tmp_root%/}/${artifact_name}-run-${run_id}" +archive_dir="${run_root}/artifact" +site_dir="${run_root}/site" +tarball="${archive_dir}/${artifact_name}.tar.gz" +serve_root="${site_dir}" + +rm -rf "$run_root" +mkdir -p "$archive_dir" "$site_dir" + +echo "Downloading ${artifact_name} from ${repo_slug} run ${run_id}..." +gh run download "$run_id" \ + -R "$repo_slug" \ + -n "$artifact_name" \ + -D "$archive_dir" + +if [[ ! -f "$tarball" ]]; then + echo "Expected artifact tarball at ${tarball}, but it was not found." >&2 + exit 1 +fi + +echo "Extracting ${tarball} into ${site_dir}..." +tar -xzf "$tarball" -C "$site_dir" + +if [[ -d "${site_dir}/docs" ]]; then + serve_root="${run_root}/serve-root" + mkdir -p "$serve_root" + mv "${site_dir}/docs" "${serve_root}/php-wasm" +fi + +echo "Artifact stored in ${run_root}" + +http_server_args=("$serve_root" "-c-1") + +if [[ -n "$port" ]]; then + http_server_args+=("-p" "$port") + echo "Serving ${serve_root} on http://127.0.0.1:${port}/php-wasm/" +else + echo "Serving ${serve_root} with http-server default port selection under /php-wasm/" +fi + +exec npx --yes http-server "${http_server_args[@]}" diff --git a/set-versions.sh b/set-versions.sh index 9cf21c3be..a6e29ea90 100755 --- a/set-versions.sh +++ b/set-versions.sh @@ -15,6 +15,7 @@ function updateFile updateFile "package.json" ${NEW_VERSION}; ls packages | while read PACKAGE; do { + test -d packages/${PACKAGE} || continue; updateFile "packages/${PACKAGE}/package.json" ${NEW_VERSION}; cd "packages/${PACKAGE}"; npm pkg fix; diff --git a/source/OutputBuffer.js b/source/OutputBuffer.js deleted file mode 100644 index a2713df89..000000000 --- a/source/OutputBuffer.js +++ /dev/null @@ -1,57 +0,0 @@ -import { _Event } from "./_Event"; - -export class OutputBuffer -{ - constructor(target, eventType, maxLength) - { - Object.defineProperty(this, 'target', {value: target}); - Object.defineProperty(this, 'buffer', {value: []}); - Object.defineProperty(this, 'eventType', {value: eventType}); - Object.defineProperty(this, 'maxLength', {value: maxLength}); - Object.defineProperty(this, 'decoder', {value: new TextDecoder()}); - Object.defineProperty(this, 'queue', {value: new Set}); - } - - push(...items) - { - this.buffer.push(...items); - - const end = this.buffer.length - 1; - - if(this.maxLength === -1 && this.buffer[end] === 10) - { - this.flush(); - } - - if(this.maxLength >= 0 && this.buffer.length >= this.maxLength) - { - this.flush(); - } - } - - flush() - { - if(!this.buffer.length) - { - return; - } - - const detail = [this.decoder.decode(new Uint8Array(this.buffer))]; - const event = new _Event(this.eventType, {detail}); - - if(this.target['on' + this.eventType]) - { - if(this.target['on' + this.eventType](event) === false) - { - return; - } - } - - if(!this.target.dispatchEvent(event)) - { - return; - } - - this.buffer.splice(0); - } -} diff --git a/source/OutputBuffer.mjs b/source/OutputBuffer.mjs new file mode 100644 index 000000000..1f613e3df --- /dev/null +++ b/source/OutputBuffer.mjs @@ -0,0 +1,85 @@ +import { _Event } from './_Event.mjs'; + +/** + * Buffers output bytes until they should be emitted as an event. + */ +export class OutputBuffer +{ + /** @type {OutputTarget} */ + target; + /** @type {number[]} */ + buffer; + /** @type {string} */ + eventType; + /** @type {number} */ + maxLength; + /** @type {TextDecoder} */ + decoder; + + /** + * Creates a new output buffer for an event target. + * @param {OutputTarget} target Event target that receives flushed events. + * @param {string} eventType Event name to dispatch when the buffer flushes. + * @param {number} maxLength Maximum buffered byte length before an automatic flush. + */ + constructor(target, eventType, maxLength) + { + Object.defineProperty(this, 'target', {value: target}); + Object.defineProperty(this, 'buffer', {value: []}); + Object.defineProperty(this, 'eventType', {value: eventType}); + Object.defineProperty(this, 'maxLength', {value: maxLength}); + Object.defineProperty(this, 'decoder', {value: new TextDecoder()}); + } + + /** + * Appends bytes to the internal output buffer. + * @param {...number} items Bytes to append to the buffer. + */ + push(...items) + { + this.buffer.push(...items); + + const end = this.buffer.length - 1; + + if(this.maxLength === -1 && this.buffer[end] === 10) + { + this.flush(); + } + + if(this.maxLength >= 0 && this.buffer.length >= this.maxLength) + { + this.flush(); + } + } + + /** + * Emits the buffered output as a single event payload. + */ + flush() + { + if(!this.buffer.length) + { + return; + } + + const detail = [this.decoder.decode(new Uint8Array(this.buffer))]; + const event = new _Event(this.eventType, {detail}); + const target = /** @type {EventTarget & {[key: string]: PhpEventHook|undefined}} */ (this.target); + const handler = target['on' + this.eventType]; + + if(handler) + { + if(handler(event) === false) + { + return; + } + } + + if(!target.dispatchEvent(event)) + { + return; + } + + this.buffer.splice(0); + } +} diff --git a/source/PhpBase.js b/source/PhpBase.js deleted file mode 100644 index 43a66a155..000000000 --- a/source/PhpBase.js +++ /dev/null @@ -1,427 +0,0 @@ -import { OutputBuffer } from './OutputBuffer'; -import { _Event } from './_Event'; -import { fsOps } from './fsOps'; -import { resolveDependencies } from './resolveDependencies'; - -const importMeta = import.meta; - -const STR = 'string'; -const NUM = 'number'; - -export class PhpBase extends EventTarget -{ - constructor(phpBinLoader, args = {}, sapi = 'embed') - { - super(); - - this.queue = []; - - this.onerror = function () {}; - this.onoutput = function () {}; - this.onready = function () {}; - - Object.defineProperty(this, 'encoder', {value: new TextEncoder()}); - Object.defineProperty(this, 'buffers', {value: { - stdin: [], - stdout: new OutputBuffer(this, 'output', -1), - stderr: new OutputBuffer(this, 'error', -1), - } }); - - Object.freeze(this.buffers); - - this.autoTransaction = ('autoTransaction' in args) ? args.autoTransaction : true; - this.transactionStarted = false; - - this.phpVersion = args.version; - this.phpVariant = args.variant; - - this.shared = args.shared = ('shared' in args) ? args.shared : {}; - - this.phpArgs = args; - - const defaults = { - stdin: () => this.buffers.stdin.shift() ?? null, - stdout: byte => this.buffers.stdout.push(byte), - stderr: byte => this.buffers.stderr.push(byte), - - postRun: () => { - const event = new _Event('ready'); - this.onready(event); - this.dispatchEvent(event); - }, - }; - - const fixed = { onRefresh: new Set }; - const phpSettings = globalThis.phpSettings ?? {}; - const userLocateFile = args.locateFile || (() => undefined); - - const files = args.files || []; - - const {files: sharedLibFiles, libs: sharedlibs, urlLibs: sharedLibUrls} = resolveDependencies(args.sharedLibs, this); - const {files: dynamicLibFiles, libs: dynamiclibs, urlLibs: dyamicLibUrls} = resolveDependencies(args.dynamicLibs, this); - - args.locateFile = (path, directory) => { - args.debug && console.error('Loading %s', path); - let located = userLocateFile(path, directory); - if(located !== undefined) - { - return located; - } - if(sharedLibUrls[path]) - { - return sharedLibUrls[path]; - } - if(dyamicLibUrls[path]) - { - return dyamicLibUrls[path]; - } - }; - - this.valueIndex = 0; - - const phpArgs = Object.assign({}, defaults, phpSettings, args, fixed); - - this.binary = phpBinLoader.then(({default: PHP}) => new PHP(phpArgs)).then(async php => { - await php.ccall( - 'pib_storage_init' - , NUM - , [] - , [] - , {async: true} - ); - - if(!php.FS.analyzePath('/preload').exists) - { - php.FS.mkdir('/preload'); - } - - const allFiles = files.concat(sharedLibFiles, dynamicLibFiles); - - // Make sure folder structure exists before preloading files - allFiles.forEach(fileDef => { - const segments = fileDef.parent.split('/'); - let currentPath = ''; - for (const segment of segments) { - if (!segment) continue; - - currentPath += segment + '/'; - if (!php.FS.analyzePath(currentPath).exists) { - php.FS.mkdir(currentPath); - } - } - }); - - await Promise.all(allFiles.map( - fileDef => new Promise(accept => php.FS.createPreloadedFile( - fileDef.parent, - fileDef.name, - fileDef.url instanceof URL ? fileDef.url.href : fileDef.url, - true, - false, - accept, - )) - )); - - const iniLines = sharedlibs.map(lib => { - if(typeof lib === 'string' || lib instanceof URL) - { - return `extension=${lib}`; - } - else if(typeof lib === 'object' && lib.ini) - { - return `extension=${lib.name ?? String(lib.url).split('/').pop()}`; - } - }); - - args.ini && iniLines.push(args.ini.replace(/\n\s+/g, '\n')); - - php.FS.writeFile('/php.ini', iniLines.join("\n") + "\n", {encoding: 'utf8'}); - - await php.ccall( - 'pib_init' - , NUM - , [STR] - , [sapi] - , {async: true} - ); - - return php; - }); - } - - inputString(byteString) - { - this.input(this.encoder.encode(byteString)); - } - - input(items) - { - this.buffers.stdin.push(...items); - } - - flush() - { - this.buffers.stdout.flush(); - this.buffers.stderr.flush(); - } - - tokenize(phpCode) - { - return this.binary.then(php => php.ccall( - 'pib_tokenize' - , STR - , [STR] - , [phpCode] - )); - } - - startTransaction() - { - return Promise.resolve(); - } - - commitTransaction(readOnly = false) - { - return Promise.resolve(); - } - - async _enqueue(callback, params = [], readOnly = false) - { - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - if(!this.queue.length) - { - return; - } - - await (this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve(); - - while(this.queue.length) - { - const [callback, params, accept, reject] = this.queue.shift(); - await callback(...params).then(accept).catch(reject); - } - - await this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve(); - - return coordinator; - } - - run(phpCode) - { - return this._enqueue(phpCode => this._run(phpCode), [phpCode]); - } - - _run(phpCode) - { - return this.binary.then(php => { - return php.ccall( - 'pib_run' - , NUM - , [STR] - , [`?>${phpCode}`] - ); - }) - .finally(() => this.flush()) - } - - exec(phpCode) - { - return this._enqueue(phpCode => this._exec(phpCode), [phpCode]); - } - - async _exec(phpCode) - { - const call = (await this.binary).ccall( - 'pib_exec' - , STR - , [STR] - , [phpCode] - , {async: true} - ); - - return call.finally(() => this.flush()); - } - - async x(fragments, ...values) - { - const names = []; - const phpModule = await this.binary; - - if(phpModule.hasVrzno) - { - for(const value of values) - { - const name = `___value__${this.valueIndex++}`; - this.shared[name] = value; - names.push(name); - } - - let code = ''; - - fragments = [...fragments]; - - while(fragments.length || names.length) - { - if(fragments.length) - code += fragments.shift(); - - if(names.length) - { - code += `(vrzno_shared('${names.shift()}'))`; - } - } - - code = `vrzno_zval( ${code} );`; - - return phpModule.zvalToJS(await this.exec(code)); - } - else - { - const encoded = values.map(value => JSON.stringify(value)); - - fragments = [...fragments]; - - let code = ''; - - while(fragments.length || names.length) - { - if(fragments.length) - code += fragments.shift(); - - if(encoded.length) - { - code += `(json_decode('${encoded.shift()}'))`; - } - } - - return this.exec(code); - } - } - - async r(fragments, ...values) - { - const names = []; - const phpModule = await this.binary; - - if(phpModule.hasVrzno) - { - for(const value of values) - { - const name = `___value__${this.valueIndex++}`; - this.shared[name] = value; - names.push(name); - } - - let code = ''; - - fragments = [...fragments]; - - while(fragments.length || names.length) - { - if(fragments.length) - code += fragments.shift(); - - if(names.length) - { - code += `(vrzno_shared('${names.shift()}'))`; - } - } - - return this.run(code); - } - else - { - const encoded = values.map(value => JSON.stringify(value)); - - fragments = [...fragments]; - - let code = ''; - - while(fragments.length || names.length) - { - if(fragments.length) - code += fragments.shift(); - - if(encoded.length) - { - code += `(json_decode('${encoded.shift()}'))`; - } - } - - return this.run(code); - } - } - - async refresh() - { - const php = await this.binary; - - for(const callback of php.onRefresh) - { - callback(); - } - - Object.keys(this.shared).forEach(key => delete this.shared[key]); - - return php.ccall( - 'pib_refresh' - , NUM - , [] - , [] - , {async: true} - ); - } - - analyzePath(path) - { - return this._enqueue(fsOps.analyzePath, [this.binary, path]); - } - - readdir(path) - { - return this._enqueue(fsOps.readdir, [this.binary, path]); - } - - readFile(path, options) - { - return this._enqueue(fsOps.readFile, [this.binary, path, options]); - } - - stat(path) - { - return this._enqueue(fsOps.stat, [this.binary, path]); - } - - mkdir(path) - { - return this._enqueue(fsOps.mkdir, [this.binary, path]); - } - - rmdir(path) - { - return this._enqueue(fsOps.rmdir, [this.binary, path]); - } - - rename(path, newPath) - { - return this._enqueue(fsOps.rename, [this.binary, path, newPath]); - } - - writeFile(path, data, options) - { - return this._enqueue(fsOps.writeFile, [this.binary, path, data, options]); - } - - unlink(path) - { - return this._enqueue(fsOps.unlink, [this.binary, path]); - } -} diff --git a/source/PhpBase.mjs b/source/PhpBase.mjs new file mode 100644 index 000000000..74818aae6 --- /dev/null +++ b/source/PhpBase.mjs @@ -0,0 +1,605 @@ +import { OutputBuffer } from './OutputBuffer.mjs'; +import { _Event } from './_Event.mjs'; +import { fsOps } from './fsOps.mjs'; +import { resolveDependencies } from './resolveDependencies.mjs'; + +const importMeta = import.meta; + +const STR = 'string'; +const NUM = 'number'; +const normalizeRuntimeModule = runtime => runtime && typeof runtime === 'object' && 'default' in runtime + ? runtime + : {default: runtime}; + +/** + * Base PHP runtime wrapper shared by the environment-specific adapters. + */ +export class PhpBase extends EventTarget +{ + /** @type {Array<[PhpQueuedCallback, PhpQueueParams, PhpQueueResolve, PhpQueueReject]>} */ + queue; + /** @type {(event?: Event) => void} */ + onerror; + /** @type {(event?: Event) => void} */ + onoutput; + /** @type {(event?: Event) => void} */ + onready; + /** @type {TextEncoder} */ + encoder; + /** @type {{stdin: number[], stdout: OutputBuffer, stderr: OutputBuffer}} */ + buffers; + /** @type {boolean} */ + autoTransaction; + /** @type {boolean|Promise} */ + transactionStarted; + /** @type {string|undefined} */ + phpVersion; + /** @type {string|undefined} */ + phpVariant; + /** @type {{[key: string]: PhpSharedValue}} */ + shared; + /** @type {PhpRuntimeArgs} */ + phpArgs; + /** @type {number} */ + valueIndex; + /** @type {Promise} */ + binary; + + /** + * Creates a PHP runtime wrapper for a specific module loader and SAPI. + * @param {Promise<{default: new (args: object) => object}|(new (args: object) => object)>} phpBinLoader Deferred PHP module loader. + * @param {PhpRuntimeArgs} args Runtime configuration for the PHP instance. + * @param {string} sapi SAPI identifier to initialize inside the module. + */ + constructor(phpBinLoader, args = {}, sapi = 'embed') + { + super(); + + this.queue = []; + + this.onerror = function () {}; + this.onoutput = function () {}; + this.onready = function () {}; + + Object.defineProperty(this, 'encoder', {value: new TextEncoder()}); + Object.defineProperty(this, 'buffers', {value: { + stdin: [] + , stdout: new OutputBuffer(this, 'output', -1) + , stderr: new OutputBuffer(this, 'error', -1) + } }); + + Object.freeze(this.buffers); + + this.autoTransaction = ('autoTransaction' in args) ? args.autoTransaction : true; + this.transactionStarted = false; + + this.phpVersion = args.version; + this.phpVariant = args.variant; + + this.shared = args.shared = ('shared' in args) ? args.shared : {}; + + this.phpArgs = args; + + const defaults = { + stdin: () => this.buffers.stdin.shift() ?? null + , stdout: byte => this.buffers.stdout.push(byte) + , stderr: byte => this.buffers.stderr.push(byte) + + , postRun: () => { + const event = new _Event('ready'); + this.onready(event); + this.dispatchEvent(event); + } + }; + + const fixed = { onRefresh: new Set }; + const phpSettings = globalThis.phpSettings ?? {}; + const userLocateFile = args.locateFile || (() => undefined); + + const files = args.files || []; + + const {files: sharedLibFiles, libs: sharedlibs, urlLibs: sharedLibUrls} = resolveDependencies(args.sharedLibs, this); + const {files: dynamicLibFiles, libs: dynamiclibs, urlLibs: dyamicLibUrls} = resolveDependencies(args.dynamicLibs, this); + + args.locateFile = (path, directory) => { + args.debug && console.error('Loading %s', path); + let located = userLocateFile(path, directory); + if(located !== undefined) + { + return located; + } + if(sharedLibUrls[path]) + { + return sharedLibUrls[path]; + } + if(dyamicLibUrls[path]) + { + return dyamicLibUrls[path]; + } + + // Suppress attempt to load libxml when + // it hasn't been provided in sharedLibs + if(path === 'libxml2.so') + { + return 'data:,'; + } + }; + + this.valueIndex = 0; + + const phpArgs = Object.assign({}, defaults, phpSettings, args, fixed); + + this.binary = phpBinLoader.then(normalizeRuntimeModule).then(({default: PHP}) => new PHP(phpArgs)).then(async php => { + await php.ccall( + 'pib_storage_init' + , NUM + , [] + , [] + , {async: true} + ); + + if(!php.FS.analyzePath('/preload').exists) + { + php.FS.mkdir('/preload'); + } + + const allFiles = files.concat(sharedLibFiles, dynamicLibFiles); + + // Make sure folder structure exists before preloading files + allFiles.forEach(fileDef => { + const segments = fileDef.parent.split('/'); + let currentPath = ''; + for(const segment of segments) + { + if(!segment) continue; + + currentPath += segment + '/'; + if(!php.FS.analyzePath(currentPath).exists) + { + php.FS.mkdir(currentPath); + } + } + }); + + await Promise.all(allFiles.map( + fileDef => new Promise(accept => php.FS.createPreloadedFile( + fileDef.parent, + fileDef.name, + fileDef.url instanceof URL ? fileDef.url.href : fileDef.url, + true, + false, + accept, + )) + )); + + const iniLines = sharedlibs.map(lib => { + if(typeof lib === 'string' || lib instanceof URL) + { + return `extension=${lib}`; + } + else if(typeof lib === 'object' && lib.ini) + { + return `extension=${lib.name ?? String(lib.url).split('/').pop()}`; + } + }); + + args.ini && iniLines.push(args.ini.replace(/\n\s+/g, '\n')); + + php.FS.writeFile('/php.ini', iniLines.join("\n") + "\n", {encoding: 'utf8'}); + + await php.ccall( + 'pib_init' + , NUM + , [STR] + , [sapi] + , {async: true} + ); + + return php; + }); + } + + /** + * Encodes a text string and pushes it into STDIN. + * @param {string} byteString Input text to encode and queue for STDIN. + */ + inputString(byteString) + { + this.input(this.encoder.encode(byteString)); + } + + /** + * Queues raw input bytes for the PHP process. + * @param {Iterable} items Encoded input bytes to queue for STDIN. + */ + input(items) + { + this.buffers.stdin.push(...items); + } + + /** + * Flushes buffered STDOUT and STDERR data. + */ + flush() + { + this.buffers.stdout.flush(); + this.buffers.stderr.flush(); + } + + /** + * Tokenizes a PHP source string in the runtime. + * @param {string} phpCode PHP source to tokenize. + * @returns {Promise} Serialized token data from the PHP runtime. + */ + tokenize(phpCode) + { + return this.binary.then(php => php.ccall( + 'pib_tokenize' + , STR + , [STR] + , [phpCode] + )); + } + + /** + * Starts a filesystem transaction when the environment supports it. + * @returns {Promise} Resolves when a transaction has started. + */ + startTransaction() + { + return Promise.resolve(); + } + + /** + * Commits a filesystem transaction when the environment supports it. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return Promise.resolve(); + } + + /** + * Schedules an async operation on the runtime queue. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates the filesystem. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + if(!this.queue.length) + { + return; + } + + await (this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve(); + + while(this.queue.length) + { + const [callback, params, accept, reject] = this.queue.shift(); + await callback(...params).then(accept).catch(reject); + } + + await this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve(); + + return coordinator; + } + + /** + * Queues PHP code for execution through `pib_run`. + * @param {string|string[]} phpCode PHP source code to execute. + * @returns {Promise} Resolves with the execution result. + */ + run(phpCode) + { + return this._enqueue( + /** + * Executes queued PHP source. + * @param {string} phpCode PHP source code queued for execution. + * @returns {Promise} Resolves with the PHP execution result. + */ + phpCode => this._run(phpCode), + [phpCode] + ); + } + + /** + * Executes PHP code immediately through `pib_run`. + * @param {string|string[]} phpCode PHP source code to execute immediately. + * @returns {Promise} Resolves with the execution result. + */ + _run(phpCode) + { + return this.binary.then(php => { + return php.ccall( + 'pib_run' + , NUM + , [STR] + , [`?>${phpCode}`] + ); + }) + .finally(() => this.flush()); + } + + /** + * Queues PHP code for execution through `pib_exec`. + * @param {string|string[]} phpCode PHP source code to evaluate and capture output from. + * @returns {Promise} Resolves with the execution result. + */ + exec(phpCode) + { + return this._enqueue( + /** + * Executes queued PHP source and captures the result. + * @param {string} phpCode PHP source code queued for evaluation. + * @returns {Promise} Resolves with the PHP evaluation result. + */ + phpCode => this._exec(phpCode), + [phpCode] + ); + } + + /** + * Executes PHP code immediately through `pib_exec`. + * @param {string|string[]} phpCode PHP source code to evaluate immediately. + * @returns {Promise} Resolves with the execution result. + */ + async _exec(phpCode) + { + const call = (await this.binary).ccall( + 'pib_exec' + , STR + , [STR] + , [phpCode] + , {async: true} + ); + + return call.finally(() => this.flush()); + } + + /** + * Evaluates an interpolated PHP expression and returns its value. + * @param {string[]} fragments Template literal string fragments. + * @param {...(object|string|number|boolean|null)} values Values to interpolate into the PHP expression. + * @returns {Promise} Resolves with the decoded PHP expression result. + */ + async x(fragments, ...values) + { + const names = []; + const phpModule = await this.binary; + + if(phpModule.hasVrzno) + { + for(const value of values) + { + const name = `___value__${this.valueIndex++}`; + this.shared[name] = value; + names.push(name); + } + + let code = ''; + + fragments = [...fragments]; + + while(fragments.length || names.length) + { + if(fragments.length) code += fragments.shift(); + if(names.length) code += `(vrzno_shared('${names.shift()}'))`; + } + + code = `vrzno_zval( ${code} );`; + + return phpModule.zvalToJS(await this.exec(code)); + } + else + { + const encoded = values.map(value => JSON.stringify(value)); + + fragments = [...fragments]; + + let code = ''; + + while(fragments.length || names.length) + { + if(fragments.length) + code += fragments.shift(); + + if(encoded.length) + { + code += `(json_decode('${encoded.shift()}'))`; + } + } + + return this.exec(code); + } + } + + /** + * Executes an interpolated PHP script without decoding the result. + * @param {string[]} fragments Template literal string fragments. + * @param {...(object|string|number|boolean|null)} values Values to interpolate into the PHP script. + * @returns {Promise} Resolves with the script execution result. + */ + async r(fragments, ...values) + { + const names = []; + const phpModule = await this.binary; + + if(phpModule.hasVrzno) + { + for(const value of values) + { + const name = `___value__${this.valueIndex++}`; + this.shared[name] = value; + names.push(name); + } + + let code = ''; + + fragments = [...fragments]; + + while(fragments.length || names.length) + { + if(fragments.length) + code += fragments.shift(); + + if(names.length) + { + code += `(vrzno_shared('${names.shift()}'))`; + } + } + + return this.run(code); + } + else + { + const encoded = values.map(value => JSON.stringify(value)); + + fragments = [...fragments]; + + let code = ''; + + while(fragments.length || names.length) + { + if(fragments.length) + code += fragments.shift(); + + if(encoded.length) + { + code += `(json_decode('${encoded.shift()}'))`; + } + } + + return this.run(code); + } + } + + /** + * Recreates the underlying PHP module instance. + * @returns {Promise} Resolves when the PHP runtime has been refreshed. + */ + async refresh() + { + const php = await this.binary; + + for(const callback of php.onRefresh) + { + callback(); + } + + Object.keys(this.shared).forEach(key => delete this.shared[key]); + + return php.ccall( + 'pib_refresh' + , NUM + , [] + , [] + , {async: true} + ); + } + + /** + * Inspects a path in the virtual filesystem. + * @param {string} path Filesystem path to inspect. + * @returns {Promise} Filesystem analysis details for the path. + */ + analyzePath(path) + { + return this._enqueue(fsOps.analyzePath, [this.binary, path]); + } + + /** + * Lists a directory in the virtual filesystem. + * @param {string} path Directory path to list. + * @returns {Promise} Directory entries for the path. + */ + readdir(path) + { + return this._enqueue(fsOps.readdir, [this.binary, path]); + } + + /** + * Reads a file from the virtual filesystem. + * @param {string} path File path to read. + * @param {object} options Read options forwarded to Emscripten FS. + * @returns {Promise} File contents for the requested path. + */ + readFile(path, options) + { + return this._enqueue(fsOps.readFile, [this.binary, path, options]); + } + + /** + * Returns file metadata for a virtual filesystem path. + * @param {string} path Filesystem path to stat. + * @returns {Promise} File metadata for the path. + */ + stat(path) + { + return this._enqueue(fsOps.stat, [this.binary, path]); + } + + /** + * Creates a directory in the virtual filesystem. + * @param {string} path Directory path to create. + * @returns {Promise} Metadata for the created directory. + */ + mkdir(path) + { + return this._enqueue(fsOps.mkdir, [this.binary, path]); + } + + /** + * Removes a directory from the virtual filesystem. + * @param {string} path Directory path to remove. + * @returns {Promise} Resolves when the directory has been removed. + */ + rmdir(path) + { + return this._enqueue(fsOps.rmdir, [this.binary, path]); + } + + /** + * Renames a virtual filesystem path. + * @param {string} path Existing filesystem path. + * @param {string} newPath Destination filesystem path. + * @returns {Promise} Resolves when the path has been renamed. + */ + rename(path, newPath) + { + return this._enqueue(fsOps.rename, [this.binary, path, newPath]); + } + + /** + * Writes a file into the virtual filesystem. + * @param {string} path File path to write. + * @param {string|Uint8Array} data Data to persist. + * @param {object} options Write options forwarded to Emscripten FS. + * @returns {Promise} Resolves when the file has been written. + */ + writeFile(path, data, options) + { + return this._enqueue(fsOps.writeFile, [this.binary, path, data, options]); + } + + /** + * Deletes a file from the virtual filesystem. + * @param {string} path File path to remove. + * @returns {Promise} Resolves when the file has been removed. + */ + unlink(path) + { + return this._enqueue(fsOps.unlink, [this.binary, path]); + } +} diff --git a/source/PhpCgiBase.js b/source/PhpCgiBase.mjs similarity index 58% rename from source/PhpCgiBase.js rename to source/PhpCgiBase.mjs index bc7b909f5..8276b231d 100644 --- a/source/PhpCgiBase.js +++ b/source/PhpCgiBase.mjs @@ -1,24 +1,26 @@ -import { parseResponse } from './parseResponse'; -import { breakoutRequest } from './breakoutRequest'; -import { fsOps } from './fsOps'; -import { resolveDependencies } from './resolveDependencies'; +import { parseResponse } from './parseResponse.mjs'; +import { breakoutRequest } from './breakoutRequest.mjs'; +import { fsOps } from './fsOps.mjs'; +import { resolveDependencies } from './resolveDependencies.mjs'; + +/** @import { PhpCgiRuntimeArgs } from 'php-cgi-wasm/public' */ /** * An object representing a dynamically loaded data file. * @typedef {string|object} FileDef - * @property {string} url - * @property {string} path - * @property {string} parent + * @property {string} url URL used to preload the file. + * @property {string} path Virtual filesystem path where the file should be mounted. + * @property {string} parent Parent directory for the mounted file. */ /** * A string or object representing a dynamically loaded shared library. * @typedef {string|object} LibDef - * @property {string} name - * @property {string} url - * @property {boolean} ini - * @property {function():libDef[]} getLibs - * @property {function():fileDef[]} getFiles + * @property {string} name Shared library filename. + * @property {string} url URL used to preload the shared library. + * @property {boolean} ini Indicates whether the library should be loaded via `php.ini`. + * @property {function(object):LibDef[]} getLibs Returns additional dependent shared libraries. + * @property {function(object):FileDef[]} getFiles Returns additional dependent preload files. */ const STR = 'string'; @@ -36,13 +38,36 @@ const requestTimes = new WeakMap; const noTrailingSlash = s => s.slice(-1) !== '/' ? s : s.slice(0, -1); const noLeadingSlash = s => s.slice(0, 1) !== '/' ? s : s.slice(1); const joinPaths = (...args) => [ - noTrailingSlash(args[0]), // Don't strip the leading slash on the first segment... - ...args.slice(1).map( a => noLeadingSlash(noTrailingSlash(a)) ) + noTrailingSlash(args[0]) // Don't strip the leading slash on the first segment... + , ...args.slice(1).map( a => noLeadingSlash(noTrailingSlash(a)) ) ].join('/'); +/** + * Stores and filters cookies for CGI requests. + * + */ class CookieJar { + /** + * Creates an in-memory cookie jar. + * @param {string} [rawCookies] Newline-delimited raw cookie strings to preload. + */ + constructor(rawCookies = '') + { + if(rawCookies) + { + this.load(rawCookies); + } + } + + /** + * + */ cookies = new Map; + /** + * Stores a raw cookie string in the in-memory jar. + * @param {string} rawCookie Raw `Set-Cookie` header value to persist. + */ store(rawCookie) { let name = null; @@ -90,6 +115,11 @@ class CookieJar } } + /** + * Returns cookies that match a request path. + * @param {?string} path Request path used to filter matching cookies. + * @returns {object[]} Cookies that should be sent for the path. + */ retrieve(path = null) { const cookies = []; @@ -119,69 +149,178 @@ class CookieJar return cookies; } + /** + * Serializes cookies for persistence. + * @param {?string} path Request path used to filter matching cookies. + * @returns {string} Serialized cookies for persistence. + */ dump(path = null) { return this.retrieve(path).map(c => c.raw).join('\n'); } + /** + * Hydrates the jar from serialized cookie lines. + * @param {string} rawCookies Newline-delimited raw cookie strings to restore. + */ load(rawCookies) { rawCookies.trim().split('\n').map(line => this.store(line)); } + /** + * Formats cookies as a request header value. + * @param {?string} path Request path used to filter matching cookies. + * @returns {string} Cookie header value for the path. + */ toEnv(path = null) { return this.retrieve(path).map(e => `${e.name}=${e.value}`).join(';'); } } +/** + * Shared PHP CGI runtime wrapper used by browser, worker, and Node adapters. + */ export class PhpCgiBase { + /** + * + */ docroot = null; + /** + * + */ prefix = '/php-wasm'; + /** + * + */ exclude = []; + /** + * Rewrites an incoming request path before routing. + * @param {string} path Request path to rewrite before PHP handles it. + * @returns {string|{scriptName: string, path: string}} Rewritten request path. + */ rewrite = path => path; + /** + * + */ cookies = null; + /** + * + */ types = {}; - onRequest = () => {}; - notFound = () => {}; + /** + * Invokes request lifecycle hooks after a response is generated. + * @param {RuntimeRequest} request Request that was handled by the runtime. + * @param {Response} [response] Response generated by the runtime. + */ + onRequest = (request, response) => {}; + /** + * Generates a fallback response when no PHP entrypoint matches a request. + * @param {RuntimeRequest} request Request that could not be resolved to a PHP entrypoint. + */ + notFound = request => {}; + /** + * + */ sharedLibs = []; + /** + * + */ + dynamicLibs = []; + /** + * + */ files = []; + /** + * + */ phpArgs = {}; + /** + * + */ maxRequestAge = 0; + /** + * + */ staticCacheTime = 60_000; + /** + * + */ dynamicCacheTime = 0; + /** + * + */ vHosts = []; + /** + * + */ php = null; + /** + * + */ input = []; + /** + * + */ output = []; + /** + * + */ error = []; + /** + * + */ + binLoader = null; + /** + * + */ + phpVersion = null; + /** + * + */ + entrypoint = null; + /** + * + */ + cookieJar = null; + /** + * + */ + extraActions = {}; + /** + * + */ + autoTransaction = true; + /** + * + */ + transactionStarted = false; + /** + * + */ + env = {}; + /** + * + */ + binary = null; + /** + * + */ count = 0; + /** + * + */ queue = []; /** - * Creates a new PHP instance (async) - * @param {*} binLoader - * @param {string} options.prefix The URL path prefix to look for when routing to PHP. - * @param {string} options.docroot The internal directory to use as the public document root. - * @param {string[]} options.exclude Array of URL prefixes to exclude from routing to PHP. - * @param {Array.<{pathPrefix: string, directory: string, entrypoint: string}>} options.vHosts A list of prefixes, directories and entrypoints to serve multiple PHP applications by URL prefix. - * @param {string} options.entrypoint Path to PHP file under docroot to serve as an entrypoint - * @param {function(string):string} options.rewrite Function to rewrite URLs - * @param {object} options.types Mapping of file extensions to mime types to populate the `Content-type` header. - * @param {function()} options.onRequest Function to be executed on each request. - * @param {function(Request):Response|string} options.notFound Function to handle 404s. - * @param {LibDef[]} options.sharedLibs Dynamically load shared libraries with LibDefs - * @param {LibDef[]} options.dynamicLibs Similar to sharedLibs but will NEVER use the ini based loader. - * @param {FileDef[]} options.files Dynamically load files with FileDefs - * @param {boolean} options.autoTransaction Automatically handle FS transactions on each request - * @param {number} options.maxRequestAge Oldest request to process (ms) - * @param {number} options.staticCacheTime Static cache time (ms) - * @param {number} options.dynamicCacheTime Dynamic cache time (ms) - * @param {object} options.env Mapping of environment variable names to values to set inside the server. + * Creates a new PHP CGI runtime wrapper. + * @param {Promise<{default: new (args: object) => object}>} phpBinLoader Deferred PHP module loader. + * @param {PhpCgiRuntimeArgs} [options] Runtime configuration for the CGI wrapper. */ constructor(phpBinLoader, {version, docroot, prefix, exclude, rewrite, entrypoint, cookies, types, onRequest, notFound, sharedLibs, dynamicLibs, actions, files, ...args} = {}) { @@ -218,38 +357,53 @@ export class PhpCgiBase this.refresh(); } + /** + * Handles the service worker install lifecycle event. + * @param {RuntimeLifecycleEvent} event Service worker install event. + * @returns {void} Registers the install work with the service worker lifecycle. + */ handleInstallEvent(event) { - return event.waitUntil(self.skipWaiting()); + return event.waitUntil(globalThis.skipWaiting()); } + /** + * Handles the service worker activate lifecycle event. + * @param {RuntimeLifecycleEvent} event Service worker activate event. + * @returns {void} Registers the activate work with the service worker lifecycle. + */ handleActivateEvent(event) { - return event.waitUntil(self.clients.claim()); + return event.waitUntil(globalThis.clients.claim()); } + /** + * Handles control messages sent to the CGI runtime. + * @param {MessageEvent} event Message event carrying a control action. + * @returns {Promise} Resolves after the action response has been posted back. + */ async handleMessageEvent(event) { const { data, source } = event; const { action, token, params = [] } = data; const actions = [ - 'analyzePath', - 'readdir', - 'readFile', - 'stat', - 'mkdir', - 'rmdir', - 'writeFile', - 'rename', - 'unlink', - 'putEnv', - 'refresh', - 'getSettings', - 'setSettings', - 'getEnvs', - 'setEnvs', - 'storeInit', + 'analyzePath' + , 'readdir' + , 'readFile' + , 'stat' + , 'mkdir' + , 'rmdir' + , 'writeFile' + , 'rename' + , 'unlink' + , 'putEnv' + , 'refresh' + , 'getSettings' + , 'setSettings' + , 'getEnvs' + , 'setEnvs' + , 'storeInit' ]; await this.binary; @@ -269,6 +423,8 @@ export class PhpCgiBase } finally { + if(action === 'refresh') result = !!result; + source.postMessage({re: token, result, error}); } } @@ -292,6 +448,11 @@ export class PhpCgiBase } } + /** + * Routes eligible fetch events through the CGI runtime. + * @param {RuntimeFetchEvent} event Fetch event to route through PHP when eligible. + * @returns {Promise|undefined} Response promise when the request is handled by PHP. + */ handleFetchEvent(event) { const url = new URL(event.request.url); @@ -314,7 +475,7 @@ export class PhpCgiBase .map(url => url.pathname); isWhitelisted = url.pathname.substr(0, prefix.length) === prefix && url.hostname === self.location.hostname; - isBlacklisted = url.pathname.match(/\.wasm$/i) + isBlacklisted = !!url.pathname.match(/\.wasm$/i) || staticUrls.includes(url.pathname) || (this.exclude.findIndex(exclude => url.pathname.substr(0, exclude.length) === exclude) > -1) || false; @@ -322,7 +483,7 @@ export class PhpCgiBase else { isWhitelisted = url.pathname.substr(0, prefix.length) === prefix; - isBlacklisted = url.pathname.match(/\.wasm$/i) + isBlacklisted = !!url.pathname.match(/\.wasm$/i) || (this.exclude.findIndex(exclude => url.pathname.substr(0, exclude.length) === exclude) > -1) || false; } @@ -330,11 +491,23 @@ export class PhpCgiBase if(isWhitelisted && !isBlacklisted) { requestTimes.set(event.request, Date.now()); - const response = this.request(event.request); - return event.respondWith(response); + const response = Promise.resolve(this.request(event.request)).then(response => { + return response instanceof Response + ? response + : new Response(String(response ?? '404 - Not Found.'), {status: 404}); + }); + event.respondWith(response); + return response; } } + /** + * Schedules an async CGI operation on the runtime queue. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ async _enqueue(callback, params = [], readOnly = false) { let accept, reject; @@ -357,14 +530,15 @@ export class PhpCgiBase return coordinator; } + /** + * Recreates the underlying CGI PHP module instance. + * @returns {Promise} Deferred PHP module instance. + */ refresh() { - // const {files, libs, urlLibs} = resolveDependencies(this.sharedLibs, this); const {files: sharedLibFiles, libs: sharedLibs, urlLibs: sharedLibUrls} = resolveDependencies(this.sharedLibs, this); const {files: dynamicLibFiles, libs: dynamicLibs, urlLibs: dynamicLibUrls} = resolveDependencies(this.dynamicLibs, this); - const files = [...sharedLibFiles, ...dynamicLibFiles]; - const userLocateFile = this.phpArgs.locateFile || (() => undefined); const locateFile = (path, directory) => { @@ -376,22 +550,33 @@ export class PhpCgiBase if(sharedLibUrls[path]) { - if(sharedLibUrls[path].protocol === 'file:') + const sharedLibUrl = new URL(String(sharedLibUrls[path]), globalThis.location?.href); + + if(sharedLibUrl.protocol === 'file:') { - return sharedLibUrls[path].pathname; + return sharedLibUrl.pathname; } - return String(sharedLibUrls[path]); + return String(sharedLibUrl); } if(dynamicLibUrls[path]) { - if(dynamicLibUrls[path].protocol === 'file:') + const dynamicLibUrl = new URL(String(dynamicLibUrls[path]), globalThis.location?.href); + + if(dynamicLibUrl.protocol === 'file:') { - return dynamicLibUrls[path].pathname; + return dynamicLibUrl.pathname; } - return String(dynamicLibUrls[path]); + return String(dynamicLibUrl); + } + + // Suppress attempt to load libxml when + // it hasn't been provided in sharedLibs + if(path === 'libxml2.so') + { + return 'data:,'; } }; @@ -406,7 +591,7 @@ export class PhpCgiBase , locateFile }; - return this.binary = this.binLoader.then({default: PHP}).then(async php => { + return this.binary = this.binLoader.then(({default: PHP}) => new PHP(phpArgs)).then(async php => { await php.ccall( 'pib_storage_init' , NUM @@ -420,17 +605,19 @@ export class PhpCgiBase php.FS.mkdir('/preload'); } - const allFiles = this.files.concat(files).concat(sharedLibFiles).concat(dynamicLibFiles); + const allFiles = this.files.concat(sharedLibFiles).concat(dynamicLibFiles); // Make sure folder structure exists before preloading files allFiles.forEach(fileDef => { const segments = fileDef.parent.split('/'); let currentPath = ''; - for (const segment of segments) { - if (!segment) continue; + for(const segment of segments) + { + if(!segment) continue; currentPath += segment + '/'; - if (!php.FS.analyzePath(currentPath).exists) { + if(!php.FS.analyzePath(currentPath).exists) + { php.FS.mkdir(currentPath); } } @@ -476,12 +663,25 @@ export class PhpCgiBase }); } + /** + * Runs before each PHP request. + * @returns {Promise} Resolves when any request pre-work has completed. + */ async _beforeRequest() {} + /** + * Runs after each successful PHP request. + * @returns {Promise} Resolves when any request cleanup has completed. + */ async _afterRequest() {} + /** + * Serves a request through the CGI runtime. + * @param {RuntimeRequest} request Request to serve through the CGI runtime. + * @returns {Promise} The generated response or custom not-found result. + */ async request(request) { const { @@ -528,10 +728,13 @@ export class PhpCgiBase } const rewrite = this.rewrite(url.pathname); + const rewritePath = typeof rewrite === 'string' + ? rewrite + : rewrite?.path ?? url.pathname; let scriptName, path; - if(typeof rewrite === 'object') + if(rewrite && typeof rewrite === 'object') { scriptName = rewrite.scriptName; path = docroot + rewrite.path; @@ -539,7 +742,7 @@ export class PhpCgiBase else { - path = joinPaths(docroot, rewrite.substr((vHostPrefix || this.prefix).length)); + path = joinPaths(docroot, rewritePath.substr((vHostPrefix || this.prefix).length)); scriptName = path; } @@ -553,7 +756,7 @@ export class PhpCgiBase } else { - scriptName = joinPaths(vHostPrefix, rewrite.substr(vHostPrefix.length)); + scriptName = joinPaths(vHostPrefix, rewritePath.substr(vHostPrefix.length)); } } @@ -566,8 +769,8 @@ export class PhpCgiBase if(aboutPath.exists && php.FS.isFile(aboutPath.object.mode)) { // Return static file - const response = new Response(php.FS.readFile(path, { encoding: 'binary', url }), {}); - response.headers.append('x-php-wasm-cache-time', new Date().getTime()); + const response = new Response(php.FS.readFile(path, {encoding: 'binary'}), {}); + response.headers.append('x-php-wasm-cache-time', String(new Date().getTime())); if(extension in this.types) { response.headers.append('Content-type', this.types[extension]); @@ -582,7 +785,7 @@ export class PhpCgiBase } else if(aboutPath.exists && php.FS.isDir(aboutPath.object.mode) && '/' !== originalPath[ -1 + originalPath.length ]) { - originalPath += '/' + originalPath += '/'; } // Rewrite to entrypoint or index.php @@ -590,7 +793,7 @@ export class PhpCgiBase } // Ensure query parameters are preserved. - originalPath += url.search + originalPath += url.search; if(this.maxRequestAge > 0 && Date.now() - requestTimes.get(request) > this.maxRequestAge) { @@ -608,9 +811,9 @@ export class PhpCgiBase if(rawResponse) { - return rawResponse instanceof Response + return typeof rawResponse === 'object' ? rawResponse - : new Response(rawResponse, {status: 404}); + : new Response(String(rawResponse), {status: 404}); } } @@ -618,13 +821,17 @@ export class PhpCgiBase try { + const requestLock = globalThis.navigator?.locks?.request + ? callback => globalThis.navigator.locks.request('php-wasm-request-lock', callback) + : callback => callback(); + // We need "return await" otherwise the finally block will run before the lock releases. - return await navigator.locks.request('php-wasm-request-lock', async () => { - this.input = ['POST', 'PUT', 'PATCH'].includes(method) ? post.split('') : []; + return await requestLock(async () => { + this.input = ['POST', 'PUT', 'PATCH'].includes(method) ? String(post ?? '').split('') : []; this.output = []; this.error = []; - const selfUrl = new URL(globalThis.location || request.url); + const selfUrl = new URL(String(globalThis.location || request.url)); putEnv(php, 'PHP_VERSION', this.phpVersion); putEnv(php, 'PHP_INI_SCAN_DIR', `/config:/preload:${docroot}`); @@ -658,13 +865,13 @@ export class PhpCgiBase this.output = []; - exitCode = await php.ccall( + exitCode = Number(await php.ccall( 'main' , 'number' , ['number', 'string'] , [] , {async: true} - ); + )); ++this.count; @@ -674,7 +881,7 @@ export class PhpCgiBase if(parsedResponse.headers.has('Status')) { - status = parsedResponse.headers.get('Status').substr(0, 3); + status = Number(parsedResponse.headers.get('Status').substr(0, 3)); } for(const rawCookie of parsedResponse.headers.getSetCookie()) @@ -703,14 +910,14 @@ export class PhpCgiBase headers.set('Location', parsedResponse.headers.get('Location')); } - const response = new Response(parsedResponse.body || '', { status, headers, url }); + const response = new Response(parsedResponse.body || '', {status, headers}); this.onRequest(request, response); return response; }); } - catch (error) + catch(error) { console.error(error); @@ -748,56 +955,115 @@ export class PhpCgiBase } } + /** + * Inspects a path in the CGI virtual filesystem. + * @param {string} path Filesystem path to inspect. + * @returns {Promise} Filesystem analysis details for the path. + */ analyzePath(path) { return this._enqueue(fsOps.analyzePath, [this.binary, path]); } + /** + * Lists a directory in the CGI virtual filesystem. + * @param {string} path Directory path to list. + * @returns {Promise} Directory entries for the path. + */ readdir(path) { return this._enqueue(fsOps.readdir, [this.binary, path]); } + /** + * Reads a file from the CGI virtual filesystem. + * @param {string} path File path to read. + * @param {object} options Read options forwarded to Emscripten FS. + * @returns {Promise} File contents for the requested path. + */ readFile(path, options) { return this._enqueue(fsOps.readFile, [this.binary, path, options]); } + /** + * Returns file metadata for a CGI virtual filesystem path. + * @param {string} path Filesystem path to stat. + * @returns {Promise} File metadata for the path. + */ stat(path) { return this._enqueue(fsOps.stat, [this.binary, path]); } + /** + * Creates a directory in the CGI virtual filesystem. + * @param {string} path Directory path to create. + * @returns {Promise} Metadata for the created directory. + */ mkdir(path) { return this._enqueue(fsOps.mkdir, [this.binary, path]); } + /** + * Removes a directory from the CGI virtual filesystem. + * @param {string} path Directory path to remove. + * @returns {Promise} Resolves when the directory has been removed. + */ rmdir(path) { return this._enqueue(fsOps.rmdir, [this.binary, path]); } + /** + * Renames a path in the CGI virtual filesystem. + * @param {string} path Existing filesystem path. + * @param {string} newPath Destination filesystem path. + * @returns {Promise} Resolves when the path has been renamed. + */ rename(path, newPath) { return this._enqueue(fsOps.rename, [this.binary, path, newPath]); } + /** + * Writes data to a file in the CGI virtual filesystem. + * @param {string} path File path to write. + * @param {string|Uint8Array} data Data to persist. + * @param {object} options Write options forwarded to Emscripten FS. + * @returns {Promise} Resolves when the file has been written. + */ writeFile(path, data, options) { return this._enqueue(fsOps.writeFile, [this.binary, path, data, options]); } + /** + * Deletes a file from the CGI virtual filesystem. + * @param {string} path File path to remove. + * @returns {Promise} Resolves when the file has been removed. + */ unlink(path) { return this._enqueue(fsOps.unlink, [this.binary, path]); } + /** + * Sets an environment variable inside the CGI runtime. + * @param {string} name Environment variable name. + * @param {string} value Environment variable value. + * @returns {Promise} Native return code from the underlying `putenv` call. + */ async putEnv(name, value) { return (await this.binary).ccall('wasm_sapi_cgi_putenv', 'number', ['string', 'string'], [name, value]); } + /** + * Returns the current CGI runtime settings. + * @returns {Promise} Current runtime settings exposed over the control API. + */ async getSettings() { return { @@ -809,6 +1075,15 @@ export class PhpCgiBase }; } + /** + * Merges new settings into the CGI runtime configuration. + * @param {object} options Settings to merge into the current runtime configuration. + * @param {string} options.docroot Updated document root. + * @param {number} options.maxRequestAge Updated request timeout threshold in milliseconds. + * @param {number} options.staticCacheTime Updated static cache lifetime in milliseconds. + * @param {number} options.dynamicCacheTime Updated dynamic cache lifetime in milliseconds. + * @param {PhpVhostList} options.vHosts Updated virtual host definitions. + */ setSettings({docroot, maxRequestAge, staticCacheTime, dynamicCacheTime, vHosts}) { this.docroot = docroot ?? this.docroot; @@ -818,11 +1093,19 @@ export class PhpCgiBase this.vHosts = vHosts ?? this.vHosts; } + /** + * Returns a copy of the configured CGI environment variables. + * @returns {Promise} A shallow copy of the configured environment variables. + */ async getEnvs() { return {...this.env}; } + /** + * Replaces the CGI runtime environment variable map. + * @param {{[key: string]: string}} env Environment variables to replace on the runtime. + */ setEnvs(env) { for(const key of Object.keys(this.env)) @@ -833,6 +1116,10 @@ export class PhpCgiBase Object.assign(this.env, env); } + /** + * Persists the current CGI settings and environment to disk. + * @returns {Promise} Resolves after the current runtime settings are persisted. + */ async storeInit() { const settings = await this.getSettings(); @@ -844,6 +1131,10 @@ export class PhpCgiBase ); } + /** + * Loads persisted CGI settings and environment from disk. + * @param {object} binary PHP module instance whose virtual FS may contain persisted init data. + */ loadInit(binary) { const initPath = '/config/init.json'; diff --git a/source/PhpCgiNode.js b/source/PhpCgiNode.js deleted file mode 100644 index bc187ce9a..000000000 --- a/source/PhpCgiNode.js +++ /dev/null @@ -1,60 +0,0 @@ -import { PhpCgiBase } from './PhpCgiBase'; -import path from 'node:path'; -import url from 'node:url'; -import fs from 'node:fs'; - -const defaultVersion = '8.4'; - -export class PhpCgiNode extends PhpCgiBase -{ - constructor({docroot, prefix, rewrite, cookies, types, onRequest, notFound, version, ...args} = {}) - { - const locateFile = (name, dir) => { - if(name.substr(0, 7) === 'file://') - { - name = new URL(name).pathname; - } - - if(dir === '') - { - if(typeof __dirname === 'undefined') - { - dir = path.dirname(url.fileURLToPath(import.meta.url)); - } - else - { - dir = __dirname; - } - } - - const located = path.resolve(path.format({dir, name})); - - if(fs.existsSync(located)) - { - return located; - } - }; - - version = version ?? defaultVersion - - super( - import(`./php${version}-cgi-node.mjs`) - , {docroot, prefix, rewrite, cookies, types, onRequest, notFound, version, locateFile, ...args} - ); - } - - async request(request) - { - const protocol = request.connection.encrypted ? 'https://' : 'http://'; - - request.url = new URL(protocol + request.headers.host + request.url); - - request.headers = new Map(Object.entries(request.headers)); - - const response = await super.request(request); - - console.error(`[${new Date().toLocaleString()}] [HTTP ${response.status}] ${String(request.method).padStart(5,' ')} ${request.url}`); - - return response; - } -} diff --git a/source/PhpCgiNode.mjs b/source/PhpCgiNode.mjs new file mode 100644 index 000000000..d4e425ff8 --- /dev/null +++ b/source/PhpCgiNode.mjs @@ -0,0 +1,129 @@ +import { PhpCgiBase } from './PhpCgiBase.mjs'; +import path from 'node:path'; +import url from 'node:url'; +import fs from 'node:fs'; + +const defaultVersion = '8.4'; +const normalizeRuntimeModule = runtime => runtime && typeof runtime === 'object' && 'default' in runtime + ? runtime + : {default: runtime}; + +const loadRuntime = specifier => { + if(typeof require === 'function') + { + return Promise.resolve( + normalizeRuntimeModule(require(specifier.replace(/\.mjs$/, '.js'))) + ); + } + + return import(specifier).then(normalizeRuntimeModule); +}; + +/** @import { PhpCgiRuntimeArgs } from 'php-cgi-wasm/public' */ + +/** + * Node.js-hosted PHP CGI wrapper. + */ +export class PhpCgiNode extends PhpCgiBase +{ + /** + * Creates a Node.js-hosted PHP CGI runtime. + * @param {PhpCgiRuntimeArgs} [options] Runtime configuration. + */ + constructor({docroot, prefix, rewrite, cookies, types, onRequest, notFound, version, ...args} = {}) + { + const locateFile = (name, dir) => { + if(name.substr(0, 7) === 'file://') + { + name = new URL(name).pathname; + } + + if(dir === '') + { + if(typeof __dirname === 'undefined') + { + dir = path.dirname(url.fileURLToPath(import.meta.url)); + } + else + { + dir = __dirname; + } + } + + const located = path.resolve(path.format({dir, name})); + + if(fs.existsSync(located)) + { + return located; + } + }; + + version = version ?? defaultVersion; + + const constructorArgs = {docroot, prefix, rewrite, cookies, types, onRequest, notFound, version, locateFile, ...args}; + + switch(version) + { + case '8.5': + super(loadRuntime('./php8.5-cgi-node.mjs'), constructorArgs); + break; + + case '8.4': + super(loadRuntime('./php8.4-cgi-node.mjs'), constructorArgs); + break; + + case '8.3': + super(loadRuntime('./php8.3-cgi-node.mjs'), constructorArgs); + break; + + case '8.2': + super(loadRuntime('./php8.2-cgi-node.mjs'), constructorArgs); + break; + + case '8.1': + super(loadRuntime('./php8.1-cgi-node.mjs'), constructorArgs); + break; + + case '8.0': + super(loadRuntime('./php8.0-cgi-node.mjs'), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + } + + /** + * Adapts a Node HTTP request for the shared CGI request handler. + * @param {RuntimeRequest} request Incoming HTTP request. + * @returns {Promise} Response generated by the PHP runtime. + */ + async request(request) + { + const protocol = ('connection' in request && request.connection?.encrypted) || ('socket' in request && request.socket?.encrypted) + ? 'https://' + : 'http://'; + const host = request.headers instanceof Map + ? request.headers.get('host') + : request.headers instanceof Headers + ? request.headers.get('host') + : request.headers?.host; + const requestUrl = new URL(protocol + host + request.url); + const headers = request.headers instanceof Map + ? request.headers + : new Map(Object.entries(request.headers instanceof Headers + ? Object.fromEntries(request.headers.entries()) + : request.headers + )); + const normalizedRequest = {...request, url: requestUrl, headers}; + + const response = await super.request(normalizedRequest); + + if(response instanceof Response) + { + console.error(`[${new Date().toLocaleString()}] [HTTP ${response.status}] ${String(request.method).padStart(5,' ')} ${requestUrl}`); + } + + return response; + } +} diff --git a/source/PhpCgiShell.js b/source/PhpCgiShell.js deleted file mode 100644 index 9be1d2fa3..000000000 --- a/source/PhpCgiShell.js +++ /dev/null @@ -1,14 +0,0 @@ -import { PhpCgiBase } from './PhpCgiBase'; - -const defaultVersion = '8.4'; - -export class PhpCgiShell extends PhpCgiBase -{ - constructor({docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) - { - super( - import(`./php${version ?? defaultVersion}-cgi-shell.mjs`) - , {docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} - ); - } -} diff --git a/source/PhpCgiWeb.js b/source/PhpCgiWeb.js deleted file mode 100644 index 99b4b7d85..000000000 --- a/source/PhpCgiWeb.js +++ /dev/null @@ -1,14 +0,0 @@ -import { PhpCgiWebBase } from './PhpCgiWebBase'; - -const defaultVersion = '8.4'; - -export class PhpCgiWeb extends PhpCgiWebBase -{ - constructor({version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) - { - super( - import(`./php${version ?? defaultVersion}-cgi-web.mjs`) - , {docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} - ); - } -} diff --git a/source/PhpCgiWeb.mjs b/source/PhpCgiWeb.mjs new file mode 100644 index 000000000..1c167bf47 --- /dev/null +++ b/source/PhpCgiWeb.mjs @@ -0,0 +1,52 @@ +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; + +const defaultVersion = '8.4'; + +/** @import { PhpCgiRuntimeArgs } from 'php-cgi-wasm/public' */ + +/** + * Browser-hosted PHP CGI wrapper. + */ +export class PhpCgiWeb extends PhpCgiWebBase +{ + /** + * Creates a browser-hosted PHP CGI runtime. + * @param {PhpCgiRuntimeArgs} [options] Runtime configuration. + */ + constructor({version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) + { + version = version ?? defaultVersion; + + const constructorArgs = {version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args}; + + switch(version) + { + case '8.5': + super(import(`./php8.5-cgi-web.mjs`), constructorArgs); + break; + + case '8.4': + super(import(`./php8.4-cgi-web.mjs`), constructorArgs); + break; + + case '8.3': + super(import(`./php8.3-cgi-web.mjs`), constructorArgs); + break; + + case '8.2': + super(import(`./php8.2-cgi-web.mjs`), constructorArgs); + break; + + case '8.1': + super(import(`./php8.1-cgi-web.mjs`), constructorArgs); + break; + + case '8.0': + super(import(`./php8.0-cgi-web.mjs`), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + } +} diff --git a/source/PhpCgiWebBase.js b/source/PhpCgiWebBase.mjs similarity index 73% rename from source/PhpCgiWebBase.js rename to source/PhpCgiWebBase.mjs index d735538f6..59c05d41e 100644 --- a/source/PhpCgiWebBase.js +++ b/source/PhpCgiWebBase.mjs @@ -1,22 +1,38 @@ -import { PhpCgiBase } from './PhpCgiBase'; -import { commitTransaction, startTransaction } from './webTransactions'; -import { resolveDependencies } from './resolveDependencies'; +import { PhpCgiBase } from './PhpCgiBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; +import { resolveDependencies } from './resolveDependencies.mjs'; const STR = 'string'; const NUM = 'number'; +/** + * Browser-specific CGI wrapper with FS transaction support. + */ export class PhpCgiWebBase extends PhpCgiBase { + /** + * Starts a persisted browser transaction for CGI requests. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ startTransaction() { return startTransaction(this); } + /** + * Commits a persisted browser transaction for CGI requests. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ commitTransaction(readOnly = false) { return commitTransaction(this, readOnly); } + /** + * Hydrates the persisted CGI filesystem before handling a request. + * @returns {Promise} Resolves after the persisted filesystem has been loaded. + */ async _beforeRequest() { if(!this.initialized) @@ -34,6 +50,10 @@ export class PhpCgiWebBase extends PhpCgiBase this.initialized = true; } + /** + * Flushes pending CGI filesystem changes after a request. + * @returns {Promise} Resolves after pending filesystem changes have been flushed. + */ async _afterRequest() { @@ -52,6 +72,10 @@ export class PhpCgiWebBase extends PhpCgiBase }); } + /** + * Recreates the browser-side CGI runtime promise. + * @returns {Promise} Rebuilds the browser-side PHP runtime promise. + */ refresh() { const {files: sharedLibFiles, libs: sharedLibs, urlLibs: sharedLibUrls} = resolveDependencies(this.sharedLibs, this); @@ -111,11 +135,13 @@ export class PhpCgiWebBase extends PhpCgiBase allFiles.forEach(fileDef => { const segments = fileDef.parent.split('/'); let currentPath = ''; - for (const segment of segments) { - if (!segment) continue; + for(const segment of segments) + { + if(!segment) continue; currentPath += segment + '/'; - if (!php.FS.analyzePath(currentPath).exists) { + if(!php.FS.analyzePath(currentPath).exists) + { php.FS.mkdir(currentPath); } } @@ -167,8 +193,17 @@ export class PhpCgiWebBase extends PhpCgiBase return php; }); + + return this.binary; } + /** + * Serializes async CGI operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ async _enqueue(callback, params = [], readOnly = false) { let accept, reject; @@ -195,7 +230,7 @@ export class PhpCgiWebBase extends PhpCgiBase { await new Promise(a => setTimeout(a, 5)); } - } while(this.queue.length) + } while(this.queue.length); await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); }); diff --git a/source/PhpCgiWebview.js b/source/PhpCgiWebview.js deleted file mode 100644 index c1385223e..000000000 --- a/source/PhpCgiWebview.js +++ /dev/null @@ -1,14 +0,0 @@ -import { PhpCgiWebBase } from './PhpCgiWebBase'; - -const defaultVersion = '8.4'; - -export class PhpCgiWebview extends PhpCgiWebBase -{ - constructor({docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) - { - super( - import(`./php${version ?? defaultVersion}-cgi-webview.mjs`) - , {docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} - ); - } -} diff --git a/source/PhpCgiWebview.mjs b/source/PhpCgiWebview.mjs new file mode 100644 index 000000000..8540f7150 --- /dev/null +++ b/source/PhpCgiWebview.mjs @@ -0,0 +1,50 @@ +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; + +const defaultVersion = '8.4'; + +/** @import { PhpCgiRuntimeArgs } from 'php-cgi-wasm/public' */ + +/** + * WebView-hosted PHP CGI wrapper. + */ +export class PhpCgiWebview extends PhpCgiWebBase +{ + /** + * Creates a WebView-hosted PHP CGI runtime. + * @param {PhpCgiRuntimeArgs} [options] Runtime configuration. + */ + constructor({docroot, prefix, rewrite, cookies, types, onRequest, notFound, version = defaultVersion, ...args} = {}) + { + const constructorArgs = {version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args}; + + switch(version) + { + case '8.5': + super(import(`./php8.5-cgi-webview.mjs`), constructorArgs); + break; + + case '8.4': + super(import(`./php8.4-cgi-webview.mjs`), constructorArgs); + break; + + case '8.3': + super(import(`./php8.3-cgi-webview.mjs`), constructorArgs); + break; + + case '8.2': + super(import(`./php8.2-cgi-webview.mjs`), constructorArgs); + break; + + case '8.1': + super(import(`./php8.1-cgi-webview.mjs`), constructorArgs); + break; + + case '8.0': + super(import(`./php8.0-cgi-webview.mjs`), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + } +} diff --git a/source/PhpCgiWorker.js b/source/PhpCgiWorker.js deleted file mode 100644 index a971f4450..000000000 --- a/source/PhpCgiWorker.js +++ /dev/null @@ -1,14 +0,0 @@ -import { PhpCgiWebBase } from './PhpCgiWebBase'; - -const defaultVersion = '8.4'; - -export class PhpCgiWorker extends PhpCgiWebBase -{ - constructor({version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) - { - super( - import(`./php${version ?? defaultVersion}-cgi-worker.mjs`) - , {version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} - ); - } -} diff --git a/source/PhpCgiWorker.mjs b/source/PhpCgiWorker.mjs new file mode 100644 index 000000000..10150fab4 --- /dev/null +++ b/source/PhpCgiWorker.mjs @@ -0,0 +1,44 @@ +import { PhpCgiWebBase } from './PhpCgiWebBase.mjs'; +import Php80CgiWorker from './php8.0-cgi-worker.mjs'; +import Php81CgiWorker from './php8.1-cgi-worker.mjs'; +import Php82CgiWorker from './php8.2-cgi-worker.mjs'; +import Php83CgiWorker from './php8.3-cgi-worker.mjs'; +import Php84CgiWorker from './php8.4-cgi-worker.mjs'; +import Php85CgiWorker from './php8.5-cgi-worker.mjs'; + +const defaultVersion = '8.4'; +const runtimes = { + '8.0': Php80CgiWorker + , '8.1': Php81CgiWorker + , '8.2': Php82CgiWorker + , '8.3': Php83CgiWorker + , '8.4': Php84CgiWorker + , '8.5': Php85CgiWorker +}; + +/** @import { PhpCgiRuntimeArgs } from 'php-cgi-wasm/public' */ + +/** + * Worker-hosted PHP CGI wrapper. + */ +export class PhpCgiWorker extends PhpCgiWebBase +{ + /** + * Creates a worker-hosted PHP CGI runtime. + * @param {PhpCgiRuntimeArgs} [options] Runtime configuration. + */ + constructor({version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args} = {}) + { + version = version ?? defaultVersion; + + const constructorArgs = {version, docroot, prefix, rewrite, cookies, types, onRequest, notFound, ...args}; + const runtime = runtimes[version]; + + if(!runtime) + { + throw new Error(`Unsupported PHP runtime: ${version}`); + } + + super(Promise.resolve({default: runtime}), constructorArgs); + } +} diff --git a/source/PhpCliNode.mjs b/source/PhpCliNode.mjs new file mode 100644 index 000000000..789cefcd1 --- /dev/null +++ b/source/PhpCliNode.mjs @@ -0,0 +1,214 @@ +import { PhpBase } from './PhpBase.mjs'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; + +const NUM = 'number'; +const SUPPORTED_VERSIONS = new Set(['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']); +const defaultVersion = /** @type {PhpRuntimeVersion} */ ( + SUPPORTED_VERSIONS.has(process.env.PHP_VERSION ?? '') + ? process.env.PHP_VERSION + : '8.4' +); +const normalizeRuntimeModule = runtime => runtime && typeof runtime === 'object' && 'default' in runtime + ? runtime + : {default: runtime}; + +const loadRuntime = specifier => { + if(typeof require === 'function') + { + return Promise.resolve( + normalizeRuntimeModule(require(specifier.replace(/\.mjs$/, '.js'))) + ); + } + + return import(specifier).then(normalizeRuntimeModule); +}; + +const createLocateFile = () => (name, dir) => { + if(name.startsWith('file://')) + { + name = new URL(name).pathname; + } + + if(dir === '') + { + if(typeof __dirname === 'undefined') + { + dir = path.dirname(url.fileURLToPath(import.meta.url)); + } + else + { + dir = __dirname; + } + } + + const located = path.resolve(path.format({dir, name})); + + if(fs.existsSync(located)) + { + return located; + } +}; + +/** + * Node.js-hosted PHP CLI wrapper. + */ +export class PhpCliNode extends PhpBase +{ + /** + * Creates a Node.js-hosted PHP CLI runtime. + * @param {PhpRuntimeArgs} args CLI runtime configuration. + */ + constructor(args = {}) + { + const version = /** @type {PhpRuntimeVersion} */ (args.version ?? defaultVersion); + const constructorArgs = {locateFile: createLocateFile(), version, ...args}; + + switch(version) + { + case '8.5': + super(loadRuntime('./php8.5-cli-node.mjs'), constructorArgs, 'cli'); + break; + + case '8.4': + super(loadRuntime('./php8.4-cli-node.mjs'), constructorArgs, 'cli'); + break; + + case '8.3': + super(loadRuntime('./php8.3-cli-node.mjs'), constructorArgs, 'cli'); + break; + + case '8.2': + super(loadRuntime('./php8.2-cli-node.mjs'), constructorArgs, 'cli'); + break; + + case '8.1': + super(loadRuntime('./php8.1-cli-node.mjs'), constructorArgs, 'cli'); + break; + + case '8.0': + super(loadRuntime('./php8.0-cli-node.mjs'), constructorArgs, 'cli'); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + + this.interactive = false; + + if(constructorArgs.interactive) + { + this.interactive = true; + } + else if(constructorArgs.script) + { + this.script = constructorArgs.script; + } + else if(constructorArgs.code) + { + this.code = constructorArgs.code; + } + + this.binary = this.binary.then((php) => { + php.inputDataQueue = []; + php.awaitingInput = null; + php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')); + this.addEventListener('stdin-request', async () => this.flush()); + return php; + }); + } + + /** + * Queues a line of input for the interactive CLI session. + * @param {string} line Input line to send to the interactive CLI process. + * @returns {Promise} Resolves after the input has been queued. + */ + async provideInput(line) + { + const php = await this.binary; + + php.inputDataQueue.push(line + '\n'); + + if(php.awaitingInput) + { + php.awaitingInput(php.inputDataQueue.shift()); + php.awaitingInput = null; + } + } + + /** + * Builds CLI flags and queues the main PHP CLI process. + * @param {string[]} flags CLI flags to pass to the PHP process. + * @returns {Promise} Resolves with the PHP process exit status. + */ + run(flags = []) + { + const cliFlags = [...flags]; + + if(this.interactive) + { + cliFlags.push('-a'); + } + else if(this.script) + { + cliFlags.push('-f', this.script); + } + else if(this.code) + { + cliFlags.push('-r', this.code); + } + + return this._enqueue( + /** + * Executes queued CLI flags. + * @param {...PhpQueueParam} params Queued CLI flag payload. + * @returns {Promise} Resolves with the CLI execution result. + */ + (...params) => this._run(/** @type {string[]} */ (params[0] ?? [])), + [cliFlags] + ); + } + + /** + * Executes the PHP CLI binary with a prepared flag list. + * @param {string[]} flags CLI flags to pass to the PHP process. + * @returns {Promise} Resolves with the PHP process exit status. + */ + async _run(flags = []) + { + const php = await this.binary; + const cmd = ['php', '-c', '/php.ini', ...flags]; + const ptrs = cmd.map(part => { + const len = php.lengthBytesUTF8(part) + 1; + const loc = php._malloc(len); + php.stringToUTF8(part, loc, len); + return loc; + }); + const arLoc = php._malloc(4 * ptrs.length); + + for(const [index, ptr] of ptrs.entries()) + { + php.setValue(arLoc + 4 * index, ptr, '*'); + } + + try + { + return await php.ccall( + 'main' + , NUM + , [NUM, NUM] + , [ptrs.length, arLoc] + , {async: true} + ); + } + catch(error) + { + return error.status; + } + finally + { + this.flush(); + } + } +} diff --git a/source/PhpCliWeb.js b/source/PhpCliWeb.js deleted file mode 100644 index 40163bfbc..000000000 --- a/source/PhpCliWeb.js +++ /dev/null @@ -1,176 +0,0 @@ -import { PhpBase } from './PhpBase'; -import { commitTransaction, startTransaction } from './webTransactions'; - -const NUM = 'number'; -const STR = 'string'; - -const defaultVersion = '8.3'; - -export class PhpCliWeb extends PhpBase -{ - constructor(args = {}) - { - super(import(`./php${args.version ?? defaultVersion}-cli-web.mjs`), args, 'cli'); - - this.interactive = false; - - if(args.interactive) - { - this.interactive = true; - } - else if(args.script) - { - this.script = args.script; - } - else if(args.code) - { - this.code = args.code; - } - - this.binary = this.binary.then((php) => { - php.inputDataQueue = []; - php.awaitingInput = null; - php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')) - this.addEventListener('stdin-request', async () => this.flush()); - return php; - }); - } - - startTransaction() - { - return startTransaction(this); - } - - commitTransaction(readOnly = false) - { - return commitTransaction(this, readOnly); - } - - async provideInput(line) - { - const php = await this.binary; - await this.startTransaction(); - - php.inputDataQueue.push(line + '\n'); - - if(php.awaitingInput) - { - php.awaitingInput( php.inputDataQueue.shift() ); - php.awaitingInput = null; - } - } - - run(flags = []) - { - if(this.interactive) - { - flags.push('-a'); - } - else if(this.script) - { - flags.push('-f', this.script); - } - else if(this.code) - { - flags.push('-r', this.code); - } - - return this._enqueue(phpCode => this._run(phpCode), [flags]); - } - - async _run(flags = []) - { - const php = (await this.binary); - - const cmd = ['php', '-c', '/php.ini', ...flags]; - - const ptrs = cmd.map(part => { - const len = php.lengthBytesUTF8(part) + 1; - const loc = php._malloc(len); - php.stringToUTF8(part, loc, len); - return loc; - }); - - const arLoc = php._malloc(4 * ptrs.length); - - for(const i in ptrs) - { - php.setValue(arLoc + 4 * i, ptrs[i], '*'); - } - - try - { - return await php.ccall( - 'main' - , NUM - , [NUM, NUM] - , [ptrs.length, arLoc] - , {async: true} - ); - } - catch(error) - { - // if(!('status' in error ) || error.status !== 0) - // { - // throw error; - // } - - return error.status; - } - finally - { - this.flush(); - // ptrs.forEach(p => php._free(p)); - // php._free(arLoc); - } - } - - async refresh() - { - super.refresh(); - // const php = await this.binary; - // await navigator.locks.request('php-wasm-fs-lock', () => { - // return new Promise((accept, reject) => { - // php.FS.syncfs(true, error => { - // if(error) reject(error); - // else accept(); - // }); - // }); - // }); - } - - async _enqueue(callback, params = [], readOnly = false) - { - await this.binary; - - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - navigator.locks.request('php-wasm-fs-lock', async () => { - if(!this.queue.length) - { - return; - } - - await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); - - do - { - const [callback, params, accept, reject] = this.queue.shift(); - const run = callback(...params); - run.then(accept).catch(reject); - await run; - } while(this.queue.length) - - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - - return coordinator; - } -} diff --git a/source/PhpCliWeb.mjs b/source/PhpCliWeb.mjs new file mode 100644 index 000000000..1d7404702 --- /dev/null +++ b/source/PhpCliWeb.mjs @@ -0,0 +1,257 @@ +import { PhpBase } from './PhpBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; + +const NUM = 'number'; +const STR = 'string'; + +const defaultVersion = '8.3'; + +/** + * Browser-hosted PHP CLI wrapper. + */ +export class PhpCliWeb extends PhpBase +{ + /** + * Creates a browser-hosted PHP CLI runtime. + * @param {PhpRuntimeArgs} args CLI runtime configuration. + */ + constructor(args = {}) + { + const version = args.version ?? defaultVersion; + const constructorArgs = {version, ...args}; + + switch(version) + { + case '8.5': + super(import(`./php8.5-cli-web.mjs`), constructorArgs, 'cli'); + break; + + case '8.4': + super(import(`./php8.4-cli-web.mjs`), constructorArgs, 'cli'); + break; + + case '8.3': + super(import(`./php8.3-cli-web.mjs`), constructorArgs, 'cli'); + break; + + case '8.2': + super(import(`./php8.2-cli-web.mjs`), constructorArgs, 'cli'); + break; + + case '8.1': + super(import(`./php8.1-cli-web.mjs`), constructorArgs, 'cli'); + break; + + case '8.0': + super(import(`./php8.0-cli-web.mjs`), constructorArgs, 'cli'); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + + this.interactive = false; + + if(constructorArgs.interactive) + { + this.interactive = true; + } + else if(constructorArgs.script) + { + this.script = constructorArgs.script; + } + else if(constructorArgs.code) + { + this.code = constructorArgs.code; + } + + this.binary = this.binary.then((php) => { + php.inputDataQueue = []; + php.awaitingInput = null; + php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')); + this.addEventListener('stdin-request', async () => this.flush()); + return php; + }); + } + + /** + * Starts a persisted browser transaction for the CLI runtime. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ + startTransaction() + { + return startTransaction(this); + } + + /** + * Commits a persisted browser transaction for the CLI runtime. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return commitTransaction(this, readOnly); + } + + /** + * Queues a line of input for the interactive CLI session. + * @param {string} line Input line to send to the interactive CLI process. + * @returns {Promise} Resolves after the input has been queued. + */ + async provideInput(line) + { + const php = await this.binary; + await this.startTransaction(); + + php.inputDataQueue.push(line + '\n'); + + if(php.awaitingInput) + { + php.awaitingInput( php.inputDataQueue.shift() ); + php.awaitingInput = null; + } + } + + /** + * Builds CLI flags and queues the main PHP CLI process. + * @param {string[]} flags CLI flags to pass to the PHP process. + * @returns {Promise} Resolves with the PHP process exit status. + */ + run(flags = []) + { + if(this.interactive) + { + flags.push('-a'); + } + else if(this.script) + { + flags.push('-f', this.script); + } + else if(this.code) + { + flags.push('-r', this.code); + } + + return this._enqueue( + /** + * Executes queued CLI flags. + * @param {string[]} phpCode CLI flags queued for execution. + * @returns {Promise} Resolves with the CLI execution result. + */ + phpCode => this._run(phpCode), + [flags] + ); + } + + /** + * Executes the PHP CLI binary with a prepared flag list. + * @param {string[]} flags CLI flags to pass to the PHP process. + * @returns {Promise} Resolves with the PHP process exit status. + */ + async _run(flags = []) + { + const php = (await this.binary); + + const cmd = ['php', '-c', '/php.ini', ...flags]; + + const ptrs = cmd.map(part => { + const len = php.lengthBytesUTF8(part) + 1; + const loc = php._malloc(len); + php.stringToUTF8(part, loc, len); + return loc; + }); + + const arLoc = php._malloc(4 * ptrs.length); + + for(const [i, ptr] of ptrs.entries()) + { + php.setValue(arLoc + 4 * i, ptr, '*'); + } + + try + { + return await php.ccall( + 'main' + , NUM + , [NUM, NUM] + , [ptrs.length, arLoc] + , {async: true} + ); + } + catch(error) + { + // if(!('status' in error ) || error.status !== 0) + // { + // throw error; + // } + + return error.status; + } + finally + { + this.flush(); + // ptrs.forEach(p => php._free(p)); + // php._free(arLoc); + } + } + + /** + * Refreshes the browser-hosted CLI runtime state. + * @returns {Promise} Resolves after the CLI runtime has been refreshed. + */ + async refresh() + { + await super.refresh(); + // const php = await this.binary; + // await navigator.locks.request('php-wasm-fs-lock', () => { + // return new Promise((accept, reject) => { + // php.FS.syncfs(true, error => { + // if(error) reject(error); + // else accept(); + // }); + // }); + // }); + } + + /** + * Serializes async CLI operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + await this.binary; + + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + navigator.locks.request('php-wasm-fs-lock', async () => { + if(!this.queue.length) + { + return; + } + + await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); + + do + { + const [callback, params, accept, reject] = this.queue.shift(); + const run = callback(...params); + run.then(accept).catch(reject); + await run; + } while(this.queue.length); + + await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); + }); + + return coordinator; + } +} diff --git a/source/PhpDbgNode.mjs b/source/PhpDbgNode.mjs new file mode 100644 index 000000000..5e9323248 --- /dev/null +++ b/source/PhpDbgNode.mjs @@ -0,0 +1,528 @@ +import { PhpBase } from './PhpBase.mjs'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; + +const NUM = 'number'; +const STR = 'string'; +const SUPPORTED_VERSIONS = new Set(['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']); +const defaultVersion = /** @type {PhpRuntimeVersion} */ ( + SUPPORTED_VERSIONS.has(process.env.PHP_VERSION ?? '') + ? process.env.PHP_VERSION + : '8.4' +); +const normalizeRuntimeModule = runtime => runtime && typeof runtime === 'object' && 'default' in runtime + ? runtime + : {default: runtime}; + +const loadRuntime = specifier => { + if(typeof require === 'function') + { + return Promise.resolve( + normalizeRuntimeModule(require(specifier.replace(/\.mjs$/, '.js'))) + ); + } + + return import(specifier).then(normalizeRuntimeModule); +}; + +const createLocateFile = () => (name, dir) => { + if(name.startsWith('file://')) + { + name = new URL(name).pathname; + } + + if(dir === '') + { + if(typeof __dirname === 'undefined') + { + dir = path.dirname(url.fileURLToPath(import.meta.url)); + } + else + { + dir = __dirname; + } + } + + const located = path.resolve(path.format({dir, name})); + + if(fs.existsSync(located)) + { + return located; + } +}; + +/** + * Node.js-hosted PHP debugger wrapper. + */ +export class PhpDbgNode extends PhpBase +{ + /** + * Creates a Node.js-hosted PHP debugger runtime. + * @param {PhpRuntimeArgs} args Debug runtime configuration. + */ + constructor(args = {}) + { + const version = /** @type {PhpRuntimeVersion} */ (args.version ?? defaultVersion); + const constructorArgs = {locateFile: createLocateFile(), version, ...args}; + + switch(version) + { + case '8.5': + super(loadRuntime('./php8.5-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + case '8.4': + super(loadRuntime('./php8.4-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + case '8.3': + super(loadRuntime('./php8.3-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + case '8.2': + super(loadRuntime('./php8.2-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + case '8.1': + super(loadRuntime('./php8.1-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + case '8.0': + super(loadRuntime('./php8.0-dbg-node.mjs'), constructorArgs, 'phpdbg'); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + + this.running = false; + this.paused = false; + this.currentFilePtr = null; + this.currentLinePtr = null; + this.bpCountPtr = null; + + this.binary = this.binary.then((php) => { + php.inputDataQueue = []; + php.awaitingInput = null; + php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')); + return php; + }); + } + + /** + * Starts the phpdbg main loop. + * @returns {Promise} Resolves when the debugger main loop starts. + */ + run() + { + return this._main(); + } + + /** + * Queues a line of input for the debugger process. + * @param {string} line Input line to send to the debugger process. + * @returns {Promise} Resolves after the input has been queued. + */ + async provideInput(line) + { + const php = await this.binary; + + php.inputDataQueue.push(line + '\n'); + + if(php.awaitingInput) + { + php.awaitingInput(php.inputDataQueue.shift()); + php.awaitingInput = null; + } + + this.addEventListener('stdin-request', async () => { + this.flush(); + }, {once: true}); + } + + /** + * Launches the phpdbg process and captures native debugger pointers. + * @returns {Promise} Resolves with the debugger process promise. + */ + async _main() + { + const php = await this.binary; + const cmd = ['phpdbg', '-c', '/php.ini', '-e']; + const ptrs = cmd.map(part => { + const len = php.lengthBytesUTF8(part) + 1; + const loc = php._malloc(len); + php.stringToUTF8(part, loc, len); + return loc; + }); + const arLoc = php._malloc(4 * ptrs.length); + + for(const [index, ptr] of ptrs.entries()) + { + php.setValue(arLoc + 4 * index, ptr, '*'); + } + + try + { + const process = php.ccall( + 'main' + , NUM + , [NUM, NUM] + , [ptrs.length, arLoc] + , {async: true} + ); + + this.currentFilePtr = php.ccall( + 'phpdbg_wasm_get_current_file' + , NUM + , [] + , [] + , {} + ); + + this.currentLinePtr = php.ccall( + 'phpdbg_wasm_get_current_line' + , NUM + , [] + , [] + , {} + ); + + this.bpCountPtr = php.ccall( + 'php_wasm_get_bpcount' + , NUM + , [] + , [] + , {} + ); + + return process; + } + finally + { + this.flush(); + } + } + + /** + * Reads the current phpdbg prompt string. + * @returns {Promise} The current phpdbg prompt string. + */ + async getPrompt() + { + const php = await this.binary; + + return php.ccall( + 'phpdbg_get_prompt' + , STR + , [] + , [] + , {} + ); + } + + /** + * Checks whether the debugger is currently executing code. + * @returns {Promise} Non-zero when PHP code is currently executing. + */ + async isExecuting() + { + const php = await this.binary; + + return php.ccall( + 'php_wasm_is_executing' + , NUM + , [] + , [] + , {} + ); + } + + /** + * Checks whether the debugger is inside an active run loop. + * @returns {Promise} Non-zero while a debug run is active. + */ + async isRunning() + { + const php = await this.binary; + + return php.ccall( + 'php_wasm_is_running' + , NUM + , [] + , [] + , {} + ); + } + + /** + * Reads the current file name from the debugger state. + * @returns {Promise} Source file path for the current debugger frame. + */ + async currentFile() + { + const php = await this.binary; + + return php.UTF8ToString(php.getValue(this.currentFilePtr, '*')); + } + + /** + * Reads the current line number from the debugger state. + * @returns {Promise} Source line number for the current debugger frame. + */ + async currentLine() + { + const php = await this.binary; + + return php.getValue(this.currentLinePtr, 'i32'); + } + + /** + * Reads the current breakpoint count from the debugger state. + * @returns {Promise} Number of registered breakpoints. + */ + async bpCount() + { + const php = await this.binary; + + return php.getValue(this.bpCountPtr, 'i32'); + } + + /** + * Dumps local variables from the current debugger frame. + * @returns {Promise} Dumped local symbol table for the current frame. + */ + async dumpVars() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_symbols', NUM, [NUM], [false], {}); + + if(ptr) + { + return this.dumpSymbols(ptr, php); + } + } + + /** + * Dumps global variables from the debugger session. + * @returns {Promise} Dumped global symbol table. + */ + async dumpGlobals() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_symbols', NUM, [NUM], [true], {}); + + if(ptr) + { + return this.dumpSymbols(ptr, php); + } + } + + /** + * Dumps defined constants from the debugger session. + * @returns {Promise} Dumped constant table. + */ + async dumpConstants() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_constants', NUM, [], [], {}); + + if(ptr) + { + return this.dumpSymbols(ptr, php); + } + } + + /** + * Decodes a native symbol dump buffer into a JavaScript object. + * @param {number} ptr Pointer to the native symbol dump buffer. + * @param {object} php PHP module instance used to decode the symbol buffer. + * @returns {object} Decoded symbol table. + */ + dumpSymbols(ptr, php) + { + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + let cur = ptr + pointerLen; + const decoder = new TextDecoder; + const symbols = {}; + + while(cur < end) + { + const zv = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = decoder.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + symbols[name] = php.zvalToJS(zv); + } + + php._free(ptr); + + return symbols; + } + + /** + * Dumps userland functions known to the debugger. + * @returns {Promise} Dumped function metadata indexed by name. + */ + async dumpFunctions() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_functions', NUM, [], [], {}); + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + let cur = ptr + pointerLen; + const decoder = new TextDecoder; + const functions = {}; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = decoder.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = decoder.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + functions[name] = {name, filename, lineNo}; + } + + php._free(ptr); + + return functions; + } + + /** + * Dumps userland classes known to the debugger. + * @returns {Promise} Dumped class metadata indexed by name. + */ + async dumpClasses() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_classes', NUM, [], [], {}); + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + let cur = ptr + pointerLen; + const decoder = new TextDecoder; + const functions = {}; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = decoder.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = decoder.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + functions[name] = {name, filename, lineNo}; + } + + php._free(ptr); + + return functions; + } + + /** + * Dumps the file list known to the debugger. + * @returns {Promise} Dumped list of loaded source files. + */ + async dumpFiles() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_files', NUM, [], [], {}); + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + let cur = ptr + pointerLen; + const decoder = new TextDecoder; + const files = []; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = decoder.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + files.push(filename); + } + + php._free(ptr); + + return files; + } + + /** + * Dumps the current debugger backtrace. + * @returns {Promise>} Stack frames for the current backtrace. + */ + async dumpBacktrace() + { + const php = await this.binary; + const ptr = php.ccall('vrzno_dbg_dump_backtrace', NUM, [], [], {}); + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + let cur = ptr + pointerLen; + const decoder = new TextDecoder; + const frames = []; + let index = 0; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = decoder.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + frames.push({filename, lineNo, frame: index}); + index++; + } + + php._free(ptr); + + return frames; + } + + /** + * Switches the active debugger frame. + * @param {number} frame Stack frame index to select. + * @returns {Promise} Native return code from the frame switch operation. + */ + async switchFrame(frame) + { + const php = await this.binary; + + return php.ccall('vrzno_dbg_switch_frame', NUM, [NUM], [frame], {}); + } +} diff --git a/source/PhpDbgWeb.js b/source/PhpDbgWeb.js deleted file mode 100644 index 4efd9da32..000000000 --- a/source/PhpDbgWeb.js +++ /dev/null @@ -1,211 +0,0 @@ -import { PhpBase } from 'php-wasm/PhpBase'; -import { commitTransaction, startTransaction } from './webTransactions'; - -const NUM = 'number'; -const STR = 'string'; - -const defaultVersion = '8.4'; - -export class PhpDbgWeb extends PhpBase -{ - constructor(args = {}) - { - super(import(`./php${args.version ?? defaultVersion}-dbg-web.mjs`), args, 'phpdbg'); - - this.running = false; - this.paused = false; - this.currentFilePtr = null; - this.currentLinePtr = null; - this.bpCountPtr = null; - - this.binary = this.binary.then((php) => { - console.log(php); - php.inputDataQueue = []; - php.awaitingInput = null; - php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')) - return php; - }); - } - - startTransaction() - { - return startTransaction(this); - } - - commitTransaction(readOnly = false) - { - return commitTransaction(this, readOnly); - } - - run() - { - return this._main(); - // return this._enqueue(() => this._main(), []); - } - - async provideInput(line) - { - const php = await this.binary; - await this.startTransaction(); - - php.inputDataQueue.push(line + '\n'); - - if(php.awaitingInput) - { - php.awaitingInput( php.inputDataQueue.shift() ); - php.awaitingInput = null; - } - - this.addEventListener('stdin-request', async () => { - this.flush(); - }, {once: true}); - - } - - async _main() - { - const php = (await this.binary); - - const cmd = ['phpdbg', '-c', '/php.ini', '-e']; - - const ptrs = cmd.map(part => { - const len = php.lengthBytesUTF8(part) + 1; - const loc = php._malloc(len); - php.stringToUTF8(part, loc, len); - return loc; - }); - - const arLoc = php._malloc(4 * ptrs.length); - - for(const i in ptrs) - { - php.setValue(arLoc + 4 * i, ptrs[i], '*'); - } - - try - { - const process = php.ccall( - 'main' - , NUM - , [NUM, NUM] - , [ptrs.length, arLoc] - , {async: true} - ); - - this.currentFilePtr = php.ccall( - 'phpdbg_wasm_get_current_file' - , NUM - , [] - , [] - , {} - ); - - this.currentLinePtr = php.ccall( - 'phpdbg_wasm_get_current_line' - , NUM - , [] - , [] - , {} - ); - - this.bpCountPtr = php.ccall( - 'php_wasm_get_bpcount' - , NUM - , [] - , [] - , {} - ); - - return process; - } - finally - { - this.flush(); - // ptrs.forEach(p => php._free(p)); - // php._free(arLoc); - } - } - - async getPrompt() - { - const php = await this.binary; - - return php.ccall( - 'phpdbg_get_prompt' - , STR - , [] - , [] - , {} - );; - } - - async currentFile() - { - const php = await this.binary; - - return php.UTF8ToString(php.getValue(this.currentFilePtr, '*')); - } - - async currentLine() - { - const php = await this.binary; - - return php.getValue(this.currentLinePtr, 'i32'); - } - - async bpCount() - { - const php = await this.binary; - - return php.getValue(this.bpCountPtr, 'i32'); - } - - async refresh() - { - // super.refresh(); - // const php = await this.binary; - // await navigator.locks.request('php-wasm-fs-lock', () => { - // return new Promise((accept, reject) => { - // php.FS.syncfs(true, error => { - // if(error) reject(error); - // else accept(); - // }); - // }); - // }); - } - - async _enqueue(callback, params = [], readOnly = false) - { - await this.binary; - - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - navigator.locks.request('php-wasm-fs-lock', async () => { - if(!this.queue.length) - { - return; - } - - await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); - - do - { - const [callback, params, accept, reject] = this.queue.shift(); - const run = callback(...params); - run.then(accept).catch(reject); - await run; - } while(this.queue.length) - - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - - return coordinator; - } -} diff --git a/source/PhpDbgWeb.mjs b/source/PhpDbgWeb.mjs new file mode 100644 index 000000000..12b447fbf --- /dev/null +++ b/source/PhpDbgWeb.mjs @@ -0,0 +1,626 @@ +import { PhpBase } from './PhpBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; + +const NUM = 'number'; +const STR = 'string'; + +const defaultVersion = '8.4'; + +/** + * Browser-hosted PHP debugger wrapper. + */ +export class PhpDbgWeb extends PhpBase +{ + /** + * Creates a browser-hosted PHP debugger runtime. + * @param {PhpRuntimeArgs} args Debug runtime configuration. + */ + constructor(args = {}) + { + const version = args.version ?? defaultVersion; + const constructorArgs = {version, ...args}; + + switch(version) + { + case '8.5': + super(import(`./php8.5-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + case '8.4': + super(import(`./php8.4-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + case '8.3': + super(import(`./php8.3-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + case '8.2': + super(import(`./php8.2-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + case '8.1': + super(import(`./php8.1-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + case '8.0': + super(import(`./php8.0-dbg-web.mjs`), constructorArgs, 'phpdbg'); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${version}`); + } + + this.running = false; + this.paused = false; + this.currentFilePtr = null; + this.currentLinePtr = null; + this.bpCountPtr = null; + + this.binary = this.binary.then((php) => { + php.inputDataQueue = []; + php.awaitingInput = null; + php.triggerStdin = () => this.dispatchEvent(new CustomEvent('stdin-request')); + return php; + }); + } + + /** + * Starts a persisted browser transaction for the debugger runtime. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ + startTransaction() + { + return startTransaction(this); + } + + /** + * Commits a persisted browser transaction for the debugger runtime. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return commitTransaction(this, readOnly); + } + + /** + * Starts the phpdbg main loop. + * @returns {Promise} Resolves when the debugger main loop starts. + */ + run() + { + return this._main(); + // return this._enqueue(() => this._main(), []); + } + + /** + * Queues a line of input for the debugger process. + * @param {string} line Input line to send to the debugger process. + * @returns {Promise} Resolves after the input has been queued. + */ + async provideInput(line) + { + const php = await this.binary; + await this.startTransaction(); + + php.inputDataQueue.push(line + '\n'); + + if(php.awaitingInput) + { + php.awaitingInput(php.inputDataQueue.shift()); + php.awaitingInput = null; + } + + this.addEventListener('stdin-request', async () => { + this.flush(); + }, {once: true}); + + } + + /** + * Launches the phpdbg process and captures native debugger pointers. + * @returns {Promise} Resolves with the debugger process promise. + */ + async _main() + { + const php = (await this.binary); + + const cmd = ['phpdbg', '-c', '/php.ini', '-e']; + + const ptrs = cmd.map(part => { + const len = php.lengthBytesUTF8(part) + 1; + const loc = php._malloc(len); + php.stringToUTF8(part, loc, len); + return loc; + }); + + const arLoc = php._malloc(4 * ptrs.length); + + for(const [i, ptr] of ptrs.entries()) + { + php.setValue(arLoc + 4 * i, ptr, '*'); + } + + try + { + const process = php.ccall( + 'main' + , NUM + , [NUM, NUM] + , [ptrs.length, arLoc] + , {async: true} + ); + + this.currentFilePtr = php.ccall( + 'phpdbg_wasm_get_current_file' + , NUM + , [] + , [] + , {} + ); + + this.currentLinePtr = php.ccall( + 'phpdbg_wasm_get_current_line' + , NUM + , [] + , [] + , {} + ); + + this.bpCountPtr = php.ccall( + 'php_wasm_get_bpcount' + , NUM + , [] + , [] + , {} + ); + + return process; + } + finally + { + this.flush(); + // ptrs.forEach(p => php._free(p)); + // php._free(arLoc); + } + } + + /** + * Reads the current phpdbg prompt string. + * @returns {Promise} The current phpdbg prompt string. + */ + async getPrompt() + { + const php = await this.binary; + + return php.ccall( + 'phpdbg_get_prompt' + , STR + , [] + , [] + , {} + ); + } + + /** + * Checks whether the debugger is currently executing code. + * @returns {Promise} Non-zero when PHP code is currently executing. + */ + async isExecuting() + { + const php = await this.binary; + + return php.ccall( + 'php_wasm_is_executing' + , NUM + , [] + , [] + , {} + ); + } + + /** + * Checks whether the debugger is inside an active run loop. + * @returns {Promise} Non-zero while a debug run is active. + */ + async isRunning() + { + const php = await this.binary; + + return php.ccall( + 'php_wasm_is_running' + , NUM + , [] + , [] + , {} + ); + } + + /** + * Reads the current file name from the debugger state. + * @returns {Promise} Source file path for the current debugger frame. + */ + async currentFile() + { + const php = await this.binary; + + return php.UTF8ToString(php.getValue(this.currentFilePtr, '*')); + } + + /** + * Reads the current line number from the debugger state. + * @returns {Promise} Source line number for the current debugger frame. + */ + async currentLine() + { + const php = await this.binary; + + return php.getValue(this.currentLinePtr, 'i32'); + } + + /** + * Reads the current breakpoint count from the debugger state. + * @returns {Promise} Number of registered breakpoints. + */ + async bpCount() + { + const php = await this.binary; + + return php.getValue(this.bpCountPtr, 'i32'); + } + + /** + * Dumps local variables from the current debugger frame. + * @returns {Promise} Dumped local symbol table for the current frame. + */ + async dumpVars() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_symbols' + , NUM + , [NUM] + , [false] + , {} + ); + + if(ptr) return this.dumpSymbols(ptr, php); + } + + /** + * Dumps global variables from the debugger session. + * @returns {Promise} Dumped global symbol table. + */ + async dumpGlobals() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_symbols' + , NUM + , [NUM] + , [true] + , {} + ); + + if(ptr) return this.dumpSymbols(ptr, php); + } + + /** + * Dumps defined constants from the debugger session. + * @returns {Promise} Dumped constant table. + */ + async dumpConstants() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_constants' + , NUM + , [] + , [] + , {} + ); + + if(ptr) return this.dumpSymbols(ptr, php); + } + + /** + * Decodes a native symbol dump buffer into a JavaScript object. + * @param {number} ptr Pointer to the native symbol dump buffer. + * @param {object} php PHP module instance used to decode the symbol buffer. + * @returns {object} Decoded symbol table. + */ + dumpSymbols(ptr, php) + { + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + + let cur = ptr + pointerLen; + const dec = new TextDecoder; + const symbols = {}; + + while(cur < end) + { + const zv = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = dec.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + symbols[name] = php.zvalToJS(zv); + } + + php._free(ptr); + + return symbols; + } + + /** + * Dumps userland functions known to the debugger. + * @returns {Promise} Dumped function metadata indexed by name. + */ + async dumpFunctions() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_functions' + , NUM + , [] + , [] + , {} + ); + + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + + let cur = ptr + pointerLen; + const dec = new TextDecoder; + const functions = {}; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = dec.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = dec.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + functions[name] = {name, filename, lineNo}; + } + + php._free(ptr); + + return functions; + } + + /** + * Dumps userland classes known to the debugger. + * @returns {Promise} Dumped class metadata indexed by name. + */ + async dumpClasses() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_classes' + , NUM + , [] + , [] + , {} + ); + + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + + let cur = ptr + pointerLen; + const dec = new TextDecoder; + const functions = {}; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = dec.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + const nameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const name = dec.decode(php.HEAP8.slice(cur, cur + nameLen)); + cur += nameLen + 1; + + functions[name] = {name, filename, lineNo}; + } + + php._free(ptr); + + return functions; + } + + /** + * Dumps the file list known to the debugger. + * @returns {Promise} Dumped list of loaded source files. + */ + async dumpFiles() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_files' + , NUM + , [] + , [] + , {} + ); + + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + + let cur = ptr + pointerLen; + const dec = new TextDecoder; + const files = []; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = dec.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + files.push(filename); + } + + php._free(ptr); + + return files; + } + + /** + * Dumps the current debugger backtrace. + * @returns {Promise>} Stack frames for the current backtrace. + */ + async dumpBacktrace() + { + const php = await this.binary; + + const ptr = php.ccall( + 'vrzno_dbg_dump_backtrace' + , NUM + , [] + , [] + , {} + ); + + const heap = new DataView(php.HEAP8.buffer); + const end = ptr + heap.getInt32(ptr, true); + const pointerLen = 4; + + let cur = ptr + pointerLen; + const dec = new TextDecoder; + const frames = []; + + let i = 0; + + while(cur < end) + { + const filenameLen = heap.getInt32(cur, true); + cur += pointerLen; + + const filename = dec.decode(php.HEAP8.slice(cur, cur + filenameLen)); + cur += filenameLen + 1; + + const lineNo = heap.getInt32(cur, true); + cur += pointerLen; + + frames.push({filename, lineNo, frame: i}); + + i++; + } + + php._free(ptr); + + return frames; + } + + /** + * Switches the active debugger frame. + * @param {number} frame Stack frame index to select. + * @returns {Promise} Native return code from the frame switch operation. + */ + async switchFrame(frame) + { + const php = await this.binary; + + return php.ccall( + 'vrzno_dbg_switch_frame' + , NUM + , [NUM] + , [frame] + , {} + ); + } + + /** + * Refreshes the browser-hosted debugger runtime state. + * @returns {Promise} Resolves after the debugger runtime has been refreshed. + */ + async refresh() + { + // super.refresh(); + // const php = await this.binary; + // await navigator.locks.request('php-wasm-fs-lock', () => { + // return new Promise((accept, reject) => { + // php.FS.syncfs(true, error => { + // if(error) reject(error); + // else accept(); + // }); + // }); + // }); + } + + /** + * Serializes async debugger operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + await this.binary; + + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + navigator.locks.request('php-wasm-fs-lock', async () => { + if(!this.queue.length) + { + return; + } + + await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); + + do + { + const [callback, params, accept, reject] = this.queue.shift(); + const run = callback(...params); + run.then(accept).catch(reject); + await run; + } while(this.queue.length); + + await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); + }); + + return coordinator; + } +} diff --git a/source/PhpNode.js b/source/PhpNode.js deleted file mode 100644 index 690a3541d..000000000 --- a/source/PhpNode.js +++ /dev/null @@ -1,45 +0,0 @@ -import { PhpBase } from './PhpBase'; -import path from 'node:path'; -import url from 'node:url'; -import fs from 'node:fs'; - -const defaultVersion = process.env.PHP_VERSION ?? '8.4'; -const defaultVariant = process.env.PHP_VARIANT ?? ''; - -export class PhpNode extends PhpBase -{ - constructor(args = {}) - { - const locateFile = (name, dir) => { - if(name.substr(0, 7) === 'file://') - { - name = new URL(name).pathname; - } - - if(dir === '') - { - if(typeof __dirname === 'undefined') - { - dir = path.dirname(url.fileURLToPath(import.meta.url)); - } - else - { - dir = __dirname; - } - } - - const located = path.resolve(path.format({dir, name})); - - if(fs.existsSync(located)) - { - return located; - } - }; - - const version = args.version ?? defaultVersion; - const variant = args.variant ?? defaultVariant; - const vvId = version + variant; - - super(import(`./php${vvId}-node.mjs`), {locateFile, version, variant, ...args}); - } -} diff --git a/source/PhpNode.mjs b/source/PhpNode.mjs new file mode 100644 index 000000000..350702c57 --- /dev/null +++ b/source/PhpNode.mjs @@ -0,0 +1,106 @@ +import { PhpBase } from './PhpBase.mjs'; +import path from 'node:path'; +import url from 'node:url'; +import fs from 'node:fs'; + +const defaultVersion = ( + process.env.PHP_VERSION === '8.5' + || process.env.PHP_VERSION === '8.4' + || process.env.PHP_VERSION === '8.3' + || process.env.PHP_VERSION === '8.2' + || process.env.PHP_VERSION === '8.1' + || process.env.PHP_VERSION === '8.0' +) + ? process.env.PHP_VERSION + : '8.4'; + +const defaultVariant = ''; +const normalizeRuntimeModule = runtime => runtime && typeof runtime === 'object' && 'default' in runtime + ? runtime + : {default: runtime}; + +const loadRuntime = specifier => { + if(typeof require === 'function') + { + return Promise.resolve( + normalizeRuntimeModule(require(specifier.replace(/\.mjs$/, '.js'))) + ); + } + + return import(specifier).then(normalizeRuntimeModule); +}; + +/** + * Node.js-hosted PHP wrapper. + */ +export class PhpNode extends PhpBase +{ + /** + * Creates a Node.js-hosted PHP runtime. + * @param {PhpRuntimeArgs} args Runtime configuration. + */ + constructor(args = {}) + { + const locateFile = (name, dir) => { + if(name.substr(0, 7) === 'file://') + { + name = new URL(name).pathname; + } + + if(dir === '') + { + if(typeof __dirname === 'undefined') + { + dir = path.dirname(url.fileURLToPath(import.meta.url)); + } + else + { + dir = __dirname; + } + } + + const located = path.resolve(path.format({dir, name})); + + if(fs.existsSync(located)) + { + return located; + } + }; + + const version = args.version ?? defaultVersion; + const variant = args.variant ?? defaultVariant; + const vvId = version + variant; + + const constructorArgs = {locateFile, version, variant, ...args}; + + switch(vvId) + { + case '8.5': + super(loadRuntime('./php8.5-node.mjs'), constructorArgs); + break; + + case '8.4': + super(loadRuntime('./php8.4-node.mjs'), constructorArgs); + break; + + case '8.3': + super(loadRuntime('./php8.3-node.mjs'), constructorArgs); + break; + + case '8.2': + super(loadRuntime('./php8.2-node.mjs'), constructorArgs); + break; + + case '8.1': + super(loadRuntime('./php8.1-node.mjs'), constructorArgs); + break; + + case '8.0': + super(loadRuntime('./php8.0-node.mjs'), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${vvId}`); + } + } +} diff --git a/source/PhpShell.js b/source/PhpShell.js deleted file mode 100644 index 1816ed3bf..000000000 --- a/source/PhpShell.js +++ /dev/null @@ -1,12 +0,0 @@ -import { PhpBase } from './PhpBase'; - -const defaultVersion = '8.4'; - -export class PhpShell extends PhpBase -{ - constructor(args = {}) - { - super(import(`./php${args.version ?? defaultVersion}-node.mjs`), args); - - } -} diff --git a/source/PhpWeb.js b/source/PhpWeb.js deleted file mode 100644 index c199d8a47..000000000 --- a/source/PhpWeb.js +++ /dev/null @@ -1,81 +0,0 @@ -import { PhpBase } from './PhpBase'; -import { commitTransaction, startTransaction } from './webTransactions'; - -const defaultVersion = '8.4'; -const defaultVariant = ''; - -export class PhpWeb extends PhpBase -{ - constructor(args = {}) - { - const version = args.version ?? defaultVersion; - const variant = args.variant ?? defaultVariant; - const vvId = version + variant; - - super(import(`./php${vvId}-web.mjs`), {version, variant, ...args}); - } - - startTransaction() - { - return startTransaction(this); - } - - commitTransaction(readOnly = false) - { - return commitTransaction(this, readOnly); - } - - async refresh() - { - super.refresh(); - const php = await this.binary; - await navigator.locks.request('php-wasm-fs-lock', () => { - return new Promise((accept, reject) => { - php.FS.syncfs(true, error => { - if(error) reject(error); - else accept(); - }); - }); - }); - } - - async _enqueue(callback, params = [], readOnly = false) - { - await this.binary; - - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - navigator.locks.request('php-wasm-fs-lock', async () => { - if(!this.queue.length) - { - return; - } - - await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); - - do - { - const [callback, params, accept, reject] = this.queue.shift(); - const run = callback(...params); - run.then(accept).catch(reject); - await run; - let lockChecks = 25; - while(!this.queue.length && lockChecks--) - { - await new Promise(a => setTimeout(a, 5)); - } - } while(this.queue.length) - - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - - return coordinator; - } -} diff --git a/source/PhpWeb.mjs b/source/PhpWeb.mjs new file mode 100644 index 000000000..d0043106f --- /dev/null +++ b/source/PhpWeb.mjs @@ -0,0 +1,159 @@ +import { PhpBase } from './PhpBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; + +const defaultVersion = '8.4'; +const defaultVariant = ''; + +/** + * Browser-hosted PHP wrapper. + */ +export class PhpWeb extends PhpBase +{ + /** + * Creates a browser-hosted PHP runtime. + * @param {PhpRuntimeArgs} args Runtime configuration. + */ + constructor(args = {}) + { + const version = args.version ?? defaultVersion; + const variant = args.variant ?? defaultVariant; + const vvId = version + variant; + + const constructorArgs = {version, variant, ...args}; + + switch(vvId) + { + case '8.5': + super(import(`./php8.5-web.mjs`), constructorArgs); + break; + + case '8.5_sdl': + super(import(`./php8.5_sdl-web.mjs`), constructorArgs); + break; + + case '8.4': + super(import(`./php8.4-web.mjs`), constructorArgs); + break; + + case '8.4_sdl': + super(import(`./php8.4_sdl-web.mjs`), constructorArgs); + break; + + case '8.3': + super(import(`./php8.3-web.mjs`), constructorArgs); + break; + + case '8.3_sdl': + super(import(`./php8.3_sdl-web.mjs`), constructorArgs); + break; + + case '8.2': + super(import(`./php8.2-web.mjs`), constructorArgs); + break; + case '8.2_sdl': + super(import(`./php8.2_sdl-web.mjs`), constructorArgs); + break; + + case '8.1': + super(import(`./php8.1-web.mjs`), constructorArgs); + break; + case '8.1_sdl': + super(import(`./php8.1_sdl-web.mjs`), constructorArgs); + break; + + case '8.0': + super(import(`./php8.0-web.mjs`), constructorArgs); + break; + case '8.0_sdl': + super(import(`./php8.0_sdl-web.mjs`), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${vvId}`); + } + } + + /** + * Starts a persisted browser transaction for the runtime. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ + startTransaction() + { + return startTransaction(this); + } + + /** + * Commits a persisted browser transaction for the runtime. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return commitTransaction(this, readOnly); + } + + /** + * Refreshes the browser-hosted runtime and syncs its filesystem. + * @returns {Promise} Resolves after the browser runtime has been refreshed. + */ + async refresh() + { + await super.refresh(); + const php = await this.binary; + await navigator.locks.request('php-wasm-fs-lock', () => { + return new Promise((accept, reject) => { + php.FS.syncfs(true, error => { + if(error) reject(error); + else accept(); + }); + }); + }); + } + + /** + * Serializes async runtime operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + await this.binary; + + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + navigator.locks.request('php-wasm-fs-lock', async () => { + if(!this.queue.length) + { + return; + } + + await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); + + do + { + const [callback, params, accept, reject] = this.queue.shift(); + const run = callback(...params); + run.then(accept).catch(reject); + await run; + let lockChecks = 25; + while(!this.queue.length && lockChecks--) + { + await new Promise(a => setTimeout(a, 5)); + } + } while(this.queue.length); + + await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); + }); + + return coordinator; + } +} diff --git a/source/PhpWebview.js b/source/PhpWebview.js deleted file mode 100644 index 8291a35cf..000000000 --- a/source/PhpWebview.js +++ /dev/null @@ -1,69 +0,0 @@ -import { PhpBase } from './PhpBase'; -import { commitTransaction, startTransaction } from './webTransactions'; - -export class PhpWebview extends PhpBase -{ - constructor(args = {}) - { - super(import(`./php${args.version ?? defaultVersion}-webview.mjs`), args); - } - - startTransaction() - { - return startTransaction(this); - } - - commitTransaction(readOnly = false) - { - return commitTransaction(this, readOnly); - } - - async refresh() - { - super.refresh(); - const php = await this.binary; - await navigator.locks.request('php-wasm-fs-lock', () => { - new Promise((accept, reject) => { - php.FS.syncfs(true, error => { - if(error) reject(error); - else accept(); - }); - }); - }); - } - - async _enqueue(callback, params = [], readOnly = false) - { - await this.binary; - - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - navigator.locks.request('php-wasm-fs-lock', async () => { - if(!this.queue.length) - { - return; - } - - await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); - - do - { - const [callback, params, accept, reject] = this.queue.shift(); - const run = callback(...params); - run.then(accept).catch(reject); - await run; - } while(this.queue.length) - - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - - return coordinator; - } -} diff --git a/source/PhpWebview.mjs b/source/PhpWebview.mjs new file mode 100644 index 000000000..e88990e39 --- /dev/null +++ b/source/PhpWebview.mjs @@ -0,0 +1,132 @@ +import { PhpBase } from './PhpBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; + +const defaultVersion = '8.4'; +const defaultVariant = ''; + +/** + * WebView-hosted PHP wrapper. + */ +export class PhpWebview extends PhpBase +{ + /** + * Creates a WebView-hosted PHP runtime. + * @param {PhpRuntimeArgs} args Runtime configuration. + */ + constructor(args = {}) + { + const version = args.version ?? defaultVersion; + const variant = args.variant ?? defaultVariant; + const vvId = version + variant; + const constructorArgs = {version, variant, ...args}; + + switch(vvId) + { + case '8.5': + super(import(`./php8.5-webview.mjs`), constructorArgs); + break; + + case '8.4': + super(import(`./php8.4-webview.mjs`), constructorArgs); + break; + + case '8.3': + super(import(`./php8.3-webview.mjs`), constructorArgs); + break; + + case '8.2': + super(import(`./php8.2-webview.mjs`), constructorArgs); + break; + + case '8.1': + super(import(`./php8.1-webview.mjs`), constructorArgs); + break; + + case '8.0': + super(import(`./php8.0-webview.mjs`), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${vvId}`); + } + } + + /** + * Starts a persisted browser transaction for the WebView runtime. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ + startTransaction() + { + return startTransaction(this); + } + + /** + * Commits a persisted browser transaction for the WebView runtime. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return commitTransaction(this, readOnly); + } + + /** + * Refreshes the WebView-hosted runtime and syncs its filesystem. + * @returns {Promise} Resolves after the WebView runtime has been refreshed. + */ + async refresh() + { + await super.refresh(); + const php = await this.binary; + await navigator.locks.request('php-wasm-fs-lock', () => { + new Promise((accept, reject) => { + php.FS.syncfs(true, error => { + if(error) reject(error); + else accept(); + }); + }); + }); + } + + /** + * Serializes async WebView operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + await this.binary; + + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + navigator.locks.request('php-wasm-fs-lock', async () => { + if(!this.queue.length) + { + return; + } + + await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); + + do + { + const [callback, params, accept, reject] = this.queue.shift(); + const run = callback(...params); + run.then(accept).catch(reject); + await run; + } while(this.queue.length); + + await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); + }); + + return coordinator; + } +} diff --git a/source/PhpWorker.js b/source/PhpWorker.js deleted file mode 100644 index a6fc96314..000000000 --- a/source/PhpWorker.js +++ /dev/null @@ -1,76 +0,0 @@ -import { PhpBase } from './PhpBase'; -import PhpBinary from './php-worker'; -import { commitTransaction, startTransaction } from './webTransactions'; - -export class PhpWorker extends PhpBase -{ - constructor(args = {}) - { - super(PhpBinary, args); - } - - startTransaction() - { - return startTransaction(this); - } - - commitTransaction(readOnly = false) - { - return commitTransaction(this, readOnly); - } - - async refresh() - { - super.refresh(); - - if(!this.phpArgs.persist) - { - return; - } - - const php = await this.binary; - await navigator.locks.request('php-wasm-fs-lock', () => { - new Promise((accept, reject) => { - php.FS.syncfs(true, error => { - if(error) reject(error); - else accept(); - }); - }); - }); - } - - async _enqueue(callback, params = [], readOnly = false) - { - await this.binary; - - let accept, reject; - - const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); - - const _accept = result => accept(result); - const _reject = reason => reject(reason); - - this.queue.push([callback, params, _accept, _reject]); - - navigator.locks.request('php-wasm-fs-lock', async () => { - if(!this.queue.length) - { - return; - } - - await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); - - do - { - const [callback, params, accept, reject] = this.queue.shift(); - const run = callback(...params); - run.then(accept).catch(reject); - await run; - } while(this.queue.length) - - await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); - }); - - return coordinator; - } -} diff --git a/source/PhpWorker.mjs b/source/PhpWorker.mjs new file mode 100644 index 000000000..b322802f2 --- /dev/null +++ b/source/PhpWorker.mjs @@ -0,0 +1,138 @@ +import { PhpBase } from './PhpBase.mjs'; +import { commitTransaction, startTransaction } from './webTransactions.mjs'; + +const defaultVersion = '8.4'; +const defaultVariant = ''; + +/** + * Worker-hosted PHP wrapper. + */ +export class PhpWorker extends PhpBase +{ + /** + * Creates a worker-hosted PHP runtime. + * @param {object} args Runtime configuration. + */ + constructor(args = {}) + { + const version = args.version ?? defaultVersion; + const variant = args.variant ?? defaultVariant; + const vvId = version + variant; + const constructorArgs = {version, variant, ...args}; + + switch(vvId) + { + case '8.5': + super(import(`./php8.5-worker.mjs`), constructorArgs); + break; + + case '8.4': + super(import(`./php8.4-worker.mjs`), constructorArgs); + break; + + case '8.3': + super(import(`./php8.3-worker.mjs`), constructorArgs); + break; + + case '8.2': + super(import(`./php8.2-worker.mjs`), constructorArgs); + break; + + case '8.1': + super(import(`./php8.1-worker.mjs`), constructorArgs); + break; + + case '8.0': + super(import(`./php8.0-worker.mjs`), constructorArgs); + break; + + default: + throw new Error(`Unsupported PHP runtime: ${vvId}`); + } + } + + /** + * Starts a persisted browser transaction for the worker runtime. + * @returns {Promise} Resolves when the transaction lock has been acquired. + */ + startTransaction() + { + return startTransaction(this); + } + + /** + * Commits a persisted browser transaction for the worker runtime. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ + commitTransaction(readOnly = false) + { + return commitTransaction(this, readOnly); + } + + /** + * Refreshes the worker-hosted runtime and syncs its filesystem when needed. + * @returns {Promise} Resolves after the worker runtime has been refreshed. + */ + async refresh() + { + await super.refresh(); + + if(!this.phpArgs.persist) + { + return; + } + + const php = await this.binary; + await navigator.locks.request('php-wasm-fs-lock', () => { + new Promise((accept, reject) => { + php.FS.syncfs(true, error => { + if(error) reject(error); + else accept(); + }); + }); + }); + } + + /** + * Serializes async worker operations behind the browser FS lock. + * @param {PhpQueuedCallback} callback Async operation to queue. + * @param {PhpQueueParams} params Arguments passed to the queued callback. + * @param {boolean} readOnly Indicates whether the queued operation mutates state. + * @returns {Promise} Resolves with the queued callback result. + */ + async _enqueue(callback, params = [], readOnly = false) + { + await this.binary; + + let accept, reject; + + const coordinator = new Promise((a,r) => [accept, reject] = [a, r]); + + const _accept = result => accept(result); + const _reject = reason => reject(reason); + + this.queue.push([callback, params, _accept, _reject]); + + navigator.locks.request('php-wasm-fs-lock', async () => { + if(!this.queue.length) + { + return; + } + + await ((this.autoTransaction && !readOnly) ? this.startTransaction() : Promise.resolve()); + + do + { + const [callback, params, accept, reject] = this.queue.shift(); + const run = callback(...params); + run.then(accept).catch(reject); + await run; + } while(this.queue.length); + + await (this.autoTransaction ? this.commitTransaction(readOnly) : Promise.resolve()); + }); + + return coordinator; + } +} diff --git a/source/_Event.js b/source/_Event.js deleted file mode 100644 index bb7eb61c9..000000000 --- a/source/_Event.js +++ /dev/null @@ -1,8 +0,0 @@ -export const _Event = globalThis.CustomEvent ?? class extends globalThis.Event -{ - constructor(name, options = {}) - { - super(name, options) - this.detail = options.detail; - } -}; diff --git a/source/_Event.mjs b/source/_Event.mjs new file mode 100644 index 000000000..fce4facf9 --- /dev/null +++ b/source/_Event.mjs @@ -0,0 +1,11 @@ +export const _Event = globalThis.CustomEvent ?? class extends globalThis.Event { + /** + * Creates an event instance with an optional `detail` payload. + * @param {string} name Event name. + * @param {{detail?: object|string|number|boolean|Array|undefined}} options Event initialization options. + */ + constructor(name, options = {}) { + super(name, /** @type {EventInit} */ (options)); + this.detail = options.detail; + } +}; diff --git a/source/breakoutRequest.js b/source/breakoutRequest.mjs similarity index 100% rename from source/breakoutRequest.js rename to source/breakoutRequest.mjs diff --git a/source/env.js b/source/env.js index fab997de8..3d03703f7 100644 --- a/source/env.js +++ b/source/env.js @@ -1,3 +1,3 @@ Module.preRun = Module.preRun || []; -if (typeof Module.preRun == 'function') Module.preRun = [ Module.preRun ]; +if(typeof Module.preRun == 'function') Module.preRun = [ Module.preRun ]; Module.preRun.push(() => Object.assign(ENV, Module.ENV || {})); diff --git a/source/fsOps.js b/source/fsOps.js deleted file mode 100644 index 70d67bc60..000000000 --- a/source/fsOps.js +++ /dev/null @@ -1,108 +0,0 @@ -export class fsOps -{ - static async analyzePath(binary, path) - { - const result = (await binary).FS.analyzePath(path); - - if(!result.object) - { - return { exists: false }; - } - - const object = { - exists: true - , id: result.object.id - , mode : result.object.mode - , mount: { - mountpoint: result.object.mount.mountpoint - , mounts: result.object.mount.mounts.map(m => m.mountpoint) - } - , isDevice: result.object.isDevice - , isFolder: result.object.isFolder - , read: result.object.read - , write: result.object.write - }; - - return {...result, object, parentObject: undefined}; - } - - static async readdir(binary, path) - { - return (await binary).FS.readdir(path); - } - - static async readFile(binary, path, options) - { - return (await binary).FS.readFile(path, options); - } - - static async stat(binary, path) - { - return (await binary).FS.stat(path); - } - - static async mkdir(binary, path) - { - const php = (await binary); - const _result = php.FS.mkdir(path); - - return { - id: _result.id - , mode : _result.mode - , mount: { - mountpoint: _result.mount.mountpoint - , mounts: _result.mount.mounts.map(m => m.mountpoint) - } - , isDevice: _result.isDevice - , isFolder: _result.isFolder - , read: _result.read - , write: _result.write - }; - } - - static async rmdir(binary, path) - { - return (await binary).FS.rmdir(path); - } - - static async rename(binary, path, newPath) - { - return (await binary).FS.rename(path, newPath); - } - - static async writeFile(binary, path, data, options) - { - const bin = (await binary); - - const about = bin.FS.analyzePath(path); - - let forced = false; - - if(about.object && about.object.mode) - { - if(!(about.object.mode & 0o200)) - { - await bin.FS.chmod(path, about.object.mode | 0o200); - } - } - - const result = bin.FS.writeFile(path, data, options); - - if(forced) - { - await bin.FS.chmod(path, about.object.mode); - } - - return result; - } - - static async unlink(binary, path) - { - return (await binary).FS.unlink(path); - } - - static async chmod(binary, mode) - { - return (await binary).FS.chmod(mode); - } -} diff --git a/source/fsOps.mjs b/source/fsOps.mjs new file mode 100644 index 000000000..2735c8849 --- /dev/null +++ b/source/fsOps.mjs @@ -0,0 +1,175 @@ +/** + * Filesystem helpers for queued runtime operations. + */ +export class fsOps +{ + /** + * Returns a normalized analysis record for a filesystem path. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Filesystem path to inspect. + * @returns {Promise} Sanitized Emscripten path analysis result. + */ + static async analyzePath(binary, path) + { + const result = (await binary).FS.analyzePath(path); + + if(!result.object) + { + return { exists: false }; + } + + const object = { + exists: true + , id: result.object.id + , mode : result.object.mode + , mount: { + mountpoint: result.object.mount.mountpoint + , mounts: result.object.mount.mounts.map(m => m.mountpoint) + } + , isDevice: result.object.isDevice + , isFolder: result.object.isFolder + , read: result.object.read + , write: result.object.write + }; + + return {...result, object, parentObject: undefined}; + } + + /** + * Lists the entries in a virtual directory. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Directory path to list. + * @returns {Promise} Directory entries for the path. + */ + static async readdir(binary, path) + { + return (await binary).FS.readdir(path); + } + + /** + * Reads a file from the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path File path to read. + * @param {object} options Read options forwarded to Emscripten FS. + * @returns {Promise} File contents for the requested path. + */ + static async readFile(binary, path, options) + { + return (await binary).FS.readFile(path, options); + } + + /** + * Returns file metadata for a virtual filesystem path. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Filesystem path to stat. + * @returns {Promise} File metadata for the path. + */ + static async stat(binary, path) + { + return (await binary).FS.stat(path); + } + + /** + * Creates a directory in the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Directory path to create. + * @returns {Promise} Metadata for the created directory. + */ + static async mkdir(binary, path) + { + const php = (await binary); + const _result = php.FS.mkdir(path); + + return { + id: _result.id + , mode : _result.mode + , mount: { + mountpoint: _result.mount.mountpoint + , mounts: _result.mount.mounts.map(m => m.mountpoint) + } + , isDevice: _result.isDevice + , isFolder: _result.isFolder + , read: _result.read + , write: _result.write + }; + } + + /** + * Removes a directory from the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Directory path to remove. + * @returns {Promise} Resolves when the directory has been removed. + */ + static async rmdir(binary, path) + { + return (await binary).FS.rmdir(path); + } + + /** + * Renames a path in the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path Existing filesystem path. + * @param {string} newPath Destination filesystem path. + * @returns {Promise} Resolves when the path has been renamed. + */ + static async rename(binary, path, newPath) + { + return (await binary).FS.rename(path, newPath); + } + + /** + * Writes data to a file in the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path File path to write. + * @param {string|Uint8Array} data Data to persist. + * @param {object} options Write options forwarded to Emscripten FS. + * @returns {Promise} Resolves when the file has been written. + */ + static async writeFile(binary, path, data, options) + { + const bin = (await binary); + + const about = bin.FS.analyzePath(path); + + let forced = false; + + if(about.object && about.object.mode) + { + if(!(about.object.mode & 0o200)) + { + await bin.FS.chmod(path, about.object.mode | 0o200); + } + } + + const result = bin.FS.writeFile(path, data, options); + + if(forced) + { + await bin.FS.chmod(path, about.object.mode); + } + + return result; + } + + /** + * Deletes a file from the virtual filesystem. + * @param {Promise} binary Deferred PHP module instance. + * @param {string} path File path to remove. + * @returns {Promise} Resolves when the file has been removed. + */ + static async unlink(binary, path) + { + return (await binary).FS.unlink(path); + } + + /** + * Changes permissions for a virtual filesystem path. + * @param {Promise} binary Deferred PHP module instance. + * @param {number} mode POSIX permission mode to apply. + * @returns {Promise} Resolves when the mode has been applied. + */ + static async chmod(binary, mode) + { + return (await binary).FS.chmod(mode); + } +} diff --git a/source/globals.d.ts b/source/globals.d.ts new file mode 100644 index 000000000..71aa9a42c --- /dev/null +++ b/source/globals.d.ts @@ -0,0 +1,146 @@ +declare const ENV: Record; + +declare interface PhpModuleGlobal { + ENV?: Record; + preRun?: Array<() => void> | (() => void); +} + +declare const Module: PhpModuleGlobal; + +declare interface PhpModuleFactory { + default: new (args: object) => object; +} + +declare type PhpRuntimeVersion = '8.0' | '8.1' | '8.2' | '8.3' | '8.4' | '8.5'; +declare type PhpRuntimeVariant = '' | '_sdl'; +declare type PhpRuntimeTarget = `${PhpRuntimeVersion}${PhpRuntimeVariant}`; + +declare type PhpQueueParam = string | number | boolean | object | undefined; +declare type PhpMessageParam = string | number | boolean | object | null | undefined; +declare type PhpRuntimeValue = object | string | number | boolean | Uint8Array | null | undefined | void; +declare type PhpQueueParams = PhpQueueParam[]; +declare type PhpMessageParams = PhpMessageParam[]; +declare type PhpQueueResolve = (value?: PhpRuntimeValue) => void; +declare type PhpQueueReject = (reason?: object | string | number | boolean | Error) => void; +declare type PhpQueuedCallback = (...params: PhpQueueParams) => Promise; +declare type PhpActionHandler = (...params: PhpQueueParams) => PhpRuntimeValue | Promise; +declare type PhpEventHook = (event: Event) => boolean | void; +declare type PhpRuntimeHook = (request: RuntimeRequest, response?: Response) => void; +declare type PhpNotFoundHook = (request: RuntimeRequest) => Response | string | undefined; +declare type PhpSharedValue = object | string | number | boolean | PhpActionHandler | undefined; + +declare type OutputTarget = EventTarget; + +declare type RuntimeRequest = Request | { + url: string | URL, + method?: string, + headers?: Headers | Map | Record, + connection?: { encrypted?: boolean }, + socket?: { encrypted?: boolean } +}; + +declare interface RuntimeLifecycleEvent { + waitUntil(promise: Promise): void; +} + +declare interface RuntimeFetchEvent { + request: Request; + respondWith(response: Response | Promise): void; +} + +declare interface PhpSharedLibrary { + name?: string; + url: string | URL; + ini?: boolean; + getLibs?: Function; + getFiles?: Function; +} + +declare interface PhpVhost { + pathPrefix: string; + directory: string; + entrypoint: string; +} + +declare type PhpLibraryList = Array; +declare type PhpPreloadFileList = PhpPreloadFile[]; +declare type PhpVhostList = PhpVhost[]; + +declare interface PhpPreloadFile { + url: string | URL; + path?: string; + parent?: string; + name?: string; +} + +declare interface PhpRuntimeArgs { + autoTransaction?: boolean; + version?: PhpRuntimeVersion; + variant?: PhpRuntimeVariant; + interactive?: boolean; + script?: string; + code?: string; + shared?: Record; + locateFile?: (path: string, directory?: string) => string | URL | undefined; + files?: PhpPreloadFileList; + sharedLibs?: PhpLibraryList; + dynamicLibs?: PhpLibraryList; + debug?: boolean; + ini?: string; + persist?: object; + staticFS?: boolean; + vHosts?: PhpVhostList; + [key: string]: object | string | number | boolean | Function | undefined; +} + +declare module './php*.mjs' { + const PhpBinary: new (args: object) => object; + export default PhpBinary; +} + +declare module './php-worker' { + const PhpBinary: Promise; + export default PhpBinary; +} + +declare module 'php-wasm/php*.mjs' { + const PhpBinary: new (args: object) => object; + export default PhpBinary; +} + +declare module 'php-wasm/php-worker.mjs' { + const PhpBinary: Promise; + export default PhpBinary; +} + +declare module 'php-wasm/PhpBase' { + export class PhpBase extends EventTarget { + constructor(phpBinLoader: Promise, args?: PhpRuntimeArgs, sapi?: string); + binary: Promise<{ + inputDataQueue?: string[], + awaitingInput?: ((value: string | undefined) => void) | null, + triggerStdin?: () => void, + persist?: boolean, + ccall?: Function, + lengthBytesUTF8?: Function, + _malloc?: Function, + _free?: Function, + stringToUTF8?: Function, + setValue?: Function, + UTF8ToString?: Function, + getValue?: Function, + HEAP8?: Int8Array, + hasVrzno?: boolean, + zvalToJS?: Function, + onRefresh?: Set, + FS?: { + syncfs?: (populate: boolean, callback: (error?: Error) => void) => void + } & object + }>; + queue: Array<[PhpQueuedCallback, PhpQueueParams, PhpQueueResolve, PhpQueueReject]>; + autoTransaction: boolean; + transactionStarted: boolean | Promise; + flush(): void; + refresh(): Promise; + } +} diff --git a/source/msg-bus.js b/source/msg-bus.mjs similarity index 78% rename from source/msg-bus.js rename to source/msg-bus.mjs index 94b8e5c0b..51190f607 100644 --- a/source/msg-bus.js +++ b/source/msg-bus.mjs @@ -2,8 +2,8 @@ const incomplete = new Map(); /** * Create a sendMessage function given a service worker URL. - * @param {*} serviceWorker The ServieWorker object or URL to the service worker. - * @returns sendMessage function for the service workrer. + * @param {ServiceWorker|string} serviceWorker The service worker instance or registration URL to target. + * @returns {(action: string, params?: PhpMessageParams) => Promise} Function that sends an RPC-style message to the service worker. */ export const sendMessageFor = (serviceWorker) => async (action, params = []) => { const token = window.crypto.randomUUID(); @@ -48,8 +48,9 @@ export const sendMessageFor = (serviceWorker) => async (action, params = []) => }; /** + * Resolves pending service worker RPC calls when replies arrive. * Event handler for recieved messages. - * @param {*} event + * @param {MessageEvent} event Message event carrying an RPC reply from the service worker. */ export const onMessage = event => { if(event.data.re && incomplete.has(event.data.re)) diff --git a/source/parseResponse.js b/source/parseResponse.mjs similarity index 91% rename from source/parseResponse.js rename to source/parseResponse.mjs index 1b6f07479..3373215fd 100644 --- a/source/parseResponse.js +++ b/source/parseResponse.mjs @@ -1,5 +1,5 @@ export const parseResponse = response => { - const headers = new Headers() + const headers = new Headers(); const line = []; const decoder = new TextDecoder(); @@ -16,7 +16,7 @@ export const parseResponse = response => { if(colon < 0) { - headers.append(header, true); + headers.append(header, ''); } else { diff --git a/source/php-tags.mjs b/source/php-tags.mjs index 24cbacb3f..f02701461 100644 --- a/source/php-tags.mjs +++ b/source/php-tags.mjs @@ -3,16 +3,28 @@ import { PhpWeb } from './PhpWeb.mjs'; const runPhpScriptTag = async (element) => { const scope = { - stdin: null, - canvas: null, - stdout: null, - stderr: null, - ini: '', - libs: [], - files: [], - imports: {} + version: '8.4' + , variant: '' + , stdin: null + , canvas: null + , stdout: null + , stderr: null + , ini: '' + , libs: [] + , files: [] + , imports: {} }; + if(element.hasAttribute('data-version')) + { + scope.version = element.getAttribute('data-version'); + } + + if(element.hasAttribute('data-variant')) + { + scope.variant = element.getAttribute('data-variant'); + } + if(element.hasAttribute('data-ini')) { scope.ini = element.getAttribute('data-ini'); @@ -97,7 +109,7 @@ const runPhpScriptTag = async (element) => { } } - let getImports = Promise.resolve(); + let getImports = Promise.resolve([]); if(scope.imports) { @@ -116,14 +128,16 @@ const runPhpScriptTag = async (element) => { const [code, input, imports] = await Promise.all([getCode, getInput, getImports]); - const flatImports = Object.assign({}, ...(imports.flat())); + const flatImports = Object.assign({}, ...imports.flat()); const php = new PhpWeb({ ...flatImports, - sharedLibs: scope.libs, - ini: scope.ini, - files: scope.files, - canvas: scope.canvas, + version: scope.version + , variant: scope.variant + , sharedLibs: scope.libs + , ini: scope.ini + , files: scope.files + , canvas: scope.canvas }); php.inputString(input); @@ -161,7 +175,7 @@ const runPhpScriptTag = async (element) => { scope.stderr && (scope.stderr.innerHTML = stderr); }); }); -} +}; const phpSelector = 'script[type="text/php"]'; @@ -179,7 +193,7 @@ const runPhpTags = (doc) => { { for(const addedNode of mutation.addedNodes) { - if(!addedNode.matches || !addedNode.matches(phpSelector)) + if(!(addedNode instanceof Element) || !addedNode.matches(phpSelector)) { continue; } @@ -190,6 +204,6 @@ const runPhpTags = (doc) => { }); observer.observe(document.body.parentElement, {childList: true, subtree: true}); -} +}; -runPhpTags(document); \ No newline at end of file +runPhpTags(document); diff --git a/source/pib/pib.c b/source/pib/pib.c index ba244d9e7..ecb822578 100644 --- a/source/pib/pib.c +++ b/source/pib/pib.c @@ -42,6 +42,7 @@ int main(void) { return 0; } bool started = false; char *_sapi_name = NULL; +static const char pib_embed_sapi_name[] = "embed"; /** * Initialize Embdedded PHP @@ -59,7 +60,7 @@ int EMSCRIPTEN_KEEPALIVE __attribute__((noinline)) pib_init(char *__sapi_name) putenv("USE_ZEND_ALLOC=0"); - if(0 == strcmp(_sapi_name, "embed")) + if(0 == strcmp(_sapi_name, pib_embed_sapi_name)) { return php_embed_init(0, NULL); } @@ -124,7 +125,7 @@ void *EMSCRIPTEN_KEEPALIVE __attribute__((noinline)) pib_storage_init(void) */ void pib_destroy(void) { - if(0 == strcmp(_sapi_name, "embed")) + if(0 == strcmp(_sapi_name, pib_embed_sapi_name)) { php_embed_shutdown(); } diff --git a/source/resolveDependencies.js b/source/resolveDependencies.mjs similarity index 61% rename from source/resolveDependencies.js rename to source/resolveDependencies.mjs index bcf976e9f..0a11b1495 100644 --- a/source/resolveDependencies.js +++ b/source/resolveDependencies.mjs @@ -1,16 +1,34 @@ +/** + * A preload file definition. + * @typedef {object} FileDef + * @property {string} url URL used to preload the file. + * @property {string} path Virtual filesystem path where the file should be mounted. + * @property {string} [name] Optional explicit filename for the mounted file. + */ + +/** + * A shared library dependency definition. + * @typedef {string|object} LibDef + * @property {string} [name] Shared library filename. + * @property {string|URL} [url] URL used to preload the shared library. + * @property {boolean} [ini] Indicates whether the library should be loaded via `php.ini`. + * @property {(wrapper: object) => LibDef[]} [getLibs] Returns additional dependent shared libraries. + * @property {(wrapper: object) => FileDef[]} [getFiles] Returns additional dependent preload files. + */ + /** * An object representing files, libs and urlLibs for a shared library. * @typedef {object} ResolvedDependencies - * @property {FileDef[]} files - * @property {LibDef[]} libs - * @property {Object} urlLibs mapping of resource names to URLs + * @property {FileDef[]} files Normalized preload file definitions. + * @property {LibDef[]} libs Normalized shared library definitions. + * @property {{[key: string]: string|URL}} urlLibs Mapping of resource names to URLs. */ /** * Resolves dependencies related to dynamically loaded shared libs. * Normalizes LibDefs & FileDefs, and extracts URLs to specified resources. * @param {LibDef[]} sharedLibs List of LibDefs to resolve dependencies for. - * @param {object} wrapper PHP Object to resolve depencencies for. + * @param {object} wrapper PHP object to resolve dependencies for. * @returns {ResolvedDependencies} Normalized LibDefs, FileDefs, and their URLs. */ export const resolveDependencies = (sharedLibs, wrapper) => { @@ -45,16 +63,17 @@ export const resolveDependencies = (sharedLibs, wrapper) => { const path = fileDef.path; const name = fileDef.name || path.split('/').pop(); const parent = path.substr(0, path.length - name.length); - return {parent, name, url}; + return {parent, name, path, url}; }); + /** @type {{[key: string]: string|URL}} */ const urlLibs = {}; const libs = _libs.map(libDef => { if(typeof libDef === 'string' || libDef instanceof URL) { libDef = String(libDef); - + if(libDef.substr(0, 1) == '/' || libDef.substr(0, 2) == './' || libDef.substr(0, 2) == '../' @@ -63,7 +82,7 @@ export const resolveDependencies = (sharedLibs, wrapper) => { || libDef.substr(0, 7) == 'file://' ){ const name = libDef.split('/').pop(); - const url = libDef + const url = libDef; urlLibs[ name ] = url; return {name, url, ini: true}; diff --git a/source/webTransactions.js b/source/webTransactions.js deleted file mode 100644 index 35b7e0056..000000000 --- a/source/webTransactions.js +++ /dev/null @@ -1,59 +0,0 @@ -export async function startTransaction(wrapper) -{ - const php = await wrapper.binary; - - if(wrapper.transactionStarted || !php.persist) - { - return wrapper.transactionStarted; - } - - wrapper.transactionStarted = new Promise((accept, reject) => { - return php.FS.syncfs(true, error => { - if(error) - { - reject(error); - } - else - { - accept(); - } - }); - }); - - return await wrapper.transactionStarted; -} - -export async function commitTransaction(wrapper, readOnly = false) -{ - const php = await wrapper.binary; - - if(!php.persist) - { - return; - } - - if(!wrapper.transactionStarted) - { - throw new Error('No transaction initialized.'); - } - - if(readOnly) - { - wrapper.transactionStarted = false; - return Promise.resolve(); - } - - return await new Promise((accept, reject) => { - return php.FS.syncfs(false, error => { - if(error) - { - reject(error); - } - else - { - wrapper.transactionStarted = false; - accept(); - } - } - )}); -} diff --git a/source/webTransactions.mjs b/source/webTransactions.mjs new file mode 100644 index 000000000..84c32fcce --- /dev/null +++ b/source/webTransactions.mjs @@ -0,0 +1,88 @@ +/** + * @typedef {object} PersistentPhpRuntime + * @property {boolean} [persist] Indicates whether the runtime has persistent storage enabled. + * @property {{syncfs?: (populate: boolean, callback: (error?: Error) => void) => void}} [FS] Filesystem bridge exposed by the runtime. + */ + +/** + * @typedef {object} TransactionalWrapper + * @property {Promise} binary Deferred runtime instance used for transaction work. + * @property {boolean|Promise} transactionStarted Tracks the currently active transaction, if any. + */ + +/** + * Starts a persisted filesystem transaction for a runtime wrapper. + * @param {TransactionalWrapper} wrapper Runtime wrapper coordinating FS transactions. + * @returns {Promise} Resolves when the transaction has been started. + */ +export async function startTransaction(wrapper) +{ + const php = await wrapper.binary; + + if(!php.persist) + { + return; + } + + if(wrapper.transactionStarted) + { + await wrapper.transactionStarted; + return; + } + + wrapper.transactionStarted = new Promise((accept, reject) => { + return php.FS.syncfs(true, error => { + if(error) + { + reject(error); + } + else + { + accept(); + } + }); + }); + + return await wrapper.transactionStarted; +} + +/** + * Commits a persisted filesystem transaction for a runtime wrapper. + * @param {TransactionalWrapper} wrapper Runtime wrapper coordinating FS transactions. + * @param {boolean} readOnly Indicates whether the transaction only performed reads. + * @returns {Promise} Resolves when the transaction has been committed. + */ +export async function commitTransaction(wrapper, readOnly = false) +{ + const php = await wrapper.binary; + + if(!php.persist) + { + return; + } + + if(!wrapper.transactionStarted) + { + throw new Error('No transaction initialized.'); + } + + if(readOnly) + { + wrapper.transactionStarted = false; + return Promise.resolve(); + } + + return await new Promise((accept, reject) => { + return php.FS.syncfs(false, error => { + if(error) + { + reject(error); + } + else + { + wrapper.transactionStarted = false; + accept(); + } + }); + }); +} diff --git a/test/BrowserTest.mjs b/test/BrowserTest.mjs deleted file mode 100644 index d7c2f6781..000000000 --- a/test/BrowserTest.mjs +++ /dev/null @@ -1,85 +0,0 @@ -import { BotTest } from 'cv3-test/BotTest.mjs'; -import { compareSnapshot } from 'cv3-test/Snapshot.mjs'; - -const version = process.env.PHP_VERSION ?? '8.4'; - -export class BrowserTest extends BotTest -{ - startDocument = 'http://localhost:9000/php-wasm/embedded-php.html?no-service-worker'; - parallel = false; - width = 1024; - height = 768; - - async testHelloWorld() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=hello-world.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testSqlite() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=sqlite.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testPostgres() - { - if(!['8.4', '8.3', '8.2'].includes(version)) return; - - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=postgres.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testSqlitePdo() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=sqlite-pdo.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testFiles() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=files.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testGoto() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=goto.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - async testDynamicExtensions() - { - await new Promise(a => setTimeout(a, 1000)); - await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=dynamic-extension.php&version=${version}`); - await new Promise(a => setTimeout(a, 20_000)); - const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - } - - // async testFetch() - // { - // await this.pobot.goto(`http://localhost:9000/php-wasm/embedded-php.html?demo=fetch.php&version=${version}`); - // await new Promise(a => setTimeout(a, 20_000)); - // const phpOutput = await this.pobot.inject(() => document.querySelectorAll('iframe')[1].getAttribute('srcdoc')); - // this.assert(compareSnapshot(phpOutput), 'Snapshot does not match!'); - // } -} diff --git a/test/basic.cjs b/test/basic.cjs new file mode 100644 index 000000000..94b8533b5 --- /dev/null +++ b/test/basic.cjs @@ -0,0 +1,226 @@ +const path = require('node:path'); +const { pathToFileURL } = require('node:url'); +const { test } = require('node:test'); +const { strict: assert } = require('node:assert'); + +const { PhpNode } = require('./lib/PhpNode.cjs'); + +test('Can run PHP', async () => { + const php = new PhpNode({}); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode({ persist: { mountPath: '/host', localPath: '/' } }); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run( + ' { + const php = new PhpNode({ persist: { mountPath: '/host', localPath: '/' } }); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(' { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode(); + + let stdOut = '', stdErr = '', stdin = 'This is a string of data provided on STDIN.'; + + php.inputString(stdin); + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + await php.run(` { + const php = new PhpNode({}); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + await php.run(` { + const php = new PhpNode({ persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + await php.run(` { + const php = new PhpNode(); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run(` { + const php = new PhpNode({ + files: [ + { + name: 'hello-world.txt', + parent: '/deeply/nested/dir/path', + url: pathToFileURL(path.join(__dirname, 'hello-world.txt')).href, + }, + ], + }); + + let stdOut = '', stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + await php.binary; + + const exitCode = await php.run( + ` { const php = new PhpNode({}); diff --git a/test/browser-test.sh b/test/browser-test.sh index 72da97118..86ea0b1b1 100755 --- a/test/browser-test.sh +++ b/test/browser-test.sh @@ -1,27 +1,25 @@ #!/usr/bin/env bash -set -eux; +set -euo pipefail PORT=9000 -export CI= +export CI="${CI:-}" +BROWSER_TEST_PORT="${PORT}" node test/browser/server.mjs & +SERVER_PID=$! -pushd demo-web; -npm run build; -popd; +trap 'kill ${SERVER_PID}' EXIT -set +e; -docker kill php-wasm-test-apache; -set -e; - -HOST_DIR="${PWD}/demo-web/build" -MOUNTED_DIR="/usr/local/apache2/htdocs/php-wasm httpd:2.4" - -docker run -d --rm --name php-wasm-test-apache -p ${PORT}:80 -v ${HOST_DIR}:${MOUNTED_DIR} & -trap "docker kill php-wasm-test-apache" 0; - -set +x; -while ! nc -z localhost ${PORT}; do +until curl -fsS "http://127.0.0.1:${PORT}/php-wasm/" >/dev/null; do sleep 0.1 done -set -x; -PHP_VERSION=${PHP_VERSION} npx cvtest test/BrowserTest.mjs; +PLAYWRIGHT_ARGS=(-c playwright.config.mjs test/browser/browser.spec.mjs) + +if [[ -n "${UPDATE_SNAPSHOTS:-}" || -n "${CV_UPDATE_SNAPSHOTS:-}" ]]; then + PLAYWRIGHT_ARGS+=(--update-snapshots) +fi + +PHP_VERSION="${PHP_VERSION}" \ +PHP_VARIANT="${PHP_VARIANT:-}" \ +BROWSER_TEST_PORT="${PORT}" \ +LIB_TYPE="${LIB_TYPE:-${BUILD_TYPE:-dynamic}}" \ +npx playwright test "${PLAYWRIGHT_ARGS[@]}" diff --git a/test/browser/browser.spec.mjs b/test/browser/browser.spec.mjs new file mode 100644 index 000000000..1954c42b8 --- /dev/null +++ b/test/browser/browser.spec.mjs @@ -0,0 +1,185 @@ +import { test, expect } from '@playwright/test'; + +const version = process.env.PHP_VERSION ?? '8.4'; +const libType = process.env.LIB_TYPE ?? process.env.BUILD_TYPE ?? 'dynamic'; +const variant = process.env.PHP_VARIANT ?? ''; + +const demoCases = [ + { + name: 'renders the hello world embedded demo', + demo: 'hello-world.php', + extensionFlags: 0, + snapshot: 'BrowserTest.testHelloWorld_0.json', + }, + { + name: 'renders the sqlite embedded demo', + demo: 'sqlite.php', + extensionFlags: 1024, + snapshot: 'BrowserTest.testSqlite_0.json', + }, + { + name: 'renders the postgres embedded demo', + demo: 'postgres.php', + extensionFlags: 0, + snapshot: 'BrowserTest.testPostgres_0.json', + minVersion: '8.2', + }, + { + name: 'renders the sqlite pdo embedded demo', + demo: 'sqlite-pdo.php', + extensionFlags: 1024, + snapshot: 'BrowserTest.testSqlitePdo_0.json', + }, + { + name: 'renders the files embedded demo', + demo: 'files.php', + extensionFlags: 0, + snapshot: { + static: 'BrowserTest.testFiles_0.json', + dynamic: 'BrowserTest.testFiles_0.dynamic.json', + shared: 'BrowserTest.testFiles_0.shared.json', + }, + }, + { + name: 'renders the goto embedded demo', + demo: 'goto.php', + extensionFlags: 0, + snapshot: 'BrowserTest.testGoto_0.json', + }, + { + name: 'renders the dynamic extensions embedded demo', + demo: 'dynamic-extension.php', + extensionFlags: 0, + snapshot: 'BrowserTest.testDynamicExtensions_0.json', + }, +]; + +test.describe.configure({ mode: 'serial' }); + +const comparePhpVersions = (left, right) => { + const leftParts = left.split('.').map(Number); + const rightParts = right.split('.').map(Number); + + for(let i = 0; i < Math.max(leftParts.length, rightParts.length); i++) + { + const leftPart = leftParts[i] ?? 0; + const rightPart = rightParts[i] ?? 0; + + if(leftPart === rightPart) + { + continue; + } + + return leftPart - rightPart; + } + + return 0; +}; + +const demoUrl = ({demo, extensionFlags}) => { + const params = new URLSearchParams({ + libType, + demo, + extensionFlags: String(extensionFlags), + version, + }); + + if(variant) + { + params.set('variant', variant); + } + + return `harness/embedded.html?${params.toString()}`; +}; + +const waitForHarnessStatus = async (page, expectedStatus = 'done') => { + await expect(async () => { + const status = await page.locator('[data-testid="status"]').textContent(); + + if(status === 'failed') + { + const stderr = await page.locator('[data-testid="stderr"]').textContent(); + throw new Error(stderr || 'Harness reported failure.'); + } + + expect(status).toBe(expectedStatus); + }).toPass({ + timeout: 180000, + intervals: [250, 500, 1000, 2000, 4000] + }); +}; + +const expectEmbeddedDemoSnapshot = async (page, fixture) => { + await page.goto(demoUrl(fixture), {waitUntil: 'domcontentloaded'}); + await waitForHarnessStatus(page); + + const stdout = await page.locator('[data-testid="stdout"]').textContent(); + const snapshot = typeof fixture.snapshot === 'string' + ? fixture.snapshot + : fixture.snapshot[libType] ?? fixture.snapshot.default; + + expect(JSON.stringify(stdout ?? '')).toMatchSnapshot(snapshot); +}; + +for(const fixture of demoCases) +{ + test(fixture.name, async ({ page }) => { + if(fixture.minVersion && comparePhpVersions(version, fixture.minVersion) < 0) + { + test.skip(`${fixture.demo} only runs on PHP ${fixture.minVersion}+.`); + } + + await expectEmbeddedDemoSnapshot(page, fixture); + }); +} + +test('runs a cli script in the browser harness', async ({ page }) => { + const params = new URLSearchParams({ + libType, + code: 'echo "Hello, World!";', + version, + }); + + await page.goto(`harness/cli.html?${params.toString()}`, {waitUntil: 'domcontentloaded'}); + await waitForHarnessStatus(page); + await expect(page.locator('[data-testid="stdout"]')).toContainText('Hello, World!'); +}); + +test('boots phpdbg in the browser harness', async ({ page }) => { + const params = new URLSearchParams({ + libType, + path: '/preload/test_www/hello-world.php', + version, + }); + + await page.goto(`harness/dbg.html?${params.toString()}`, {waitUntil: 'domcontentloaded'}); + await waitForHarnessStatus(page, 'ready'); + + await expect(async () => { + const currentFile = await page.locator('[data-testid="current-file"]').textContent(); + const stdout = await page.locator('[data-testid="stdout"]').textContent(); + + expect( + currentFile === '/preload/test_www/hello-world.php' + || (stdout ?? '').includes('/preload/test_www/hello-world.php') + ).toBe(true); + }).toPass({ + timeout: 30000, + intervals: [250, 500, 1000, 2000] + }); +}); + +test('serves php through the cgi worker harness', async ({ page }) => { + const params = new URLSearchParams({ + libType, + version, + }); + + await page.goto(`harness/cgi.html?${params.toString()}`, {waitUntil: 'domcontentloaded'}); + await waitForHarnessStatus(page); + await expect(page.locator('[data-testid="controller"]')).toContainText('/php-wasm/cgi-worker.mjs'); + await expect(page.locator('[data-testid="request-path"]')).toHaveText('/php-wasm/cgi-bin/test'); + await expect(page.locator('[data-testid="status-code"]')).toHaveText('200'); + await expect(page.locator('[data-testid="powered-by"]')).toContainText(`PHP/${version}`); + await expect(page.locator('[data-testid="stderr"]')).toHaveText(''); +}); diff --git a/test/BrowserTest.testDynamicExtensions_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testDynamicExtensions-0-linux.json similarity index 100% rename from test/BrowserTest.testDynamicExtensions_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testDynamicExtensions-0-linux.json diff --git a/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-dynamic-linux.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-dynamic-linux.json new file mode 100644 index 000000000..774c0a067 --- /dev/null +++ b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-dynamic-linux.json @@ -0,0 +1 @@ +"Array\n(\n [0] => ./.\n [1] => ./..\n [2] => ./config/.\n [3] => ./config/..\n [4] => ./dev/.\n [5] => ./dev/..\n [6] => ./dev/null\n [7] => ./dev/random\n [8] => ./dev/shm/.\n [9] => ./dev/shm/..\n [10] => ./dev/shm/tmp/.\n [11] => ./dev/shm/tmp/..\n [12] => ./dev/stderr\n [13] => ./dev/stdin\n [14] => ./dev/stdout\n [15] => ./dev/tty\n [16] => ./dev/tty1\n [17] => ./dev/urandom\n [18] => ./home/.\n [19] => ./home/..\n [20] => ./home/web_user/.\n [21] => ./home/web_user/..\n [22] => ./persist/.\n [23] => ./persist/..\n [24] => ./php.ini\n [25] => ./preload/.\n [26] => ./preload/..\n [27] => ./preload/list-extensions.php\n [28] => ./preload/test_www/.\n [29] => ./preload/test_www/..\n [30] => ./preload/test_www/hello-world.php\n [31] => ./preload/test_www/phpinfo.php\n [32] => ./tmp/.\n [33] => ./tmp/..\n)\n" \ No newline at end of file diff --git a/test/BrowserTest.testFiles_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-linux.json similarity index 100% rename from test/BrowserTest.testFiles_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-linux.json diff --git a/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-shared-linux.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-shared-linux.json new file mode 100644 index 000000000..fa8125535 --- /dev/null +++ b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testFiles-0-shared-linux.json @@ -0,0 +1 @@ +"Array\n(\n [0] => ./.\n [1] => ./..\n [2] => ./config/.\n [3] => ./config/..\n [4] => ./dev/.\n [5] => ./dev/..\n [6] => ./dev/null\n [7] => ./dev/random\n [8] => ./dev/shm/.\n [9] => ./dev/shm/..\n [10] => ./dev/shm/tmp/.\n [11] => ./dev/shm/tmp/..\n [12] => ./dev/stderr\n [13] => ./dev/stdin\n [14] => ./dev/stdout\n [15] => ./dev/tty\n [16] => ./dev/tty1\n [17] => ./dev/urandom\n [18] => ./home/.\n [19] => ./home/..\n [20] => ./home/web_user/.\n [21] => ./home/web_user/..\n [22] => ./persist/.\n [23] => ./persist/..\n [24] => ./php.ini\n [25] => ./preload/.\n [26] => ./preload/..\n [27] => ./preload/icudt72l.dat\n [28] => ./preload/list-extensions.php\n [29] => ./preload/test_www/.\n [30] => ./preload/test_www/..\n [31] => ./preload/test_www/hello-world.php\n [32] => ./preload/test_www/phpinfo.php\n [33] => ./tmp/.\n [34] => ./tmp/..\n)\n" \ No newline at end of file diff --git a/test/BrowserTest.testGoto_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testGoto-0-linux.json similarity index 100% rename from test/BrowserTest.testGoto_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testGoto-0-linux.json diff --git a/test/BrowserTest.testHelloWorld_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testHelloWorld-0-linux.json similarity index 100% rename from test/BrowserTest.testHelloWorld_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testHelloWorld-0-linux.json diff --git a/test/BrowserTest.testPostgres_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testPostgres-0-linux.json similarity index 100% rename from test/BrowserTest.testPostgres_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testPostgres-0-linux.json diff --git a/test/BrowserTest.testSqlite_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testSqlite-0-linux.json similarity index 100% rename from test/BrowserTest.testSqlite_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testSqlite-0-linux.json diff --git a/test/BrowserTest.testSqlitePdo_0.json b/test/browser/browser.spec.mjs-snapshots/BrowserTest-testSqlitePdo-0-linux.json similarity index 100% rename from test/BrowserTest.testSqlitePdo_0.json rename to test/browser/browser.spec.mjs-snapshots/BrowserTest-testSqlitePdo-0-linux.json diff --git a/test/browser/demo-web-artifact-server.mjs b/test/browser/demo-web-artifact-server.mjs new file mode 100644 index 000000000..9ecb3e2a0 --- /dev/null +++ b/test/browser/demo-web-artifact-server.mjs @@ -0,0 +1,140 @@ +import fs from 'node:fs'; +import http from 'node:http'; +import path from 'node:path'; + +const basePath = '/php-wasm'; +const artifactRoot = path.resolve(process.cwd(), process.env.DEMO_WEB_ARTIFACT_ROOT ?? 'docs'); + +const mimeTypes = { + '.css': 'text/css; charset=utf-8' + , '.dat': 'application/octet-stream' + , '.gif': 'image/gif' + , '.html': 'text/html; charset=utf-8' + , '.ico': 'image/x-icon' + , '.js': 'text/javascript; charset=utf-8' + , '.json': 'application/json; charset=utf-8' + , '.map': 'application/json; charset=utf-8' + , '.mjs': 'text/javascript; charset=utf-8' + , '.png': 'image/png' + , '.so': 'application/octet-stream' + , '.sql': 'text/plain; charset=utf-8' + , '.svg': 'image/svg+xml' + , '.txt': 'text/plain; charset=utf-8' + , '.wasm': 'application/wasm' + , '.woff': 'font/woff' + , '.woff2': 'font/woff2' + , '.zip': 'application/zip' +}; + +const send = (res, status, body, headers = {}) => { + res.writeHead(status, headers); + res.end(body); +}; + +const safeJoin = (root, requestedPath) => { + const resolvedRoot = path.resolve(root); + const resolvedPath = path.resolve(resolvedRoot, requestedPath); + + if(!resolvedPath.startsWith(`${resolvedRoot}${path.sep}`) && resolvedPath !== resolvedRoot) + { + return null; + } + + return resolvedPath; +}; + +const serveFile = (req, res, file) => { + const extension = path.extname(file).toLowerCase(); + const headers = { + 'content-type': mimeTypes[extension] ?? 'application/octet-stream' + }; + + if(req.url?.startsWith(`${basePath}/cgi-worker.js`)) + { + headers['service-worker-allowed'] = `${basePath}/`; + } + + const stream = fs.createReadStream(file); + + stream.on('open', () => { + res.writeHead(200, headers); + stream.pipe(res); + }); + + stream.on('error', error => { + send(res, 500, String(error), {'content-type': 'text/plain; charset=utf-8'}); + }); +}; + +const resolveRequestedFile = pathname => { + if(pathname === basePath || pathname === `${basePath}/`) + { + return safeJoin(artifactRoot, 'index.html'); + } + + if(!pathname.startsWith(`${basePath}/`)) + { + return null; + } + + const relativePath = decodeURIComponent(pathname.slice(basePath.length + 1) || 'index.html'); + const requestedPath = relativePath.endsWith('/') + ? `${relativePath}index.html` + : relativePath; + + const candidatePaths = [ + requestedPath + , pathname.replace(/^\/+/, '') + ]; + + for(const candidatePath of candidatePaths) + { + const file = safeJoin(artifactRoot, candidatePath); + + if(file && fs.existsSync(file)) + { + return file; + } + } + + return safeJoin(artifactRoot, '404.html'); +}; + +const server = http.createServer((req, res) => { + const url = new URL(req.url ?? '/', 'http://127.0.0.1'); + + if(url.pathname === '/') + { + send(res, 302, '', {location: `${basePath}/`}); + return; + } + + const file = resolveRequestedFile(url.pathname); + + if(!file) + { + send(res, 404, 'Not Found', {'content-type': 'text/plain; charset=utf-8'}); + return; + } + + fs.stat(file, (error, stats) => { + if(error || !stats.isFile()) + { + send(res, 404, 'Not Found', {'content-type': 'text/plain; charset=utf-8'}); + return; + } + + serveFile(req, res, file); + }); +}); + +const port = Number(process.env.BROWSER_TEST_PORT ?? process.env.DEMO_WEB_E2E_PORT ?? 9414); + +server.listen(port, '127.0.0.1', () => { + process.stdout.write(`demo-web-artifact-server listening on http://127.0.0.1:${port}${basePath}/\n`); +}); + +const close = () => server.close(() => process.exit(0)); + +process.on('SIGINT', close); +process.on('SIGTERM', close); diff --git a/test/browser/demo-web-artifact.spec.mjs b/test/browser/demo-web-artifact.spec.mjs new file mode 100644 index 000000000..64552148d --- /dev/null +++ b/test/browser/demo-web-artifact.spec.mjs @@ -0,0 +1,103 @@ +import { test, expect } from '@playwright/test'; + +const version = process.env.PHP_VERSION ?? '8.4'; + +test.describe.configure({ mode: 'serial' }); + +test('home page uses the production base path', async ({ page }) => { + await page.goto('home.html?no-service-worker', {waitUntil: 'domcontentloaded'}); + + await expect(page).toHaveURL(/\/php-wasm\/home\.html\?no-service-worker$/); + await expect(page.getByRole('heading', { name: 'Select a demo:' })).toBeVisible(); + + const embeddedLink = page.getByRole('link', { name: /PHP Embedded Demo/ }); + const frameworkLink = page.getByRole('link', { name: /PHP CGI Demo/ }); + + await expect(embeddedLink).toHaveAttribute( + 'href', + '/php-wasm/embedded-php.html?demo=sdl-sine.php' + ); + await expect(frameworkLink).toHaveAttribute('href', '/php-wasm/select-framework.html'); +}); + +test('home demo query redirects into the embedded demo', async ({ page }) => { + await page.goto(`home.html?demo=hello-world.php&version=${version}&no-service-worker`, { + waitUntil: 'domcontentloaded' + }); + + await expect(page).toHaveURL(/\/php-wasm\/embedded-php\.html/, { timeout: 180000 }); + await expect(page).toHaveURL(new RegExp(`version=${version.replace('.', '\\.')}`), { timeout: 180000 }); + + const outputFrame = page.locator('iframe').nth(1); + + await expect.poll( + async () => (await outputFrame.getAttribute('srcdoc')) ?? '', + { timeout: 180000 } + ).toContain('Hello, World!'); +}); + +test('embedded php hello world runs', async ({ page }) => { + await page.goto(`embedded-php.html?demo=hello-world.php&version=${version}&extensionFlags=0&no-service-worker`, { + waitUntil: 'domcontentloaded' + }); + + const outputFrame = page.locator('iframe').nth(1); + + await expect.poll( + async () => (await outputFrame.getAttribute('srcdoc')) ?? '', + { timeout: 180000 } + ).toContain('Hello, World!'); +}); + +test('cli preview runs a php script', async ({ page }) => { + const code = encodeURIComponent('echo "Hello, World!";'); + + await page.goto(`cli-preview.html?code=${code}&no-service-worker`, { + waitUntil: 'domcontentloaded' + }); + + await expect(page.getByText('php-cli-wasm preview')).toBeVisible({ timeout: 180000 }); + await expect(page.getByText('Hello, World!')).toBeVisible({ timeout: 180000 }); +}); + +test('debug preview boots php-dbg', async ({ page }) => { + await page.goto('dbg-preview.html?path=/preload/test_www/hello-world.php&no-service-worker', { + waitUntil: 'domcontentloaded' + }); + + await expect(page.getByText('php-dbg-wasm preview')).toBeVisible({ timeout: 180000 }); + await expect(page.getByText('php-dbg-wasm ready!')).toBeVisible({ timeout: 180000 }); + await expect(page.locator('.console-output')).toContainText('/preload/test_www/hello-world.php', { + timeout: 180000 + }); +}); + +test('select framework registers the service worker', async ({ page }) => { + await page.goto('select-framework.html', {waitUntil: 'domcontentloaded'}); + + await expect(page.getByText('Select a Framework:')).toBeVisible({ timeout: 180000 }); + + await expect.poll( + () => page.evaluate(async () => { + if(!navigator.serviceWorker?.controller) + { + return null; + } + + const registration = await navigator.serviceWorker.getRegistration('/php-wasm/'); + + if(!registration) + { + return null; + } + + return ( + registration.active?.scriptURL + ?? registration.installing?.scriptURL + ?? registration.waiting?.scriptURL + ?? '' + ); + }), + { timeout: 180000 } + ).toContain('/php-wasm/cgi-worker.js'); +}); diff --git a/docs/scripts/dynamic-extension.php b/test/browser/fixtures/scripts/dynamic-extension.php similarity index 100% rename from docs/scripts/dynamic-extension.php rename to test/browser/fixtures/scripts/dynamic-extension.php diff --git a/docs/scripts/files.php b/test/browser/fixtures/scripts/files.php similarity index 71% rename from docs/scripts/files.php rename to test/browser/fixtures/scripts/files.php index 3d1f389fe..2c0287b4c 100644 --- a/docs/scripts/files.php +++ b/test/browser/fixtures/scripts/files.php @@ -1,10 +1,15 @@ - $entry) { if('./proc/' === substr($name, 0, 7)) continue; - echo $name . "
"; + $files[] = $name; } + +sort($files); +print_r($files); diff --git a/docs/scripts/goto.php b/test/browser/fixtures/scripts/goto.php similarity index 100% rename from docs/scripts/goto.php rename to test/browser/fixtures/scripts/goto.php diff --git a/docs/scripts/hello-world.php b/test/browser/fixtures/scripts/hello-world.php similarity index 100% rename from docs/scripts/hello-world.php rename to test/browser/fixtures/scripts/hello-world.php diff --git a/docs/scripts/list-extensions.php b/test/browser/fixtures/scripts/list-extensions.php similarity index 100% rename from docs/scripts/list-extensions.php rename to test/browser/fixtures/scripts/list-extensions.php diff --git a/docs/scripts/phpinfo.php b/test/browser/fixtures/scripts/phpinfo.php similarity index 59% rename from docs/scripts/phpinfo.php rename to test/browser/fixtures/scripts/phpinfo.php index 4fa6fe317..94b334b92 100644 --- a/docs/scripts/phpinfo.php +++ b/test/browser/fixtures/scripts/phpinfo.php @@ -1,2 +1,2 @@ -query('CREATE TABLE IF NOT EXISTS people ( diff --git a/test/browser/harness/cgi-page.mjs b/test/browser/harness/cgi-page.mjs new file mode 100644 index 000000000..69736c8ec --- /dev/null +++ b/test/browser/harness/cgi-page.mjs @@ -0,0 +1,83 @@ +import { + appendStderr, + libType, + runtimeVersion, + setMeta, + setStatus, +} from './common.mjs'; + +const testPath = '/php-wasm/cgi-bin/test'; + +const waitForControl = async () => { + if(navigator.serviceWorker.controller) + { + return navigator.serviceWorker.controller; + } + + await new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('Timed out waiting for service-worker control.')), 30000); + + navigator.serviceWorker.addEventListener('controllerchange', () => { + clearTimeout(timeout); + resolve(); + }, {once: true}); + }); + + return navigator.serviceWorker.controller; +}; + +const main = async () => { + if(!navigator.serviceWorker) + { + throw new Error('Service workers are not available in this browser.'); + } + + setStatus('registering'); + + const workerUrl = new URL(`../cgi-worker.mjs?version=${encodeURIComponent(runtimeVersion)}&libType=${encodeURIComponent(libType)}&cacheBust=${Date.now()}`, import.meta.url); + const registration = await navigator.serviceWorker.register(workerUrl, { + scope: '/php-wasm/' + , type: 'module' + , updateViaCache: 'none' + }); + + setMeta( + 'worker-url', + registration.active?.scriptURL + ?? registration.installing?.scriptURL + ?? registration.waiting?.scriptURL + ?? '' + ); + + await navigator.serviceWorker.ready; + + const controller = await waitForControl(); + + if(!controller) + { + throw new Error('No active service worker controller was found.'); + } + + setMeta('controller', controller.scriptURL); + + const response = await fetch(testPath); + const responseText = await response.text(); + + setMeta('powered-by', response.headers.get('x-powered-by') ?? ''); + setMeta('status-code', response.status); + setMeta('request-path', testPath); + document.querySelector('[data-testid="response-text"]').textContent = responseText; + setStatus(response.ok ? 'done' : 'failed'); + + if(!response.ok) + { + appendStderr([responseText, responseText.endsWith('\n') ? '' : '\n']); + throw new Error(`CGI response failed with status ${response.status}.`); + } +}; + +main().catch(error => { + appendStderr([`${String(error)}\n`]); + setStatus('failed'); + throw error; +}); diff --git a/test/browser/harness/cgi-worker.mjs b/test/browser/harness/cgi-worker.mjs new file mode 100644 index 000000000..85ea1f8bb --- /dev/null +++ b/test/browser/harness/cgi-worker.mjs @@ -0,0 +1,68 @@ +import { PhpCgiWorker } from '/packages/php-cgi-wasm/PhpCgiWorker.mjs'; +import { loadCgiSharedLibs } from '/php-wasm/harness/runtime-libs.mjs'; + +const query = new URL(self.location.href).searchParams; +const runtimeVersion = query.get('version') ?? '8.4'; +const libType = query.get('libType') ?? query.get('buildType') ?? 'dynamic'; + +const createNotFoundResponse = request => new Response( + `

404

${request.url} not found`, + {status: 404, headers: {'Content-Type': 'text/html; charset=utf-8'}} +); + +let loader = null; +const prefix = '/php-wasm/cgi-bin/'; +const testPath = `${prefix}test`; + +const init = () => { + if(loader) + { + return loader; + } + + loader = Promise.resolve(new PhpCgiWorker({ + docroot: '/persist/www' + , exclude: [`${prefix}~!@`, `${prefix}.`] + , files: [ + { + parent: '/preload/test_www/' + , name: 'hello-world.php' + , url: new URL('/php-wasm/fixtures/scripts/hello-world.php', self.location.origin) + } + , { + parent: '/preload/test_www/' + , name: 'phpinfo.php' + , url: new URL('/php-wasm/fixtures/scripts/phpinfo.php', self.location.origin) + } + , { + parent: '/preload/' + , name: 'list-extensions.php' + , url: new URL('/php-wasm/fixtures/scripts/list-extensions.php', self.location.origin) + } + ] + , notFound: createNotFoundResponse + , prefix + , sharedLibs: loadCgiSharedLibs(libType) + , staticFS: false + , types: { + html: 'text/html' + , php: 'text/plain; charset=utf-8' + , txt: 'text/plain; charset=utf-8' + } + , vHosts: [ + { + pathPrefix: testPath + , directory: '/preload/test_www' + , entrypoint: 'hello-world.php' + } + ] + , version: runtimeVersion + })); + + return loader; +}; + +self.addEventListener('install', async event => (await init()).handleInstallEvent(event)); +self.addEventListener('activate', async event => (await init()).handleActivateEvent(event)); +self.addEventListener('fetch', async event => (await init()).handleFetchEvent(event)); +self.addEventListener('message', async event => (await init()).handleMessageEvent(event)); diff --git a/test/browser/harness/cgi.html b/test/browser/harness/cgi.html new file mode 100644 index 000000000..9c7c70c06 --- /dev/null +++ b/test/browser/harness/cgi.html @@ -0,0 +1,19 @@ + + + + + php-cgi-wasm Harness + + +

php-cgi-wasm Harness

+

Status: booting

+ + + + + +

+	

+	
+
+
diff --git a/test/browser/harness/cli-page.mjs b/test/browser/harness/cli-page.mjs
new file mode 100644
index 000000000..5c0f4fb8e
--- /dev/null
+++ b/test/browser/harness/cli-page.mjs
@@ -0,0 +1,46 @@
+import { PhpCliWeb } from '/packages/php-cli-wasm/PhpCliWeb.mjs';
+
+import {
+	appendStderr,
+	appendStdout,
+	libType,
+	createIni,
+	query,
+	runtimeVersion,
+	setMeta,
+	setStatus,
+} from './common.mjs';
+import { loadCliSharedLibs } from './runtime-libs.mjs';
+
+const main = async () => {
+	setStatus('loading');
+
+	const php = new PhpCliWeb({
+		code: query.get('code') ?? 'echo "Hello, World!";'
+		, ini: createIni()
+		, persist: [{mountPath: '/persist'}, {mountPath: '/config'}]
+		, sharedLibs: loadCliSharedLibs(libType)
+		, version: runtimeVersion
+	});
+
+	php.addEventListener('output', event => appendStdout(event.detail));
+	php.addEventListener('error', event => appendStderr(event.detail));
+
+	setStatus('running');
+
+	const exitCode = await php.run();
+
+	setMeta('exit-code', exitCode);
+	setStatus(exitCode === 0 ? 'done' : 'failed');
+
+	if(exitCode !== 0)
+	{
+		throw new Error(`PHP CLI exited with code ${exitCode}.`);
+	}
+};
+
+main().catch(error => {
+	appendStderr([`${String(error)}\n`]);
+	setStatus('failed');
+	throw error;
+});
diff --git a/test/browser/harness/cli.html b/test/browser/harness/cli.html
new file mode 100644
index 000000000..4984b7af5
--- /dev/null
+++ b/test/browser/harness/cli.html
@@ -0,0 +1,15 @@
+
+
+
+	
+	php-cli-wasm Harness
+
+
+	

php-cli-wasm Harness

+

Status: booting

+ +

+	

+	
+
+
diff --git a/test/browser/harness/common.mjs b/test/browser/harness/common.mjs
new file mode 100644
index 000000000..b9936cd47
--- /dev/null
+++ b/test/browser/harness/common.mjs
@@ -0,0 +1,73 @@
+export const query = new URLSearchParams(window.location.search);
+export const runtimeVersion = query.get('version') ?? '8.4';
+export const libType = query.get('libType') ?? query.get('buildType') ?? 'dynamic';
+export const buildType = libType;
+export const demo = query.get('demo') ?? 'hello-world.php';
+export const extensionFlags = Number(query.get('extensionFlags') ?? '0');
+export const variant = query.get('variant') ?? '';
+
+const statusNode = document.querySelector('[data-testid="status"]');
+const stdoutNode = document.querySelector('[data-testid="stdout"]');
+const stderrNode = document.querySelector('[data-testid="stderr"]');
+
+export const createIni = () => `
+date.timezone=${Intl.DateTimeFormat().resolvedOptions().timeZone}
+expose_php=0
+display_errors=Off
+display_startup_errors=Off
+log_errors=On
+error_log=/dev/stderr
+`;
+
+export const fixtureUrl = file => new URL(`../fixtures/scripts/${file}`, import.meta.url).toString();
+
+export const preloadFiles = [
+	{
+		parent: '/preload/test_www/'
+		, name: 'hello-world.php'
+		, url: fixtureUrl('hello-world.php')
+	}
+	, {
+		parent: '/preload/test_www/'
+		, name: 'phpinfo.php'
+		, url: fixtureUrl('phpinfo.php')
+	}
+	, {
+		parent: '/preload/'
+		, name: 'list-extensions.php'
+		, url: fixtureUrl('list-extensions.php')
+	}
+];
+
+export const appendStdout = chunks => {
+	stdoutNode.textContent += chunks.join('');
+};
+
+export const appendStderr = chunks => {
+	stderrNode.textContent += chunks.join('');
+};
+
+export const setMeta = (name, value) => {
+	const node = document.querySelector(`[data-testid="${name}"]`);
+
+	if(node)
+	{
+		node.textContent = String(value);
+	}
+};
+
+export const setStatus = value => {
+	statusNode.textContent = value;
+	document.body.dataset.status = value;
+};
+
+export const loadFixtureScript = async file => {
+	const response = await fetch(fixtureUrl(file));
+
+	if(!response.ok)
+	{
+		throw new Error(`Unable to load fixture: ${file}`);
+	}
+
+	return response.text();
+};
diff --git a/test/browser/harness/dbg-page.mjs b/test/browser/harness/dbg-page.mjs
new file mode 100644
index 000000000..375b934e2
--- /dev/null
+++ b/test/browser/harness/dbg-page.mjs
@@ -0,0 +1,112 @@
+import { PhpDbgWeb } from '/packages/php-dbg-wasm/PhpDbgWeb.mjs';
+
+import {
+	appendStderr,
+	appendStdout,
+	libType,
+	createIni,
+	preloadFiles,
+	query,
+	runtimeVersion,
+	setMeta,
+	setStatus,
+} from './common.mjs';
+import { loadDbgSharedLibs } from './runtime-libs.mjs';
+
+const startPath = query.get('path') ?? '/preload/test_www/hello-world.php';
+
+const waitForPrompt = async php => {
+	const start = Date.now();
+
+	while(Date.now() - start < 30000)
+	{
+		const prompt = await php.getPrompt().catch(() => '');
+
+		if(/prompt>/i.test(prompt))
+		{
+			return;
+		}
+
+		await new Promise(resolve => setTimeout(resolve, 100));
+	}
+
+	throw new Error('Timed out waiting for phpdbg prompt.');
+};
+
+const main = async () => {
+	setStatus('loading');
+
+	const php = new PhpDbgWeb({
+		files: preloadFiles
+		, ini: createIni()
+		, persist: [{mountPath: '/persist'}, {mountPath: '/config'}]
+		, sharedLibs: loadDbgSharedLibs(libType)
+		, version: runtimeVersion
+	});
+
+	php.addEventListener('output', event => appendStdout(event.detail));
+	php.addEventListener('error', event => appendStderr(event.detail));
+
+	const updatePromptState = async () => {
+		setMeta('prompt', await php.getPrompt());
+		setMeta('current-file', await php.currentFile());
+		setMeta('current-line', await php.currentLine());
+	};
+
+	const startup = new Promise((resolve, reject) => {
+		let started = false;
+
+		const runStartupCommand = async command => {
+			await php.provideInput(command);
+			await updatePromptState();
+		};
+
+		const startRuntime = async () => {
+			if(started)
+			{
+				return;
+			}
+
+			started = true;
+
+			try
+			{
+				if(startPath)
+				{
+					await runStartupCommand(`exec ${startPath}`);
+				}
+
+				await runStartupCommand('set pagination off');
+				setStatus('ready');
+				resolve();
+			}
+			catch(error)
+			{
+				reject(error);
+			}
+		};
+
+		php.addEventListener('stdin-request', () => {
+			void updatePromptState();
+		});
+
+		php.addEventListener('stdin-request', () => {
+			void startRuntime();
+		}, {once: true});
+
+		void waitForPrompt(php)
+			.then(() => startRuntime())
+			.catch(reject);
+	});
+
+	const process = php.run();
+
+	await startup;
+	await process;
+};
+
+main().catch(error => {
+	appendStderr([`${String(error)}\n`]);
+	setStatus('failed');
+	throw error;
+});
diff --git a/test/browser/harness/dbg.html b/test/browser/harness/dbg.html
new file mode 100644
index 000000000..4fe4aa620
--- /dev/null
+++ b/test/browser/harness/dbg.html
@@ -0,0 +1,24 @@
+
+
+
+	
+	php-dbg-wasm Harness
+	
+
+
+	

php-dbg-wasm Harness

+

Status: booting

+ + + +

+	

+	
+
+
diff --git a/test/browser/harness/embedded-page.mjs b/test/browser/harness/embedded-page.mjs
new file mode 100644
index 000000000..33c6d8302
--- /dev/null
+++ b/test/browser/harness/embedded-page.mjs
@@ -0,0 +1,59 @@
+import { PGlite } from '/node_modules/@electric-sql/pglite/dist/index.js';
+import { PhpWeb } from '/packages/php-wasm/PhpWeb.mjs';
+
+import {
+	appendStderr,
+	appendStdout,
+	libType,
+	createIni,
+	demo,
+	extensionFlags,
+	loadFixtureScript,
+	preloadFiles,
+	runtimeVersion,
+	setMeta,
+	setStatus,
+	variant,
+} from './common.mjs';
+import {
+	loadEmbeddedDynamicLibs,
+	loadEmbeddedExtensionLibs,
+	loadEmbeddedSharedLibs,
+} from './runtime-libs.mjs';
+
+const main = async () => {
+	setStatus('loading');
+
+	const php = new PhpWeb({
+		version: runtimeVersion
+		, ...(variant ? {variant} : {})
+		, dynamicLibs: loadEmbeddedDynamicLibs(demo)
+		, files: preloadFiles
+		, ini: createIni()
+		, PGlite
+		, persist: [{mountPath: '/persist'}, {mountPath: '/config'}]
+		, sharedLibs: [
+			...loadEmbeddedSharedLibs(libType)
+			, ...loadEmbeddedExtensionLibs(libType, extensionFlags)
+		]
+	});
+
+	php.addEventListener('output', event => appendStdout(event.detail));
+	php.addEventListener('error', event => appendStderr(event.detail));
+
+	const exitCode = await php.run(await loadFixtureScript(demo));
+
+	setMeta('exit-code', exitCode);
+	setStatus(exitCode === 0 ? 'done' : 'failed');
+
+	if(exitCode !== 0)
+	{
+		throw new Error(`Embedded PHP exited with code ${exitCode}.`);
+	}
+};
+
+main().catch(error => {
+	appendStderr([`${String(error)}\n`]);
+	setStatus('failed');
+	throw error;
+});
diff --git a/test/browser/harness/embedded.html b/test/browser/harness/embedded.html
new file mode 100644
index 000000000..8b2a312fb
--- /dev/null
+++ b/test/browser/harness/embedded.html
@@ -0,0 +1,15 @@
+
+
+
+	
+	php-wasm Embedded Harness
+
+
+	

php-wasm Embedded Harness

+

Status: booting

+ +

+	

+	
+
+
diff --git a/test/browser/harness/index.html b/test/browser/harness/index.html
new file mode 100644
index 000000000..35f15e95a
--- /dev/null
+++ b/test/browser/harness/index.html
@@ -0,0 +1,16 @@
+
+
+
+	
+	php-wasm Browser Harness
+
+
+	

php-wasm Browser Harness

+ + + diff --git a/test/browser/harness/runtime-libs.mjs b/test/browser/harness/runtime-libs.mjs new file mode 100644 index 000000000..7be9e22f9 --- /dev/null +++ b/test/browser/harness/runtime-libs.mjs @@ -0,0 +1,249 @@ +import dom from '/packages/dom/index.mjs'; +import gd from '/packages/gd/index.mjs'; +import iconv from '/packages/iconv/index.mjs'; +import intl from '/packages/intl/index.mjs'; +import libxml from '/packages/libxml/index.mjs'; +import libzip from '/packages/libzip/index.mjs'; +import mbstring from '/packages/mbstring/index.mjs'; +import openssl from '/packages/openssl/index.mjs'; +import simplexml from '/packages/simplexml/index.mjs'; +import sqlite from '/packages/sqlite/index.mjs'; +import tidy from '/packages/tidy/index.mjs'; +import xml from '/packages/xml/index.mjs'; +import yaml from '/packages/libyaml/index.mjs'; +import zlib from '/packages/zlib/index.mjs'; + +const assetUrl = path => new URL(`../../packages/${path}`, import.meta.url); + +const sharedLib = (name, path) => ({name, url: assetUrl(path)}); +const intlSharedSupport = { + getLibs: () => [ + sharedLib('libicuuc.so', 'intl/libicuuc.so') + , sharedLib('libicutu.so', 'intl/libicutu.so') + , sharedLib('libicutest.so', 'intl/libicutest.so') + , sharedLib('libicuio.so', 'intl/libicuio.so') + , sharedLib('libicui18n.so', 'intl/libicui18n.so') + , sharedLib('libicudata.so', 'intl/libicudata.so') + ] + , getFiles: () => [ + { + name: 'icudt72l.dat' + , path: '/preload/icudt72l.dat' + , url: assetUrl('intl/icudt72l.dat') + } + ] +}; + +const toggleableModules = [ + ['php-wasm-dom', 1, dom] + , ['php-wasm-gd', 2, gd] + , ['php-wasm-iconv', 4, iconv] + , ['php-wasm-intl', 8, intl] + , ['php-wasm-libxml', 16, libxml] + , ['php-wasm-yaml', 32, yaml] + , ['php-wasm-libzip', 64, libzip] + , ['php-wasm-mbstring', 128, mbstring] + , ['php-wasm-openssl', 256, openssl] + , ['php-wasm-simplexml', 512, simplexml] + , ['php-wasm-sqlite', 1024, sqlite] + , ['php-wasm-xml', 2048, xml] + , ['php-wasm-zlib', 4096, zlib] +]; + +const dynamicCliLibs = [ + libxml + , dom + , zlib + , libzip + , gd + , iconv + , intl + , openssl + , mbstring + , sqlite + , xml + , simplexml + , tidy + , yaml +]; + +const dynamicDbgLibs = [ + libxml + , dom + , zlib + , libzip + , gd + , iconv + , intl + , openssl + , mbstring + , sqlite + , xml + , simplexml + , yaml +]; + +const dynamicCgiLibs = [ + libxml + , dom + , zlib + , libzip + , gd + , iconv + , intl + , openssl + , mbstring + , sqlite + , xml + , simplexml + , tidy + , yaml +]; + +const sharedEmbeddedLibs = [ + sharedLib('libxml2.so', 'libxml/libxml2.so') + , sharedLib('libz.so', 'zlib/libz.so') + , sharedLib('libzip.so', 'libzip/libzip.so') + , sharedLib('libfreetype.so', 'gd/libfreetype.so') + , sharedLib('libjpeg.so', 'gd/libjpeg.so') + , sharedLib('libwebp.so', 'gd/libwebp.so') + , sharedLib('libpng.so', 'gd/libpng.so') + , sharedLib('libiconv.so', 'iconv/libiconv.so') + , intlSharedSupport + , sharedLib('libcrypto.so', 'openssl/libcrypto.so') + , sharedLib('libssl.so', 'openssl/libssl.so') + , sharedLib('libonig.so', 'mbstring/libonig.so') + , sharedLib('libsqlite3.so', 'sqlite/libsqlite3.so') + , sharedLib('libtidy.so', 'tidy/libtidy.so') + , sharedLib('libyaml.so', 'libyaml/libyaml.so') +]; + +const sharedCliLibs = [ + sharedLib('libxml2.so', 'libxml/libxml2.so') + , sharedLib('libz.so', 'zlib/libz.so') + , sharedLib('libzip.so', 'libzip/libzip.so') + , sharedLib('libfreetype.so', 'gd/libfreetype.so') + , sharedLib('libjpeg.so', 'gd/libjpeg.so') + , sharedLib('libwebp.so', 'gd/libwebp.so') + , sharedLib('libpng.so', 'gd/libpng.so') + , sharedLib('libiconv.so', 'iconv/libiconv.so') + , intlSharedSupport + , sharedLib('libcrypto.so', 'openssl/libcrypto.so') + , sharedLib('libssl.so', 'openssl/libssl.so') + , sharedLib('libonig.so', 'mbstring/libonig.so') + , sharedLib('libsqlite3.so', 'sqlite/libsqlite3.so') + , sharedLib('libtidy.so', 'tidy/libtidy.so') + , sharedLib('libyaml.so', 'libyaml/libyaml.so') +]; + +const sharedDbgLibs = [ + sharedLib('libxml2.so', 'libxml/libxml2.so') + , sharedLib('libz.so', 'zlib/libz.so') + , sharedLib('libzip.so', 'libzip/libzip.so') + , sharedLib('libfreetype.so', 'gd/libfreetype.so') + , sharedLib('libjpeg.so', 'gd/libjpeg.so') + , sharedLib('libwebp.so', 'gd/libwebp.so') + , sharedLib('libpng.so', 'gd/libpng.so') + , sharedLib('libiconv.so', 'iconv/libiconv.so') + , intlSharedSupport + , sharedLib('libcrypto.so', 'openssl/libcrypto.so') + , sharedLib('libssl.so', 'openssl/libssl.so') + , sharedLib('libonig.so', 'mbstring/libonig.so') + , sharedLib('libsqlite3.so', 'sqlite/libsqlite3.so') + , sharedLib('libtidy.so', 'tidy/libtidy.so') + , sharedLib('libyaml.so', 'libyaml/libyaml.so') +]; + +const sharedCgiLibs = [ + sharedLib('libxml2.so', 'libxml/libxml2.so') + , sharedLib('libz.so', 'zlib/libz.so') + , sharedLib('libzip.so', 'libzip/libzip.so') + , sharedLib('libfreetype.so', 'gd/libfreetype.so') + , sharedLib('libjpeg.so', 'gd/libjpeg.so') + , sharedLib('libwebp.so', 'gd/libwebp.so') + , sharedLib('libpng.so', 'gd/libpng.so') + , sharedLib('libiconv.so', 'iconv/libiconv.so') + , intlSharedSupport + , sharedLib('libcrypto.so', 'openssl/libcrypto.so') + , sharedLib('libssl.so', 'openssl/libssl.so') + , sharedLib('libonig.so', 'mbstring/libonig.so') + , sharedLib('libsqlite3.so', 'sqlite/libsqlite3.so') + , sharedLib('libtidy.so', 'tidy/libtidy.so') + , sharedLib('libyaml.so', 'libyaml/libyaml.so') +]; + +const pickLibsForLibType = (libType, dynamicLibs, sharedLibs) => { + if(libType === 'dynamic') + { + return dynamicLibs; + } + + if(libType === 'shared') + { + return sharedLibs; + } + + return []; +}; + +export const loadEmbeddedSharedLibs = libType => { + if(libType === 'dynamic') + { + return []; + } + + if(libType === 'shared') + { + // Match demo-web so the core shared runtime resolves side modules + // through locateFile using package-local asset URLs. + return sharedEmbeddedLibs; + } + + return []; +}; + +export const loadEmbeddedExtensionLibs = (libType, flags) => { + if(libType !== 'dynamic' || !flags) + { + return []; + } + + const sharedLibs = []; + + for(const [, bit, module] of toggleableModules) + { + if(flags & bit) + { + sharedLibs.push(module); + } + } + + return sharedLibs; +}; + +export const loadEmbeddedDynamicLibs = demoName => { + if(demoName !== 'dynamic-extension.php') + { + return []; + } + + return [yaml]; +}; + +export const loadCliSharedLibs = libType => pickLibsForLibType( + libType, + dynamicCliLibs, + sharedCliLibs +); + +export const loadDbgSharedLibs = libType => pickLibsForLibType( + libType, + dynamicDbgLibs, + sharedDbgLibs +); + +export const loadCgiSharedLibs = libType => pickLibsForLibType( + libType, + dynamicCgiLibs, + sharedCgiLibs +); diff --git a/test/browser/server.mjs b/test/browser/server.mjs new file mode 100644 index 000000000..98ec98ee0 --- /dev/null +++ b/test/browser/server.mjs @@ -0,0 +1,225 @@ +import fs from 'node:fs'; +import http from 'node:http'; +import path from 'node:path'; + +const repoRoot = process.cwd(); +const basePath = '/php-wasm'; + +const mimeTypes = { + '.br': 'application/octet-stream' + , '.css': 'text/css; charset=utf-8' + , '.data': 'application/octet-stream' + , '.gz': 'application/octet-stream' + , '.html': 'text/html; charset=utf-8' + , '.js': 'text/javascript; charset=utf-8' + , '.json': 'application/json; charset=utf-8' + , '.map': 'application/json; charset=utf-8' + , '.mjs': 'text/javascript; charset=utf-8' + , '.php': 'text/plain; charset=utf-8' + , '.so': 'application/octet-stream' + , '.txt': 'text/plain; charset=utf-8' + , '.wasm': 'application/wasm' +}; + +const mounts = [ + { + prefix: `${basePath}/fixtures/` + , root: path.resolve(repoRoot, 'test/browser/fixtures') + } + , { + prefix: `${basePath}/harness/` + , root: path.resolve(repoRoot, 'test/browser/harness') + } + , { + prefix: '/packages/' + , root: path.resolve(repoRoot, 'packages') + } + , { + prefix: '/node_modules/@electric-sql/pglite/' + , root: path.resolve(repoRoot, 'node_modules/@electric-sql/pglite') + } +]; + +const packageSpecifierAliases = new Map([ + ['php-wasm', '/packages/php-wasm'] + , ['php-cgi-wasm', '/packages/php-cgi-wasm'] + , ['php-cli-wasm', '/packages/php-cli-wasm'] + , ['php-dbg-wasm', '/packages/php-dbg-wasm'] + , ['php-wasm-dom', '/packages/dom'] + , ['php-wasm-gd', '/packages/gd'] + , ['php-wasm-iconv', '/packages/iconv'] + , ['php-wasm-intl', '/packages/intl'] + , ['php-wasm-libxml', '/packages/libxml'] + , ['php-wasm-yaml', '/packages/libyaml'] + , ['php-wasm-libzip', '/packages/libzip'] + , ['php-wasm-mbstring', '/packages/mbstring'] + , ['php-wasm-openssl', '/packages/openssl'] + , ['php-wasm-simplexml', '/packages/simplexml'] + , ['php-wasm-sqlite', '/packages/sqlite'] + , ['php-wasm-tidy', '/packages/tidy'] + , ['php-wasm-xml', '/packages/xml'] + , ['php-wasm-zlib', '/packages/zlib'] +]); + +const packageIndexSpecifiers = new Set([ + 'php-wasm-dom' + , 'php-wasm-gd' + , 'php-wasm-iconv' + , 'php-wasm-intl' + , 'php-wasm-libxml' + , 'php-wasm-yaml' + , 'php-wasm-libzip' + , 'php-wasm-mbstring' + , 'php-wasm-openssl' + , 'php-wasm-simplexml' + , 'php-wasm-sqlite' + , 'php-wasm-tidy' + , 'php-wasm-xml' + , 'php-wasm-zlib' +]); + +const send = (res, status, body, headers = {}) => { + res.writeHead(status, headers); + res.end(body); +}; + +const safeJoin = (root, requestedPath) => { + const resolvedRoot = path.resolve(root); + const resolvedPath = path.resolve(resolvedRoot, requestedPath); + + if(!resolvedPath.startsWith(`${resolvedRoot}${path.sep}`) && resolvedPath !== resolvedRoot) + { + return null; + } + + return resolvedPath; +}; + +const rewriteImportSpecifier = specifier => { + for(const [packageName, packagePath] of packageSpecifierAliases) + { + if(specifier === packageName) + { + return packageIndexSpecifiers.has(packageName) + ? `${packagePath}/index.mjs` + : specifier; + } + + if(specifier.startsWith(`${packageName}/`)) + { + return `${packagePath}/${specifier.slice(packageName.length + 1)}`; + } + } + + return specifier; +}; + +const rewriteJavaScriptImports = source => source.replace( + /((?:from\s*|import\s*\(\s*)["'])([^"']+)(["'])/g, + (match, prefix, specifier, suffix) => `${prefix}${rewriteImportSpecifier(specifier)}${suffix}` +); + +const serveFile = (req, res, file) => { + const extension = path.extname(file).toLowerCase(); + const mimeType = mimeTypes[extension] ?? 'application/octet-stream'; + const headers = {'content-type': mimeType}; + + if(req.url?.startsWith(`${basePath}/cgi-worker.mjs`)) + { + headers['service-worker-allowed'] = `${basePath}/`; + } + + if(extension === '.js' || extension === '.mjs') + { + fs.readFile(file, 'utf8', (error, source) => { + if(error) + { + send(res, 500, String(error), {'content-type': 'text/plain; charset=utf-8'}); + return; + } + + send(res, 200, rewriteJavaScriptImports(source), headers); + }); + + return; + } + + const stream = fs.createReadStream(file); + + stream.on('open', () => { + res.writeHead(200, headers); + stream.pipe(res); + }); + + stream.on('error', error => { + send(res, 500, String(error), {'content-type': 'text/plain; charset=utf-8'}); + }); +}; + +const resolveMountedFile = pathname => { + if(pathname === basePath || pathname === `${basePath}/`) + { + return path.resolve(repoRoot, 'test/browser/harness/index.html'); + } + + if(pathname === `${basePath}/cgi-worker.mjs`) + { + return path.resolve(repoRoot, 'test/browser/harness/cgi-worker.mjs'); + } + + for(const mount of mounts) + { + if(!pathname.startsWith(mount.prefix)) + { + continue; + } + + const relativePath = decodeURIComponent(pathname.slice(mount.prefix.length) || 'index.html'); + const requestedPath = relativePath.endsWith('/') + ? `${relativePath}index.html` + : relativePath; + + return safeJoin(mount.root, requestedPath); + } + + return null; +}; + +const server = http.createServer((req, res) => { + const url = new URL(req.url ?? '/', 'http://127.0.0.1'); + + if(url.pathname === '/') + { + send(res, 302, '', {location: `${basePath}/`}); + return; + } + + const file = resolveMountedFile(url.pathname); + + if(!file) + { + send(res, 404, 'Not Found', {'content-type': 'text/plain; charset=utf-8'}); + return; + } + + fs.stat(file, (error, stats) => { + if(error || !stats.isFile()) + { + send(res, 404, 'Not Found', {'content-type': 'text/plain; charset=utf-8'}); + return; + } + + serveFile(req, res, file); + }); +}); + +const port = Number(process.env.BROWSER_TEST_PORT ?? 9000); + +server.listen(port, '127.0.0.1', () => { + process.stdout.write(`browser-test-server listening on http://127.0.0.1:${port}${basePath}/\n`); +}); + +const close = () => server.close(() => process.exit(0)); + +process.on('SIGINT', close); +process.on('SIGTERM', close); diff --git a/test/browser/verify-browser-assets.mjs b/test/browser/verify-browser-assets.mjs new file mode 100644 index 000000000..ca6d9f815 --- /dev/null +++ b/test/browser/verify-browser-assets.mjs @@ -0,0 +1,73 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const repoRoot = process.cwd(); +const versions = ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']; + +const versionedFamilies = [ + ['packages/php-wasm', 'php%s-web.mjs'] + , ['packages/php-cli-wasm', 'php%s-cli-web.mjs'] + , ['packages/php-dbg-wasm', 'php%s-dbg-web.mjs'] + , ['packages/php-cgi-wasm', 'php%s-cgi-worker.mjs'] + , ['packages/dom', '%s.mjs'] + , ['packages/gd', '%s.mjs'] + , ['packages/iconv', '%s.mjs'] + , ['packages/intl', '%s.mjs'] + , ['packages/libyaml', '%s.mjs'] + , ['packages/libzip', '%s.mjs'] + , ['packages/mbstring', '%s.mjs'] + , ['packages/openssl', '%s.mjs'] + , ['packages/simplexml', '%s.mjs'] + , ['packages/sqlite', '%s.mjs'] + , ['packages/tidy', '%s.mjs'] + , ['packages/xml', '%s.mjs'] + , ['packages/zlib', '%s.mjs'] +]; + +const staticFiles = [ + 'packages/libxml/index.mjs' + , 'packages/intl/icudt72l.dat' + , 'test/browser/server.mjs' + , 'test/browser/browser.spec.mjs' +]; + +const missingFiles = []; + +for(const file of staticFiles) +{ + if(!fs.existsSync(path.resolve(repoRoot, file))) + { + missingFiles.push(file); + } +} + +for(const [directory, pattern] of versionedFamilies) +{ + for(const version of versions) + { + const filename = pattern.replace('%s', version); + const fullPath = path.resolve(repoRoot, directory, filename); + + if(!fs.existsSync(fullPath)) + { + missingFiles.push(path.join(directory, filename)); + } + } +} + +if(missingFiles.length) +{ + process.stderr.write( + [ + 'Browser CI assets are incomplete.', + 'The static harness imports package version tables that require the full browser runtime corpus for every PHP version.', + 'Missing files:', + ...missingFiles.map(file => ` - ${file}`), + 'Check the artifact pattern for this job and the upstream package build outputs.' + ].join('\n') + '\n' + ); + + process.exit(1); +} + +process.stdout.write('Browser CI asset verification passed.\n'); diff --git a/test/cgi-node/cgi-node.test.cjs b/test/cgi-node/cgi-node.test.cjs new file mode 100644 index 000000000..204353aa9 --- /dev/null +++ b/test/cgi-node/cgi-node.test.cjs @@ -0,0 +1,17 @@ +const { test } = require('node:test'); +const { strict: assert } = require('node:assert'); + +const version = process.env.PHP_VERSION ?? '8.4'; +const baseUrl = `http://127.0.0.1:${Number(process.env.CGI_NODE_TEST_PORT ?? 9001)}/php-wasm/cgi-bin/test`; + +test('renders the CGI hello world demo', async () => { + const phpOutput = await (await fetch(`${baseUrl}/hello-world.php`)).text(); + + assert.equal(phpOutput, 'Hello, world!\n'); +}); + +test('serves the expected PHP version through CGI', async () => { + const phpOutput = await (await fetch(`${baseUrl}/version.php`)).text(); + + assert.equal(phpOutput, version); +}); diff --git a/test/cgi-node/cgi-node.test.mjs b/test/cgi-node/cgi-node.test.mjs new file mode 100644 index 000000000..9007b330d --- /dev/null +++ b/test/cgi-node/cgi-node.test.mjs @@ -0,0 +1,17 @@ +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; + +const version = process.env.PHP_VERSION ?? '8.4'; +const baseUrl = `http://127.0.0.1:${Number(process.env.CGI_NODE_TEST_PORT ?? 9001)}/php-wasm/cgi-bin/test`; + +test('renders the CGI hello world demo', async () => { + const phpOutput = await (await fetch(`${baseUrl}/hello-world.php`)).text(); + + assert.equal(phpOutput, 'Hello, world!\n'); +}); + +test('serves the expected PHP version through CGI', async () => { + const phpOutput = await (await fetch(`${baseUrl}/version.php`)).text(); + + assert.equal(phpOutput, version); +}); diff --git a/test/cgi-node/server.cjs b/test/cgi-node/server.cjs new file mode 100644 index 000000000..62b39a3be --- /dev/null +++ b/test/cgi-node/server.cjs @@ -0,0 +1,74 @@ +const http = require('node:http'); +const os = require('node:os'); +const path = require('node:path'); +const { mkdtemp, mkdir, rm, writeFile } = require('node:fs/promises'); + +const { PhpCgiNode } = require('php-cgi-wasm/PhpCgiNode'); +const { nodeRuntimeOptions } = require('../lib/node-runtime-options.cjs'); + +(async () => { + const port = Number(process.env.CGI_NODE_TEST_PORT ?? 3003); + const version = process.env.PHP_VERSION ?? '8.4'; + const tempRoot = await mkdtemp(path.join(os.tmpdir(), 'php-cgi-node-test-')); + const persistRoot = path.join(tempRoot, 'persist'); + const configRoot = path.join(tempRoot, 'config'); + const wwwRoot = path.join(persistRoot, 'www', 'test'); + + await mkdir(wwwRoot, { recursive: true }); + await mkdir(configRoot, { recursive: true }); + await writeFile(path.join(wwwRoot, 'hello-world.php'), ' { + const result = await php.request(request); + const reader = result.body.getReader(); + + response.writeHead(result.status, [...result.headers.entries()].flat()); + + let done = false; + + while(!done) + { + const chunk = await reader.read(); + done = chunk.done; + + if(chunk.value) + { + response.write(chunk.value); + } + } + + response.end(); + }); + + const closeServer = async () => { + await new Promise(resolve => server.close(() => resolve())); + await rm(tempRoot, { recursive: true, force: true }); + }; + + for(const signal of ['SIGINT', 'SIGTERM']) + { + process.once(signal, async () => { + await closeServer(); + process.exit(0); + }); + } + + server.listen(port, '0.0.0.0'); +})().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/test/cgi-node/server.mjs b/test/cgi-node/server.mjs new file mode 100644 index 000000000..fe40efdcb --- /dev/null +++ b/test/cgi-node/server.mjs @@ -0,0 +1,69 @@ +import http from 'node:http'; +import os from 'node:os'; +import path from 'node:path'; +import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises'; + +import { PhpCgiNode } from 'php-cgi-wasm/PhpCgiNode'; +import { nodeRuntimeOptions } from '../lib/node-runtime-options.mjs'; + +const port = Number(process.env.CGI_NODE_TEST_PORT ?? 3003); +const version = process.env.PHP_VERSION ?? '8.4'; +const tempRoot = await mkdtemp(path.join(os.tmpdir(), 'php-cgi-node-test-')); +const persistRoot = path.join(tempRoot, 'persist'); +const configRoot = path.join(tempRoot, 'config'); +const wwwRoot = path.join(persistRoot, 'www', 'test'); + +await mkdir(wwwRoot, { recursive: true }); +await mkdir(configRoot, { recursive: true }); +await writeFile(path.join(wwwRoot, 'hello-world.php'), ' { + const result = await php.request(request); + const reader = result.body.getReader(); + + response.writeHead(result.status, [...result.headers.entries()].flat()); + + let done = false; + + while(!done) + { + const chunk = await reader.read(); + done = chunk.done; + + if(chunk.value) + { + response.write(chunk.value); + } + } + + response.end(); +}); + +const closeServer = async () => { + await new Promise(resolve => server.close(() => resolve())); + await rm(tempRoot, { recursive: true, force: true }); +}; + +for(const signal of ['SIGINT', 'SIGTERM']) +{ + process.once(signal, async () => { + await closeServer(); + process.exit(0); + }); +} + +server.listen(port, '0.0.0.0'); diff --git a/test/cli-node/cli-node.test.cjs b/test/cli-node/cli-node.test.cjs new file mode 100644 index 000000000..46a8c63c9 --- /dev/null +++ b/test/cli-node/cli-node.test.cjs @@ -0,0 +1,1479 @@ +const { strict: assert } = require('node:assert'); +const fs = require('node:fs'); +const { test } = require('node:test'); +const path = require('node:path'); +const { PhpCliNode } = require('php-cli-wasm/PhpCliNode'); +const { nodeRuntimeOptions } = require('../lib/node-runtime-options.cjs'); +const { runCliPhpt } = require('../lib/phpt.cjs'); + +const version = process.env.PHP_VERSION ?? '8.4'; +const here = __dirname; +const phpt = name => path.resolve(here, `../../third_party/php${version}-src/tests/lang/${name}.phpt`); +const extPhpt = (extension, name) => path.resolve(here, `../../third_party/php${version}-src/ext/${extension}/tests/${name}`); +const [phpMajor, phpMinor] = version.split('.').map(Number); +const atLeast = (major, minor) => phpMajor > major || (phpMajor === major && phpMinor >= minor); +const simplexmlImportDomPhpts = atLeast(8, 4) + ? ['simplexml_import_new_dom.phpt', 'simplexml_import_old_dom.phpt'] + : ['simplexml_import_dom.phpt']; +const registerNodeClassPhpt = atLeast(8, 4) + ? 'register_node_class.phpt' + : 'regsiter_node_class.phpt'; +const removedZlibPhptsInPhp85 = [ + ['zlib', '004-mb.phpt'], + ['zlib', '004.phpt'], + ['zlib', '007.phpt'], + ['zlib', 'gzfile_variation12.phpt'], + ['zlib', 'gzfile_variation4.phpt'], + ['zlib', 'gzfile_variation5.phpt'], + ['zlib', 'gzfile_variation9.phpt'], + ['zlib', 'readgzfile_variation12.phpt'], + ['zlib', 'readgzfile_variation4.phpt'], + ['zlib', 'readgzfile_variation5.phpt'], + ['zlib', 'readgzfile_variation9.phpt'], +]; +const directCliPhpts = [ + '001', + '002', + '003', + '004', + '005', + '006', + '007', + '008', + '009', + '010', + '011', + '012', + '013', + '014', + '015', + '016', + '017', + '018', + '019', + '020', + '021', + '022', + '023', + '026', + '027', + '028', + '030', + '032', + '033', + '035', + '036', + '037', + '038', + '039', + '040', + '041', + '042', + '043', + '044', + 'array_shortcut_001', + 'array_shortcut_002', + 'array_shortcut_003', + 'array_shortcut_005', + 'bison1', + 'bug18872', + 'bug19566', + 'bug19943', + 'bug20175', + 'bug21094', + 'bug21600', + 'bug21669', + 'bug21820', + 'bug21849', + 'bug21961', + 'bug22231', + 'bug22510', + 'bug22592', + 'bug23279', + 'bug23384', + 'bug23489', + 'bug23524', + 'bug23584', + 'bug23624', + 'bug24054', + 'bug24396', + 'bug24436', + 'bug24499', + 'bug24573', + 'bug24640', + 'bug24652', + 'bug24658', + 'bug24783', + 'bug24908', + 'bug24951', + 'bug25547', + 'bug25652', + 'bug25922', + 'bug26182', + 'bug26696', + 'bug26866', + 'bug26869', + 'bug27354', + 'bug27439', + 'bug27443', + 'bug27535', + 'bug28213', + 'bug28800', + 'bug29566', + 'bug29893', + 'bug29944', + 'bug30578', + 'bug30726', + 'bug30862', + 'bug32828', + 'bug32924', + 'bug35176', + 'bug35382', + 'bug43958', + 'bug44654', + 'bug44827', + 'bug55754', + 'bug71897', + 'bug73172', + 'bug73329', + 'bug7515', + 'catchable_error_001', + 'catchable_error_002', + 'comments', + 'comments2', + 'compare_objects_basic1', + 'compare_objects_basic2', + 'empty_variation', + 'engine_assignExecutionOrder_001', + 'engine_assignExecutionOrder_002', + 'engine_assignExecutionOrder_003', + 'engine_assignExecutionOrder_004', + 'engine_assignExecutionOrder_005', + 'engine_assignExecutionOrder_006', + 'engine_assignExecutionOrder_007', + 'engine_assignExecutionOrder_008', + 'engine_assignExecutionOrder_009', + 'error_2_exception_001', + 'execution_order', + 'foreach_with_object_001', + 'foreach_with_references_001', + 'foreachLoop.001', + 'foreachLoop.002', + 'foreachLoop.003', + 'foreachLoop.004', + 'foreachLoop.005', + 'foreachLoop.006', + 'foreachLoop.009', + 'foreachLoop.010', + 'foreachLoop.011', + 'foreachLoop.012', + 'foreachLoop.013', + 'foreachLoop.014', + 'foreachLoop.015', + 'foreachLoop.016', + 'foreachLoop.017', + 'foreachLoopIterator.001', + 'foreachLoopIterator.002', + 'foreachLoopIteratorAggregate.001', + 'foreachLoopIteratorAggregate.002', + 'foreachLoopIteratorAggregate.003', + 'foreachLoopIteratorAggregate.004', + 'foreachLoopObjects.001', + 'foreachLoopObjects.002', + 'foreachLoopObjects.003', + 'foreachLoopObjects.004', + 'foreachLoopObjects.005', + 'foreachLoopObjects.006', + 'func_get_arg_variation', + 'func_get_arg.001', + 'func_get_arg.002', + 'func_get_arg.003', + 'func_get_arg.004', + 'func_get_arg.005', + 'func_get_args.001', + 'func_get_args.002', + 'func_get_args.003', + 'func_get_args.004', + 'func_num_args.001', + 'func_num_args.002', + 'func_num_args.003', + 'func_num_args.004', + 'include_variation1', + 'include_variation2', + 'include_variation3', + 'invalid_octal', + 'passByReference_001', + 'passByReference_002', + 'passByReference_003', + 'passByReference_004', + 'passByReference_005', + 'passByReference_006', + 'passByReference_007', + 'passByReference_008', + 'passByReference_009', + 'passByReference_010', + 'passByReference_012', + 'returnByReference.001', + 'returnByReference.002', + 'returnByReference.003', + 'returnByReference.004', + 'returnByReference.005', + 'returnByReference.006', + 'returnByReference.007', + 'returnByReference.008', + 'returnByReference.009', + 'short_tags.001', + 'short_tags.002', + 'short_tags.004', + 'static_basic_001', + 'static_basic_002', + 'static_variation_001', + 'static_variation_002', + 'string_decimals_001', + 'syntax_errors', + 'this_assignment', + 'throw_variation_001', + 'type_hints_001', + 'type_hints_002', + 'type_hints_003', + 'zend_throw_exception_001', + 'operators/add_variationStr', + 'operators/bitwiseAnd_variationStr', + 'operators/bitwiseNot_variationStr', + 'operators/bitwiseOr_variationStr', + 'operators/bitwiseShiftLeft_variationStr', + 'operators/bitwiseShiftLeft_variationStr2', + 'operators/bitwiseShiftRight_variationStr', + 'operators/bitwiseShiftRight_variationStr2', + 'operators/bitwiseXor_variationStr', + 'operators/coalesce', + 'operators/divide_variationStr', + 'operators/modulus_variationStr', + 'operators/multiply_variationStr', + 'operators/nan-comparison-false', + 'operators/negate_variationStr', + 'operators/operator_equals_basic', + 'operators/operator_gt_basic', + 'operators/operator_gt_or_equal_basic', + 'operators/operator_gt_variation', + 'operators/operator_identical_basic', + 'operators/operator_identical_recusion-01', + 'operators/operator_lt_basic', + 'operators/operator_lt_or_equal_basic', + 'operators/operator_lt_variation', + 'operators/operator_notequals_basic', + 'operators/operator_notidentical_basic', + 'operators/operator_spaceship_basic', + 'operators/overloaded_property_ref', + 'operators/postdec_variationStr', + 'operators/postinc_variationStr', + 'operators/predec_variationStr', + 'operators/preinc_variationStr', + 'operators/subtract_variationStr', + 'string/unicode_escape', + 'string/unicode_escape_empty', + 'string/unicode_escape_incomplete', + 'string/unicode_escape_large_codepoint', + 'string/unicode_escape_legacy', + 'string/unicode_escape_sign', + 'string/unicode_escape_sign2', + 'string/unicode_escape_surrogates', + 'string/unicode_escape_whitespace', +]; +const directCliExtensionPhpts = [ + ['simplexml', '000.phpt'], + ['simplexml', '001-mb.phpt'], + ['simplexml', '001.phpt'], + ['simplexml', '002.phpt'], + ['simplexml', '003.phpt'], + ['simplexml', '004.phpt'], + ['simplexml', '005.phpt'], + ['simplexml', '006.phpt'], + ['simplexml', '007.phpt'], + ['simplexml', '008.phpt'], + ['simplexml', '009.phpt'], + ['simplexml', '009b.phpt'], + ['simplexml', '010.phpt'], + ['simplexml', '011.phpt'], + ['simplexml', '012.phpt'], + ['simplexml', '013.phpt'], + ['simplexml', '014.phpt'], + ['simplexml', '014a.phpt'], + ['simplexml', '014b.phpt'], + ['simplexml', '015.phpt'], + ['simplexml', '016.phpt'], + ['simplexml', '016a.phpt'], + ['simplexml', '017.phpt'], + ['simplexml', '018.phpt'], + ['simplexml', '019.phpt'], + ['simplexml', '020.phpt'], + ['simplexml', '021.phpt'], + ['simplexml', '022.phpt'], + ['simplexml', '023.phpt'], + ['simplexml', '024.phpt'], + ['simplexml', '025.phpt'], + ['simplexml', '026.phpt'], + ['simplexml', '027.phpt'], + ['simplexml', '028.phpt'], + ['simplexml', '029.phpt'], + ['simplexml', '030.phpt'], + ['simplexml', '031.phpt'], + ['simplexml', '032.phpt'], + ['simplexml', '033.phpt'], + ['simplexml', '034.phpt'], + ['simplexml', '035.phpt'], + ['simplexml', '036.phpt'], + ['simplexml', '037.phpt'], + ['simplexml', '038.phpt'], + ['simplexml', 'bug12170.phpt'], + ['simplexml', 'bug24392.phpt'], + ['simplexml', 'bug26976.phpt'], + ['simplexml', 'bug27010.phpt'], + ['simplexml', 'bug35785.phpt'], + ['simplexml', 'bug36611.phpt'], + ['simplexml', 'bug37076_1.phpt'], + ['simplexml', 'bug37076.phpt'], + ['simplexml', 'bug37386.phpt'], + ['simplexml', 'bug38347.phpt'], + ['simplexml', 'bug38354.phpt'], + ['simplexml', 'bug38406.phpt'], + ['simplexml', 'bug38424.phpt'], + ['simplexml', 'bug39662.phpt'], + ['simplexml', 'bug39760.phpt'], + ['simplexml', 'bug40451.phpt'], + ['simplexml', 'bug41175.phpt'], + ['simplexml', 'bug41582.phpt'], + ['simplexml', 'bug41861.phpt'], + ['simplexml', 'bug41867.phpt'], + ['simplexml', 'bug41947.phpt'], + ['simplexml', 'bug42259.phpt'], + ['simplexml', 'bug42369.phpt'], + ['simplexml', 'bug43221.phpt'], + ['simplexml', 'bug44478.phpt'], + ['simplexml', 'bug45553.phpt'], + ['simplexml', 'bug46003.phpt'], + ['simplexml', 'bug46047.phpt'], + ['simplexml', 'bug46048.phpt'], + ['simplexml', 'bug48601.phpt'], + ['simplexml', 'bug51615.phpt'], + ['simplexml', 'bug52751.phpt'], + ['simplexml', 'bug53033.phpt'], + ['simplexml', 'bug54973.phpt'], + ['simplexml', 'bug61335.phpt'], + ['simplexml', 'bug62328.phpt'], + ['simplexml', 'bug62639.phpt'], + ['simplexml', 'bug63575.phpt'], + ['simplexml', 'bug66084_0.phpt'], + ['simplexml', 'bug66084_1.phpt'], + ['simplexml', 'bug67116.phpt'], + ['simplexml', 'bug67572.phpt'], + ['simplexml', 'bug69169.phpt'], + ['simplexml', 'bug69491.phpt'], + ['simplexml', 'bug72588.phpt'], + ['simplexml', 'bug72957.phpt'], + ['simplexml', 'bug72971_2.phpt'], + ['simplexml', 'bug72971.phpt'], + ['simplexml', 'bug75245.phpt'], + ['simplexml', 'bug76712.phpt'], + ['simplexml', 'bug81325.phpt'], + ['simplexml', 'current_error.phpt'], + ['simplexml', 'feature55218.phpt'], + ['simplexml', 'foreach_by_reference.phpt'], + ['simplexml', 'get_prop_address_not_initialized.phpt'], + ['simplexml', 'gh10200.phpt'], + ['simplexml', 'gh10983.phpt'], + ['simplexml', 'gh12167.phpt'], + ['simplexml', 'gh12169.phpt'], + ['simplexml', 'gh12223.phpt'], + ['simplexml', 'gh12929.phpt'], + ['simplexml', 'gh14638.phpt'], + ['simplexml', 'key_error.phpt'], + ['simplexml', 'profile11.phpt'], + ['simplexml', 'profile12.phpt'], + ['simplexml', 'profile13.phpt'], + ['simplexml', 'profile01.phpt'], + ['simplexml', 'profile02.phpt'], + ['simplexml', 'profile03.phpt'], + ['simplexml', 'profile04.phpt'], + ['simplexml', 'profile05.phpt'], + ['simplexml', 'profile06.phpt'], + ['simplexml', 'profile07.phpt'], + ['simplexml', 'profile08.phpt'], + ['simplexml', 'profile09.phpt'], + ['simplexml', 'profile10.phpt'], + ...simplexmlImportDomPhpts.map(name => ['simplexml', name]), + ['simplexml', 'simplexml_load_file.phpt'], + ['simplexml', 'simplexml_uninitialized.phpt'], + ['simplexml', 'SimpleXMLElement_addAttribute_basic.phpt'], + ['simplexml', 'SimpleXMLElement_addAttribute_required_attribute_name.phpt'], + ['simplexml', 'SimpleXMLElement_getDocNamespaces.phpt'], + ['simplexml', 'SimpleXMLElement_xpath.phpt'], + ['simplexml', 'sxe_001.phpt'], + ['simplexml', 'sxe_002.phpt'], + ['simplexml', 'sxe_003.phpt'], + ['simplexml', 'sxe_004.phpt'], + ['simplexml', 'sxe_005.phpt'], + ['dom', 'DOMDocument_loadHTMLfile_variation1.phpt'], + ['dom', 'DOM4_ChildNode_wrong_document.phpt'], + ['dom', 'DOM4_DOMNode_ElementSiblings.phpt'], + ['dom', 'DOM4_DOMNode_after.phpt'], + ['dom', 'DOM4_DOMNode_after_ns.phpt'], + ['dom', 'DOM4_DOMNode_append_ns.phpt'], + ['dom', 'DOM4_DOMNode_before.phpt'], + ['dom', 'DOM4_DOMNode_before_ns.phpt'], + ['dom', 'DOM4_DOMNode_prepend_ns.phpt'], + ['dom', 'DOM4_DOMNode_remove.phpt'], + ['dom', 'DOM4_DOMNode_removeDanglingElement.phpt'], + ['dom', 'DOM4_DOMNode_replaceWith.phpt'], + ['dom', 'DOM4_ParentNode.phpt'], + ['dom', 'DOM4_ParentNode_Fragment.phpt'], + ['dom', 'DOM4_ParentNode_append.phpt'], + ['dom', 'DOM4_ParentNode_append_invalidtypes.phpt'], + ['dom', 'DOM4_ParentNode_append_with_attributes.phpt'], + ['dom', 'DOM4_ParentNode_append_wrong_document.phpt'], + ['dom', 'DOM4_ParentNode_prepend.phpt'], + ['dom', 'DOMAttr_construct_error_001.phpt'], + ['dom', 'DOMAttr_name_basic_001.phpt'], + ['dom', 'DOMAttr_ownerElement_error_001.phpt'], + ['dom', 'DOMAttr_value_basic_001.phpt'], + ['dom', 'DOMAttr_value_basic_002.phpt'], + ['dom', 'DOMCDATASection_construct_error_001.phpt'], + ['dom', 'DOMCharacterData_appendData_basic.phpt'], + ['dom', 'DOMCharacterData_data_basic_002.phpt'], + ['dom', 'DOMCharacterData_data_error_002.phpt'], + ['dom', 'DOMCharacterData_deleteData_basic_001.phpt'], + ['dom', 'DOMCharacterData_deleteData_error_002.phpt'], + ['dom', 'DOMCharacterData_length_error_001.phpt'], + ['dom', 'DOMCharacterData_replaceWith_self.phpt'], + ['dom', 'DOMCharacterData_substringData_basic_001.phpt'], + ['dom', 'DOMChildNode_methods_without_parent.phpt'], + ['dom', 'DOMComment_appendData_basic.phpt'], + ['dom', 'DOMComment_appendData_basic_Sullivan.phpt'], + ['dom', 'DOMComment_construct_basic_001.phpt'], + ['dom', 'DOMComment_construct_error_001.phpt'], + ['dom', 'DOMComment_insertData_basic.phpt'], + ['dom', 'DOMComment_insertData_error1.phpt'], + ['dom', 'DOMComment_insertData_error2.phpt'], + ['dom', 'DOMComment_replaceData_basic.phpt'], + ['dom', 'DOMComment_replaceData_error1.phpt'], + ['dom', 'DOMComment_replaceData_error2.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_basic_001.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_error_002.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_error_003.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_hasChildNodes_basic.phpt'], + ['dom', 'DOMDocumentFragment_construct_basic_001.phpt'], + ['dom', 'DOMDocumentFragment_construct_error_001.phpt'], + ['dom', 'DOMDocumentType_basic_001.phpt'], + ['dom', 'DOMDocumentType_entities_error_001.phpt'], + ['dom', 'DOMDocumentType_internalSubset_error_001.phpt'], + ['dom', 'DOMDocumentType_name_error_001.phpt'], + ['dom', 'DOMDocumentType_notations_error_001.phpt'], + ['dom', 'DOMDocumentType_publicId_basic_001.phpt'], + ['dom', 'DOMDocumentType_publicId_error_001.phpt'], + ['dom', 'DOMDocumentType_systemId_basic_001.phpt'], + ['dom', 'DOMDocumentType_systemId_error_001.phpt'], + ['dom', 'DOMDocument_adoptNode.phpt'], + ['dom', 'DOMDocument_adoptNode_attribute_references.phpt'], + ['dom', 'DOMDocument_config_basic.phpt'], + ['dom', 'DOMDocument_createAttribute_basic.phpt'], + ['dom', 'DOMDocument_createAttribute_error.phpt'], + ['dom', 'DOMDocument_createAttribute_error1.phpt'], + ['dom', 'DOMDocument_createAttribute_variation.phpt'], + ['dom', 'DOMDocument_createEntityReference_basic.phpt'], + ['dom', 'DOMDocument_createEntityReference_error1.phpt'], + ['dom', 'DOMDocument_createProcessingInstruction_basic.phpt'], + ['dom', 'DOMDocument_createProcessingInstruction_error.phpt'], + ['dom', 'DOMDocument_documentURI_basic.phpt'], + ['dom', 'DOMDocument_encoding_basic.phpt'], + ['dom', 'DOMDocument_getElementsByTagNameNS_match_any_namespace.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_simplexml.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_tree_walk.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_write_properties.phpt'], + ['dom', 'DOMDocument_implementationRead_basic.phpt'], + ['dom', 'DOMDocument_importNode_attribute_prefix_conflict.phpt'], + ['dom', 'DOMDocument_item_cache_invalidation.phpt'], + ['dom', 'DOMDocument_json_encode.phpt'], + ['dom', 'DOMDocument_length_cache_invalidation.phpt'], + ['dom', 'DOMDocument_liveness_caching_invalidation.phpt'], + ['dom', 'DOMDocument_loadHTML_basic.phpt'], + ['dom', 'DOMDocument_loadHTML_error2.phpt'], + ['dom', 'DOMDocument_loadXML_error6.phpt'], + ['dom', 'DOMDocument_load_error6.phpt'], + ['dom', 'DOMDocument_preserveWhiteSpace_basic.phpt'], + ['dom', 'DOMDocument_preserveWhiteSpace_variations.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_basic.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_error1.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_error2.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_basic.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_error1.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_error2.phpt'], + ['dom', 'DOMDocument_resolveExternals_basic.phpt'], + ['dom', 'DOMDocument_saveHTMLFile_error2.phpt'], + ['dom', 'DOMDocument_saveHTMLFile_invalid_filename.phpt'], + ['dom', 'DOMDocument_saveHTML_basic.phpt'], + ['dom', 'DOMDocument_saveHTML_error2.phpt'], + ['dom', 'DOMDocument_saveHTML_variant1.phpt'], + ['dom', 'DOMDocument_saveHTML_variant2.phpt'], + ['dom', 'DOMDocument_savexml_basic.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_addAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_basic.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error1.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error2.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error3.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_missingAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidate_addAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidate_basic.phpt'], + ['dom', 'DOMDocument_schemaValidate_error1.phpt'], + ['dom', 'DOMDocument_schemaValidate_error2.phpt'], + ['dom', 'DOMDocument_schemaValidate_error3.phpt'], + ['dom', 'DOMDocument_schemaValidate_error5.phpt'], + ['dom', 'DOMDocument_schemaValidate_error6.phpt'], + ['dom', 'DOMDocument_schemaValidate_missingAttrs.phpt'], + ['dom', 'DOMDocument_standalone_basic.phpt'], + ['dom', 'DOMDocument_strictErrorChecking_basic.phpt'], + ['dom', 'DOMDocument_strictErrorChecking_variation.phpt'], + ['dom', 'DOMDocument_validate_basic.phpt'], + ['dom', 'DOMDocument_validate_error2.phpt'], + ['dom', 'DOMDocument_validate_external_dtd.phpt'], + ['dom', 'DOMDocument_validate_on_parse_basic.phpt'], + ['dom', 'DOMDocument_validate_on_parse_variation.phpt'], + ['dom', 'DOMElement_append_hierarchy_test.phpt'], + ['dom', 'DOMElement_className.phpt'], + ['dom', 'DOMElement_getAttributeNames.phpt'], + ['dom', 'DOMElement_getElementsByTagName_without_document.phpt'], + ['dom', 'DOMElement_hasAttributes_basic.phpt'], + ['dom', 'DOMElement_id.phpt'], + ['dom', 'DOMElement_insertAdjacentElement.phpt'], + ['dom', 'DOMElement_insertAdjacentText.phpt'], + ['dom', 'DOMElement_prepend_hierarchy_test.phpt'], + ['dom', 'DOMElement_replaceChildren.phpt'], + ['dom', 'DOMElement_setAttributeNS_prefix_conflict.phpt'], + ['dom', 'DOMElement_toggleAttribute.phpt'], + ['dom', 'DOMElement_toggleAttribute_without_document.phpt'], + ['dom', 'DOMEntityReference_basic.phpt'], + ['dom', 'DOMEntityReference_error1.phpt'], + ['dom', 'DOMEntity_fields.phpt'], + ['dom', 'DOMImplementation_createDocumentType_basic.phpt'], + ['dom', 'DOMImplementation_createDocument_basic.phpt'], + ['dom', 'DOMImplementation_hasFeature_basic.phpt'], + ['dom', 'DOMNamedNodeMap_count.phpt'], + ['dom', 'DOMNamedNodeMap_edge_case_offset.phpt'], + ['dom', 'DOMNamedNodeMap_string_references.phpt'], + ['dom', 'DOMNode_C14N_basic.phpt'], + ['dom', 'DOMNode_C14N_references.phpt'], + ['dom', 'DOMNode_DOMNameSpaceNode_isConnected.phpt'], + ['dom', 'DOMNode_DOMNameSpaceNode_parentElement.phpt'], + ['dom', 'DOMNode_cloneNode_basic.phpt'], + ['dom', 'DOMNode_contains.phpt'], + ['dom', 'DOMNode_getLineNo_basic.phpt'], + ['dom', 'DOMNode_getNodePath_basic.phpt'], + ['dom', 'DOMNode_getRootNode.phpt'], + ['dom', 'DOMNode_hasChildNodes.phpt'], + ['dom', 'DOMNode_hasChildNodes_basic.phpt'], + ['dom', 'DOMNode_insertBefore.phpt'], + ['dom', 'DOMNode_insertBefore_error1.phpt'], + ['dom', 'DOMNode_issamenode_basic.phpt'], + ['dom', 'DOMNode_normalize_basic.phpt'], + ['dom', 'DOMNode_removeChild_basic.phpt'], + ['dom', 'DOMNode_removeChild_error1.phpt'], + ['dom', 'DOMNode_replaceChild_basic.phpt'], + ['dom', 'DOMNode_replaceChild_error1.phpt'], + ['dom', 'DOMNode_replaceChild_error2.phpt'], + ['dom', 'DOMParentNode_empty_argument.phpt'], + ['dom', 'DOMProcessingInstruction.phpt'], + ['dom', 'DOMText_appendData_basic.phpt'], + ['dom', 'DomNodeList_count.phpt'], + ['dom', 'ParentNode_append_fragment_text_coalesce.phpt'], + ['dom', 'bug28721.phpt'], + ['dom', 'bug28817.phpt'], + ['dom', 'bug32615.phpt'], + ['dom', 'bug34276.phpt'], + ['dom', 'bug35342.phpt'], + ['dom', 'bug35673.phpt'], + ['dom', 'bug36756.phpt'], + ['dom', 'bug37277.phpt'], + ['dom', 'bug37456.phpt'], + ['dom', 'bug38438.phpt'], + ['dom', 'bug38850.phpt'], + ['dom', 'bug38949.phpt'], + ['dom', 'bug40836.phpt'], + ['dom', 'bug41257.phpt'], + ['dom', 'bug41374.phpt'], + ['dom', 'bug42082.phpt'], + ['dom', 'bug43364.phpt'], + ['dom', 'bug44648.phpt'], + ['dom', 'bug45251.phpt'], + ['dom', 'bug46185.phpt'], + ['dom', 'bug46335.phpt'], + ['dom', 'bug46849.phpt'], + ['dom', 'bug47430.phpt'], + ['dom', 'bug47530.phpt'], + ['dom', 'bug47531_a.phpt'], + ['dom', 'bug47531_b.phpt'], + ['dom', 'bug47848.phpt'], + ['dom', 'bug47849.phpt'], + ['dom', 'bug49463.phpt'], + ['dom', 'bug49490.phpt'], + ['dom', 'bug50661.phpt'], + ['dom', 'bug52656.phpt'], + ['dom', 'bug54382.phpt'], + ['dom', 'bug54601.phpt'], + ['dom', 'bug55700.phpt'], + ['dom', 'bug61858.phpt'], + ['dom', 'bug65196.phpt'], + ['dom', 'bug66502.phpt'], + ['dom', 'bug66783.phpt'], + ['dom', 'bug67081.phpt'], + ['dom', 'bug67440.phpt'], + ['dom', 'bug67474.phpt'], + ['dom', 'bug67949.phpt'], + ['dom', 'bug69373.phpt'], + ['dom', 'bug69679.phpt'], + ['dom', 'bug69846.phpt'], + ['dom', 'bug70001.phpt'], + ['dom', 'bug70359.phpt'], + ['dom', 'bug70558.phpt'], + ['dom', 'bug73907.phpt'], + ['dom', 'bug74004.phpt'], + ['dom', 'bug74416.phpt'], + ['dom', 'bug75451.phpt'], + ['dom', 'bug77569.phpt'], + ['dom', 'bug77686.phpt'], + ['dom', 'bug78025.phpt'], + ['dom', 'bug78221.phpt'], + ['dom', 'bug78577.phpt'], + ['dom', 'bug79271.phpt'], + ['dom', 'bug79451.phpt'], + ['dom', 'bug79852.phpt'], + ['dom', 'bug79968.phpt'], + ['dom', 'bug79971_2.phpt'], + ['dom', 'bug80332_1.phpt'], + ['dom', 'bug80332_2.phpt'], + ['dom', 'bug80600.phpt'], + ['dom', 'bug80602.phpt'], + ['dom', 'bug80602_2.phpt'], + ['dom', 'bug80602_3.phpt'], + ['dom', 'bug80602_4.phpt'], + ['dom', 'bug80927.phpt'], + ['dom', 'bug81433.phpt'], + ['dom', 'bug81642.phpt'], + ['dom', 'bug_lifetime_parentNode_getAttributeNodeNS.phpt'], + ['dom', 'canonicalization.phpt'], + ['dom', 'childNodes_current_crash.phpt'], + ['dom', 'clone_nodes.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttributeNS_with_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttributeNS_without_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_mixed_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_with_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_without_prefix.phpt'], + ['dom', 'delayed_freeing/attribute_declaration.phpt'], + ['dom', 'delayed_freeing/comment_node.phpt'], + ['dom', 'delayed_freeing/direct_construction.phpt'], + ['dom', 'delayed_freeing/document_fragment.phpt'], + ['dom', 'delayed_freeing/dom_character_data.phpt'], + ['dom', 'delayed_freeing/dtd_node.phpt'], + ['dom', 'delayed_freeing/element_declaration.phpt'], + ['dom', 'delayed_freeing/element_uaf_crash.phpt'], + ['dom', 'delayed_freeing/entity_declaration.phpt'], + ['dom', 'delayed_freeing/entity_reference.phpt'], + ['dom', 'delayed_freeing/gh9628_1.phpt'], + ['dom', 'delayed_freeing/gh9628_2.phpt'], + ['dom', 'delayed_freeing/namespace_definition_crash.phpt'], + ['dom', 'delayed_freeing/namespace_definition_crash_in_attribute.phpt'], + ['dom', 'delayed_freeing/namespace_xmlns_declaration.phpt'], + ['dom', 'delayed_freeing/namespace_xmlns_declaration_attribute_variation.phpt'], + ['dom', 'delayed_freeing/notation_declaration.phpt'], + ['dom', 'delayed_freeing/processing_instruction.phpt'], + ['dom', 'delayed_freeing/text_node.phpt'], + ['dom', 'delayed_freeing/without_contructor.phpt'], + ['dom', 'dom001.phpt'], + ['dom', 'dom002.phpt'], + ['dom', 'dom003.phpt'], + ['dom', 'dom005.phpt'], + ['dom', 'dom006.phpt'], + ['dom', 'dom007.phpt'], + ['dom', 'dom_comment_basic.phpt'], + ['dom', 'dom_comment_variation.phpt'], + ['dom', 'dom_create_element.phpt'], + ['dom', 'dom_import_simplexml.phpt'], + ['dom', 'dom_set_attr_node.phpt'], + ['dom', 'domattributes.phpt'], + ['dom', 'domchardata.phpt'], + ['dom', 'domdocument_createentityreference_001.phpt'], + ['dom', 'domelement.phpt'], + ['dom', 'domobject_debug_handler.phpt'], + ['dom', 'domxpath.phpt'], + ['dom', 'element_child_and_parent_node_without_document.phpt'], + ['dom', 'entity_reference_stale_01.phpt'], + ['dom', 'entity_reference_stale_02.phpt'], + ['dom', 'fragments_multiple_nodes_DOMParentNode.phpt'], + ['dom', 'getElementsByTagName_liveness_deallocated_document.phpt'], + ['dom', 'gh10234.phpt'], + ['dom', 'gh11288.phpt'], + ['dom', 'gh11289.phpt'], + ['dom', 'gh11290.phpt'], + ['dom', 'gh11347.phpt'], + ['dom', 'gh11500.phpt'], + ['dom', 'gh11625.phpt'], + ['dom', 'gh11682.phpt'], + ['dom', 'gh11791.phpt'], + ['dom', 'gh11830/attribute_variation.phpt'], + ['dom', 'gh11830/document_variation.phpt'], + ['dom', 'gh11830/hierarchy_variation.phpt'], + ['dom', 'gh11830/type_variation.phpt'], + ['dom', 'gh11906.phpt'], + ['dom', 'gh12002.phpt'], + ['dom', 'gh12616_1.phpt'], + ['dom', 'gh12616_2.phpt'], + ['dom', 'gh12616_3.phpt'], + ['dom', 'gh12870_a.phpt'], + ['dom', 'gh12870_b.phpt'], + ['dom', 'gh13012.phpt'], + ['dom', 'gh13012_ns.phpt'], + ['dom', 'gh14343.phpt'], + ['dom', 'gh14702.phpt'], + ['dom', 'gh9142.phpt'], + ['dom', 'manually_call_constructor/attribute.phpt'], + ['dom', 'manually_call_constructor/cdatasection.phpt'], + ['dom', 'manually_call_constructor/comment.phpt'], + ['dom', 'manually_call_constructor/document.phpt'], + ['dom', 'manually_call_constructor/documentfragment.phpt'], + ['dom', 'manually_call_constructor/element.phpt'], + ['dom', 'manually_call_constructor/entityreference.phpt'], + ['dom', 'manually_call_constructor/processinginstruction.phpt'], + ['dom', 'manually_call_constructor/text.phpt'], + ['dom', 'not_serializable.phpt'], + ['dom', 'not_unserializable.phpt'], + ['dom', 'php_function_edge_cases.phpt'], + ['dom', 'property_write_errors.phpt'], + ['dom', 'reconcile_reused_namespace.phpt'], + ['dom', 'registerNodeClass_abstract_class.phpt'], + ['dom', registerNodeClassPhpt], + ['dom', 'replaceWith_non_viable_next_sibling.phpt'], + ['dom', 'setAttributeNodeNS_same_uri_different_prefix.phpt'], + ['dom', 'specific_namespace_behaviour.phpt'], + ['dom', 'toString_exceptions.phpt'], + ['dom', 'uaf_doctype_iterator.phpt'], + ['dom', 'xpath_domnamespacenode.phpt'], + ['dom', 'xpath_domnamespacenode_advanced.phpt'], + ['zlib', '001.phpt'], + ['zlib', '002.phpt'], + ['zlib', '005.phpt'], + ['sqlite3', 'sqlite3_01_open.phpt'], + ['sqlite3', 'bug45798.phpt'], + ['sqlite3', 'bug53463.phpt'], + ['tidy', '001.phpt'], + ['tidy', '006.phpt'], + ['iconv', 'bug48147.phpt'], + ['iconv', 'bug51250.phpt'], + ['iconv', 'bug53304.phpt'], + ['intl', 'badargs.phpt'], + ['intl', 'breakiter___construct.phpt'], + ['intl', 'breakiter___construct_error.phpt'], + ['intl', 'breakiter_clone_basic.phpt'], + ['intl', 'breakiter_createCodePointInstance_basic.phpt'], + ['intl', 'breakiter_current_basic.phpt'], + ['intl', 'breakiter_factories_basic.phpt'], + ['intl', 'breakiter_first_basic.phpt'], + ['intl', 'breakiter_following_basic.phpt'], + ['intl', 'breakiter_getPartsIterator_error.phpt'], + ['intl', 'breakiter_getPartsIterator_var1.phpt'], + ['intl', 'breakiter_getText_basic.phpt'], + ['intl', 'breakiter_isBoundary_basic.phpt'], + ['intl', 'breakiter_last_basic.phpt'], + ['intl', 'breakiter_next_basic.phpt'], + ['intl', 'breakiter_previous_basic.phpt'], + ['intl', 'breakiter_setText_basic.phpt'], + ['intl', 'bug12887.phpt'], + ['intl', 'bug14562.phpt'], + ['intl', 'bug48227.phpt'], + ['intl', 'bug50590.phpt'], + ['intl', 'bug55562.phpt'], + ['intl', 'bug60192-compare.phpt'], + ['intl', 'bug60192-getlocale.phpt'], + ['intl', 'bug60192-getsortkey.phpt'], + ['intl', 'bug60192-sort.phpt'], + ['intl', 'bug60192-sortwithsortkeys.phpt'], + ['intl', 'bug61860.phpt'], + ['intl', 'bug62017.phpt'], + ['intl', 'bug62081.phpt'], + ['intl', 'bug62082.phpt'], + ['intl', 'bug62083.phpt'], + ['intl', 'bug62759.phpt'], + ['intl', 'bug62915.phpt'], + ['intl', 'bug65732.phpt'], + ['intl', 'bug67397.phpt'], + ['intl', 'bug68447.phpt'], + ['intl', 'bug68471.phpt'], + ['intl', 'bug70451.phpt'], + ['intl', 'bug70452.phpt'], + ['intl', 'bug71020.phpt'], + ['intl', 'bug72061.phpt'], + ['intl', 'bug72241.phpt'], + ['intl', 'bug72533.phpt'], + ['intl', 'bug72639.phpt'], + ['intl', 'bug74063.phpt'], + ['intl', 'bug74264.phpt'], + ['intl', 'bug74298.phpt'], + ['intl', 'bug74433.phpt'], + ['intl', 'bug74484_MessageFormatter.phpt'], + ['intl', 'bug74705.phpt'], + ['intl', 'bug75090.phpt'], + ['intl', 'bug75193.phpt'], + ['intl', 'bug75317.phpt'], + ['intl', 'bug75318.phpt'], + ['intl', 'bug75378.phpt'], + ['intl', 'bug76556.phpt'], + ['intl', 'bug77895.phpt'], + ['intl', 'bug78804.phpt'], + ['intl', 'bug80763.phpt'], + ['intl', 'bug81019.phpt'], + ['intl', 'calendar_add_basic.phpt'], + ['intl', 'calendar_add_error.phpt'], + ['intl', 'calendar_before_after_error.phpt'], + ['intl', 'calendar_clear_basic.phpt'], + ['intl', 'calendar_clear_error.phpt'], + ['intl', 'calendar_const_field_field_count.phpt'], + ['intl', 'calendar_createInstance_basic.phpt'], + ['intl', 'calendar_createInstance_error.phpt'], + ['intl', 'calendar_createInstance_variation1.phpt'], + ['intl', 'calendar_equals_before_after_basic.phpt'], + ['intl', 'calendar_equals_error.phpt'], + ['intl', 'calendar_fieldDifference_basic.phpt'], + ['intl', 'calendar_fieldDifference_error.phpt'], + ['intl', 'calendar_fromDateTime_basic.phpt'], + ['intl', 'calendar_fromDateTime_error.phpt'], + ['intl', 'calendar_getAvailableLocales_basic.phpt'], + ['intl', 'calendar_getDayOfWeekType_error.phpt'], + ['intl', 'calendar_getErrorCode_error.phpt'], + ['intl', 'calendar_getErrorCode_getErrorMessage_basic.phpt'], + ['intl', 'calendar_getErrorMessage_error.phpt'], + ['intl', 'calendar_getFirstDayOfWeek_basic.phpt'], + ['intl', 'calendar_getFirstDayOfWeek_error.phpt'], + ['intl', 'calendar_getKeywordValuesForLocale_basic.phpt'], + ['intl', 'calendar_getLocale_basic.phpt'], + ['intl', 'calendar_getLocale_error.phpt'], + ['intl', 'calendar_getMinimalDaysInFirstWeek_basic.phpt'], + ['intl', 'calendar_getMinimalDaysInFirstWeek_error.phpt'], + ['intl', 'calendar_getNow_basic.phpt'], + ['intl', 'calendar_getSkipped_RepeatedWallTimeOption_error.phpt'], + ['intl', 'calendar_getTimeZone_basic.phpt'], + ['intl', 'calendar_getTimeZone_error.phpt'], + ['intl', 'calendar_getTime_basic.phpt'], + ['intl', 'calendar_getTime_error.phpt'], + ['intl', 'calendar_getType_basic.phpt'], + ['intl', 'calendar_getType_error.phpt'], + ['intl', 'calendar_getWeekendTransition_basic.phpt'], + ['intl', 'calendar_getWeekendTransition_error.phpt'], + ['intl', 'calendar_getXMaximum_basic.phpt'], + ['intl', 'calendar_getXMinimum_basic.phpt'], + ['intl', 'calendar_get_Least_Greatest_Minimum_Maximum_error.phpt'], + ['intl', 'calendar_get_basic.phpt'], + ['intl', 'calendar_get_getActualMaximum_Minumum_error.phpt'], + ['intl', 'calendar_get_getActualMaximum_Minumum_error2.phpt'], + ['intl', 'calendar_get_setRepeatedWallTimeOption_basic.phpt'], + ['intl', 'calendar_get_setSkippedWallTimeOption_basic.phpt'], + ['intl', 'calendar_inDaylightTime_basic.phpt'], + ['intl', 'calendar_inDaylightTime_error.phpt'], + ['intl', 'calendar_isEquivalentTo_basic.phpt'], + ['intl', 'calendar_isEquivalentTo_error.phpt'], + ['intl', 'calendar_isLenient_error.phpt'], + ['intl', 'calendar_isSet_basic.phpt'], + ['intl', 'calendar_isSet_empty_time.phpt'], + ['intl', 'calendar_isSet_error.phpt'], + ['intl', 'calendar_isWeekend_basic.phpt'], + ['intl', 'calendar_isWeekend_error.phpt'], + ['intl', 'calendar_is_set_lenient_basic.phpt'], + ['intl', 'calendar_roll_basic.phpt'], + ['intl', 'calendar_roll_error.phpt'], + ['intl', 'calendar_roll_variation1.phpt'], + ['intl', 'calendar_setFirstDayOfWeek_basic.phpt'], + ['intl', 'calendar_setFirstDayOfWeek_error.phpt'], + ['intl', 'calendar_setLenient_error.phpt'], + ['intl', 'calendar_setMinimalDaysInFirstWeek_basic.phpt'], + ['intl', 'calendar_setMinimalDaysInFirstWeek_error.phpt'], + ['intl', 'calendar_setSkipped_RepeatedWallTimeOption_error.phpt'], + ['intl', 'calendar_setTimeZone_basic.phpt'], + ['intl', 'calendar_setTimeZone_error.phpt'], + ['intl', 'calendar_setTimeZone_error2.phpt'], + ['intl', 'calendar_setTimeZone_variation1.phpt'], + ['intl', 'calendar_setTimeZone_variation2.phpt'], + ['intl', 'calendar_setTime_basic.phpt'], + ['intl', 'calendar_setTime_error.phpt'], + ['intl', 'calendar_set_basic.phpt'], + ['intl', 'calendar_set_date.phpt'], + ['intl', 'calendar_set_date_time.phpt'], + ['intl', 'calendar_set_error.phpt'], + ['intl', 'calendar_set_variation1.phpt'], + ['intl', 'calendar_toDateTime_basic.phpt'], + ['intl', 'calendar_toDateTime_error.phpt'], + ['intl', 'collation_customization.phpt'], + ['intl', 'collator_get_error_code.phpt'], + ['intl', 'collator_get_error_message.phpt'], + ['intl', 'collator_get_set_attribute.phpt'], + ['intl', 'collator_get_set_strength.phpt'], + ['intl', 'cpbi_clone_equality.phpt'], + ['intl', 'cpbi_getLastCodePoint_basic.phpt'], + ['intl', 'cpbi_parts_iterator.phpt'], + ['intl', 'dateformat___construct_bad_tz_cal.phpt'], + ['intl', 'dateformat_bug65683.phpt'], + ['intl', 'dateformat_bug65683_2.phpt'], + ['intl', 'dateformat_bug68893.phpt'], + ['intl', 'dateformat_bug71516.phpt'], + ['intl', 'dateformat_clone2.phpt'], + ['intl', 'dateformat_clone_bad_obj.phpt'], + ['intl', 'dateformat_formatObject_error.phpt'], + ['intl', 'dateformat_format_relative.phpt'], + ['intl', 'dateformat_get_datetype.phpt'], + ['intl', 'dateformat_get_set_pattern2.phpt'], + ['intl', 'dateformat_get_timetype.phpt'], + ['intl', 'dateformat_get_timezone_id.phpt'], + ['intl', 'dateformat_invalid_timezone.phpt'], + ['intl', 'dateformat_is_set_lenient.phpt'], + ['intl', 'dateformat_setTimeZone_error.phpt'], + ['intl', 'datepatterngenerator_clone.phpt'], + ['intl', 'datepatterngenerator_error.phpt'], + ['intl', 'deprecated_number_formater_type_currency.phpt'], + ['intl', 'formatter_clone.phpt'], + ['intl', 'formatter_clone_bad_obj.phpt'], + ['intl', 'formatter_fail.phpt'], + ['intl', 'formatter_format_and_parse_errors.phpt'], + ['intl', 'formatter_format_conv.phpt'], + ['intl', 'formatter_format_currency2.phpt'], + ['intl', 'formatter_get_error.phpt'], + ['intl', 'formatter_parse.phpt'], + ['intl', 'formatter_parse_currency.phpt'], + ['intl', 'gh10647.phpt'], + ['intl', 'gh11658.phpt'], + ['intl', 'gh12020.phpt'], + ['intl', 'gh12243.phpt'], + ['intl', 'gh12282.phpt'], + ['intl', 'gh12943.phpt'], + ['intl', 'gh7734.phpt'], + ['intl', 'gh8115.phpt'], + ['intl', 'gh8364.phpt'], + ['intl', 'grapheme_empty.phpt'], + ['intl', 'grapheme_out_of_bounds.phpt'], + ['intl', 'gregoriancalendar___construct_basic.phpt'], + ['intl', 'gregoriancalendar___construct_error.phpt'], + ['intl', 'gregoriancalendar___construct_variant1.phpt'], + ['intl', 'gregoriancalendar_getGregorianChange_error.phpt'], + ['intl', 'gregoriancalendar_get_setGregorianChange_basic.phpt'], + ['intl', 'gregoriancalendar_isLeapYear_basic.phpt'], + ['intl', 'gregoriancalendar_isLeapYear_error.phpt'], + ['intl', 'idn.phpt'], + ['intl', 'idn_bug76829.phpt'], + ['intl', 'ini_use_exceptions_basic.phpt'], + ['intl', 'intl_error_name.phpt'], + ['intl', 'intl_get_error_code.phpt'], + ['intl', 'intl_get_error_message.phpt'], + ['intl', 'intl_icu_data_version_constant.phpt'], + ['intl', 'intl_icu_version_constant.phpt'], + ['intl', 'intl_is_failure.phpt'], + ['intl', 'locale/bug72809.phpt'], + ['intl', 'locale/bug74993.phpt'], + ['intl', 'locale_accept.phpt'], + ['intl', 'locale_bug66289.phpt'], + ['intl', 'locale_bug72658.phpt'], + ['intl', 'locale_bug74439.phpt'], + ['intl', 'locale_compose_locale.phpt'], + ['intl', 'locale_get_all_variants.phpt'], + ['intl', 'locale_get_default.phpt'], + ['intl', 'locale_get_display_language3.phpt'], + ['intl', 'locale_get_display_variant2.phpt'], + ['intl', 'locale_get_keywords2.phpt'], + ['intl', 'locale_get_primary_language.phpt'], + ['intl', 'locale_get_region.phpt'], + ['intl', 'locale_get_script.phpt'], + ['intl', 'locale_parse_locale2.phpt'], + ['intl', 'locale_set_default.phpt'], + ['intl', 'msgfmt_bug70484.phpt'], + ['intl', 'msgfmt_clone.phpt'], + ['intl', 'msgfmt_clone_bad_obj.phpt'], + ['intl', 'msgfmt_fail2.phpt'], + ['intl', 'msgfmt_format.phpt'], + ['intl', 'msgfmt_format_error1.phpt'], + ['intl', 'msgfmt_format_error2.phpt'], + ['intl', 'msgfmt_format_error3.phpt'], + ['intl', 'msgfmt_format_error4.phpt'], + ['intl', 'msgfmt_format_error5.phpt'], + ['intl', 'msgfmt_format_error6.phpt'], + ['intl', 'msgfmt_format_mixed_params.phpt'], + ['intl', 'msgfmt_format_subpatterns.phpt'], + ['intl', 'msgfmt_format_subpatterns_named.phpt'], + ['intl', 'msgfmt_get_locale.phpt'], + ['intl', 'msgfmt_get_set_pattern.phpt'], + ['intl', 'msgfmt_millisecond_dates.phpt'], + ['intl', 'msgfmt_parse.phpt'], + ['intl', 'msgfmt_setPattern_cache.phpt'], + ['intl', 'normalizer_normalize.phpt'], + ['intl', 'rbbiter___construct_basic.phpt'], + ['intl', 'rbbiter_getRuleStatusVec_basic.phpt'], + ['intl', 'rbbiter_getRuleStatus_basic.phpt'], + ['intl', 'regression_sort_and_cow.phpt'], + ['intl', 'regression_sort_eq.phpt'], + ['intl', 'regression_sortwsk_and_cow.phpt'], + ['intl', 'regression_sortwsk_eq.phpt'], + ['intl', 'resourcebundle_arrayaccess.phpt'], + ['intl', 'resourcebundle_countable.phpt'], + ['intl', 'resourcebundle_create.phpt'], + ['intl', 'resourcebundle_double_ctor.phpt'], + ['intl', 'resourcebundle_individual.phpt'], + ['intl', 'resourcebundle_iterator.phpt'], + ['intl', 'resourcebundle_locales.phpt'], + ['intl', 'resourcebundle_traversable.phpt'], + ['intl', 'spoofchecker_self_references.phpt'], + ['intl', 'spoofchecker_typed_references.phpt'], + ['intl', 'timezone_clone_basic.phpt'], + ['intl', 'timezone_clone_error.phpt'], + ['intl', 'timezone_countEquivalentIDs_basic.phpt'], + ['intl', 'timezone_countEquivalentIDs_error.phpt'], + ['intl', 'timezone_createDefault_basic.phpt'], + ['intl', 'timezone_createEnumeration_basic.phpt'], + ['intl', 'timezone_createEnumeration_error.phpt'], + ['intl', 'timezone_createEnumeration_variation1.phpt'], + ['intl', 'timezone_createEnumeration_variation2.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_basic.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_error.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_variant1.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_variant2.phpt'], + ['intl', 'timezone_createTimeZone_basic.phpt'], + ['intl', 'timezone_createTimeZone_error.phpt'], + ['intl', 'timezone_equals_basic.phpt'], + ['intl', 'timezone_equals_error.phpt'], + ['intl', 'timezone_fromDateTimeZone_basic.phpt'], + ['intl', 'timezone_fromDateTimeZone_error.phpt'], + ['intl', 'timezone_getCanonicalID_basic.phpt'], + ['intl', 'timezone_getCanonicalID_error.phpt'], + ['intl', 'timezone_getDSTSavings_basic.phpt'], + ['intl', 'timezone_getDSTSavings_error.phpt'], + ['intl', 'timezone_getDisplayName_basic.phpt'], + ['intl', 'timezone_getDisplayName_error.phpt'], + ['intl', 'timezone_getDisplayName_variant1.phpt'], + ['intl', 'timezone_getEquivalentID_basic.phpt'], + ['intl', 'timezone_getEquivalentID_error.phpt'], + ['intl', 'timezone_getErrorCode_error.phpt'], + ['intl', 'timezone_getErrorMessage_error.phpt'], + ['intl', 'timezone_getGMT_basic.phpt'], + ['intl', 'timezone_getID_error.phpt'], + ['intl', 'timezone_getOffset_basic.phpt'], + ['intl', 'timezone_getRawOffset_basic.phpt'], + ['intl', 'timezone_getRawOffset_error.phpt'], + ['intl', 'timezone_getRegion_basic.phpt'], + ['intl', 'timezone_getRegion_error.phpt'], + ['intl', 'timezone_getTZData_basic.phpt'], + ['intl', 'timezone_getUnknown_basic.phpt'], + ['intl', 'timezone_hasSameRules_basic.phpt'], + ['intl', 'timezone_hasSameRules_error.phpt'], + ['intl', 'timezone_toDateTimeZone_basic.phpt'], + ['intl', 'timezone_toDateTimeZone_error.phpt'], + ['intl', 'timezone_useDaylightTime_basic.phpt'], + ['intl', 'timezone_useDaylightTime_error.phpt'], + ['intl', 'transliterator_child.phpt'], + ['intl', 'transliterator_clone.phpt'], + ['intl', 'transliterator_create_basic.phpt'], + ['intl', 'transliterator_create_error.phpt'], + ['intl', 'transliterator_create_from_rule_basic.phpt'], + ['intl', 'transliterator_create_from_rule_error.phpt'], + ['intl', 'transliterator_create_inverse_basic.phpt'], + ['intl', 'transliterator_create_inverse_error.phpt'], + ['intl', 'transliterator_get_error_code_basic.phpt'], + ['intl', 'transliterator_get_error_code_error.phpt'], + ['intl', 'transliterator_get_error_message_basic.phpt'], + ['intl', 'transliterator_get_error_message_error.phpt'], + ['intl', 'transliterator_list_ids_basic.phpt'], + ['intl', 'transliterator_property_id.phpt'], + ['intl', 'transliterator_transliterate_basic.phpt'], + ['intl', 'transliterator_transliterate_error.phpt'], + ['intl', 'transliterator_transliterate_variant1.phpt'], + ['intl', 'uconverter___construct_error.phpt'], + ['intl', 'uconverter_bug66873.phpt'], + ['intl', 'uconverter_enum.phpt'], + ['intl', 'uconverter_func_basic.phpt'], + ['intl', 'uconverter_func_subst.phpt'], + ['intl', 'uconverter_getDestinationEncoding.phpt'], + ['intl', 'uconverter_getSourceEncoding.phpt'], + ['intl', 'uconverter_getstandards_basic.phpt'], + ['intl', 'uconverter_oop_algo.phpt'], + ['intl', 'uconverter_oop_basic.phpt'], + ['intl', 'uconverter_oop_callback_return.phpt'], + ['intl', 'uconverter_oop_subst.phpt'], + ['intl', 'uconverter_setSourceEncoding.phpt'], + ['xmlwriter', '001.phpt'], + ['xmlwriter', '002.phpt'], + ['xmlwriter', '003.phpt'], + ['xmlwriter', '004.phpt'], + ['xmlwriter', '005-mb.phpt'], + ['xmlwriter', '005.phpt'], + ['xmlwriter', '006.phpt'], + ['xmlwriter', '007.phpt'], + ['xmlwriter', '008.phpt'], + ['xmlwriter', '009.phpt'], + ['xmlwriter', '010.phpt'], + ['xmlwriter', '011.phpt'], + ['xmlwriter', '012.phpt'], + ['xmlwriter', 'bug39504.phpt'], + ['xmlwriter', 'bug41287.phpt'], + ['xmlwriter', 'bug41326.phpt'], + ['xmlwriter', 'bug48204.phpt'], + ['xmlwriter', 'bug71536.phpt'], + ['xmlwriter', 'bug79344.phpt'], + ['xmlwriter', 'OO_001.phpt'], + ['xmlwriter', 'OO_002.phpt'], + ['xmlwriter', 'OO_003.phpt'], + ['xmlwriter', 'OO_004.phpt'], + ['xmlwriter', 'OO_005.phpt'], + ['xmlwriter', 'OO_006.phpt'], + ['xmlwriter', 'OO_007.phpt'], + ['xmlwriter', 'OO_008.phpt'], + ['xmlwriter', 'OO_009.phpt'], + ['xmlwriter', 'OO_010.phpt'], + ['xmlwriter', 'OO_011.phpt'], + ['xmlwriter', 'OO_012.phpt'], + ['xmlwriter', 'OO_013.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_001.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_003.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_004.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_005.phpt'], + ['xmlwriter', 'xmlwriter_write_attribute_ns_basic_001.phpt'], + ['xmlwriter', 'xmlwriter_write_dtd_basic_001.phpt'], + ['xmlreader', '001.phpt'], + ['xmlreader', '002.phpt'], + ['xmlreader', '003.phpt'], + ['xmlreader', '004.phpt'], + ['xmlreader', 'open_error.phpt'], + ['xmlreader', 'readString_basic.phpt'], + ['zlib', '003.phpt'], + ['zlib', '006.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(0, 3)), + ['zlib', '008.phpt'], + ['zlib', 'bug48725.phpt'], + ['zlib', 'bug48725_2.phpt'], + ['zlib', 'bug61287.phpt'], + ['zlib', 'bug61443.phpt'], + ['zlib', 'bug61820.phpt'], + ['zlib', 'bug71417.phpt'], + ['zlib', 'bug73944.phpt'], + ['zlib', 'bug74240.phpt'], + ['zlib', 'bug75273.phpt'], + ['zlib', 'bug75299.phpt'], + ['zlib', 'bug_34821.phpt'], + ['zlib', 'bug_52944.phpt'], + ['zlib', 'deflate_add_basic.phpt'], + ['zlib', 'deflate_add_buffer_full.phpt'], + ['zlib', 'deflate_add_error.phpt'], + ['zlib', 'deflate_init_error.phpt'], + ['zlib', 'deflate_init_reuse.phpt'], + ['zlib', 'dictionary_usage.phpt'], + ['zlib', 'gzclose_basic.phpt'], + ['zlib', 'gzcompress_error1.phpt'], + ['zlib', 'gzcompress_variation1.phpt'], + ['zlib', 'gzdeflate_error1.phpt'], + ['zlib', 'gzdeflate_variation1.phpt'], + ['zlib', 'gzencode_error1.phpt'], + ['zlib', 'gzeof_basic.phpt'], + ['zlib', 'gzeof_variation1.phpt'], + ['zlib', 'gzfile_basic.phpt'], + ['zlib', 'gzfile_basic2.phpt'], + ['zlib', 'gzfile_variation15.phpt'], + ['zlib', 'gzfile_variation7.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(3, 7)), + ['zlib', 'gzfilegzreadfile.phpt'], + ['zlib', 'gzgets_basic.phpt'], + ['zlib', 'gzinflate-bug42663.phpt'], + ['zlib', 'gzinflate_error1.phpt'], + ['zlib', 'gzinflate_length.phpt'], + ['zlib', 'gzopen_basic.phpt'], + ['zlib', 'gzopen_basic2.phpt'], + ['zlib', 'gzopen_variation4.phpt'], + ['zlib', 'gzopen_variation5.phpt'], + ['zlib', 'gzopen_variation6.phpt'], + ['zlib', 'gzopen_variation7.phpt'], + ['zlib', 'gzopen_variation8.phpt'], + ['zlib', 'gzopen_variation9.phpt'], + ['zlib', 'gzpassthru_basic.phpt'], + ['zlib', 'gzputs_basic.phpt'], + ['zlib', 'gzread_basic.phpt'], + ['zlib', 'gzread_error2.phpt'], + ['zlib', 'gzread_variation1.phpt'], + ['zlib', 'gzreadgzwrite.phpt'], + ['zlib', 'gzreadgzwriteplain.phpt'], + ['zlib', 'gzrewind_basic.phpt'], + ['zlib', 'gzrewind_basic2.phpt'], + ['zlib', 'gzrewind_variation1.phpt'], + ['zlib', 'gzseek_basic.phpt'], + ['zlib', 'gzseek_basic2.phpt'], + ['zlib', 'gzseek_variation1.phpt'], + ['zlib', 'gzseek_variation2.phpt'], + ['zlib', 'gzseek_variation3.phpt'], + ['zlib', 'gzseek_variation4.phpt'], + ['zlib', 'gzseek_variation5.phpt'], + ['zlib', 'gzseek_variation6.phpt'], + ['zlib', 'gzseek_variation7.phpt'], + ['zlib', 'gztell_basic.phpt'], + ['zlib', 'gztell_basic2.phpt'], + ['zlib', 'gzuncompress_basic1.phpt'], + ['zlib', 'gzuncompress_error1.phpt'], + ['zlib', 'gzwrite_basic.phpt'], + ['zlib', 'gzwrite_error2.phpt'], + ['zlib', 'gzwrite_variation1.phpt'], + ['zlib', 'inflate_add_error.phpt'], + ['zlib', 'inflate_get_read_len.phpt'], + ['zlib', 'inflate_get_status.phpt'], + ['zlib', 'inflate_init_error.phpt'], + ['zlib', 'inflate_init_reuse.phpt'], + ['zlib', 'ob_002.phpt'], + ['zlib', 'readgzfile_basic.phpt'], + ['zlib', 'readgzfile_basic2.phpt'], + ['zlib', 'readgzfile_variation15.phpt'], + ['zlib', 'readgzfile_variation7.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(7)), + ['zlib', 'zlib_filter_deflate.phpt'], + ['zlib', 'zlib_filter_deflate2.phpt'], + ['zlib', 'zlib_filter_inflate.phpt'], + ['zlib', 'zlib_get_coding_type_basic.phpt'], + ['zlib', 'zlib_get_coding_type_br.phpt'], + ['zlib', 'zlib_scheme_copy_basic.phpt'], + ['zlib', 'zlib_scheme_copy_variation1.phpt'], + ['zlib', 'zlib_scheme_copy_variation2.phpt'], + ['zlib', 'zlib_scheme_dir_basic.phpt'], + ['zlib', 'zlib_scheme_file_basic.phpt'], + ['zlib', 'zlib_scheme_file_get_contents_basic.phpt'], + ['zlib', 'zlib_scheme_file_put_contents_basic.phpt'], + ['zlib', 'zlib_scheme_file_read_file_basic.phpt'], + ['zlib', 'zlib_scheme_fopen_basic.phpt'], + ['zlib', 'zlib_scheme_fopen_variation1.phpt'], + ['zlib', 'zlib_scheme_rename_basic.phpt'], + ['zlib', 'zlib_scheme_stat_basic.phpt'], + ['zlib', 'zlib_scheme_stat_basic2.phpt'], + ['zlib', 'zlib_scheme_unlink_basic.phpt'], + ['zlib', 'zlib_wrapper_fflush_basic.phpt'], + ['zlib', 'zlib_wrapper_flock_basic.phpt'], + ['zlib', 'zlib_wrapper_fstat_basic.phpt'], + ['zlib', 'zlib_wrapper_ftruncate_basic.phpt'], + ['zlib', 'zlib_wrapper_meta_data_basic.phpt'], + ['sqlite3', 'bug47159.phpt'], + ['sqlite3', 'bug66550.phpt'], + ['sqlite3', 'bug68760.phpt'], + ['sqlite3', 'bug69972.phpt'], + ['sqlite3', 'bug70628.phpt'], + ['sqlite3', 'bug71049.phpt'], + ['sqlite3', 'bug72571.phpt'], + ['sqlite3', 'bug72668.phpt'], + ['sqlite3', 'bug73333.phpt'], + ['sqlite3', 'bug76665.phpt'], + ['sqlite3', 'bug77051.phpt'], + ['sqlite3', 'bug79294.phpt'], + ['sqlite3', 'exception_from_toString.phpt'], + ['sqlite3', 'gh11451.phpt'], + ['sqlite3', 'gh11878.phpt'], + ['sqlite3', 'sqlite3_01_open-mb.phpt'], + ['sqlite3', 'sqlite3_02_create.phpt'], + ['sqlite3', 'sqlite3_02_open.phpt'], + ['sqlite3', 'sqlite3_03_insert.phpt'], + ['sqlite3', 'sqlite3_04_update.phpt'], + ['sqlite3', 'sqlite3_05_delete.phpt'], + ['sqlite3', 'sqlite3_06_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_07_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_08_udf.phpt'], + ['sqlite3', 'sqlite3_09_blob_bound_param.phpt'], + ['sqlite3', 'sqlite3_10_bound_value_name.phpt'], + ['sqlite3', 'sqlite3_12_unfinalized_stmt_cleanup.phpt'], + ['sqlite3', 'sqlite3_13_skip_all_cleanup.phpt'], + ['sqlite3', 'sqlite3_14_querysingle.phpt'], + ['sqlite3', 'sqlite3_16_select_no_results.phpt'], + ['sqlite3', 'sqlite3_17_version.phpt'], + ['sqlite3', 'sqlite3_18_changes.phpt'], + ['sqlite3', 'sqlite3_19_columninfo.phpt'], + ['sqlite3', 'sqlite3_20_error.phpt'], + ['sqlite3', 'sqlite3_23_escape_string.phpt'], + ['sqlite3', 'sqlite3_24_last_insert_rowid.phpt'], + ['sqlite3', 'sqlite3_25_create_aggregate.phpt'], + ['sqlite3', 'sqlite3_26_reset_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_27_reset_prepared_stmt_result.phpt'], + ['sqlite3', 'sqlite3_28_clear_bindings.phpt'], + ['sqlite3', 'sqlite3_29_createfunction.phpt'], + ['sqlite3', 'sqlite3_30_blobopen.phpt'], + ['sqlite3', 'sqlite3_31_changes.phpt'], + ['sqlite3', 'sqlite3_33_createAggregate_notcallable.phpt'], + ['sqlite3', 'sqlite3_33_reset.phpt'], + ['sqlite3', 'sqlite3_36_create_collation.phpt'], + ['sqlite3', 'sqlite3_38_backup.phpt'], + ['sqlite3', 'sqlite3_38_extended_error.phpt'], + ['sqlite3', 'sqlite3_39_toggleExtended.phpt'], + ['sqlite3', 'sqlite3_40_setauthorizer.phpt'], + ['sqlite3', 'sqlite3_bind_bug68849.phpt'], + ['sqlite3', 'sqlite3_blob_bind_resource.phpt'], + ['sqlite3', 'sqlite3_bound_value_at_name.phpt'], + ['sqlite3', 'sqlite3_busyTimeout.phpt'], + ['sqlite3', 'sqlite3_enable_exceptions.phpt'], + ['sqlite3', 'sqlite3_open_empty_string.phpt'], + ['sqlite3', 'sqlite3_prepare_001.phpt'], + ['sqlite3', 'sqlite3_prepare_faultystmt.phpt'], + ['sqlite3', 'sqlite3_prepare_with_empty_string.phpt'], + ['sqlite3', 'sqlite3_trampoline_create_aggregate.phpt'], + ['sqlite3', 'sqlite3_trampoline_create_collation.phpt'], + ['sqlite3', 'sqlite3_trampoline_createfunction.phpt'], + ['sqlite3', 'sqlite3_trampoline_setauthorizer.phpt'], + ['sqlite3', 'sqlite3stmt_getsql.phpt'], + ['sqlite3', 'sqlite3stmt_paramCount_basic.phpt'], + ['tidy', '002.phpt'], + ['tidy', '005-mb.phpt'], + ['tidy', '005.phpt'], + ['tidy', '007.phpt'], + ['tidy', '008.phpt'], + ['tidy', '009.phpt'], + ['tidy', '010.phpt'], + ['tidy', '011.phpt'], + ['tidy', '012.phpt'], + ['tidy', '013.phpt'], + ['tidy', '014.phpt'], + ['tidy', '015.phpt'], + ['tidy', '016.phpt'], + ['tidy', '018.phpt'], + ['tidy', '019.phpt'], + ['tidy', '023.phpt'], + ['tidy', '024.phpt'], + ['tidy', '025.phpt'], + ['tidy', '027.phpt'], + ['tidy', '028.phpt'], + ['tidy', '029.phpt'], + ['tidy', '030.phpt'], + ['tidy', '031.phpt'], + ['tidy', '032.phpt'], + ['tidy', '033.phpt'], + ['tidy', '034.phpt'], + ['tidy', '035.phpt'], + ['tidy', '036.phpt'], + ['tidy', 'bug54682.phpt'], + ['tidy', 'bug77040.phpt'], + ['tidy', 'bug77594.phpt'], + ['tidy', 'bug_50558.phpt'], + ['tidy', 'gh12980.phpt'], + ['tidy', 'parsing_inexistent_file.phpt'], + ['tidy', 'tidy_error.phpt'], + ['tidy', 'tidy_error1.phpt'], + ['tidy', 'uninitialized.phpt'], + ['iconv', 'bug48289.phpt'], + ['iconv', 'bug52211.phpt'], + ['iconv', 'bug52941.phpt'], + ['iconv', 'bug53891.phpt'], + ['iconv', 'bug55146.phpt'], + ['iconv', 'bug60494.phpt'], + ['iconv', 'bug63839.phpt'], + ['iconv', 'bug66828.phpt'], + ['iconv', 'bug68180.phpt'], + ['iconv', 'bug69840.phpt'], + ['iconv', 'bug72320.phpt'], + ['iconv', 'bug74230.phpt'], + ['iconv', 'bug76249.phpt'], + ['iconv', 'bug77147.phpt'], + ['iconv', 'bug78069.phpt'], + ['iconv', 'bug79200.phpt'], + ['iconv', 'gh7980.phpt'], + ['iconv', 'iconv-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv003.phpt'], + ['iconv', 'iconv_basic.phpt'], + ['iconv', 'iconv_default_charset.phpt'], + ['iconv', 'iconv_encoding_basic.phpt'], + ['iconv', 'iconv_get_encoding_basic.phpt'], + ['iconv', 'iconv_ini_encoding.phpt'], + ['iconv', 'iconv_mime_decode-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_mime_decode.phpt'], + ['iconv', 'iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_mime_decode_headers.phpt'], + ['iconv', 'iconv_mime_encode_001.phpt'], + ['iconv', 'iconv_set_encoding-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_stream_filter.phpt'], + ['iconv', 'iconv_stream_filter_delimiter.phpt'], + ['iconv', 'iconv_strlen-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strlen_basic.phpt'], + ['iconv', 'iconv_strlen_error2.phpt'], + ['iconv', 'iconv_strpos-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strpos_basic.phpt'], + ['iconv', 'iconv_strpos_error2.phpt'], + ['iconv', 'iconv_strpos_error_001.phpt'], + ['iconv', 'iconv_strpos_variation5.phpt'], + ['iconv', 'iconv_strrpos-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strrpos_basic.phpt'], + ['iconv', 'iconv_strrpos_error2.phpt'], + ['iconv', 'iconv_substr-charset-length-cve-2007-4783.phpt'], + ['iconv', 'iconv_substr_basic.phpt'], + ['iconv', 'iconv_substr_error2.phpt'], + ['iconv', 'iconv_substr_out_of_bounds.phpt'], + ['iconv', 'ob_iconv_handler-charset-length-cve-2007-4840.phpt'] +]; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut + , stdErr: () => stdErr + }; +}; + +test('runs a CLI script in Node', async () => { + const php = new PhpCliNode(nodeRuntimeOptions({ + runtime: 'cli', + code: 'echo "Hello, World!";' + , version + })); + const {stdOut, stdErr} = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0); + assert.equal(stdOut(), 'Hello, World!'); + assert.equal(stdErr(), ''); +}); + +test(`loads the requested CLI runtime version (${version})`, async () => { + const php = new PhpCliNode(nodeRuntimeOptions({ + runtime: 'cli', + code: 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;' + , version + })); + const {stdOut, stdErr} = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0); + assert.equal(stdOut(), version); + assert.equal(stdErr(), ''); +}); + +for(const phptName of directCliPhpts) +{ + const phptFile = phpt(phptName); + const runner = fs.existsSync(phptFile) ? test : test.skip; + + runner(`runs core PHPT ${phptName} directly in CLI Node (${version})`, async () => { + await runCliPhpt({ + phptFile, + version + }); + }); +} + +for(const [extensionName, phptName] of directCliExtensionPhpts) +{ + const phptFile = extPhpt(extensionName, phptName); + const runner = fs.existsSync(phptFile) ? test : test.skip; + + runner(`runs ${extensionName} PHPT ${phptName} directly in CLI Node (${version})`, async () => { + await runCliPhpt({ + phptFile, + version + }); + }); +} diff --git a/test/cli-node/cli-node.test.mjs b/test/cli-node/cli-node.test.mjs new file mode 100644 index 000000000..4e654c9ce --- /dev/null +++ b/test/cli-node/cli-node.test.mjs @@ -0,0 +1,1481 @@ +import { strict as assert } from 'node:assert'; +import fs from 'node:fs'; +import { test } from 'node:test'; +import path from 'node:path'; +import url from 'node:url'; + +import { PhpCliNode } from '../../packages/php-cli-wasm/PhpCliNode.mjs'; +import { nodeRuntimeOptions } from '../lib/node-runtime-options.mjs'; +import { runCliPhpt } from '../lib/phpt.mjs'; + +const version = process.env.PHP_VERSION ?? '8.4'; +const here = path.dirname(url.fileURLToPath(import.meta.url)); +const phpt = name => path.resolve(here, `../../third_party/php${version}-src/tests/lang/${name}.phpt`); +const extPhpt = (extension, name) => path.resolve(here, `../../third_party/php${version}-src/ext/${extension}/tests/${name}`); +const [phpMajor, phpMinor] = version.split('.').map(Number); +const atLeast = (major, minor) => phpMajor > major || (phpMajor === major && phpMinor >= minor); +const simplexmlImportDomPhpts = atLeast(8, 4) + ? ['simplexml_import_new_dom.phpt', 'simplexml_import_old_dom.phpt'] + : ['simplexml_import_dom.phpt']; +const registerNodeClassPhpt = atLeast(8, 4) + ? 'register_node_class.phpt' + : 'regsiter_node_class.phpt'; +const removedZlibPhptsInPhp85 = [ + ['zlib', '004-mb.phpt'], + ['zlib', '004.phpt'], + ['zlib', '007.phpt'], + ['zlib', 'gzfile_variation12.phpt'], + ['zlib', 'gzfile_variation4.phpt'], + ['zlib', 'gzfile_variation5.phpt'], + ['zlib', 'gzfile_variation9.phpt'], + ['zlib', 'readgzfile_variation12.phpt'], + ['zlib', 'readgzfile_variation4.phpt'], + ['zlib', 'readgzfile_variation5.phpt'], + ['zlib', 'readgzfile_variation9.phpt'], +]; +const directCliPhpts = [ + '001', + '002', + '003', + '004', + '005', + '006', + '007', + '008', + '009', + '010', + '011', + '012', + '013', + '014', + '015', + '016', + '017', + '018', + '019', + '020', + '021', + '022', + '023', + '026', + '027', + '028', + '030', + '032', + '033', + '035', + '036', + '037', + '038', + '039', + '040', + '041', + '042', + '043', + '044', + 'array_shortcut_001', + 'array_shortcut_002', + 'array_shortcut_003', + 'array_shortcut_005', + 'bison1', + 'bug18872', + 'bug19566', + 'bug19943', + 'bug20175', + 'bug21094', + 'bug21600', + 'bug21669', + 'bug21820', + 'bug21849', + 'bug21961', + 'bug22231', + 'bug22510', + 'bug22592', + 'bug23279', + 'bug23384', + 'bug23489', + 'bug23524', + 'bug23584', + 'bug23624', + 'bug24054', + 'bug24396', + 'bug24436', + 'bug24499', + 'bug24573', + 'bug24640', + 'bug24652', + 'bug24658', + 'bug24783', + 'bug24908', + 'bug24951', + 'bug25547', + 'bug25652', + 'bug25922', + 'bug26182', + 'bug26696', + 'bug26866', + 'bug26869', + 'bug27354', + 'bug27439', + 'bug27443', + 'bug27535', + 'bug28213', + 'bug28800', + 'bug29566', + 'bug29893', + 'bug29944', + 'bug30578', + 'bug30726', + 'bug30862', + 'bug32828', + 'bug32924', + 'bug35176', + 'bug35382', + 'bug43958', + 'bug44654', + 'bug44827', + 'bug55754', + 'bug71897', + 'bug73172', + 'bug73329', + 'bug7515', + 'catchable_error_001', + 'catchable_error_002', + 'comments', + 'comments2', + 'compare_objects_basic1', + 'compare_objects_basic2', + 'empty_variation', + 'engine_assignExecutionOrder_001', + 'engine_assignExecutionOrder_002', + 'engine_assignExecutionOrder_003', + 'engine_assignExecutionOrder_004', + 'engine_assignExecutionOrder_005', + 'engine_assignExecutionOrder_006', + 'engine_assignExecutionOrder_007', + 'engine_assignExecutionOrder_008', + 'engine_assignExecutionOrder_009', + 'error_2_exception_001', + 'execution_order', + 'foreach_with_object_001', + 'foreach_with_references_001', + 'foreachLoop.001', + 'foreachLoop.002', + 'foreachLoop.003', + 'foreachLoop.004', + 'foreachLoop.005', + 'foreachLoop.006', + 'foreachLoop.009', + 'foreachLoop.010', + 'foreachLoop.011', + 'foreachLoop.012', + 'foreachLoop.013', + 'foreachLoop.014', + 'foreachLoop.015', + 'foreachLoop.016', + 'foreachLoop.017', + 'foreachLoopIterator.001', + 'foreachLoopIterator.002', + 'foreachLoopIteratorAggregate.001', + 'foreachLoopIteratorAggregate.002', + 'foreachLoopIteratorAggregate.003', + 'foreachLoopIteratorAggregate.004', + 'foreachLoopObjects.001', + 'foreachLoopObjects.002', + 'foreachLoopObjects.003', + 'foreachLoopObjects.004', + 'foreachLoopObjects.005', + 'foreachLoopObjects.006', + 'func_get_arg_variation', + 'func_get_arg.001', + 'func_get_arg.002', + 'func_get_arg.003', + 'func_get_arg.004', + 'func_get_arg.005', + 'func_get_args.001', + 'func_get_args.002', + 'func_get_args.003', + 'func_get_args.004', + 'func_num_args.001', + 'func_num_args.002', + 'func_num_args.003', + 'func_num_args.004', + 'include_variation1', + 'include_variation2', + 'include_variation3', + 'invalid_octal', + 'passByReference_001', + 'passByReference_002', + 'passByReference_003', + 'passByReference_004', + 'passByReference_005', + 'passByReference_006', + 'passByReference_007', + 'passByReference_008', + 'passByReference_009', + 'passByReference_010', + 'passByReference_012', + 'returnByReference.001', + 'returnByReference.002', + 'returnByReference.003', + 'returnByReference.004', + 'returnByReference.005', + 'returnByReference.006', + 'returnByReference.007', + 'returnByReference.008', + 'returnByReference.009', + 'short_tags.001', + 'short_tags.002', + 'short_tags.004', + 'static_basic_001', + 'static_basic_002', + 'static_variation_001', + 'static_variation_002', + 'string_decimals_001', + 'syntax_errors', + 'this_assignment', + 'throw_variation_001', + 'type_hints_001', + 'type_hints_002', + 'type_hints_003', + 'zend_throw_exception_001', + 'operators/add_variationStr', + 'operators/bitwiseAnd_variationStr', + 'operators/bitwiseNot_variationStr', + 'operators/bitwiseOr_variationStr', + 'operators/bitwiseShiftLeft_variationStr', + 'operators/bitwiseShiftLeft_variationStr2', + 'operators/bitwiseShiftRight_variationStr', + 'operators/bitwiseShiftRight_variationStr2', + 'operators/bitwiseXor_variationStr', + 'operators/coalesce', + 'operators/divide_variationStr', + 'operators/modulus_variationStr', + 'operators/multiply_variationStr', + 'operators/nan-comparison-false', + 'operators/negate_variationStr', + 'operators/operator_equals_basic', + 'operators/operator_gt_basic', + 'operators/operator_gt_or_equal_basic', + 'operators/operator_gt_variation', + 'operators/operator_identical_basic', + 'operators/operator_identical_recusion-01', + 'operators/operator_lt_basic', + 'operators/operator_lt_or_equal_basic', + 'operators/operator_lt_variation', + 'operators/operator_notequals_basic', + 'operators/operator_notidentical_basic', + 'operators/operator_spaceship_basic', + 'operators/overloaded_property_ref', + 'operators/postdec_variationStr', + 'operators/postinc_variationStr', + 'operators/predec_variationStr', + 'operators/preinc_variationStr', + 'operators/subtract_variationStr', + 'string/unicode_escape', + 'string/unicode_escape_empty', + 'string/unicode_escape_incomplete', + 'string/unicode_escape_large_codepoint', + 'string/unicode_escape_legacy', + 'string/unicode_escape_sign', + 'string/unicode_escape_sign2', + 'string/unicode_escape_surrogates', + 'string/unicode_escape_whitespace', +]; +const directCliExtensionPhpts = [ + ['simplexml', '000.phpt'], + ['simplexml', '001-mb.phpt'], + ['simplexml', '001.phpt'], + ['simplexml', '002.phpt'], + ['simplexml', '003.phpt'], + ['simplexml', '004.phpt'], + ['simplexml', '005.phpt'], + ['simplexml', '006.phpt'], + ['simplexml', '007.phpt'], + ['simplexml', '008.phpt'], + ['simplexml', '009.phpt'], + ['simplexml', '009b.phpt'], + ['simplexml', '010.phpt'], + ['simplexml', '011.phpt'], + ['simplexml', '012.phpt'], + ['simplexml', '013.phpt'], + ['simplexml', '014.phpt'], + ['simplexml', '014a.phpt'], + ['simplexml', '014b.phpt'], + ['simplexml', '015.phpt'], + ['simplexml', '016.phpt'], + ['simplexml', '016a.phpt'], + ['simplexml', '017.phpt'], + ['simplexml', '018.phpt'], + ['simplexml', '019.phpt'], + ['simplexml', '020.phpt'], + ['simplexml', '021.phpt'], + ['simplexml', '022.phpt'], + ['simplexml', '023.phpt'], + ['simplexml', '024.phpt'], + ['simplexml', '025.phpt'], + ['simplexml', '026.phpt'], + ['simplexml', '027.phpt'], + ['simplexml', '028.phpt'], + ['simplexml', '029.phpt'], + ['simplexml', '030.phpt'], + ['simplexml', '031.phpt'], + ['simplexml', '032.phpt'], + ['simplexml', '033.phpt'], + ['simplexml', '034.phpt'], + ['simplexml', '035.phpt'], + ['simplexml', '036.phpt'], + ['simplexml', '037.phpt'], + ['simplexml', '038.phpt'], + ['simplexml', 'bug12170.phpt'], + ['simplexml', 'bug24392.phpt'], + ['simplexml', 'bug26976.phpt'], + ['simplexml', 'bug27010.phpt'], + ['simplexml', 'bug35785.phpt'], + ['simplexml', 'bug36611.phpt'], + ['simplexml', 'bug37076_1.phpt'], + ['simplexml', 'bug37076.phpt'], + ['simplexml', 'bug37386.phpt'], + ['simplexml', 'bug38347.phpt'], + ['simplexml', 'bug38354.phpt'], + ['simplexml', 'bug38406.phpt'], + ['simplexml', 'bug38424.phpt'], + ['simplexml', 'bug39662.phpt'], + ['simplexml', 'bug39760.phpt'], + ['simplexml', 'bug40451.phpt'], + ['simplexml', 'bug41175.phpt'], + ['simplexml', 'bug41582.phpt'], + ['simplexml', 'bug41861.phpt'], + ['simplexml', 'bug41867.phpt'], + ['simplexml', 'bug41947.phpt'], + ['simplexml', 'bug42259.phpt'], + ['simplexml', 'bug42369.phpt'], + ['simplexml', 'bug43221.phpt'], + ['simplexml', 'bug44478.phpt'], + ['simplexml', 'bug45553.phpt'], + ['simplexml', 'bug46003.phpt'], + ['simplexml', 'bug46047.phpt'], + ['simplexml', 'bug46048.phpt'], + ['simplexml', 'bug48601.phpt'], + ['simplexml', 'bug51615.phpt'], + ['simplexml', 'bug52751.phpt'], + ['simplexml', 'bug53033.phpt'], + ['simplexml', 'bug54973.phpt'], + ['simplexml', 'bug61335.phpt'], + ['simplexml', 'bug62328.phpt'], + ['simplexml', 'bug62639.phpt'], + ['simplexml', 'bug63575.phpt'], + ['simplexml', 'bug66084_0.phpt'], + ['simplexml', 'bug66084_1.phpt'], + ['simplexml', 'bug67116.phpt'], + ['simplexml', 'bug67572.phpt'], + ['simplexml', 'bug69169.phpt'], + ['simplexml', 'bug69491.phpt'], + ['simplexml', 'bug72588.phpt'], + ['simplexml', 'bug72957.phpt'], + ['simplexml', 'bug72971_2.phpt'], + ['simplexml', 'bug72971.phpt'], + ['simplexml', 'bug75245.phpt'], + ['simplexml', 'bug76712.phpt'], + ['simplexml', 'bug81325.phpt'], + ['simplexml', 'current_error.phpt'], + ['simplexml', 'feature55218.phpt'], + ['simplexml', 'foreach_by_reference.phpt'], + ['simplexml', 'get_prop_address_not_initialized.phpt'], + ['simplexml', 'gh10200.phpt'], + ['simplexml', 'gh10983.phpt'], + ['simplexml', 'gh12167.phpt'], + ['simplexml', 'gh12169.phpt'], + ['simplexml', 'gh12223.phpt'], + ['simplexml', 'gh12929.phpt'], + ['simplexml', 'gh14638.phpt'], + ['simplexml', 'key_error.phpt'], + ['simplexml', 'profile11.phpt'], + ['simplexml', 'profile12.phpt'], + ['simplexml', 'profile13.phpt'], + ['simplexml', 'profile01.phpt'], + ['simplexml', 'profile02.phpt'], + ['simplexml', 'profile03.phpt'], + ['simplexml', 'profile04.phpt'], + ['simplexml', 'profile05.phpt'], + ['simplexml', 'profile06.phpt'], + ['simplexml', 'profile07.phpt'], + ['simplexml', 'profile08.phpt'], + ['simplexml', 'profile09.phpt'], + ['simplexml', 'profile10.phpt'], + ...simplexmlImportDomPhpts.map(name => ['simplexml', name]), + ['simplexml', 'simplexml_load_file.phpt'], + ['simplexml', 'simplexml_uninitialized.phpt'], + ['simplexml', 'SimpleXMLElement_addAttribute_basic.phpt'], + ['simplexml', 'SimpleXMLElement_addAttribute_required_attribute_name.phpt'], + ['simplexml', 'SimpleXMLElement_getDocNamespaces.phpt'], + ['simplexml', 'SimpleXMLElement_xpath.phpt'], + ['simplexml', 'sxe_001.phpt'], + ['simplexml', 'sxe_002.phpt'], + ['simplexml', 'sxe_003.phpt'], + ['simplexml', 'sxe_004.phpt'], + ['simplexml', 'sxe_005.phpt'], + ['dom', 'DOMDocument_loadHTMLfile_variation1.phpt'], + ['dom', 'DOM4_ChildNode_wrong_document.phpt'], + ['dom', 'DOM4_DOMNode_ElementSiblings.phpt'], + ['dom', 'DOM4_DOMNode_after.phpt'], + ['dom', 'DOM4_DOMNode_after_ns.phpt'], + ['dom', 'DOM4_DOMNode_append_ns.phpt'], + ['dom', 'DOM4_DOMNode_before.phpt'], + ['dom', 'DOM4_DOMNode_before_ns.phpt'], + ['dom', 'DOM4_DOMNode_prepend_ns.phpt'], + ['dom', 'DOM4_DOMNode_remove.phpt'], + ['dom', 'DOM4_DOMNode_removeDanglingElement.phpt'], + ['dom', 'DOM4_DOMNode_replaceWith.phpt'], + ['dom', 'DOM4_ParentNode.phpt'], + ['dom', 'DOM4_ParentNode_Fragment.phpt'], + ['dom', 'DOM4_ParentNode_append.phpt'], + ['dom', 'DOM4_ParentNode_append_invalidtypes.phpt'], + ['dom', 'DOM4_ParentNode_append_with_attributes.phpt'], + ['dom', 'DOM4_ParentNode_append_wrong_document.phpt'], + ['dom', 'DOM4_ParentNode_prepend.phpt'], + ['dom', 'DOMAttr_construct_error_001.phpt'], + ['dom', 'DOMAttr_name_basic_001.phpt'], + ['dom', 'DOMAttr_ownerElement_error_001.phpt'], + ['dom', 'DOMAttr_value_basic_001.phpt'], + ['dom', 'DOMAttr_value_basic_002.phpt'], + ['dom', 'DOMCDATASection_construct_error_001.phpt'], + ['dom', 'DOMCharacterData_appendData_basic.phpt'], + ['dom', 'DOMCharacterData_data_basic_002.phpt'], + ['dom', 'DOMCharacterData_data_error_002.phpt'], + ['dom', 'DOMCharacterData_deleteData_basic_001.phpt'], + ['dom', 'DOMCharacterData_deleteData_error_002.phpt'], + ['dom', 'DOMCharacterData_length_error_001.phpt'], + ['dom', 'DOMCharacterData_replaceWith_self.phpt'], + ['dom', 'DOMCharacterData_substringData_basic_001.phpt'], + ['dom', 'DOMChildNode_methods_without_parent.phpt'], + ['dom', 'DOMComment_appendData_basic.phpt'], + ['dom', 'DOMComment_appendData_basic_Sullivan.phpt'], + ['dom', 'DOMComment_construct_basic_001.phpt'], + ['dom', 'DOMComment_construct_error_001.phpt'], + ['dom', 'DOMComment_insertData_basic.phpt'], + ['dom', 'DOMComment_insertData_error1.phpt'], + ['dom', 'DOMComment_insertData_error2.phpt'], + ['dom', 'DOMComment_replaceData_basic.phpt'], + ['dom', 'DOMComment_replaceData_error1.phpt'], + ['dom', 'DOMComment_replaceData_error2.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_basic_001.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_error_002.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_error_003.phpt'], + ['dom', 'DOMDocumentFragment_appendXML_hasChildNodes_basic.phpt'], + ['dom', 'DOMDocumentFragment_construct_basic_001.phpt'], + ['dom', 'DOMDocumentFragment_construct_error_001.phpt'], + ['dom', 'DOMDocumentType_basic_001.phpt'], + ['dom', 'DOMDocumentType_entities_error_001.phpt'], + ['dom', 'DOMDocumentType_internalSubset_error_001.phpt'], + ['dom', 'DOMDocumentType_name_error_001.phpt'], + ['dom', 'DOMDocumentType_notations_error_001.phpt'], + ['dom', 'DOMDocumentType_publicId_basic_001.phpt'], + ['dom', 'DOMDocumentType_publicId_error_001.phpt'], + ['dom', 'DOMDocumentType_systemId_basic_001.phpt'], + ['dom', 'DOMDocumentType_systemId_error_001.phpt'], + ['dom', 'DOMDocument_adoptNode.phpt'], + ['dom', 'DOMDocument_adoptNode_attribute_references.phpt'], + ['dom', 'DOMDocument_config_basic.phpt'], + ['dom', 'DOMDocument_createAttribute_basic.phpt'], + ['dom', 'DOMDocument_createAttribute_error.phpt'], + ['dom', 'DOMDocument_createAttribute_error1.phpt'], + ['dom', 'DOMDocument_createAttribute_variation.phpt'], + ['dom', 'DOMDocument_createEntityReference_basic.phpt'], + ['dom', 'DOMDocument_createEntityReference_error1.phpt'], + ['dom', 'DOMDocument_createProcessingInstruction_basic.phpt'], + ['dom', 'DOMDocument_createProcessingInstruction_error.phpt'], + ['dom', 'DOMDocument_documentURI_basic.phpt'], + ['dom', 'DOMDocument_encoding_basic.phpt'], + ['dom', 'DOMDocument_getElementsByTagNameNS_match_any_namespace.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_simplexml.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_tree_walk.phpt'], + ['dom', 'DOMDocument_getElementsByTagName_liveness_write_properties.phpt'], + ['dom', 'DOMDocument_implementationRead_basic.phpt'], + ['dom', 'DOMDocument_importNode_attribute_prefix_conflict.phpt'], + ['dom', 'DOMDocument_item_cache_invalidation.phpt'], + ['dom', 'DOMDocument_json_encode.phpt'], + ['dom', 'DOMDocument_length_cache_invalidation.phpt'], + ['dom', 'DOMDocument_liveness_caching_invalidation.phpt'], + ['dom', 'DOMDocument_loadHTML_basic.phpt'], + ['dom', 'DOMDocument_loadHTML_error2.phpt'], + ['dom', 'DOMDocument_loadXML_error6.phpt'], + ['dom', 'DOMDocument_load_error6.phpt'], + ['dom', 'DOMDocument_preserveWhiteSpace_basic.phpt'], + ['dom', 'DOMDocument_preserveWhiteSpace_variations.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_basic.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_error1.phpt'], + ['dom', 'DOMDocument_relaxNGValidateSource_error2.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_basic.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_error1.phpt'], + ['dom', 'DOMDocument_relaxNGValidate_error2.phpt'], + ['dom', 'DOMDocument_resolveExternals_basic.phpt'], + ['dom', 'DOMDocument_saveHTMLFile_error2.phpt'], + ['dom', 'DOMDocument_saveHTMLFile_invalid_filename.phpt'], + ['dom', 'DOMDocument_saveHTML_basic.phpt'], + ['dom', 'DOMDocument_saveHTML_error2.phpt'], + ['dom', 'DOMDocument_saveHTML_variant1.phpt'], + ['dom', 'DOMDocument_saveHTML_variant2.phpt'], + ['dom', 'DOMDocument_savexml_basic.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_addAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_basic.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error1.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error2.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_error3.phpt'], + ['dom', 'DOMDocument_schemaValidateSource_missingAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidate_addAttrs.phpt'], + ['dom', 'DOMDocument_schemaValidate_basic.phpt'], + ['dom', 'DOMDocument_schemaValidate_error1.phpt'], + ['dom', 'DOMDocument_schemaValidate_error2.phpt'], + ['dom', 'DOMDocument_schemaValidate_error3.phpt'], + ['dom', 'DOMDocument_schemaValidate_error5.phpt'], + ['dom', 'DOMDocument_schemaValidate_error6.phpt'], + ['dom', 'DOMDocument_schemaValidate_missingAttrs.phpt'], + ['dom', 'DOMDocument_standalone_basic.phpt'], + ['dom', 'DOMDocument_strictErrorChecking_basic.phpt'], + ['dom', 'DOMDocument_strictErrorChecking_variation.phpt'], + ['dom', 'DOMDocument_validate_basic.phpt'], + ['dom', 'DOMDocument_validate_error2.phpt'], + ['dom', 'DOMDocument_validate_external_dtd.phpt'], + ['dom', 'DOMDocument_validate_on_parse_basic.phpt'], + ['dom', 'DOMDocument_validate_on_parse_variation.phpt'], + ['dom', 'DOMElement_append_hierarchy_test.phpt'], + ['dom', 'DOMElement_className.phpt'], + ['dom', 'DOMElement_getAttributeNames.phpt'], + ['dom', 'DOMElement_getElementsByTagName_without_document.phpt'], + ['dom', 'DOMElement_hasAttributes_basic.phpt'], + ['dom', 'DOMElement_id.phpt'], + ['dom', 'DOMElement_insertAdjacentElement.phpt'], + ['dom', 'DOMElement_insertAdjacentText.phpt'], + ['dom', 'DOMElement_prepend_hierarchy_test.phpt'], + ['dom', 'DOMElement_replaceChildren.phpt'], + ['dom', 'DOMElement_setAttributeNS_prefix_conflict.phpt'], + ['dom', 'DOMElement_toggleAttribute.phpt'], + ['dom', 'DOMElement_toggleAttribute_without_document.phpt'], + ['dom', 'DOMEntityReference_basic.phpt'], + ['dom', 'DOMEntityReference_error1.phpt'], + ['dom', 'DOMEntity_fields.phpt'], + ['dom', 'DOMImplementation_createDocumentType_basic.phpt'], + ['dom', 'DOMImplementation_createDocument_basic.phpt'], + ['dom', 'DOMImplementation_hasFeature_basic.phpt'], + ['dom', 'DOMNamedNodeMap_count.phpt'], + ['dom', 'DOMNamedNodeMap_edge_case_offset.phpt'], + ['dom', 'DOMNamedNodeMap_string_references.phpt'], + ['dom', 'DOMNode_C14N_basic.phpt'], + ['dom', 'DOMNode_C14N_references.phpt'], + ['dom', 'DOMNode_DOMNameSpaceNode_isConnected.phpt'], + ['dom', 'DOMNode_DOMNameSpaceNode_parentElement.phpt'], + ['dom', 'DOMNode_cloneNode_basic.phpt'], + ['dom', 'DOMNode_contains.phpt'], + ['dom', 'DOMNode_getLineNo_basic.phpt'], + ['dom', 'DOMNode_getNodePath_basic.phpt'], + ['dom', 'DOMNode_getRootNode.phpt'], + ['dom', 'DOMNode_hasChildNodes.phpt'], + ['dom', 'DOMNode_hasChildNodes_basic.phpt'], + ['dom', 'DOMNode_insertBefore.phpt'], + ['dom', 'DOMNode_insertBefore_error1.phpt'], + ['dom', 'DOMNode_issamenode_basic.phpt'], + ['dom', 'DOMNode_normalize_basic.phpt'], + ['dom', 'DOMNode_removeChild_basic.phpt'], + ['dom', 'DOMNode_removeChild_error1.phpt'], + ['dom', 'DOMNode_replaceChild_basic.phpt'], + ['dom', 'DOMNode_replaceChild_error1.phpt'], + ['dom', 'DOMNode_replaceChild_error2.phpt'], + ['dom', 'DOMParentNode_empty_argument.phpt'], + ['dom', 'DOMProcessingInstruction.phpt'], + ['dom', 'DOMText_appendData_basic.phpt'], + ['dom', 'DomNodeList_count.phpt'], + ['dom', 'ParentNode_append_fragment_text_coalesce.phpt'], + ['dom', 'bug28721.phpt'], + ['dom', 'bug28817.phpt'], + ['dom', 'bug32615.phpt'], + ['dom', 'bug34276.phpt'], + ['dom', 'bug35342.phpt'], + ['dom', 'bug35673.phpt'], + ['dom', 'bug36756.phpt'], + ['dom', 'bug37277.phpt'], + ['dom', 'bug37456.phpt'], + ['dom', 'bug38438.phpt'], + ['dom', 'bug38850.phpt'], + ['dom', 'bug38949.phpt'], + ['dom', 'bug40836.phpt'], + ['dom', 'bug41257.phpt'], + ['dom', 'bug41374.phpt'], + ['dom', 'bug42082.phpt'], + ['dom', 'bug43364.phpt'], + ['dom', 'bug44648.phpt'], + ['dom', 'bug45251.phpt'], + ['dom', 'bug46185.phpt'], + ['dom', 'bug46335.phpt'], + ['dom', 'bug46849.phpt'], + ['dom', 'bug47430.phpt'], + ['dom', 'bug47530.phpt'], + ['dom', 'bug47531_a.phpt'], + ['dom', 'bug47531_b.phpt'], + ['dom', 'bug47848.phpt'], + ['dom', 'bug47849.phpt'], + ['dom', 'bug49463.phpt'], + ['dom', 'bug49490.phpt'], + ['dom', 'bug50661.phpt'], + ['dom', 'bug52656.phpt'], + ['dom', 'bug54382.phpt'], + ['dom', 'bug54601.phpt'], + ['dom', 'bug55700.phpt'], + ['dom', 'bug61858.phpt'], + ['dom', 'bug65196.phpt'], + ['dom', 'bug66502.phpt'], + ['dom', 'bug66783.phpt'], + ['dom', 'bug67081.phpt'], + ['dom', 'bug67440.phpt'], + ['dom', 'bug67474.phpt'], + ['dom', 'bug67949.phpt'], + ['dom', 'bug69373.phpt'], + ['dom', 'bug69679.phpt'], + ['dom', 'bug69846.phpt'], + ['dom', 'bug70001.phpt'], + ['dom', 'bug70359.phpt'], + ['dom', 'bug70558.phpt'], + ['dom', 'bug73907.phpt'], + ['dom', 'bug74004.phpt'], + ['dom', 'bug74416.phpt'], + ['dom', 'bug75451.phpt'], + ['dom', 'bug77569.phpt'], + ['dom', 'bug77686.phpt'], + ['dom', 'bug78025.phpt'], + ['dom', 'bug78221.phpt'], + ['dom', 'bug78577.phpt'], + ['dom', 'bug79271.phpt'], + ['dom', 'bug79451.phpt'], + ['dom', 'bug79852.phpt'], + ['dom', 'bug79968.phpt'], + ['dom', 'bug79971_2.phpt'], + ['dom', 'bug80332_1.phpt'], + ['dom', 'bug80332_2.phpt'], + ['dom', 'bug80600.phpt'], + ['dom', 'bug80602.phpt'], + ['dom', 'bug80602_2.phpt'], + ['dom', 'bug80602_3.phpt'], + ['dom', 'bug80602_4.phpt'], + ['dom', 'bug80927.phpt'], + ['dom', 'bug81433.phpt'], + ['dom', 'bug81642.phpt'], + ['dom', 'bug_lifetime_parentNode_getAttributeNodeNS.phpt'], + ['dom', 'canonicalization.phpt'], + ['dom', 'childNodes_current_crash.phpt'], + ['dom', 'clone_nodes.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttributeNS_with_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttributeNS_without_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_mixed_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_with_prefix.phpt'], + ['dom', 'createAttributeNS_prefix_conflicts/setAttribute_without_prefix.phpt'], + ['dom', 'delayed_freeing/attribute_declaration.phpt'], + ['dom', 'delayed_freeing/comment_node.phpt'], + ['dom', 'delayed_freeing/direct_construction.phpt'], + ['dom', 'delayed_freeing/document_fragment.phpt'], + ['dom', 'delayed_freeing/dom_character_data.phpt'], + ['dom', 'delayed_freeing/dtd_node.phpt'], + ['dom', 'delayed_freeing/element_declaration.phpt'], + ['dom', 'delayed_freeing/element_uaf_crash.phpt'], + ['dom', 'delayed_freeing/entity_declaration.phpt'], + ['dom', 'delayed_freeing/entity_reference.phpt'], + ['dom', 'delayed_freeing/gh9628_1.phpt'], + ['dom', 'delayed_freeing/gh9628_2.phpt'], + ['dom', 'delayed_freeing/namespace_definition_crash.phpt'], + ['dom', 'delayed_freeing/namespace_definition_crash_in_attribute.phpt'], + ['dom', 'delayed_freeing/namespace_xmlns_declaration.phpt'], + ['dom', 'delayed_freeing/namespace_xmlns_declaration_attribute_variation.phpt'], + ['dom', 'delayed_freeing/notation_declaration.phpt'], + ['dom', 'delayed_freeing/processing_instruction.phpt'], + ['dom', 'delayed_freeing/text_node.phpt'], + ['dom', 'delayed_freeing/without_contructor.phpt'], + ['dom', 'dom001.phpt'], + ['dom', 'dom002.phpt'], + ['dom', 'dom003.phpt'], + ['dom', 'dom005.phpt'], + ['dom', 'dom006.phpt'], + ['dom', 'dom007.phpt'], + ['dom', 'dom_comment_basic.phpt'], + ['dom', 'dom_comment_variation.phpt'], + ['dom', 'dom_create_element.phpt'], + ['dom', 'dom_import_simplexml.phpt'], + ['dom', 'dom_set_attr_node.phpt'], + ['dom', 'domattributes.phpt'], + ['dom', 'domchardata.phpt'], + ['dom', 'domdocument_createentityreference_001.phpt'], + ['dom', 'domelement.phpt'], + ['dom', 'domobject_debug_handler.phpt'], + ['dom', 'domxpath.phpt'], + ['dom', 'element_child_and_parent_node_without_document.phpt'], + ['dom', 'entity_reference_stale_01.phpt'], + ['dom', 'entity_reference_stale_02.phpt'], + ['dom', 'fragments_multiple_nodes_DOMParentNode.phpt'], + ['dom', 'getElementsByTagName_liveness_deallocated_document.phpt'], + ['dom', 'gh10234.phpt'], + ['dom', 'gh11288.phpt'], + ['dom', 'gh11289.phpt'], + ['dom', 'gh11290.phpt'], + ['dom', 'gh11347.phpt'], + ['dom', 'gh11500.phpt'], + ['dom', 'gh11625.phpt'], + ['dom', 'gh11682.phpt'], + ['dom', 'gh11791.phpt'], + ['dom', 'gh11830/attribute_variation.phpt'], + ['dom', 'gh11830/document_variation.phpt'], + ['dom', 'gh11830/hierarchy_variation.phpt'], + ['dom', 'gh11830/type_variation.phpt'], + ['dom', 'gh11906.phpt'], + ['dom', 'gh12002.phpt'], + ['dom', 'gh12616_1.phpt'], + ['dom', 'gh12616_2.phpt'], + ['dom', 'gh12616_3.phpt'], + ['dom', 'gh12870_a.phpt'], + ['dom', 'gh12870_b.phpt'], + ['dom', 'gh13012.phpt'], + ['dom', 'gh13012_ns.phpt'], + ['dom', 'gh14343.phpt'], + ['dom', 'gh14702.phpt'], + ['dom', 'gh9142.phpt'], + ['dom', 'manually_call_constructor/attribute.phpt'], + ['dom', 'manually_call_constructor/cdatasection.phpt'], + ['dom', 'manually_call_constructor/comment.phpt'], + ['dom', 'manually_call_constructor/document.phpt'], + ['dom', 'manually_call_constructor/documentfragment.phpt'], + ['dom', 'manually_call_constructor/element.phpt'], + ['dom', 'manually_call_constructor/entityreference.phpt'], + ['dom', 'manually_call_constructor/processinginstruction.phpt'], + ['dom', 'manually_call_constructor/text.phpt'], + ['dom', 'not_serializable.phpt'], + ['dom', 'not_unserializable.phpt'], + ['dom', 'php_function_edge_cases.phpt'], + ['dom', 'property_write_errors.phpt'], + ['dom', 'reconcile_reused_namespace.phpt'], + ['dom', 'registerNodeClass_abstract_class.phpt'], + ['dom', registerNodeClassPhpt], + ['dom', 'replaceWith_non_viable_next_sibling.phpt'], + ['dom', 'setAttributeNodeNS_same_uri_different_prefix.phpt'], + ['dom', 'specific_namespace_behaviour.phpt'], + ['dom', 'toString_exceptions.phpt'], + ['dom', 'uaf_doctype_iterator.phpt'], + ['dom', 'xpath_domnamespacenode.phpt'], + ['dom', 'xpath_domnamespacenode_advanced.phpt'], + ['zlib', '001.phpt'], + ['zlib', '002.phpt'], + ['zlib', '005.phpt'], + ['sqlite3', 'sqlite3_01_open.phpt'], + ['sqlite3', 'bug45798.phpt'], + ['sqlite3', 'bug53463.phpt'], + ['tidy', '001.phpt'], + ['tidy', '006.phpt'], + ['iconv', 'bug48147.phpt'], + ['iconv', 'bug51250.phpt'], + ['iconv', 'bug53304.phpt'], + ['intl', 'badargs.phpt'], + ['intl', 'breakiter___construct.phpt'], + ['intl', 'breakiter___construct_error.phpt'], + ['intl', 'breakiter_clone_basic.phpt'], + ['intl', 'breakiter_createCodePointInstance_basic.phpt'], + ['intl', 'breakiter_current_basic.phpt'], + ['intl', 'breakiter_factories_basic.phpt'], + ['intl', 'breakiter_first_basic.phpt'], + ['intl', 'breakiter_following_basic.phpt'], + ['intl', 'breakiter_getPartsIterator_error.phpt'], + ['intl', 'breakiter_getPartsIterator_var1.phpt'], + ['intl', 'breakiter_getText_basic.phpt'], + ['intl', 'breakiter_isBoundary_basic.phpt'], + ['intl', 'breakiter_last_basic.phpt'], + ['intl', 'breakiter_next_basic.phpt'], + ['intl', 'breakiter_previous_basic.phpt'], + ['intl', 'breakiter_setText_basic.phpt'], + ['intl', 'bug12887.phpt'], + ['intl', 'bug14562.phpt'], + ['intl', 'bug48227.phpt'], + ['intl', 'bug50590.phpt'], + ['intl', 'bug55562.phpt'], + ['intl', 'bug60192-compare.phpt'], + ['intl', 'bug60192-getlocale.phpt'], + ['intl', 'bug60192-getsortkey.phpt'], + ['intl', 'bug60192-sort.phpt'], + ['intl', 'bug60192-sortwithsortkeys.phpt'], + ['intl', 'bug61860.phpt'], + ['intl', 'bug62017.phpt'], + ['intl', 'bug62081.phpt'], + ['intl', 'bug62082.phpt'], + ['intl', 'bug62083.phpt'], + ['intl', 'bug62759.phpt'], + ['intl', 'bug62915.phpt'], + ['intl', 'bug65732.phpt'], + ['intl', 'bug67397.phpt'], + ['intl', 'bug68447.phpt'], + ['intl', 'bug68471.phpt'], + ['intl', 'bug70451.phpt'], + ['intl', 'bug70452.phpt'], + ['intl', 'bug71020.phpt'], + ['intl', 'bug72061.phpt'], + ['intl', 'bug72241.phpt'], + ['intl', 'bug72533.phpt'], + ['intl', 'bug72639.phpt'], + ['intl', 'bug74063.phpt'], + ['intl', 'bug74264.phpt'], + ['intl', 'bug74298.phpt'], + ['intl', 'bug74433.phpt'], + ['intl', 'bug74484_MessageFormatter.phpt'], + ['intl', 'bug74705.phpt'], + ['intl', 'bug75090.phpt'], + ['intl', 'bug75193.phpt'], + ['intl', 'bug75317.phpt'], + ['intl', 'bug75318.phpt'], + ['intl', 'bug75378.phpt'], + ['intl', 'bug76556.phpt'], + ['intl', 'bug77895.phpt'], + ['intl', 'bug78804.phpt'], + ['intl', 'bug80763.phpt'], + ['intl', 'bug81019.phpt'], + ['intl', 'calendar_add_basic.phpt'], + ['intl', 'calendar_add_error.phpt'], + ['intl', 'calendar_before_after_error.phpt'], + ['intl', 'calendar_clear_basic.phpt'], + ['intl', 'calendar_clear_error.phpt'], + ['intl', 'calendar_const_field_field_count.phpt'], + ['intl', 'calendar_createInstance_basic.phpt'], + ['intl', 'calendar_createInstance_error.phpt'], + ['intl', 'calendar_createInstance_variation1.phpt'], + ['intl', 'calendar_equals_before_after_basic.phpt'], + ['intl', 'calendar_equals_error.phpt'], + ['intl', 'calendar_fieldDifference_basic.phpt'], + ['intl', 'calendar_fieldDifference_error.phpt'], + ['intl', 'calendar_fromDateTime_basic.phpt'], + ['intl', 'calendar_fromDateTime_error.phpt'], + ['intl', 'calendar_getAvailableLocales_basic.phpt'], + ['intl', 'calendar_getDayOfWeekType_error.phpt'], + ['intl', 'calendar_getErrorCode_error.phpt'], + ['intl', 'calendar_getErrorCode_getErrorMessage_basic.phpt'], + ['intl', 'calendar_getErrorMessage_error.phpt'], + ['intl', 'calendar_getFirstDayOfWeek_basic.phpt'], + ['intl', 'calendar_getFirstDayOfWeek_error.phpt'], + ['intl', 'calendar_getKeywordValuesForLocale_basic.phpt'], + ['intl', 'calendar_getLocale_basic.phpt'], + ['intl', 'calendar_getLocale_error.phpt'], + ['intl', 'calendar_getMinimalDaysInFirstWeek_basic.phpt'], + ['intl', 'calendar_getMinimalDaysInFirstWeek_error.phpt'], + ['intl', 'calendar_getNow_basic.phpt'], + ['intl', 'calendar_getSkipped_RepeatedWallTimeOption_error.phpt'], + ['intl', 'calendar_getTimeZone_basic.phpt'], + ['intl', 'calendar_getTimeZone_error.phpt'], + ['intl', 'calendar_getTime_basic.phpt'], + ['intl', 'calendar_getTime_error.phpt'], + ['intl', 'calendar_getType_basic.phpt'], + ['intl', 'calendar_getType_error.phpt'], + ['intl', 'calendar_getWeekendTransition_basic.phpt'], + ['intl', 'calendar_getWeekendTransition_error.phpt'], + ['intl', 'calendar_getXMaximum_basic.phpt'], + ['intl', 'calendar_getXMinimum_basic.phpt'], + ['intl', 'calendar_get_Least_Greatest_Minimum_Maximum_error.phpt'], + ['intl', 'calendar_get_basic.phpt'], + ['intl', 'calendar_get_getActualMaximum_Minumum_error.phpt'], + ['intl', 'calendar_get_getActualMaximum_Minumum_error2.phpt'], + ['intl', 'calendar_get_setRepeatedWallTimeOption_basic.phpt'], + ['intl', 'calendar_get_setSkippedWallTimeOption_basic.phpt'], + ['intl', 'calendar_inDaylightTime_basic.phpt'], + ['intl', 'calendar_inDaylightTime_error.phpt'], + ['intl', 'calendar_isEquivalentTo_basic.phpt'], + ['intl', 'calendar_isEquivalentTo_error.phpt'], + ['intl', 'calendar_isLenient_error.phpt'], + ['intl', 'calendar_isSet_basic.phpt'], + ['intl', 'calendar_isSet_empty_time.phpt'], + ['intl', 'calendar_isSet_error.phpt'], + ['intl', 'calendar_isWeekend_basic.phpt'], + ['intl', 'calendar_isWeekend_error.phpt'], + ['intl', 'calendar_is_set_lenient_basic.phpt'], + ['intl', 'calendar_roll_basic.phpt'], + ['intl', 'calendar_roll_error.phpt'], + ['intl', 'calendar_roll_variation1.phpt'], + ['intl', 'calendar_setFirstDayOfWeek_basic.phpt'], + ['intl', 'calendar_setFirstDayOfWeek_error.phpt'], + ['intl', 'calendar_setLenient_error.phpt'], + ['intl', 'calendar_setMinimalDaysInFirstWeek_basic.phpt'], + ['intl', 'calendar_setMinimalDaysInFirstWeek_error.phpt'], + ['intl', 'calendar_setSkipped_RepeatedWallTimeOption_error.phpt'], + ['intl', 'calendar_setTimeZone_basic.phpt'], + ['intl', 'calendar_setTimeZone_error.phpt'], + ['intl', 'calendar_setTimeZone_error2.phpt'], + ['intl', 'calendar_setTimeZone_variation1.phpt'], + ['intl', 'calendar_setTimeZone_variation2.phpt'], + ['intl', 'calendar_setTime_basic.phpt'], + ['intl', 'calendar_setTime_error.phpt'], + ['intl', 'calendar_set_basic.phpt'], + ['intl', 'calendar_set_date.phpt'], + ['intl', 'calendar_set_date_time.phpt'], + ['intl', 'calendar_set_error.phpt'], + ['intl', 'calendar_set_variation1.phpt'], + ['intl', 'calendar_toDateTime_basic.phpt'], + ['intl', 'calendar_toDateTime_error.phpt'], + ['intl', 'collation_customization.phpt'], + ['intl', 'collator_get_error_code.phpt'], + ['intl', 'collator_get_error_message.phpt'], + ['intl', 'collator_get_set_attribute.phpt'], + ['intl', 'collator_get_set_strength.phpt'], + ['intl', 'cpbi_clone_equality.phpt'], + ['intl', 'cpbi_getLastCodePoint_basic.phpt'], + ['intl', 'cpbi_parts_iterator.phpt'], + ['intl', 'dateformat___construct_bad_tz_cal.phpt'], + ['intl', 'dateformat_bug65683.phpt'], + ['intl', 'dateformat_bug65683_2.phpt'], + ['intl', 'dateformat_bug68893.phpt'], + ['intl', 'dateformat_bug71516.phpt'], + ['intl', 'dateformat_clone2.phpt'], + ['intl', 'dateformat_clone_bad_obj.phpt'], + ['intl', 'dateformat_formatObject_error.phpt'], + ['intl', 'dateformat_format_relative.phpt'], + ['intl', 'dateformat_get_datetype.phpt'], + ['intl', 'dateformat_get_set_pattern2.phpt'], + ['intl', 'dateformat_get_timetype.phpt'], + ['intl', 'dateformat_get_timezone_id.phpt'], + ['intl', 'dateformat_invalid_timezone.phpt'], + ['intl', 'dateformat_is_set_lenient.phpt'], + ['intl', 'dateformat_setTimeZone_error.phpt'], + ['intl', 'datepatterngenerator_clone.phpt'], + ['intl', 'datepatterngenerator_error.phpt'], + ['intl', 'deprecated_number_formater_type_currency.phpt'], + ['intl', 'formatter_clone.phpt'], + ['intl', 'formatter_clone_bad_obj.phpt'], + ['intl', 'formatter_fail.phpt'], + ['intl', 'formatter_format_and_parse_errors.phpt'], + ['intl', 'formatter_format_conv.phpt'], + ['intl', 'formatter_format_currency2.phpt'], + ['intl', 'formatter_get_error.phpt'], + ['intl', 'formatter_parse.phpt'], + ['intl', 'formatter_parse_currency.phpt'], + ['intl', 'gh10647.phpt'], + ['intl', 'gh11658.phpt'], + ['intl', 'gh12020.phpt'], + ['intl', 'gh12243.phpt'], + ['intl', 'gh12282.phpt'], + ['intl', 'gh12943.phpt'], + ['intl', 'gh7734.phpt'], + ['intl', 'gh8115.phpt'], + ['intl', 'gh8364.phpt'], + ['intl', 'grapheme_empty.phpt'], + ['intl', 'grapheme_out_of_bounds.phpt'], + ['intl', 'gregoriancalendar___construct_basic.phpt'], + ['intl', 'gregoriancalendar___construct_error.phpt'], + ['intl', 'gregoriancalendar___construct_variant1.phpt'], + ['intl', 'gregoriancalendar_getGregorianChange_error.phpt'], + ['intl', 'gregoriancalendar_get_setGregorianChange_basic.phpt'], + ['intl', 'gregoriancalendar_isLeapYear_basic.phpt'], + ['intl', 'gregoriancalendar_isLeapYear_error.phpt'], + ['intl', 'idn.phpt'], + ['intl', 'idn_bug76829.phpt'], + ['intl', 'ini_use_exceptions_basic.phpt'], + ['intl', 'intl_error_name.phpt'], + ['intl', 'intl_get_error_code.phpt'], + ['intl', 'intl_get_error_message.phpt'], + ['intl', 'intl_icu_data_version_constant.phpt'], + ['intl', 'intl_icu_version_constant.phpt'], + ['intl', 'intl_is_failure.phpt'], + ['intl', 'locale/bug72809.phpt'], + ['intl', 'locale/bug74993.phpt'], + ['intl', 'locale_accept.phpt'], + ['intl', 'locale_bug66289.phpt'], + ['intl', 'locale_bug72658.phpt'], + ['intl', 'locale_bug74439.phpt'], + ['intl', 'locale_compose_locale.phpt'], + ['intl', 'locale_get_all_variants.phpt'], + ['intl', 'locale_get_default.phpt'], + ['intl', 'locale_get_display_language3.phpt'], + ['intl', 'locale_get_display_variant2.phpt'], + ['intl', 'locale_get_keywords2.phpt'], + ['intl', 'locale_get_primary_language.phpt'], + ['intl', 'locale_get_region.phpt'], + ['intl', 'locale_get_script.phpt'], + ['intl', 'locale_parse_locale2.phpt'], + ['intl', 'locale_set_default.phpt'], + ['intl', 'msgfmt_bug70484.phpt'], + ['intl', 'msgfmt_clone.phpt'], + ['intl', 'msgfmt_clone_bad_obj.phpt'], + ['intl', 'msgfmt_fail2.phpt'], + ['intl', 'msgfmt_format.phpt'], + ['intl', 'msgfmt_format_error1.phpt'], + ['intl', 'msgfmt_format_error2.phpt'], + ['intl', 'msgfmt_format_error3.phpt'], + ['intl', 'msgfmt_format_error4.phpt'], + ['intl', 'msgfmt_format_error5.phpt'], + ['intl', 'msgfmt_format_error6.phpt'], + ['intl', 'msgfmt_format_mixed_params.phpt'], + ['intl', 'msgfmt_format_subpatterns.phpt'], + ['intl', 'msgfmt_format_subpatterns_named.phpt'], + ['intl', 'msgfmt_get_locale.phpt'], + ['intl', 'msgfmt_get_set_pattern.phpt'], + ['intl', 'msgfmt_millisecond_dates.phpt'], + ['intl', 'msgfmt_parse.phpt'], + ['intl', 'msgfmt_setPattern_cache.phpt'], + ['intl', 'normalizer_normalize.phpt'], + ['intl', 'rbbiter___construct_basic.phpt'], + ['intl', 'rbbiter_getRuleStatusVec_basic.phpt'], + ['intl', 'rbbiter_getRuleStatus_basic.phpt'], + ['intl', 'regression_sort_and_cow.phpt'], + ['intl', 'regression_sort_eq.phpt'], + ['intl', 'regression_sortwsk_and_cow.phpt'], + ['intl', 'regression_sortwsk_eq.phpt'], + ['intl', 'resourcebundle_arrayaccess.phpt'], + ['intl', 'resourcebundle_countable.phpt'], + ['intl', 'resourcebundle_create.phpt'], + ['intl', 'resourcebundle_double_ctor.phpt'], + ['intl', 'resourcebundle_individual.phpt'], + ['intl', 'resourcebundle_iterator.phpt'], + ['intl', 'resourcebundle_locales.phpt'], + ['intl', 'resourcebundle_traversable.phpt'], + ['intl', 'spoofchecker_self_references.phpt'], + ['intl', 'spoofchecker_typed_references.phpt'], + ['intl', 'timezone_clone_basic.phpt'], + ['intl', 'timezone_clone_error.phpt'], + ['intl', 'timezone_countEquivalentIDs_basic.phpt'], + ['intl', 'timezone_countEquivalentIDs_error.phpt'], + ['intl', 'timezone_createDefault_basic.phpt'], + ['intl', 'timezone_createEnumeration_basic.phpt'], + ['intl', 'timezone_createEnumeration_error.phpt'], + ['intl', 'timezone_createEnumeration_variation1.phpt'], + ['intl', 'timezone_createEnumeration_variation2.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_basic.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_error.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_variant1.phpt'], + ['intl', 'timezone_createTimeZoneIDEnumeration_variant2.phpt'], + ['intl', 'timezone_createTimeZone_basic.phpt'], + ['intl', 'timezone_createTimeZone_error.phpt'], + ['intl', 'timezone_equals_basic.phpt'], + ['intl', 'timezone_equals_error.phpt'], + ['intl', 'timezone_fromDateTimeZone_basic.phpt'], + ['intl', 'timezone_fromDateTimeZone_error.phpt'], + ['intl', 'timezone_getCanonicalID_basic.phpt'], + ['intl', 'timezone_getCanonicalID_error.phpt'], + ['intl', 'timezone_getDSTSavings_basic.phpt'], + ['intl', 'timezone_getDSTSavings_error.phpt'], + ['intl', 'timezone_getDisplayName_basic.phpt'], + ['intl', 'timezone_getDisplayName_error.phpt'], + ['intl', 'timezone_getDisplayName_variant1.phpt'], + ['intl', 'timezone_getEquivalentID_basic.phpt'], + ['intl', 'timezone_getEquivalentID_error.phpt'], + ['intl', 'timezone_getErrorCode_error.phpt'], + ['intl', 'timezone_getErrorMessage_error.phpt'], + ['intl', 'timezone_getGMT_basic.phpt'], + ['intl', 'timezone_getID_error.phpt'], + ['intl', 'timezone_getOffset_basic.phpt'], + ['intl', 'timezone_getRawOffset_basic.phpt'], + ['intl', 'timezone_getRawOffset_error.phpt'], + ['intl', 'timezone_getRegion_basic.phpt'], + ['intl', 'timezone_getRegion_error.phpt'], + ['intl', 'timezone_getTZData_basic.phpt'], + ['intl', 'timezone_getUnknown_basic.phpt'], + ['intl', 'timezone_hasSameRules_basic.phpt'], + ['intl', 'timezone_hasSameRules_error.phpt'], + ['intl', 'timezone_toDateTimeZone_basic.phpt'], + ['intl', 'timezone_toDateTimeZone_error.phpt'], + ['intl', 'timezone_useDaylightTime_basic.phpt'], + ['intl', 'timezone_useDaylightTime_error.phpt'], + ['intl', 'transliterator_child.phpt'], + ['intl', 'transliterator_clone.phpt'], + ['intl', 'transliterator_create_basic.phpt'], + ['intl', 'transliterator_create_error.phpt'], + ['intl', 'transliterator_create_from_rule_basic.phpt'], + ['intl', 'transliterator_create_from_rule_error.phpt'], + ['intl', 'transliterator_create_inverse_basic.phpt'], + ['intl', 'transliterator_create_inverse_error.phpt'], + ['intl', 'transliterator_get_error_code_basic.phpt'], + ['intl', 'transliterator_get_error_code_error.phpt'], + ['intl', 'transliterator_get_error_message_basic.phpt'], + ['intl', 'transliterator_get_error_message_error.phpt'], + ['intl', 'transliterator_list_ids_basic.phpt'], + ['intl', 'transliterator_property_id.phpt'], + ['intl', 'transliterator_transliterate_basic.phpt'], + ['intl', 'transliterator_transliterate_error.phpt'], + ['intl', 'transliterator_transliterate_variant1.phpt'], + ['intl', 'uconverter___construct_error.phpt'], + ['intl', 'uconverter_bug66873.phpt'], + ['intl', 'uconverter_enum.phpt'], + ['intl', 'uconverter_func_basic.phpt'], + ['intl', 'uconverter_func_subst.phpt'], + ['intl', 'uconverter_getDestinationEncoding.phpt'], + ['intl', 'uconverter_getSourceEncoding.phpt'], + ['intl', 'uconverter_getstandards_basic.phpt'], + ['intl', 'uconverter_oop_algo.phpt'], + ['intl', 'uconverter_oop_basic.phpt'], + ['intl', 'uconverter_oop_callback_return.phpt'], + ['intl', 'uconverter_oop_subst.phpt'], + ['intl', 'uconverter_setSourceEncoding.phpt'], + ['xmlwriter', '001.phpt'], + ['xmlwriter', '002.phpt'], + ['xmlwriter', '003.phpt'], + ['xmlwriter', '004.phpt'], + ['xmlwriter', '005-mb.phpt'], + ['xmlwriter', '005.phpt'], + ['xmlwriter', '006.phpt'], + ['xmlwriter', '007.phpt'], + ['xmlwriter', '008.phpt'], + ['xmlwriter', '009.phpt'], + ['xmlwriter', '010.phpt'], + ['xmlwriter', '011.phpt'], + ['xmlwriter', '012.phpt'], + ['xmlwriter', 'bug39504.phpt'], + ['xmlwriter', 'bug41287.phpt'], + ['xmlwriter', 'bug41326.phpt'], + ['xmlwriter', 'bug48204.phpt'], + ['xmlwriter', 'bug71536.phpt'], + ['xmlwriter', 'bug79344.phpt'], + ['xmlwriter', 'OO_001.phpt'], + ['xmlwriter', 'OO_002.phpt'], + ['xmlwriter', 'OO_003.phpt'], + ['xmlwriter', 'OO_004.phpt'], + ['xmlwriter', 'OO_005.phpt'], + ['xmlwriter', 'OO_006.phpt'], + ['xmlwriter', 'OO_007.phpt'], + ['xmlwriter', 'OO_008.phpt'], + ['xmlwriter', 'OO_009.phpt'], + ['xmlwriter', 'OO_010.phpt'], + ['xmlwriter', 'OO_011.phpt'], + ['xmlwriter', 'OO_012.phpt'], + ['xmlwriter', 'OO_013.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_001.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_003.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_004.phpt'], + ['xmlwriter', 'xmlwriter_open_uri_error_005.phpt'], + ['xmlwriter', 'xmlwriter_write_attribute_ns_basic_001.phpt'], + ['xmlwriter', 'xmlwriter_write_dtd_basic_001.phpt'], + ['xmlreader', '001.phpt'], + ['xmlreader', '002.phpt'], + ['xmlreader', '003.phpt'], + ['xmlreader', '004.phpt'], + ['xmlreader', 'open_error.phpt'], + ['xmlreader', 'readString_basic.phpt'], + ['zlib', '003.phpt'], + ['zlib', '006.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(0, 3)), + ['zlib', '008.phpt'], + ['zlib', 'bug48725.phpt'], + ['zlib', 'bug48725_2.phpt'], + ['zlib', 'bug61287.phpt'], + ['zlib', 'bug61443.phpt'], + ['zlib', 'bug61820.phpt'], + ['zlib', 'bug71417.phpt'], + ['zlib', 'bug73944.phpt'], + ['zlib', 'bug74240.phpt'], + ['zlib', 'bug75273.phpt'], + ['zlib', 'bug75299.phpt'], + ['zlib', 'bug_34821.phpt'], + ['zlib', 'bug_52944.phpt'], + ['zlib', 'deflate_add_basic.phpt'], + ['zlib', 'deflate_add_buffer_full.phpt'], + ['zlib', 'deflate_add_error.phpt'], + ['zlib', 'deflate_init_error.phpt'], + ['zlib', 'deflate_init_reuse.phpt'], + ['zlib', 'dictionary_usage.phpt'], + ['zlib', 'gzclose_basic.phpt'], + ['zlib', 'gzcompress_error1.phpt'], + ['zlib', 'gzcompress_variation1.phpt'], + ['zlib', 'gzdeflate_error1.phpt'], + ['zlib', 'gzdeflate_variation1.phpt'], + ['zlib', 'gzencode_error1.phpt'], + ['zlib', 'gzeof_basic.phpt'], + ['zlib', 'gzeof_variation1.phpt'], + ['zlib', 'gzfile_basic.phpt'], + ['zlib', 'gzfile_basic2.phpt'], + ['zlib', 'gzfile_variation15.phpt'], + ['zlib', 'gzfile_variation7.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(3, 7)), + ['zlib', 'gzfilegzreadfile.phpt'], + ['zlib', 'gzgets_basic.phpt'], + ['zlib', 'gzinflate-bug42663.phpt'], + ['zlib', 'gzinflate_error1.phpt'], + ['zlib', 'gzinflate_length.phpt'], + ['zlib', 'gzopen_basic.phpt'], + ['zlib', 'gzopen_basic2.phpt'], + ['zlib', 'gzopen_variation4.phpt'], + ['zlib', 'gzopen_variation5.phpt'], + ['zlib', 'gzopen_variation6.phpt'], + ['zlib', 'gzopen_variation7.phpt'], + ['zlib', 'gzopen_variation8.phpt'], + ['zlib', 'gzopen_variation9.phpt'], + ['zlib', 'gzpassthru_basic.phpt'], + ['zlib', 'gzputs_basic.phpt'], + ['zlib', 'gzread_basic.phpt'], + ['zlib', 'gzread_error2.phpt'], + ['zlib', 'gzread_variation1.phpt'], + ['zlib', 'gzreadgzwrite.phpt'], + ['zlib', 'gzreadgzwriteplain.phpt'], + ['zlib', 'gzrewind_basic.phpt'], + ['zlib', 'gzrewind_basic2.phpt'], + ['zlib', 'gzrewind_variation1.phpt'], + ['zlib', 'gzseek_basic.phpt'], + ['zlib', 'gzseek_basic2.phpt'], + ['zlib', 'gzseek_variation1.phpt'], + ['zlib', 'gzseek_variation2.phpt'], + ['zlib', 'gzseek_variation3.phpt'], + ['zlib', 'gzseek_variation4.phpt'], + ['zlib', 'gzseek_variation5.phpt'], + ['zlib', 'gzseek_variation6.phpt'], + ['zlib', 'gzseek_variation7.phpt'], + ['zlib', 'gztell_basic.phpt'], + ['zlib', 'gztell_basic2.phpt'], + ['zlib', 'gzuncompress_basic1.phpt'], + ['zlib', 'gzuncompress_error1.phpt'], + ['zlib', 'gzwrite_basic.phpt'], + ['zlib', 'gzwrite_error2.phpt'], + ['zlib', 'gzwrite_variation1.phpt'], + ['zlib', 'inflate_add_error.phpt'], + ['zlib', 'inflate_get_read_len.phpt'], + ['zlib', 'inflate_get_status.phpt'], + ['zlib', 'inflate_init_error.phpt'], + ['zlib', 'inflate_init_reuse.phpt'], + ['zlib', 'ob_002.phpt'], + ['zlib', 'readgzfile_basic.phpt'], + ['zlib', 'readgzfile_basic2.phpt'], + ['zlib', 'readgzfile_variation15.phpt'], + ['zlib', 'readgzfile_variation7.phpt'], + ...(atLeast(8, 5) ? [] : removedZlibPhptsInPhp85.slice(7)), + ['zlib', 'zlib_filter_deflate.phpt'], + ['zlib', 'zlib_filter_deflate2.phpt'], + ['zlib', 'zlib_filter_inflate.phpt'], + ['zlib', 'zlib_get_coding_type_basic.phpt'], + ['zlib', 'zlib_get_coding_type_br.phpt'], + ['zlib', 'zlib_scheme_copy_basic.phpt'], + ['zlib', 'zlib_scheme_copy_variation1.phpt'], + ['zlib', 'zlib_scheme_copy_variation2.phpt'], + ['zlib', 'zlib_scheme_dir_basic.phpt'], + ['zlib', 'zlib_scheme_file_basic.phpt'], + ['zlib', 'zlib_scheme_file_get_contents_basic.phpt'], + ['zlib', 'zlib_scheme_file_put_contents_basic.phpt'], + ['zlib', 'zlib_scheme_file_read_file_basic.phpt'], + ['zlib', 'zlib_scheme_fopen_basic.phpt'], + ['zlib', 'zlib_scheme_fopen_variation1.phpt'], + ['zlib', 'zlib_scheme_rename_basic.phpt'], + ['zlib', 'zlib_scheme_stat_basic.phpt'], + ['zlib', 'zlib_scheme_stat_basic2.phpt'], + ['zlib', 'zlib_scheme_unlink_basic.phpt'], + ['zlib', 'zlib_wrapper_fflush_basic.phpt'], + ['zlib', 'zlib_wrapper_flock_basic.phpt'], + ['zlib', 'zlib_wrapper_fstat_basic.phpt'], + ['zlib', 'zlib_wrapper_ftruncate_basic.phpt'], + ['zlib', 'zlib_wrapper_meta_data_basic.phpt'], + ['sqlite3', 'bug47159.phpt'], + ['sqlite3', 'bug66550.phpt'], + ['sqlite3', 'bug68760.phpt'], + ['sqlite3', 'bug69972.phpt'], + ['sqlite3', 'bug70628.phpt'], + ['sqlite3', 'bug71049.phpt'], + ['sqlite3', 'bug72571.phpt'], + ['sqlite3', 'bug72668.phpt'], + ['sqlite3', 'bug73333.phpt'], + ['sqlite3', 'bug76665.phpt'], + ['sqlite3', 'bug77051.phpt'], + ['sqlite3', 'bug79294.phpt'], + ['sqlite3', 'exception_from_toString.phpt'], + ['sqlite3', 'gh11451.phpt'], + ['sqlite3', 'gh11878.phpt'], + ['sqlite3', 'sqlite3_01_open-mb.phpt'], + ['sqlite3', 'sqlite3_02_create.phpt'], + ['sqlite3', 'sqlite3_02_open.phpt'], + ['sqlite3', 'sqlite3_03_insert.phpt'], + ['sqlite3', 'sqlite3_04_update.phpt'], + ['sqlite3', 'sqlite3_05_delete.phpt'], + ['sqlite3', 'sqlite3_06_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_07_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_08_udf.phpt'], + ['sqlite3', 'sqlite3_09_blob_bound_param.phpt'], + ['sqlite3', 'sqlite3_10_bound_value_name.phpt'], + ['sqlite3', 'sqlite3_12_unfinalized_stmt_cleanup.phpt'], + ['sqlite3', 'sqlite3_13_skip_all_cleanup.phpt'], + ['sqlite3', 'sqlite3_14_querysingle.phpt'], + ['sqlite3', 'sqlite3_16_select_no_results.phpt'], + ['sqlite3', 'sqlite3_17_version.phpt'], + ['sqlite3', 'sqlite3_18_changes.phpt'], + ['sqlite3', 'sqlite3_19_columninfo.phpt'], + ['sqlite3', 'sqlite3_20_error.phpt'], + ['sqlite3', 'sqlite3_23_escape_string.phpt'], + ['sqlite3', 'sqlite3_24_last_insert_rowid.phpt'], + ['sqlite3', 'sqlite3_25_create_aggregate.phpt'], + ['sqlite3', 'sqlite3_26_reset_prepared_stmt.phpt'], + ['sqlite3', 'sqlite3_27_reset_prepared_stmt_result.phpt'], + ['sqlite3', 'sqlite3_28_clear_bindings.phpt'], + ['sqlite3', 'sqlite3_29_createfunction.phpt'], + ['sqlite3', 'sqlite3_30_blobopen.phpt'], + ['sqlite3', 'sqlite3_31_changes.phpt'], + ['sqlite3', 'sqlite3_33_createAggregate_notcallable.phpt'], + ['sqlite3', 'sqlite3_33_reset.phpt'], + ['sqlite3', 'sqlite3_36_create_collation.phpt'], + ['sqlite3', 'sqlite3_38_backup.phpt'], + ['sqlite3', 'sqlite3_38_extended_error.phpt'], + ['sqlite3', 'sqlite3_39_toggleExtended.phpt'], + ['sqlite3', 'sqlite3_40_setauthorizer.phpt'], + ['sqlite3', 'sqlite3_bind_bug68849.phpt'], + ['sqlite3', 'sqlite3_blob_bind_resource.phpt'], + ['sqlite3', 'sqlite3_bound_value_at_name.phpt'], + ['sqlite3', 'sqlite3_busyTimeout.phpt'], + ['sqlite3', 'sqlite3_enable_exceptions.phpt'], + ['sqlite3', 'sqlite3_open_empty_string.phpt'], + ['sqlite3', 'sqlite3_prepare_001.phpt'], + ['sqlite3', 'sqlite3_prepare_faultystmt.phpt'], + ['sqlite3', 'sqlite3_prepare_with_empty_string.phpt'], + ['sqlite3', 'sqlite3_trampoline_create_aggregate.phpt'], + ['sqlite3', 'sqlite3_trampoline_create_collation.phpt'], + ['sqlite3', 'sqlite3_trampoline_createfunction.phpt'], + ['sqlite3', 'sqlite3_trampoline_setauthorizer.phpt'], + ['sqlite3', 'sqlite3stmt_getsql.phpt'], + ['sqlite3', 'sqlite3stmt_paramCount_basic.phpt'], + ['tidy', '002.phpt'], + ['tidy', '005-mb.phpt'], + ['tidy', '005.phpt'], + ['tidy', '007.phpt'], + ['tidy', '008.phpt'], + ['tidy', '009.phpt'], + ['tidy', '010.phpt'], + ['tidy', '011.phpt'], + ['tidy', '012.phpt'], + ['tidy', '013.phpt'], + ['tidy', '014.phpt'], + ['tidy', '015.phpt'], + ['tidy', '016.phpt'], + ['tidy', '018.phpt'], + ['tidy', '019.phpt'], + ['tidy', '023.phpt'], + ['tidy', '024.phpt'], + ['tidy', '025.phpt'], + ['tidy', '027.phpt'], + ['tidy', '028.phpt'], + ['tidy', '029.phpt'], + ['tidy', '030.phpt'], + ['tidy', '031.phpt'], + ['tidy', '032.phpt'], + ['tidy', '033.phpt'], + ['tidy', '034.phpt'], + ['tidy', '035.phpt'], + ['tidy', '036.phpt'], + ['tidy', 'bug54682.phpt'], + ['tidy', 'bug77040.phpt'], + ['tidy', 'bug77594.phpt'], + ['tidy', 'bug_50558.phpt'], + ['tidy', 'gh12980.phpt'], + ['tidy', 'parsing_inexistent_file.phpt'], + ['tidy', 'tidy_error.phpt'], + ['tidy', 'tidy_error1.phpt'], + ['tidy', 'uninitialized.phpt'], + ['iconv', 'bug48289.phpt'], + ['iconv', 'bug52211.phpt'], + ['iconv', 'bug52941.phpt'], + ['iconv', 'bug53891.phpt'], + ['iconv', 'bug55146.phpt'], + ['iconv', 'bug60494.phpt'], + ['iconv', 'bug63839.phpt'], + ['iconv', 'bug66828.phpt'], + ['iconv', 'bug68180.phpt'], + ['iconv', 'bug69840.phpt'], + ['iconv', 'bug72320.phpt'], + ['iconv', 'bug74230.phpt'], + ['iconv', 'bug76249.phpt'], + ['iconv', 'bug77147.phpt'], + ['iconv', 'bug78069.phpt'], + ['iconv', 'bug79200.phpt'], + ['iconv', 'gh7980.phpt'], + ['iconv', 'iconv-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv003.phpt'], + ['iconv', 'iconv_basic.phpt'], + ['iconv', 'iconv_default_charset.phpt'], + ['iconv', 'iconv_encoding_basic.phpt'], + ['iconv', 'iconv_get_encoding_basic.phpt'], + ['iconv', 'iconv_ini_encoding.phpt'], + ['iconv', 'iconv_mime_decode-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_mime_decode.phpt'], + ['iconv', 'iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_mime_decode_headers.phpt'], + ['iconv', 'iconv_mime_encode_001.phpt'], + ['iconv', 'iconv_set_encoding-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_stream_filter.phpt'], + ['iconv', 'iconv_stream_filter_delimiter.phpt'], + ['iconv', 'iconv_strlen-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strlen_basic.phpt'], + ['iconv', 'iconv_strlen_error2.phpt'], + ['iconv', 'iconv_strpos-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strpos_basic.phpt'], + ['iconv', 'iconv_strpos_error2.phpt'], + ['iconv', 'iconv_strpos_error_001.phpt'], + ['iconv', 'iconv_strpos_variation5.phpt'], + ['iconv', 'iconv_strrpos-charset-length-cve-2007-4840.phpt'], + ['iconv', 'iconv_strrpos_basic.phpt'], + ['iconv', 'iconv_strrpos_error2.phpt'], + ['iconv', 'iconv_substr-charset-length-cve-2007-4783.phpt'], + ['iconv', 'iconv_substr_basic.phpt'], + ['iconv', 'iconv_substr_error2.phpt'], + ['iconv', 'iconv_substr_out_of_bounds.phpt'], + ['iconv', 'ob_iconv_handler-charset-length-cve-2007-4840.phpt'] +]; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut + , stdErr: () => stdErr + }; +}; + +test('runs a CLI script in Node', async () => { + const php = new PhpCliNode(nodeRuntimeOptions({ + runtime: 'cli', + code: 'echo "Hello, World!";' + , version + })); + const {stdOut, stdErr} = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0); + assert.equal(stdOut(), 'Hello, World!'); + assert.equal(stdErr(), ''); +}); + +test(`loads the requested CLI runtime version (${version})`, async () => { + const php = new PhpCliNode(nodeRuntimeOptions({ + runtime: 'cli', + code: 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;' + , version + })); + const {stdOut, stdErr} = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0); + assert.equal(stdOut(), version); + assert.equal(stdErr(), ''); +}); + +for(const phptName of directCliPhpts) +{ + const phptFile = phpt(phptName); + const runner = fs.existsSync(phptFile) ? test : test.skip; + + runner(`runs core PHPT ${phptName} directly in CLI Node (${version})`, async () => { + await runCliPhpt({ + phptFile, + version + }); + }); +} + +for(const [extensionName, phptName] of directCliExtensionPhpts) +{ + const phptFile = extPhpt(extensionName, phptName); + const runner = fs.existsSync(phptFile) ? test : test.skip; + + runner(`runs ${extensionName} PHPT ${phptName} directly in CLI Node (${version})`, async () => { + await runCliPhpt({ + phptFile, + version + }); + }); +} diff --git a/test/dbg-node/dbg-node.test.cjs b/test/dbg-node/dbg-node.test.cjs new file mode 100644 index 000000000..fbe939e6a --- /dev/null +++ b/test/dbg-node/dbg-node.test.cjs @@ -0,0 +1,145 @@ +const path = require('node:path'); +const { pathToFileURL } = require('node:url'); +const { strict: assert } = require('node:assert'); +const { test } = require('node:test'); + +const { PhpDbgNode } = require('php-dbg-wasm/PhpDbgNode'); +const { nodeRuntimeOptions } = require('../lib/node-runtime-options.cjs'); + +const version = process.env.PHP_VERSION ?? '8.4'; +const scriptPath = '/preload/test_www/hello-world.php'; +const legacyBootVersion = '8.1'; + +const preloadFiles = [ + { + parent: '/preload/test_www/', + name: 'hello-world.php', + url: pathToFileURL(path.join(__dirname, '../browser/fixtures/scripts/hello-world.php')).href, + }, +]; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut, + stdErr: () => stdErr, + }; +}; + +const comparePhpVersions = (left, right) => { + const leftParts = left.split('.').map(Number); + const rightParts = right.split('.').map(Number); + + for(let index = 0; index < Math.max(leftParts.length, rightParts.length); index++) + { + const leftPart = leftParts[index] ?? 0; + const rightPart = rightParts[index] ?? 0; + + if(leftPart === rightPart) + { + continue; + } + + return leftPart - rightPart; + } + + return 0; +}; + +const timeoutForVersion = (legacyTimeoutMs, modernTimeoutMs) => ( + comparePhpVersions(version, legacyBootVersion) < 0 + ? legacyTimeoutMs + : modernTimeoutMs +); + +const formatDiagnostics = (label, stdOut, stdErr) => ( + `Timed out waiting for phpdbg ${label}.\nSTDOUT:\n${stdOut() || '[empty]'}\nSTDERR:\n${stdErr() || '[empty]'}` +); + +const waitForPromptState = async (php, stdOut, stdErr, timeoutMs, label) => { + const start = Date.now(); + + while(Date.now() - start < timeoutMs) + { + const prompt = await php.getPrompt().catch(() => ''); + + if(/prompt>/i.test(prompt)) + { + return prompt; + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + throw new Error(formatDiagnostics(label, stdOut, stdErr)); +}; + +const waitForReadyState = async (php, stdOut, stdErr, timeoutMs) => { + const start = Date.now(); + + while(Date.now() - start < timeoutMs) + { + const prompt = await php.getPrompt().catch(() => ''); + const output = stdOut(); + + if( + /\[Set execution context: \/preload\/test_www\/hello-world\.php\]/.test(output) + && /\[Successful compilation of \/preload\/test_www\/hello-world\.php\]/.test(output) + && /prompt>/i.test(prompt) + ) + { + return prompt; + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + throw new Error(formatDiagnostics('readiness', stdOut, stdErr)); +}; + +test(`boots phpdbg in Node for PHP ${version}`, async () => { + const php = new PhpDbgNode(nodeRuntimeOptions({ runtime: 'dbg', files: preloadFiles, version })); + const { stdOut, stdErr } = attachOutput(php); + + const process = php.run(); + + await waitForPromptState( + php, + stdOut, + stdErr, + timeoutForVersion(60000, 30000), + 'boot prompt' + ); + + await php.provideInput(`exec ${scriptPath}`); + await php.provideInput('set pagination off'); + + const prompt = await waitForReadyState( + php, + stdOut, + stdErr, + timeoutForVersion(45000, 20000) + ); + + await php.provideInput('quit'); + + const exitCode = await process.catch(error => { + if(error && typeof error === 'object' && 'status' in error) + { + return error.status; + } + + throw error; + }); + + assert.match(prompt, /prompt>/i); + assert.match(stdOut(), /\[Set execution context: \/preload\/test_www\/hello-world\.php\]/); + assert.match(stdOut(), /\[Successful compilation of \/preload\/test_www\/hello-world\.php\]/); + assert.equal(stdErr(), ''); + assert.equal(exitCode, 0); +}); diff --git a/test/dbg-node/dbg-node.test.mjs b/test/dbg-node/dbg-node.test.mjs new file mode 100644 index 000000000..c43aca0e9 --- /dev/null +++ b/test/dbg-node/dbg-node.test.mjs @@ -0,0 +1,143 @@ +import { strict as assert } from 'node:assert'; +import { test } from 'node:test'; + +import { PhpDbgNode } from '../../packages/php-dbg-wasm/PhpDbgNode.mjs'; +import { nodeRuntimeOptions } from '../lib/node-runtime-options.mjs'; + +const version = process.env.PHP_VERSION ?? '8.4'; +const scriptPath = '/preload/test_www/hello-world.php'; +const legacyBootVersion = '8.1'; + +const preloadFiles = [ + { + parent: '/preload/test_www/' + , name: 'hello-world.php' + , url: new URL('../browser/fixtures/scripts/hello-world.php', import.meta.url) + } +]; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut + , stdErr: () => stdErr + }; +}; + +const comparePhpVersions = (left, right) => { + const leftParts = left.split('.').map(Number); + const rightParts = right.split('.').map(Number); + + for(let index = 0; index < Math.max(leftParts.length, rightParts.length); index++) + { + const leftPart = leftParts[index] ?? 0; + const rightPart = rightParts[index] ?? 0; + + if(leftPart === rightPart) + { + continue; + } + + return leftPart - rightPart; + } + + return 0; +}; + +const timeoutForVersion = (legacyTimeoutMs, modernTimeoutMs) => { + return comparePhpVersions(version, legacyBootVersion) < 0 + ? legacyTimeoutMs + : modernTimeoutMs; +}; + +const formatDiagnostics = (label, stdOut, stdErr) => { + return `Timed out waiting for phpdbg ${label}.\nSTDOUT:\n${stdOut() || '[empty]'}\nSTDERR:\n${stdErr() || '[empty]'}`; +}; + +const waitForPromptState = async (php, stdOut, stdErr, timeoutMs, label) => { + const start = Date.now(); + + while(Date.now() - start < timeoutMs) + { + const prompt = await php.getPrompt().catch(() => ''); + + if(/prompt>/i.test(prompt)) + { + return prompt; + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + throw new Error(formatDiagnostics(label, stdOut, stdErr)); +}; + +const waitForReadyState = async (php, stdOut, stdErr, timeoutMs) => { + const start = Date.now(); + + while(Date.now() - start < timeoutMs) + { + const prompt = await php.getPrompt().catch(() => ''); + const output = stdOut(); + + if( + /\[Set execution context: \/preload\/test_www\/hello-world\.php\]/.test(output) + && /\[Successful compilation of \/preload\/test_www\/hello-world\.php\]/.test(output) + && /prompt>/i.test(prompt) + ) + { + return prompt; + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + throw new Error(formatDiagnostics('readiness', stdOut, stdErr)); +}; + +test(`boots phpdbg in Node for PHP ${version}`, async () => { + const php = new PhpDbgNode(nodeRuntimeOptions({runtime: 'dbg', files: preloadFiles, version})); + const {stdOut, stdErr} = attachOutput(php); + + const process = php.run(); + + await waitForPromptState( + php, + stdOut, + stdErr, + timeoutForVersion(60000, 30000), + 'boot prompt' + ); + + await php.provideInput(`exec ${scriptPath}`); + await php.provideInput('set pagination off'); + + const prompt = await waitForReadyState( + php, + stdOut, + stdErr, + timeoutForVersion(45000, 20000) + ); + + await php.provideInput('quit'); + + const exitCode = await process.catch(error => { + if(error && typeof error === 'object' && 'status' in error) + { + return error.status; + } + + throw error; + }); + + assert.match(prompt, /prompt>/i); + assert.match(stdOut(), /\[Set execution context: \/preload\/test_www\/hello-world\.php\]/); + assert.match(stdOut(), /\[Successful compilation of \/preload\/test_www\/hello-world\.php\]/); + assert.equal(stdErr(), ''); + assert.equal(exitCode, 0); +}); diff --git a/test/demo-web-test.sh b/test/demo-web-test.sh new file mode 100755 index 000000000..7aae7bf34 --- /dev/null +++ b/test/demo-web-test.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -euo pipefail + +PORT="${BROWSER_TEST_PORT:-9414}" +ARTIFACT_ROOT="${DEMO_WEB_ARTIFACT_ROOT:-docs}" + +export CI="${CI:-}" + +BROWSER_TEST_PORT="${PORT}" \ +DEMO_WEB_ARTIFACT_ROOT="${ARTIFACT_ROOT}" \ +node test/browser/demo-web-artifact-server.mjs & +SERVER_PID=$! + +trap 'kill ${SERVER_PID}' EXIT + +until curl -fsS "http://127.0.0.1:${PORT}/php-wasm/home.html" >/dev/null; do + sleep 0.1 +done + +PLAYWRIGHT_ARGS=(-c playwright.config.mjs test/browser/demo-web-artifact.spec.mjs) + +PHP_VERSION="${PHP_VERSION:-8.4}" \ +BROWSER_TEST_PORT="${PORT}" \ +LIB_TYPE="${LIB_TYPE:-${BUILD_TYPE:-dynamic}}" \ +DEMO_WEB_ARTIFACT_ROOT="${ARTIFACT_ROOT}" \ +npx playwright test "${PLAYWRIGHT_ARGS[@]}" diff --git a/test/docs-cgi.test.cjs b/test/docs-cgi.test.cjs new file mode 100644 index 000000000..7542fa65d --- /dev/null +++ b/test/docs-cgi.test.cjs @@ -0,0 +1,26 @@ +const { test } = require('node:test'); +const { strict: assert } = require('node:assert'); + +const { buildDocsCoverageReport } = require('./docs/report.cjs'); + +test('Every CGI docs code block is classified by the docs coverage harness', async () => { + const report = await buildDocsCoverageReport({ + includeCgiNode: true, + includeBrowserOnly: false, + }); + + assert.ok(report.summary.total > 0, 'Expected CGI docs coverage to include at least one code block.'); + assert.equal(report.summary.byStatus.uncovered ?? 0, 0); +}); + +test('CGI docs coverage harness executes runtime-backed CGI examples', async () => { + const report = await buildDocsCoverageReport({ + includeCgiNode: true, + includeBrowserOnly: false, + }); + + assert.ok( + (report.summary.byStatus.executable_cgi_node ?? 0) >= 2, + `Expected at least 2 CGI runtime-backed covered blocks, got ${report.summary.byStatus.executable_cgi_node ?? 0}.` + ); +}); diff --git a/test/docs-cgi.test.mjs b/test/docs-cgi.test.mjs new file mode 100644 index 000000000..be70e8fff --- /dev/null +++ b/test/docs-cgi.test.mjs @@ -0,0 +1,26 @@ +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; + +import { buildDocsCoverageReport } from './docs/report.mjs'; + +test('Every CGI docs code block is classified by the docs coverage harness', async () => { + const report = await buildDocsCoverageReport({ + includeCgiNode: true, + includeBrowserOnly: false, + }); + + assert.ok(report.summary.total > 0, 'Expected CGI docs coverage to include at least one code block.'); + assert.equal(report.summary.byStatus.uncovered ?? 0, 0); +}); + +test('CGI docs coverage harness executes runtime-backed CGI examples', async () => { + const report = await buildDocsCoverageReport({ + includeCgiNode: true, + includeBrowserOnly: false, + }); + + assert.ok( + (report.summary.byStatus.executable_cgi_node ?? 0) >= 2, + `Expected at least 2 CGI runtime-backed covered blocks, got ${report.summary.byStatus.executable_cgi_node ?? 0}.` + ); +}); diff --git a/test/docs.test.cjs b/test/docs.test.cjs new file mode 100644 index 000000000..e51015075 --- /dev/null +++ b/test/docs.test.cjs @@ -0,0 +1,81 @@ +const fs = require('node:fs'); +const path = require('node:path'); +const { test } = require('node:test'); +const { strict: assert } = require('node:assert'); + +const { buildDocsCoverageReport } = require('./docs/report.cjs'); +const { docsFixtureRoot, phpWasmSiteDocsRoot } = require('./docs/lib/paths.cjs'); + +function walkMarkdownFiles(directory, results = []) +{ + for(const entry of fs.readdirSync(directory, { withFileTypes: true })) + { + const nextPath = path.join(directory, entry.name); + + if(entry.isDirectory()) + { + walkMarkdownFiles(nextPath, results); + continue; + } + + if(entry.isFile() && nextPath.endsWith('.md')) + { + results.push(nextPath); + } + } + + return results; +} + +function normalizeSiteFixtureMarkdown(source) +{ + return source + .replace(/\r\n/g, '\n') + .replace(/^(---\n[\s\S]*?\n---\n)\n?\n/, '$1') + .replace(/^\n/, '') + .trimEnd(); +} + +test('Every docs code block is classified by the docs coverage harness', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + + assert.ok(report.summary.total > 100, `Expected more than 100 classified docs blocks, got ${report.summary.total}.`); + assert.equal(report.summary.byStatus.uncovered ?? 0, 0); +}); + +test('Docs coverage harness executes a meaningful subset of runtime-backed examples', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + const executableCount = report.summary.byStatus.executable_node ?? 0; + + assert.ok(executableCount >= 30, `Expected at least 30 runtime-backed covered blocks, got ${executableCount}.`); +}); + +test('Docs coverage report tracks known browser/platform gaps explicitly', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + assert.ok((report.summary.byStatus.allowed_gap ?? 0) > 0); +}); + +test( + 'Vendored docs fixture matches php-wasm-site page content', + { skip: !fs.existsSync(phpWasmSiteDocsRoot) && 'php-wasm-site checkout not available.' }, + () => { + const fixtureFiles = walkMarkdownFiles(path.join(docsFixtureRoot, 'pages')) + .map(file => path.relative(path.join(docsFixtureRoot, 'pages'), file)) + .sort(); + const siteFiles = walkMarkdownFiles(phpWasmSiteDocsRoot) + .map(file => path.relative(phpWasmSiteDocsRoot, file)) + .sort(); + + assert.deepEqual(siteFiles, fixtureFiles); + + for(const relativePath of fixtureFiles) + { + const fixtureFile = path.join(docsFixtureRoot, 'pages', relativePath); + const siteFile = path.join(phpWasmSiteDocsRoot, relativePath); + const fixtureSource = normalizeSiteFixtureMarkdown(fs.readFileSync(fixtureFile, 'utf8')); + const siteSource = normalizeSiteFixtureMarkdown(fs.readFileSync(siteFile, 'utf8')); + + assert.equal(siteSource, fixtureSource, `Docs page drifted: ${relativePath}`); + } + } +); diff --git a/test/docs.test.mjs b/test/docs.test.mjs new file mode 100644 index 000000000..46e8ed70d --- /dev/null +++ b/test/docs.test.mjs @@ -0,0 +1,81 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; + +import { buildDocsCoverageReport } from './docs/report.mjs'; +import { docsFixtureRoot, phpWasmSiteDocsRoot } from './docs/lib/paths.mjs'; + +function walkMarkdownFiles(directory, results = []) +{ + for(const entry of fs.readdirSync(directory, { withFileTypes: true })) + { + const nextPath = path.join(directory, entry.name); + + if(entry.isDirectory()) + { + walkMarkdownFiles(nextPath, results); + continue; + } + + if(entry.isFile() && nextPath.endsWith('.md')) + { + results.push(nextPath); + } + } + + return results; +} + +function normalizeSiteFixtureMarkdown(source) +{ + return source + .replace(/\r\n/g, '\n') + .replace(/^(---\n[\s\S]*?\n---\n)\n?\n/, '$1') + .replace(/^\n/, '') + .trimEnd(); +} + +test('Every docs code block is classified by the docs coverage harness', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + + assert.ok(report.summary.total > 100, `Expected more than 100 classified docs blocks, got ${report.summary.total}.`); + assert.equal(report.summary.byStatus.uncovered ?? 0, 0); +}); + +test('Docs coverage harness executes a meaningful subset of runtime-backed examples', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + const executableCount = report.summary.byStatus.executable_node ?? 0; + + assert.ok(executableCount >= 30, `Expected at least 30 runtime-backed covered blocks, got ${executableCount}.`); +}); + +test('Docs coverage report tracks known browser/platform gaps explicitly', async () => { + const report = await buildDocsCoverageReport({ includeCgiNode: false }); + assert.ok((report.summary.byStatus.allowed_gap ?? 0) > 0); +}); + +test( + 'Vendored docs fixture matches php-wasm-site page content', + { skip: !fs.existsSync(phpWasmSiteDocsRoot) && 'php-wasm-site checkout not available.' }, + () => { + const fixtureFiles = walkMarkdownFiles(path.join(docsFixtureRoot, 'pages')) + .map(file => path.relative(path.join(docsFixtureRoot, 'pages'), file)) + .sort(); + const siteFiles = walkMarkdownFiles(phpWasmSiteDocsRoot) + .map(file => path.relative(phpWasmSiteDocsRoot, file)) + .sort(); + + assert.deepEqual(siteFiles, fixtureFiles); + + for(const relativePath of fixtureFiles) + { + const fixtureFile = path.join(docsFixtureRoot, 'pages', relativePath); + const siteFile = path.join(phpWasmSiteDocsRoot, relativePath); + const fixtureSource = normalizeSiteFixtureMarkdown(fs.readFileSync(fixtureFile, 'utf8')); + const siteSource = normalizeSiteFixtureMarkdown(fs.readFileSync(siteFile, 'utf8')); + + assert.equal(siteSource, fixtureSource, `Docs page drifted: ${relativePath}`); + } + } +); diff --git a/test/docs/fixtures/php-wasm-site/README.md b/test/docs/fixtures/php-wasm-site/README.md new file mode 100644 index 000000000..27086cd01 --- /dev/null +++ b/test/docs/fixtures/php-wasm-site/README.md @@ -0,0 +1,8 @@ +Vendored docs fixture from `seanmorris/php-wasm-site`. + +- Commit: `73d20fb6d1c1dce8519354e821761f60df4c220c` + +The markdown files under `pages/` are copied from that commit and include inline HTML comments +linking back to the source repo plus the php-wasm code the local docs harness validates against. + +GitHub: https://github.com/seanmorris/php-wasm-site diff --git a/test/docs/fixtures/php-wasm-site/pages/404.md b/test/docs/fixtures/php-wasm-site/pages/404.md new file mode 100644 index 000000000..12a27956e --- /dev/null +++ b/test/docs/fixtures/php-wasm-site/pages/404.md @@ -0,0 +1,13 @@ +--- +title: 404 - Page Not Found +leftBarLink: false +--- + +# 404 - Page Not Found + +*Looks like you followed a link, or typed a URL that either had a typo, or no longer exists.* diff --git a/test/docs/fixtures/php-wasm-site/pages/CHANGELOG.md b/test/docs/fixtures/php-wasm-site/pages/CHANGELOG.md new file mode 100644 index 000000000..80991b615 --- /dev/null +++ b/test/docs/fixtures/php-wasm-site/pages/CHANGELOG.md @@ -0,0 +1,109 @@ + +# php-wasm + +Changes + +## v0.1.0 - Aiming for the (GitHub) Stars + +* Rebuilt `demo-web` around Vite, reorganized it into `pages`, `components`, `lib`, and `assets`, and added the newer browser/e2e harnesses plus runtime path helpers for the worker and page builds. +* Added Quickbus-backed browser messaging, a richer `phpdbg` bus session, and a VSCode debugger bridge for the demo app and debugger workflow. +* Expanded runtime/build coverage across older targets, including `phpdbg`, SDL, and Vrzno support in PHP `8.0` builds. SDL now ships as the `_sdl` runtime variant instead of a separately loaded shared library. +* Added `version` and `variant` support to `php-tags`, making it possible to select non-default runtimes from static HTML. +* Standardized the maintained runtime sources on `.mjs` modules and expanded type/JSDoc coverage across `php-wasm`, `php-cgi-wasm`, `php-cli-wasm`, `php-dbg-wasm`, and the extension helper packages. +* Reworked shared and dynamic extension loading so built-in support libraries, ICU payloads, OpenSSL, libxml/XML, DOM, SimpleXML, XMLReader, and XMLWriter behave consistently across Node, browser, demo, and docs/test harnesses. +* Suppressed implicit `libxml2.so` loading when it is not provided in `sharedLibs`, which reduces startup download size for minimal runtime configurations. +* Broadened verification with vendored `php-wasm-site` docs fixtures, split docs/CGI coverage suites, deeper CLI-node PHPT coverage, richer XML/intl/tidy/iconv/sqlite smoke tests, and browser-test race-condition fixes. +* Added `require()` support and CJS harness coverage for the core Node runtimes, documented manual extension asset wiring for CommonJS consumers, standardized `LIB_TYPE` as the static/shared/dynamic selector, and left `BUILD_TYPE` as the JS/MJS wrapper-format selector. +* Improved local workspace and release plumbing with symlink-aware package loading, action-artifact overlay support, and refreshed README/package docs around runtime defaults, versioned `.wasm` assets, extension wiring, interactive CLI/debugger behavior via `waitline`, and Cloudflare D1 setup through `pdo_cfd1`. + +## v0.0.9 - Here there be dragons + +*Version 0.0.9 is represented by a near endless stream of letter-tagged alpha releases and will be considered officially skipped. The changes in v0.1.0 mostly landed somewhere in this range, but since the API is not stable, here there be dragons.* + +* Adding PHP-CGI support! +* Runtime extension loading! +* libicu, freetype, zlib, gd, libpng, libjpeg, openssl, & phar support. +* php-wasm, php-cgi-wasm, & php-wasm-builder are now separate packages. +* Vrzno now facilitates url fopen via the fetch() api. +* pdo_cfd1 is now a separate extension from Vrzno. +* pdo_pglite adds local Postgres support. +* SQLite is now using version 3.46. +* Demos for CodeIgniter, CakePHP, Laravel & Laminas. +* Drupal & all other demos now use standard build + zip install. +* Modules are now webpack-compatible out of the box. +* Exposing FS methods w/queueing & locking to sync files between tabs & workers. +* Fixed the bug with POST requests under Firefox. +* Adding support for PHP 8.3.7 & 8.4.1. +* Automatic CI testing for PHP 8.0, 8.1, 8.2, 8.3, & 8.4. + +## v0.0.8 - Preparing for Lift-off + +* Adding ESM & CDN Module support! +* Adding stdin. +* Buffering stdout/stderr in javascript. +* Fixing ` + +

+    

+
+
+```
+
+## @electric-sql/pglite
+
+`pdo_pglite` is powered by [@electric-sql/pglite](https://electric-sql.com/).
+
+
+
+
+
+
+
diff --git a/test/docs/fixtures/php-wasm-site/pages/extensions/using-php-extensions.md b/test/docs/fixtures/php-wasm-site/pages/extensions/using-php-extensions.md
new file mode 100644
index 000000000..61670f905
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/extensions/using-php-extensions.md
@@ -0,0 +1,248 @@
+---
+title: Using PHP Extensions
+weight: -1000
+---
+
+# Using PHP Extensions
+
+Extension helper JS packages are provided as ESM modules.
+
+Those helper modules rely on `import.meta.url` to resolve their static assets, so there is no universal CommonJS equivalent for them.
+
+If you need to bypass the helper packages, you can still provide the underlying `.so`, `.data`, `.wasm`, and support-library assets manually through the runtime constructors.
+
+You can pass an array as the `sharedLibs` argument to the constructor from Javascript to automatically generate an ini file that loads your extensions.
+
+```javascript
+import libxml from 'php-wasm-libxml';
+import dom from 'php-wasm-dom';
+
+const php = new PhpWeb({sharedLibs: [
+	libxml,
+	dom,
+]});
+```
+
+You can also use the `dynamicLibs` argument to get similar behavior **without** automatically loading the extension. A PHP script can call the `dl()` function to dynamically load the extension at runtime:
+
+```javascript
+import libxml from 'php-wasm-libxml';
+import dom from 'php-wasm-dom';
+
+const php = new PhpWeb({dynamicLibs: [
+	libxml,
+	dom,
+]});
+```
+
+```php
+ pathToFileURL(
+  path.resolve(__dirname, 'vendor', file)
+).href;
+
+const php = new PhpNode({
+  sharedLibs: [
+    {
+      name: 'php8.5-sqlite.so',
+      url: asset('php8.5-sqlite.so'),
+      ini: true,
+    },
+    {
+      name: 'libsqlite3.so',
+      url: asset('libsqlite3.so'),
+      ini: false,
+    },
+  ],
+});
+```
+
+If an extension also needs preload files such as `icudt72l.dat`, provide those through `files`. If you need to override where the base runtime discovers `.wasm`, `.data`, or supporting assets, use `locateFile`.
+
+
+The first codeblock is shorthand for the second. Passing `ini: true` will automatically load the extension via `/php.ini`, passing `ini: false` will wait for a call to `dl()` to do the lookup.
+
+```javascript
+const php = new PhpWeb({sharedLibs: [ await import('https://unpkg.com/php-wasm-sqlite') ]});
+```
+
+Supporting libraries should **not** be loaded via `ini`.
+
+```javascript
+const php = new PhpWeb({sharedLibs: [
+	{
+		name: `php8.4-sqlite.so`,
+		url:  `https://unpkg.com/php-wasm-sqlite/php8.4-sqlite.so`,
+		ini:  true,
+	},
+	{	
+		name: 'sqlite.so',
+		url: 'https://unpkg.com/php-wasm-sqlite/sqlite.so',
+		ini: false 
+	}
+]});
+```
+
+Strings starting with `/`, `./`, `http://` or `https://` will be treated as URLs:
+
+```javascript
+const php = new PhpWeb({sharedLibs: [
+	`./php8.4-phar.so`
+]});
+```
+
+Some extensions require supporting libraries. You can provide URLs for those as `sharedLibs` as well, just pass `ini: false`:
+
+*(`name` is implied to be the last section of the URL here.)*
+
+```javascript
+const php = new PhpWeb({sharedLibs: [
+	{ url: 'https://unpkg.com/php-wasm-sqlite/php8.4-sqlite.so', ini: true  },
+	{ url: 'https://unpkg.com/php-wasm-sqlite/sqlite.so',        ini: false },
+]});
+```
+
+## Extension List
+
+The following extensions may be loaded at runtime. This allows the shared extensions and their dependencies to be cached, reused, and selected à la carte for each application
+
+### gd
+
+[https://www.npmjs.com/package/php-wasm-gd](https://www.npmjs.com/package/php-wasm-gd)
+
+### iconv
+
+[https://www.npmjs.com/package/php-wasm-iconv](https://www.npmjs.com/package/php-wasm-iconv)
+
+### intl
+
+[https://www.npmjs.com/package/php-wasm-intl](https://www.npmjs.com/package/php-wasm-intl)
+
+### libxml
+
+[https://www.npmjs.com/package/php-wasm-libxml](https://www.npmjs.com/package/php-wasm-libxml)
+
+### xml
+
+[https://www.npmjs.com/package/php-wasm-xml](https://www.npmjs.com/package/php-wasm-xml)
+
+### dom
+
+[https://www.npmjs.com/package/php-wasm-dom](https://www.npmjs.com/package/php-wasm-dom)
+
+### simplexml
+
+[https://www.npmjs.com/package/php-wasm-simplexml](https://www.npmjs.com/package/php-wasm-simplexml)
+
+### xmlwriter
+
+[https://www.npmjs.com/package/php-wasm-xmlwriter](https://www.npmjs.com/package/php-wasm-xmlwriter)
+
+### yaml
+
+[https://www.npmjs.com/package/php-wasm-yaml](https://www.npmjs.com/package/php-wasm-yaml)
+
+### zip
+
+[https://www.npmjs.com/package/php-wasm-libzip](https://www.npmjs.com/package/php-wasm-libzip)
+
+### mbstring
+
+[https://www.npmjs.com/package/php-wasm-mbstring](https://www.npmjs.com/package/php-wasm-mbstring)
+
+### openssl
+
+[https://www.npmjs.com/package/php-wasm-openssl](https://www.npmjs.com/package/php-wasm-openssl)
+
+### phar
+
+[https://www.npmjs.com/package/php-wasm-phar](https://www.npmjs.com/package/php-wasm-phar)
+
+### sqlite
+
+[https://www.npmjs.com/package/php-wasm-sqlite](https://www.npmjs.com/package/php-wasm-sqlite)
+
+### pdo-sqlite
+
+[https://www.npmjs.com/package/php-wasm-sqlite](https://www.npmjs.com/package/php-wasm-sqlite)
+
+### tidy
+
+[https://www.npmjs.com/package/php-wasm-tidy](https://www.npmjs.com/package/php-wasm-tidy)
+
+### sdl
+
+Built into the `_sdl` runtime variant. No separate extension package is required.
+
+### zlib
+
+[https://www.npmjs.com/package/php-wasm-zlib](https://www.npmjs.com/package/php-wasm-zlib)
diff --git a/test/docs/fixtures/php-wasm-site/pages/extensions/vrzno.md b/test/docs/fixtures/php-wasm-site/pages/extensions/vrzno.md
new file mode 100644
index 000000000..f92773d83
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/extensions/vrzno.md
@@ -0,0 +1,184 @@
+---
+title: Vrzno
+---
+
+# Vrzno
+
+*Vrzno requires PHP 8.0+*
+
+VRZNO is the first PHP extension built for php-wasm. Once it's compiled with PHP, it can be served to any browser and executed client side. It can also run in Node.js and Cloudflare Workers.
+
+## How is this possible?
+
+VRZNO is a bridge between Javascript and PHP in an extremely nontraditional sense. It lets you pass objects, arrays, callbacks, and classes between PHP & Javascript, as well as scalar values.
+## PHP Functions
+
+### vrzno_await($promise)
+Wait on a Promise-like object to resolve within PHP before proceeding with the script. This will pause execution of PHP in the same way the `await` keyword does when used in Javascript.
+
+```php
+fetch('https://api.weather.gov/gridpoints/TOP/40,74/forecast'));
+$json = vrzno_await($response->json());
+
+var_dump($json);
+```
+
+### vrzno_import($module_url)
+Import a javascript library asynchronously. This is the PHP equivalent of Javascript's dynamic `import()`.
+
+See a demo: https://codepen.io/SeanMorris227/pen/LYqNNrE
+
+```php
+Date;
+
+var_dump($Date->now());
+```
+
+Since the `Date` object is also technically a class in Javascript, we can create a new instance in PHP using the `new` operator, and call the instance method, `toISOString`:
+
+```php
+Date;
+
+$d = new $Date;
+
+var_dump($d, $d->toISOString());
+```
+
+### new Vrzno
+Creates a new `Vrzno` object that holds a reference to Javascript's `globalThis` object. In the browser this corresponds to `window`.
+
+```php
+setTimeout( fn() => $window->alert('Done!'), 1000);
+```
+
+Since we can create new objects from classes, we can even use this to create Promises:
+
+```php
+Promise;
+
+$p = new $Promise(function($accept, $reject) use ($window) {
+    $window->setTimeout( fn() => $accept('Pass.'), 1000);
+});
+
+$dump = fn($value) => var_dump($value);
+$p->then($dump)->catch($dump);
+```
+
+## Arrays
+
+Both string and integer properties are fully marshalled for both PHP and JS arrays.
+
+## toString & __toString
+
+The Javascript `.toString` method and the PHP `->__toString` method are proxied to each other to ensure proper stringification in both languages.
+
+## URL fopen
+
+Vrzno implements a fetch-backend for the `http` and `https` stream wrappers, which respects the `allow_url_fopen` INI directive.
+
+```php
+ [
+    'method' => 'POST',
+    'content' => json_encode(['value' => 'foobar'])
+]];
+
+$context = stream_context_create($opts);
+
+var_dump(
+    file_get_contents('https://jsonplaceholder.typicode.com/users', false, $context)
+);
+```
+
+Currently, the following context options are implemented:
+
+* method
+* content
+* header
+* ignore_errors
+
+More information on HTTP context options can be found here:
+
+
+
+## Limitations
+
+* The Javascript object model places properties and methods in the same namespace. PHP however uses separate namespaces for properties and methods. This means an object in PHP can have a property `$x->y` as well as a method `$x->y()`. However, if a Javascript object has a method `x.y()`, then the property `x.y` must resolve to the same callback as the method.
+
+  Currently, when a PHP object is passed into a Javascript execution environment, method names take precedence over property names. This means if a PHP object has both a method `$x->y()`, and a property `$x->y`, then the property will be inaccessible from Javascript.
+
+* PHP Classes are not **yet** accessible from Javascript. i.e. there is no way to pass a class out of PHP and call `new` on it from Javascript.
+
+* Static methods are not yet proxied from PHP.
diff --git a/test/docs/fixtures/php-wasm-site/pages/filesystem/fs-operations.md b/test/docs/fixtures/php-wasm-site/pages/filesystem/fs-operations.md
new file mode 100644
index 000000000..da31f843b
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/filesystem/fs-operations.md
@@ -0,0 +1,115 @@
+---
+title: FS Operations
+---
+
+# Filesystem Operations
+
+## Filesystem Methods
+
+The following EmscriptenFS methods are exposed via the php object:
+
+### php.analyzePath
+
+Get information about a file or directory.
+
+```javascript
+await php.analyzePath(path);
+```
+
+### php.readdir
+
+Get a list of files and folders in a directory.
+
+```javascript
+await php.readdir(path);
+```
+
+### php.readFile
+
+Get the contents of a file as a `Uint8Array` by default, or optionally as utf-8.
+
+```javascript
+await php.readFile(path);
+```
+
+```javascript
+await php.readFile(path, {encoding: 'utf8'});
+```
+
+### php.stat
+
+Get information about a file or directory.
+
+```javascript
+await php.stat(path);
+```
+
+### php.mkdir
+
+Create a directory.
+
+```javascript
+await php.mkdir(path);
+```
+
+### php.rmdir
+
+Delete a directory (must be empty).
+
+```javascript
+await php.rmdir(path);
+```
+
+### php.unlink
+
+Delete a file.
+
+```javascript
+await php.unlink(path);
+```
+
+### php.rename
+
+Rename a file or directory.
+
+```javascript
+await php.rename(path, newPath);
+```
+
+### php.writeFile
+
+Create a new file. Content should be supplied as a `Uint8Array`, or optionally as a string of text.
+
+```javascript
+await php.writeFile(path, data);
+```
+
+```javascript
+await php.writeFile(path, data, {encoding: 'utf8'});
+```
+
+## Accessing the FileSystem of a Service Worker
+
+***Note:*** If you're using php-web in conjunction with php-cgi-worker to work on the filesystem, you'll need to `refresh` the filesystem in the worker. You can do that with the following call using `msg-bus` (as shown below).
+
+```javascript
+// Write a file
+await sendMessage('writeFile', ['/path/to/your/file', 'contents', {encoding: 'utf8'}]);
+
+// Check the path
+const result = await sendMessage('analyzePath', ['/path/to/your/file']);
+```
+
+If you modify the filesystem outside of the service worker, you can refresh its filesystem with a call to `refresh`.
+
+```javascript
+// Tell the worker that the FS has been updated
+await sendMessage('refresh');
+```
diff --git a/test/docs/fixtures/php-wasm-site/pages/filesystem/loading-files.md b/test/docs/fixtures/php-wasm-site/pages/filesystem/loading-files.md
new file mode 100644
index 000000000..347b58b1f
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/filesystem/loading-files.md
@@ -0,0 +1,80 @@
+---
+title: Loading Files
+---
+
+# Loading Files
+
+### Loading Single Files
+
+The constructor method of the php-wasm objects accepts a `files` parameter to load files into the filesystem by URL. For example, dynamic and shared `php-intl` builds require `icudt72l.dat` to be loaded into the `/preload` directory. Static `intl` builds can bundle that file into the runtime `.data` payload instead.
+
+```javascript
+const sharedLibs = [
+  { name: 'libicuuc.so',   url: 'https://unpkg.com/php-wasm-intl/libicuuc.so' },
+  { name: 'libicutu.so',   url: 'https://unpkg.com/php-wasm-intl/libicutu.so' },
+  { name: 'libicutest.so', url: 'https://unpkg.com/php-wasm-intl/libicutest.so' },
+  { name: 'libicuio.so',   url: 'https://unpkg.com/php-wasm-intl/libicuio.so' },
+  { name: 'libicui18n.so', url: 'https://unpkg.com/php-wasm-intl/libicui18n.so' },
+  { name: 'libicudata.so', url: 'https://unpkg.com/php-wasm-intl/libicudata.so' },
+];
+
+const files = [
+	{
+		name: 'icudt72l.dat',
+		parent: '/preload/',
+		url: 'https://unpkg.com/php-wasm-intl/icudt72l.dat'
+	}
+];
+
+const php = new PhpWeb({sharedLibs, files});
+```
+
+If you use the `php-wasm-intl` module directly, it will provide both the ICU support libraries and the `icudt72l.dat` preload file for dynamic builds. Shared runtimes should use the same preload file, but only inject the `libicu*.so` support libraries, not `php8.x-intl.so`.
+
+### Preloaded FS
+
+Use the `PRELOAD_ASSETS` key in your `.php-wasm-rc` file to define a list of files and directories to include by default.
+
+See [compiling/php-wasm-rc.html#preload_assets](/compiling/php-wasm-rc.html#preload_assets) for more information.
+
+### locateFile
+
+You can provide the `locateFile` option to php-wasm as a callback to map the names of files to URLs where they're loaded from. Returning `undefined` will fallback to the default behavior.
+
+This option is useful if your static assets are served from a different directory than your JavaScript files. It applies to .wasm files, shared libraries, single files, and preloaded FS packages in .data files.
+
+```javascript
+const php = new PhpWeb({locateFile: filename => `/my/static/path/${filename}`});
+```
+
+## Persistent Storage
+
+### IDBFS (Web & Worker)
+
+To use IDBFS in PhpWeb, pass a `persist` object with a `mountPath` key. The value of `mountPath` will be used as the path to the persistent directory within the PHP environment.
+
+```javascript
+const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');
+
+const php = new PhpWeb({persist: {mountPath: '/persist'}});
+```
+
+### NodeFS (Node.js Only)
+
+To use NodeFS in PhpWeb, pass a `persist` object with `mountPath` & `localPath` keys.
+
+`localPath` will be used as the path to the HOST directory to expose to PHP.
+`mountPath` will be used as the path to the persistent directory within the PHP environment.
+
+```javascript
+const { PhpNode } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpNode.mjs');
+
+const php = new PhpNode({persist: {mountPath: '/persist', localPath: '~/your-files'}});
+```
diff --git a/test/docs/fixtures/php-wasm-site/pages/filesystem/transactions.md b/test/docs/fixtures/php-wasm-site/pages/filesystem/transactions.md
new file mode 100644
index 000000000..479437b4b
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/filesystem/transactions.md
@@ -0,0 +1,33 @@
+
+# Transactions
+
+**Note: This feature is available for Web and Worker environments only!**
+
+The web and worker builds utilize `navigator.locks.request` to request a lock named `php-wasm-fs-lock` before performing filesystem operations. This ensures that multiple tabs and the service worker can interact with the filesystem without overwriting each other's work.
+
+Before any filesystem operation occurs, the entire filesystem is loaded from IDBFS, and before releasing the lock, the entire filesystem is loaded back into IDBFS.
+
+The operations are enqueued asynchronously, meaning that **if multiple requests are generated before one transaction closes, they will be automatically batched.** This also applies to multiple requests generated before the lock is acquired. Generally, there is no need to take explicit control of filesystem mirroring.
+
+## Manual Control of FS Mirroring
+
+If you prefer to suppress this automatic behavior and take explicit control over filesystem mirroring, you can pass the `{autoTransaction: false}` option to the constructor. In this case, you will need to call `php.startTransaction()` before any filesystem operations, and then `php.commitTransaction()` when you are done. **Using this incorrectly may leave your filesystem in a corrupted state.**
+
+### php.startTransaction
+
+```javascript
+await php.startTransaction();
+```
+
+### php.commitTransaction
+
+```javascript
+await php.commitTransaction();
+```
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-in-nodeJs.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-in-nodeJs.md
new file mode 100644
index 000000000..fb688e17b
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-in-nodeJs.md
@@ -0,0 +1,218 @@
+---
+title: PHP-CGI for Node.js
+weight: -500
+---
+
+# Php-Cgi-Wasm for Node.js
+
+`PhpCgiNode` runs the CGI build of PHP inside Node.js and lets you serve requests through a normal Node HTTP server.
+
+Use it when you want PHP to behave like a web application instead of an embedded expression runner. In practice that means:
+
+- requests go through `php.request(...)`
+- PHP reads from a document root
+- cookies and CGI environment variables are managed for you
+- files can persist to host directories with NodeFS mounts
+
+## Install
+
+```bash
+npm i php-cgi-wasm
+```
+
+If you want runtime-loadable extensions, install the packages you plan to use as well:
+
+```bash
+npm i php-wasm-intl php-wasm-libxml php-wasm-phar php-wasm-mbstring php-wasm-openssl php-wasm-dom php-wasm-xml php-wasm-simplexml php-wasm-sqlite php-wasm-zlib php-wasm-gd
+```
+
+## Minimal HTTP server
+
+This is the basic pattern:
+
+```javascript
+#!/usr/bin/env node
+import http from 'node:http';
+import { PhpCgiNode } from 'php-cgi-wasm/PhpCgiNode';
+
+const php = new PhpCgiNode({
+  prefix: '/php-wasm/cgi-bin/',
+  docroot: '/persist/www',
+  persist: [
+    { mountPath: '/persist', localPath: './persist' },
+    { mountPath: '/config',  localPath: './config'  },
+  ],
+});
+
+const server = http.createServer(async (request, response) => {
+  const result = await php.request(request);
+  const reader = result.body.getReader();
+
+  response.writeHead(result.status, [...result.headers.entries()].flat());
+
+  let done = false;
+
+  while(!done)
+  {
+    const chunk = await reader.read();
+    done = chunk.done;
+
+    if(chunk.value)
+    {
+      response.write(chunk.value);
+    }
+  }
+
+  response.end();
+});
+
+server.listen(3003);
+```
+
+Open `http://localhost:3003/php-wasm/cgi-bin/` after creating a PHP app under `./persist/www`.
+
+If you're running CommonJS instead of ESM, use `const { PhpCgiNode } = require('php-cgi-wasm/PhpCgiNode');` and keep the rest of the constructor options the same.
+
+## Loading extensions
+
+When your active library mode is `dynamic`, pass extension packages as `sharedLibs`:
+
+```javascript
+const php = new PhpCgiNode({
+  prefix: '/php-wasm/cgi-bin/',
+  docroot: '/persist/www',
+  persist: [
+    { mountPath: '/persist', localPath: './persist' },
+    { mountPath: '/config',  localPath: './config'  },
+  ],
+  sharedLibs: [
+    await import('php-wasm-intl'),
+    await import('php-wasm-libxml'),
+    await import('php-wasm-phar'),
+    await import('php-wasm-mbstring'),
+    await import('php-wasm-openssl'),
+    await import('php-wasm-dom'),
+    await import('php-wasm-xml'),
+    await import('php-wasm-simplexml'),
+    await import('php-wasm-sqlite'),
+    await import('php-wasm-zlib'),
+    await import('php-wasm-gd'),
+  ],
+});
+```
+
+`sharedLibs` works the same way here as it does in the other runtimes: extension packages resolve their `.so` files and supporting libraries automatically.
+
+The extension helper JS packages remain ESM-only. In CommonJS, do not `require()` those helper packages. Manage extension `.so`, `.data`, `.wasm`, and support-library assets manually through `sharedLibs`, `dynamicLibs`, `files`, and `locateFile`, as described in the extensions guide.
+
+## Important options
+
+### `docroot`
+
+The PHP document root inside the emscripten filesystem.
+
+```javascript
+docroot: '/persist/www'
+```
+
+With the `persist` mounts above, that maps to `./persist/www` on the host.
+
+### `prefix`
+
+The URL prefix that identifies requests meant for this PHP application.
+
+```javascript
+prefix: '/php-wasm/cgi-bin/'
+```
+
+### `persist`
+
+NodeFS mounts. These expose host directories to PHP.
+
+```javascript
+persist: [
+  { mountPath: '/persist', localPath: './persist' },
+  { mountPath: '/config',  localPath: './config'  },
+]
+```
+
+This is how you keep application files, sessions, caches, and config across requests.
+
+### `types`
+
+Optional MIME type map for static files served through the CGI wrapper.
+
+```javascript
+types: {
+  jpg:  'image/jpeg',
+  jpeg: 'image/jpeg',
+  gif:  'image/gif',
+  png:  'image/png',
+  svg:  'image/svg+xml',
+}
+```
+
+### `version`
+
+Selects the PHP-CGI runtime version to load. `PhpCgiNode` currently defaults to `8.4`.
+
+```javascript
+version: '8.5'
+```
+
+### `rewrite`, `entrypoint`, `exclude`, `env`, `notFound`, `onRequest`
+
+These work the same way as the CGI worker/web runtimes documented in [php-cgi-wasm methods](/methods/php-cgi-wasm.html):
+
+- `rewrite` rewrites incoming paths before routing
+- `entrypoint` forces a single PHP entry script such as `index.php`
+- `exclude` bypasses PHP for matching URL prefixes
+- `env` sets CGI environment variables
+- `notFound` returns a custom 404 response
+- `onRequest` lets you inspect each request/response pair
+
+## What `php.request()` expects
+
+`PhpCgiNode` accepts a Node HTTP request object directly:
+
+```javascript
+const result = await php.request(request);
+```
+
+Internally it normalizes the Node request into a URL plus headers map, then returns a standard `Response` object. That is why the server bridge above reads:
+
+- `result.status`
+- `result.headers`
+- `result.body.getReader()`
+
+## Cookies and config
+
+The CGI runtime keeps its cookie jar under `/config/.cookies`. If `/config` is persisted to disk, cookies survive process restarts along with the rest of your mounted config.
+
+The runtime also sets `PHP_INI_SCAN_DIR` to include `/config`, `/preload`, and the active document root, so project-local configuration files can be loaded from those paths.
+
+## Multi-app routing
+
+If you need to host more than one PHP app behind one Node server, `PhpCgiBase` also supports `vHosts` entries with:
+
+- `pathPrefix`
+- `directory`
+- `entrypoint`
+
+That lets one runtime serve multiple PHP applications by URL prefix from different directories.
+
+## Related source
+
+The current Node demo in the upstream repo lives at:
+
+- [`demo-node/index.mjs`](https://github.com/seanmorris/php-wasm/blob/develop/demo-node/index.mjs)
+
+The `PhpCgiNode` class itself is implemented at:
+
+- [`source/PhpCgiNode.mjs`](https://github.com/seanmorris/php-wasm/blob/develop/source/PhpCgiNode.mjs)
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-service-worker.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-service-worker.md
new file mode 100644
index 000000000..872dd5b74
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/cgi-service-worker.md
@@ -0,0 +1,84 @@
+---
+title: PHP-CGI in Service Workers
+weight: -600
+---
+
+# Php-Cgi-Wasm for Service Workers
+
+Version 0.0.9 adds `php-cgi-wasm` to the mix. This allows you to run php in web-server mode, similar to how it runs under apache or nginx. Running within a Service Worker, it can intercept and respond to HTTP requests just like a normal webserver. This means the browser can simply navigate to a URL, and PHP will generate the page, and everything will work as-normal, AJAX and all. From the perspective of the webpage, its just making HTTP requests. Its not worried about whether the PHP runs on the server or in a Service Worker.
+
+### Install the php-cgi-wasm package
+
+```bash
+$ npm install php-cgi-wasm
+```
+
+### Example Service Worker
+
+```  { .javascript numbers="true" }
+import { PhpCgiWorker } from "php-cgi-wasm/PhpCgiWorker";
+
+// Spawn the PHP-CGI binary
+const php = new PhpCgiWorker({
+	prefix:  '/php-wasm',
+	docroot: '/persist/www',
+	types: {
+		jpg:  'image/jpeg',
+		jpeg: 'image/jpeg',
+		gif:  'image/gif',
+		png:  'image/png',
+		svg:  'image/svg+xml',
+	}
+});
+
+// Set up the event handlers
+self.addEventListener('install',  event => php.handleInstallEvent(event));
+self.addEventListener('activate', event => php.handleActivateEvent(event));
+self.addEventListener('fetch',    event => php.handleFetchEvent(event));
+self.addEventListener('message',  event => php.handleMessageEvent(event));
+```
+
+***Note:*** `php-cgi-wasm` & `php-wasm` are separate packages. One "embeds" php right into your javascript, the other runs in "cgi-mode," just like php would under apache or nginx.
+
+### msg-bus
+
+There is a `msg-bus` module supplied by `php-cgi-wasm` as a helper to communicate with php running inside a worker. The module exposes two functions: `sendMessageFor` and `onMessage`.
+
+This allows you to simply `await` the result of calls to file system methods (see above) on the service worker:
+
+```javascript
+const result = await sendMessage(methodName, [param, param, param]);
+```
+
+#### onMessage & sendMessageFor
+
+* Use `onMessage` as an event handler for `message` events coming from the Service Worker.
+* Use `sendMessageFor` to **GENERATE A FUNCTION** that you can use to send messages to your service worker.
+
+```{ .javascript highlight="9,11" }
+import { onMessage, sendMessageFor } from 'php-cgi-wasm/msg-bus';
+
+const SERVICE_WORKER_SCRIPT_URL = '/cgi-worker.mjs';
+
+navigator.serviceWorker.register(SERVICE_WORKER_SCRIPT_URL);
+
+navigator.serviceWorker.addEventListener('message', onMessage);
+
+const sendMessage = sendMessageFor(SERVICE_WORKER_SCRIPT_URL);
+
+const result = await sendMessage(methodName, [param, param, param]);
+```
+
+#### php.handleMessageEvent
+
+Once you've got the above set up, use `php.handleMessageEvent` to handle the `message` events on the service worker:
+
+```javascript
+self.addEventListener('message',  event => php.handleMessageEvent(event));
+```
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/home.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/home.md
new file mode 100644
index 000000000..b5138335d
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/home.md
@@ -0,0 +1,57 @@
+---
+title: Home
+pagetitle: Documentation Home
+weight: -1000
+---
+
+# Home
+
+[![Static Badge](https://img.shields.io/badge/reddit-always%20online-336699?style=for-the-badge&logo=reddit)](https://www.reddit.com/r/phpwasm/) [![Discord](https://img.shields.io/discord/1199824765666463835?style=for-the-badge&logo=discord&link=https%3A%2F%2Fdiscord.gg%2Fj8VZzju7gJ)](https://discord.gg/j8VZzju7gJ)
+
+Join the community: [reddit](https://www.reddit.com/r/phpwasm/) | [discord](https://discord.gg/j8VZzju7gJ)
+
+Nightly builds are announced in the `#nightly-builds` channel on the `php-wasm` Discord server.
+
+## Getting Started
+
+To install php-wasm with npm, see [INSTALLING](/getting-started/install-and-include.html).
+
+For instructions on using PHP inside of JS scripts, see [PHP In Javascript](/getting-started/php-in-js.html).
+
+If you want to write pure frontend PHP and skip the JS entirely, see [PHP In Static HTML](/getting-started/php-in-static-html.html).
+
+If you'd like to spin up a webserver right in your browser, see [PHP-CGI In Service Workers](/getting-started/cgi-service-worker.html).
+
+If you'd like to serve websites with Node.js, see [PHP-CGI In Node.js](/getting-started/cgi-in-nodeJs.html).
+
+## Demo
+
+
+
+## Nightly Builds
+
+The latest successful nightly artifact build published from GitHub Actions is the `Build Artifacts` workflow run on `develop` from **February 24, 2026**:
+
+- Run `#92`
+- GitHub Actions run ID `22360005357`
+- PHP `8.0`, `8.1`, `8.2`, `8.3`, `8.4`, and `8.5`
+- `static`, `shared`, and `dynamic` library builds
+- Discord: nightly builds are announced in `#nightly-builds`
+
+
+
+For historical release notes, see the [CHANGELOG](/CHANGELOG.html).
+
+## 🍻 Licensed under the Apache License, Version 2.0
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/install-and-include.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/install-and-include.md
new file mode 100644
index 000000000..a26e470c7
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/install-and-include.md
@@ -0,0 +1,109 @@
+---
+title: Install & Import
+weight: -900
+---
+
+# Install & Import php-wasm
+
+Include the module in your preferred format:
+
+## From a CDN
+
+Using ESM modules, you can import php-wasm directly from a CDN:
+
+### jsDelivr
+
+```javascript
+const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');
+const php = new PhpWeb;
+```
+
+### unpkg
+
+```javascript
+const { PhpWeb } = await import('https://unpkg.com/php-wasm/PhpWeb.mjs');
+const php = new PhpWeb;
+```
+
+## Installing with npm
+
+You can also install php-wasm with npm.
+
+[Find php-wasm on npm](https://www.npmjs.com/package/php-wasm)
+
+### Current packages
+
+```sh
+$ npm i php-wasm
+$ npm i php-cgi-wasm
+$ npm i php-cli-wasm
+$ npm i php-dbg-wasm
+$ npm i php-wasm-builder
+```
+
+### Latest nightly build
+
+If you want the newest unpublished artifacts instead of the npm packages, use the latest successful `Build Artifacts` workflow run from GitHub Actions.
+
+If you specifically need the long-lived `develop` artifacts, the latest successful `develop`-branch build is still the February 24, 2026 run:
+
+- `Build Artifacts` run `#92`
+- GitHub Actions run ID `22360005357`
+- Branch: `develop`
+- Versions built: PHP `8.0` through `8.5`
+- Library modes built: `static`, `shared`, and `dynamic`
+- Discord: nightly builds are announced in `#nightly-builds`
+
+Link:
+
+
+
+#### Pre-Packaged Static Assets:
+
+If you're using a bundler, use the vendor's documentation to learn how to move the files matching the following pattern to your public directory:
+
+```bash
+node_modules/php-wasm/php8.4-web.mjs.wasm
+node_modules/php-cgi-wasm/php8.4-cgi-worker.mjs.wasm
+```
+
+## Importing the module
+
+### ESM
+
+```javascript
+import { PhpWeb } from 'php-wasm/PhpWeb.mjs';
+const php = new PhpWeb;
+```
+
+### CommonJS Node runtimes
+
+```javascript
+const { PhpNode } = require('php-wasm/PhpNode');
+
+const php = new PhpNode({version: '8.5'});
+```
+
+### Module Format
+
+Core Node runtimes support both ESM and CommonJS.
+
+For `0.1.0`, use the published entrypoints across the runtime packages.
+
+- `php-wasm/PhpNode`
+- `php-cgi-wasm/PhpCgiNode`
+- `php-cli-wasm/PhpCliNode`
+- `php-dbg-wasm/PhpDbgNode`
+
+Browser and worker entrypoints remain ESM-only.
+
+Extension helper JS packages also remain ESM-only. Their helper modules use `import.meta.url` to resolve static assets, and there is no universal CommonJS equivalent for that pattern.
+
+When you need to manage runtime-loadable extensions from CommonJS, load the core runtime with `require()` and provide the extension `.so`, `.data`, `.wasm`, and support-library assets yourself via `sharedLibs`, `dynamicLibs`, `files`, and `locateFile`.
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-js.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-js.md
new file mode 100644
index 000000000..8ff23075a
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-js.md
@@ -0,0 +1,110 @@
+---
+title: PHP in Javascript
+weight: -800
+---
+
+# Php-Wasm in Javascript
+
+## Running PHP & Taking Output
+
+First, import the module and create an instance of  PHP:
+
+```javascript
+const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');
+const php = new PhpWeb;
+```
+
+Add some event listeners to get ahold of the output:
+
+```javascript
+// Listen to STDOUT & STDERR
+php.addEventListener('output', (event) => console.log(event.detail));
+php.addEventListener('error',  (event) => console.log(event.detail));
+```
+
+Pass some data on STDIN if required:
+
+```javascript
+php.inputString('This is a string of data provided on STDIN.');
+```
+
+... then run some PHP!
+
+```javascript
+const exitCode = await php.run(' phpDate(format, phpStrtotime(time));
+```
+
+You can see this working live on CodePen:
+
+
+
+```javascript
+(async () => {
+  const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');
+  const php = new PhpWeb;
+  const input  = document.querySelector('#date-input');
+  const format = document.querySelector('#date-format');
+  const output = document.querySelector('#date-output');
+
+  // Return an actual PHP function to Javascript:
+  const phpStrtotime = await php.x`function($time) { return strtotime($time); }`;
+  const phpDate = await php.x`function($format, $time) { return date($format, $time); }`;
+
+  const formatTime = (format, time) => phpDate(format, phpStrtotime(time));
+
+  input.addEventListener('input', () => output.innerText = formatTime(format.value, input.value));
+  format.addEventListener('input', () => output.innerText = formatTime(format.value, input.value));
+
+  format.value = 'Y-m-d H:i:s';
+  input.value = '8:00pm 2 days ago';
+
+  output.innerText = formatTime(format.value, input.value);
+})();
+```
+
+## Importing Javascript Values into PHP
+
+The `php.x՝...՝` & `php.r՝...՝` functions allow for Javascript to be interpolated into PHP code with the  `${𝒆𝒙𝒑𝒓𝒆𝒔𝒔𝒊𝒐𝒏}` notation that Javascript `՝backtick՝` interpolation normally allows for. Any Javascript values can be interpolated, and PHP will treat them as normal, native objects.
+
+You can see this working live on CodePen:
+
+
+
+```{ .javascript highlight="10-12" }
+(async () => {
+  const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');
+
+  const php = new PhpWeb;
+
+  const phpCallback = await php.x` function(){
+
+    $phpString = "PHP String";
+
+    $jsCallback = ${function() {
+        return "JS String: " + window.prompt("Provide some input, please.");
+    }};
+
+    return sprintf("%s and %s", $phpString, $jsCallback());
+  }`;
+
+  document.write(phpCallback());
+
+})();
+```
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-static-html.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-static-html.md
new file mode 100644
index 000000000..b611826e9
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-static-html.md
@@ -0,0 +1,144 @@
+---
+title: PHP in Static HTML
+weight: -700
+---
+
+# Php-Wasm in Static HTML
+
+PHP can be included in static HTML pages that are served with no dynamic processing on the backend whatsoever. Just use one of the `php-tags` module entrypoints from a CDN in your page:
+
+**JSDelivr**
+
+```html
+
+```
+
+**Unpkg**
+
+```html
+
+```
+
+Once you've included that, you can start writing php within `
+
+
+``` + +Inline php can use standard input, output and error with `data-` attributes. Just set the value of the attribute to a selector that will match that tag. + +``` { .html highlight="5" } + + + + + + +
+
+``` + +The `src` attribute can be used on ` + + + + +
+
+ + +``` + +## Dynamic Extensions in Static Pages + +Dynamic extensions can be loaded in static webpages like so: + +```{ .html numbers="true" highlight="4-6" } + +``` + +You can find the full list of extensions here: [extensions/using-php-extensions.html#extension-list](/extensions/using-php-extensions.html#extension-list) + +Here is a less-than-trivial example that loads zlib, gd, libwebp & others: + + + +```html +https://github.com/seanmorris/php-wasm
+ + +
+

+
+```
+
+The examples above assume the default `php-tags` runtime version (`8.4` at the moment). If you set a different `data-version`, update the `php8.x-*.so` filenames to match.
diff --git a/test/docs/fixtures/php-wasm-site/pages/getting-started/php.ini.md b/test/docs/fixtures/php-wasm-site/pages/getting-started/php.ini.md
new file mode 100644
index 000000000..bad2a3fe5
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/getting-started/php.ini.md
@@ -0,0 +1,60 @@
+---
+title: php.ini
+weight: -850
+---
+
+# php.ini
+
+The php.ini files in php-wasm work exactly the same as in normal php. See the [PHP docs](https://www.php.net/manual/en/ini.list.php) for the full list of ini settings.
+
+```ini
+[php]
+date.timezone=UTC
+tidy.clean_output=1
+expose_php=0
+```
+
+## Setting up php.ini at Runtime
+
+You can pass in the `ini` property to the constructor to add lines to `/php.ini`:
+
+```javascript
+const php = new PhpWeb({ini: `
+	date.timezone=${Intl.DateTimeFormat().resolvedOptions().timeZone}
+	tidy.clean_output=1
+	expose_php=0
+`});
+```
+
+## FS Locations
+
+If present, The `/config/php.ini` and `/preload/php.ini` files will also be loaded. You can learn how to populate the filesystem in [Loading Files](/filesystem/loading-files.html).
+
+## Loading Extensions by PHP Version
+
+PHP allows for `${ENVIRONMENT_VARIABLES}` to be used inside ini files. The `PHP_VERSION` environment variable is provided to allow loading of the extension compatible with the currently running version of PHP.
+
+```ini
+[php]
+extension=php${PHP_VERSION}-phar.so
+```
+
+Remember to correctly escape the `$` if you're supplying the INI from Javascript with `՝backtics՝`.
+
+```{ .javascript highlight="2" }
+const php = new PhpWeb({ini: `
+	extension=php\${PHP_VERSION}-phar.so
+	date.timezone=${Intl.DateTimeFormat().resolvedOptions().timeZone}
+`});
+```
+
+## CGI Configuration
+
+When running in CGI mode, php will look for a `php.ini` file in the document root directory, and load it along with the files listed above.
+
diff --git a/test/docs/fixtures/php-wasm-site/pages/index.md b/test/docs/fixtures/php-wasm-site/pages/index.md
new file mode 100644
index 000000000..fe96a93cf
--- /dev/null
+++ b/test/docs/fixtures/php-wasm-site/pages/index.md
@@ -0,0 +1,91 @@
+---
+title: Php-Wasm by Sean Morris
+description-meta: PHP in Browser, powered by WebAssembly. Deploy PHP 8 apps client-side in one click, run PHP in cloudflare with full access to D1 SQL, or write PHP desktop apps with GTK.
+noprefix: true
+template: templates/with-hero.php
+hero: intro.html
+leftBarLink: false
+leftBarShow: false
+canonical: https://php-wasm.seanmorr.is/
+itemtype: schema.org/SoftwareSourceCode
+microdata:
+    name: php-wasm
+    description: Php-Wasm is an implementation of PHP running in Web Assembly.
+    alternateName: php-cgi-wasm
+    programmingLanguage: php, javascript, webassembly
+    runtimePlatform: webassembly
+    codeRepository: https://github.com/seanmorris/php-wasm
+    copyrightHolder: Sean Morris
+    copyrightYear: 2020-2026
+    countryOfOrigin: USA
+    headline: PHP powered by WebAssembly.
+    isAccessibleForFree: true
+    isBasedOn: php
+    isFamilyFriendly: true
+    keywords: php, javascript, webassembly
+    license: https://www.apache.org/licenses/LICENSE-2.0.txt
+    maintainer: Sean Morris
+    additionalType: https://schema.org/ComputerLanguage
+---
+
+

Php Wasm puts PHP right in the browser.

+PHP can now run in the browser as a counterpart to Javascript, and can either be invoked from Javascript code or static HTML, where it's got full access to JS APIs as well as the DOM. Or, it can run a service worker, where it mimics a CGI webserver like Apache or nginx. And yea, it can serve whole websites. + + + +

Standard PDO Database Connectors.

+Php Wasm supports SQLite, PostgreSQL, and Cloudflare D1, all via PDO, so you can query your database just like you've always done it. + +

A Full Bridge To Javascript Code

+The Vrzno extension allows PHP to gain access to any APIs available to Javascript. Objects, functions, and even classes can be imported from Javascript and used in PHP as if they were native code. That opens up things like DOM APIs, or anything else the browser exposes to Javascript. On the desktop, Node.js packages like NodeGTK can be used to build desktop applications in PHP. + +You can see a simple demo of the Curvature framework being used to generate some dynamic html [here](https://seanmorris.github.io/php-wasm/?demo=curvature.php), or a node-based version that allows PHP to access GTK [here](https://github.com/seanmorris/php-gtk). + + + +

Field Tested.

+ +Php Wasm is already powering cutting-edge frontend PHP applications like WordPress-Playground, Drupal-Playground, and PlayWithLaravel. You can also find it featured on [3v4l.org](https://3v4l.org). + +

Fully Loaded with Batteries Included.

+ +Php Wasm comes with support for many of the most commonly used PHP extensions, including LibXML, OpenSSL, Intl, ICU, GD, mbstring + oniguruma, and zlib. Most of them can be loaded dynamically as shared objects, or compiled statically if your use case requires it. [View the whole list](/extensions/using-php-extensions.html#extension-list). + +Extensions can even be loaded from a CDN like jsDelivr or unpkg, since they're wrapped in JS modules. You can learn how to do all that and more in the [docs](/extensions/using-php-extensions.html#dynamic-imports-for-extensions). + +

Isomorphic PHP.

+ +Write code that runs on the backend, the frontend, the edge and the service worker. You can even include classes directly from Packagist with a cloud-based autoloader. + +

And, of course, its Open Source.

+ +Php Wasm is published 100% for free under the Apache License, Version 2.0. This means Php Wasm is and always will be 100% free. Php Wasm is committed to maintaining the free and open nature of the web, and all the tools the project is based on. + +

Want to Reach Out?

+ +If you'd like to get involved and contribute code or sponsorship, head over to the [GitHub repo](https://github.com/seanmorris/php-wasm), and don't hesitate to say hi on [Discord](https://discord.com/invite/j8VZzju7gJ)! diff --git a/test/docs/fixtures/php-wasm-site/pages/methods/php-cgi-wasm.md b/test/docs/fixtures/php-wasm-site/pages/methods/php-cgi-wasm.md new file mode 100644 index 000000000..b11c2e83a --- /dev/null +++ b/test/docs/fixtures/php-wasm-site/pages/methods/php-cgi-wasm.md @@ -0,0 +1,346 @@ +--- +pagetitle: Php-Cgi-Wasm Methods +itemtype: schema.org/Class +microdata: + name: PhpCgiWasm + alternateName: PhpCgiNode + alternateName: PhpCgiWorker +--- + +# Php-Cgi-Wasm Methods + +## constructor + +The php-cgi-wasm constructor takes an options bucket object as its single parameter. The keys are outlined below. + +```javascript +const php = new PhpCgiWorker(); +``` + +The concrete classes are: + +- `PhpCgiNode` +- `PhpCgiWorker` + +### version + +*string* + +Selects the PHP-CGI runtime version to load. + +```javascript +const php = new PhpCgiWorker({version: '8.4'}); +``` + +### sharedLibs + +*array of strings or objects* + +```javascript +const php = new PhpCgiWorker({ + sharedLibs: [ + { url: 'https://unpkg.com/php-wasm-sqlite/php8.4-sqlite.so', ini: true }, + { url: 'https://unpkg.com/php-wasm-sqlite/sqlite.so', ini: false }, + ] +}); +``` + +ESM helper packages can be passed directly here. CommonJS callers should pass strings, `URL`s, or `{name, url, ini}` records manually instead. + +### dynamicLibs + +*array of strings or objects* + +Resolved like `sharedLibs`, but never written into `php.ini`. + +The same CommonJS rule applies here: pass manual strings, `URL`s, or objects rather than the ESM helper packages. + +### files + +*array of objects* + +Dynamic and shared `intl` builds use this mechanism to provide `icudt72l.dat` under `/preload`. Static `intl` builds can bundle the same file into the runtime `.data` package instead. + +```javascript +const php = new PhpCgiWorker({ + files: [ + { + name: 'icudt72l.dat', + parent: '/preload/', + url: 'https://unpkg.com/php-wasm-intl/icudt72l.dat' + } + ] +}); +``` + +### actions + +*object* + +Extra message-bus actions exposed through `php.handleMessageEvent`. Action handlers receive the PHP wrapper as their first argument. + +```javascript +const php = new PhpCgiWorker({ + actions: { + helloWorld: (php, name) => { + return `Hello, ${name}!`; + }, + } +}); +``` + +### locateFile + +*function(path, directory): string | URL | undefined* + +```javascript +const php = new PhpCgiWorker({ + locateFile: path => `/assets/php/${path}` +}); +``` + +### docroot + +*string* + +Tells php where to find the php source files for your website inside the emscripten filesystem. + +```javascript +const php = new PhpCgiWorker({ + docroot: '/persist/public' +}); +``` + +### entrypoint + +*string* + +```javascript +const php = new PhpCgiWorker({ + entrypoint: 'index.php' +}); +``` + +### prefix + +*string* + +If a request is made with a pathname that starts with `prefix`, php-cgi-wasm will activate and attempt to route the request to PHP rather than allowing it to proceed to the network. + +```javascript +const php = new PhpCgiWorker({ + prefix: '/php-wasm' +}); +``` + +### exclude + +*array of strings* + +If a request matched the prefix, but the URL also matches an element of `exclude`, then PHP will ignore the request and it will be sent to the network. + +```javascript +const php = new PhpCgiWorker({ + exclude: ['/php-wasm/assets', '/php-wasm/static'] +}); +``` + +### rewrite + +*function(string): string | {scriptName: string, path: string}* + +Pass a function that will receive paths and rewrite them before PHP begins routing. + +```javascript +const php = new PhpCgiWorker({ + rewrite: path => path === '/php-wasm' ? '/php-wasm/index.php' : path +}); +``` + +### types + +*object.* + +```javascript +const php = new PhpCgiWorker({ + types: { + svg: 'image/svg+xml', + webp: 'image/webp' + } +}); +``` + +### notFound + +*function(request): response* + +This callback will be called when the requested PHP script/static asset is not found, and should return a `Response` object. + +```javascript +const php = new PhpCgiWorker({ + notFound: request => new Response('404 - Not Found', {status: 404}) +}); +``` + +### onRequest + +*function(request, response): void* + +Callback to run for every request. + +```javascript +const php = new PhpCgiWorker({ + onRequest: (request, response) => { + console.log(request.url, response.status); + } +}); +``` + +### env + +*object* + +Environment variables to inject into the CGI runtime before each request. + +```javascript +const php = new PhpCgiWorker({ + env: { + APP_ENV: 'development', + APP_DEBUG: '1' + } +}); +``` + +### autoTransaction + +*boolean* + +Defaults to `true`. Controls whether request handling and filesystem operations automatically wrap themselves in filesystem transactions. + +### maxRequestAge + +*number* + +Maximum request age in milliseconds. Older requests return `408`. + +### staticCacheTime + +*number* + +How long static-file responses may be cached in browsers with the Cache API available. + +### dynamicCacheTime + +*number* + +Stored setting for dynamic response cache lifetime. + +### vHosts + +*array of objects* + +Mount multiple PHP applications under different path prefixes. + +```javascript +const php = new PhpCgiWorker({ + vHosts: [ + { + pathPrefix: '/php-wasm/app-a', + directory: '/persist/app-a/public', + entrypoint: 'index.php' + } + ] +}); +``` + +## handleInstallEvent + +In service workers, this hooks into the `install` event. This should be set up as follows: + +```javascript +self.addEventListener('install', event => php.handleInstallEvent(event)); +``` + +In service workers, this hooks into the `activate` event. This should be set up as follows: + +## handleActivateEvent + +```javascript +self.addEventListener('activate', event => php.handleActivateEvent(event)); +``` + +In service workers, this hooks into the `message` event. This should be set up as follows: + +## handleMessageEvent + +```javascript +self.addEventListener('message', event => php.handleMessageEvent(event)); +``` + +`handleMessageEvent` exposes the built-in filesystem and settings methods over the worker message channel: + +- `analyzePath` +- `readdir` +- `readFile` +- `stat` +- `mkdir` +- `rmdir` +- `writeFile` +- `rename` +- `unlink` +- `putEnv` +- `refresh` +- `getSettings` +- `setSettings` +- `getEnvs` +- `setEnvs` +- `storeInit` + +It will also dispatch any custom handlers provided via the `actions` constructor option. + +In service workers, this hooks into the `fetch` event, and will call the `request` method in service workers. + +This should be set up as follows: + +## handleFetchEvent + +```javascript +self.addEventListener('fetch', event => php.handleFetchEvent(event)); +``` + +## request + +The `request` method only needs to be called manually if PHP-CGI is running under Node.js or inside a webpage. When running in a service worker, `handleFetchEvent` will call `request` internally. + +It returns a `Response`. + +## refresh + +This will discard the current PHP instance and spin up a brand new one. + +## Filesystem and Settings Helpers + +`PhpCgiBase` also exposes: + +- `analyzePath(path)` +- `readdir(path)` +- `readFile(path, options)` +- `stat(path)` +- `mkdir(path)` +- `rmdir(path)` +- `rename(path, newPath)` +- `writeFile(path, data, options)` +- `unlink(path)` +- `putEnv(name, value)` +- `getSettings()` +- `setSettings(settings)` +- `getEnvs()` +- `setEnvs(env)` +- `storeInit()` diff --git a/test/docs/fixtures/php-wasm-site/pages/methods/php-wasm.md b/test/docs/fixtures/php-wasm-site/pages/methods/php-wasm.md new file mode 100644 index 000000000..18e30fd77 --- /dev/null +++ b/test/docs/fixtures/php-wasm-site/pages/methods/php-wasm.md @@ -0,0 +1,224 @@ +--- +pagetitle: Php-Wasm Methods +weight: -1000 +itemtype: schema.org/Class +microdata: + name: PhpWasm + alternateName: PhpNode + alternateName: PhpWeb +--- + +# Php-Wasm Methods + +## constructor + +The concrete `php-wasm` classes all extend the same base runtime API: + +- `PhpWeb` +- `PhpNode` + +Both accept the same core options bucket, with different defaults for binary loading and filesystem persistence depending on environment. + +### Common constructor options + +### version + +*string* + +Selects the PHP runtime version to load. The current defaults in `source/` are `8.4` for `PhpWeb` and `PhpNode`. + +```javascript +const php = new PhpWeb({version: '8.4'}); +``` + +### variant + +*string* + +Optional build suffix appended to the runtime filename. + +```javascript +const php = new PhpWeb({version: '8.4', variant: '-debug'}); +``` + +### sharedLibs + +*array of strings or objects* + +Loads shared extensions before boot and writes `extension=...` lines for any item with `ini: true`. + +```javascript +const php = new PhpWeb({ + sharedLibs: [ + { url: 'https://unpkg.com/php-wasm-sqlite/php8.4-sqlite.so', ini: true }, + { url: 'https://unpkg.com/php-wasm-sqlite/sqlite.so', ini: false }, + ] +}); +``` + +ESM helper packages can be passed directly here. CommonJS callers should pass strings, `URL`s, or `{name, url, ini}` records manually instead. + +### dynamicLibs + +*array of strings or objects* + +Resolved the same way as `sharedLibs`, but never written into `php.ini`. + +The same CommonJS rule applies here: pass manual strings, `URL`s, or objects rather than the ESM helper packages. + +### files + +*array of objects* + +Preloads arbitrary files into the runtime before startup. + +Dynamic and shared `intl` builds use this mechanism to provide `icudt72l.dat` under `/preload`. Static `intl` builds can bundle the same file into the runtime `.data` package instead. + +```javascript +const php = new PhpWeb({ + files: [ + { + name: 'icudt72l.dat', + parent: '/preload/', + url: 'https://unpkg.com/php-wasm-intl/icudt72l.dat' + } + ] +}); +``` + +### locateFile + +*function(path, directory): string | URL | undefined* + +Overrides how `.wasm`, shared libraries, preload assets, and other runtime files are resolved. + +### ini + +*string* + +Additional `php.ini` lines appended to the generated runtime config. + +```javascript +const php = new PhpWeb({ini: ` +display_errors=1 +memory_limit=256M +`}); +``` + +### persist + +*object or array* + +Mounts persistent filesystems. In web runtimes this is typically IDBFS, and in `PhpNode` it can point to a host directory. + +### autoTransaction + +*boolean* + +Defaults to `true`. Controls whether queued operations automatically start and commit filesystem transactions. + +### shared + +*object* + +Shared JS object registry used internally by `php.x` and `php.r` when VRZNO is enabled. You generally do not need to set this manually. + +## php.run + +Run a PHP script and return its numeric exit code. `php.run()` is the right choice when you want script semantics, output on STDOUT/STDERR, or mixed PHP/HTML. + +The examples in this project use an opening ` entry.match(/^php(\d+\.\d+)-node\.(?:mjs|js)$/)) + .filter(Boolean) + .map(match => match[1]) + .filter((version, index, versions) => versions.indexOf(version) === index) + .filter(version => !minVersion || version.localeCompare(minVersion, undefined, { numeric: true }) >= 0) + .sort((left, right) => right.localeCompare(left, undefined, { numeric: true })); + + if(!versions.length) + { + const suffix = minVersion + ? ` >= ${minVersion}` + : ''; + throw new Error(`No local PhpNode runtime build${suffix} is available.`); + } + + return versions[0]; +} + +function capturePhpIo(php) +{ + let stdout = ''; + let stderr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdout += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stderr += line))); + + return { + get stdout(){ return stdout; }, + get stderr(){ return stderr; }, + reset() + { + stdout = ''; + stderr = ''; + }, + }; +} + +async function createPhpNode(options = {}) +{ + ensureNavigatorLocks(); + const version = options.version ?? getAvailablePhpNodeVersion(); + const php = new PhpNode(nodeRuntimeOptions({ version, runtime: 'php', ...options })); + + await php.binary; + + return php; +} + +async function createPhpCgiNode(options = {}) +{ + ensureNavigatorLocks(); + const version = options.version ?? process.env.PHP_VERSION; + + if(!version) + { + throw new Error('No PhpCgiNode runtime version was specified. Set PHP_VERSION or pass options.version explicitly.'); + } + + const php = new PhpCgiNode(nodeRuntimeOptions({ version, runtime: 'cgi', ...options })); + + await php.binary; + + return php; +} + +async function withTempDir(callback) +{ + const directory = await mkdtemp(path.join(os.tmpdir(), 'php-wasm-docs-')); + + try + { + return await callback(directory); + } + finally + { + await rm(directory, { recursive: true, force: true }); + } +} + +async function writeTree(root, tree) +{ + for(const [relativePath, contents] of Object.entries(tree)) + { + const destination = path.join(root, relativePath); + await mkdir(path.dirname(destination), { recursive: true }); + await writeFile(destination, contents); + } +} + +async function listen(server) +{ + return await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + server.off('error', reject); + resolve(server.address()); + }); + }); +} + +async function closeServer(server) +{ + return await new Promise((resolve, reject) => { + server.close(error => error ? reject(error) : resolve()); + }); +} + +function createRequestServer(php) +{ + return http.createServer(async (request, response) => { + const result = await php.request(request); + const reader = result.body.getReader(); + + response.writeHead(result.status, [...result.headers.entries()].flat()); + + let done = false; + + while(!done) + { + const chunk = await reader.read(); + done = chunk.done; + + if(chunk.value) + { + response.write(chunk.value); + } + } + + response.end(); + }); +} + +module.exports = { + capturePhpIo, + closeServer, + createPhpCgiNode, + createPhpNode, + createRequestServer, + getAvailablePhpNodeVersion, + listen, + withTempDir, + writeTree, +}; diff --git a/test/docs/lib/runtime.mjs b/test/docs/lib/runtime.mjs new file mode 100644 index 000000000..b449820a0 --- /dev/null +++ b/test/docs/lib/runtime.mjs @@ -0,0 +1,168 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises'; +import http from 'node:http'; + +import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs'; +import { PhpCgiNode } from '../../../packages/php-cgi-wasm/PhpCgiNode.mjs'; +import { phpWasmPackageDir } from './paths.mjs'; +import { nodeRuntimeOptions } from '../../lib/node-runtime-options.mjs'; + +function ensureNavigatorLocks() +{ + if(!globalThis.navigator) + { + globalThis.navigator = {}; + } + + if(!globalThis.navigator.locks) + { + globalThis.navigator.locks = { + async request(_name, callback) + { + return await callback(); + }, + }; + } +} + +export function getAvailablePhpNodeVersion(options = {}) +{ + const { minVersion = null } = typeof options === 'string' + ? { minVersion: options } + : options; + + const versions = fs.readdirSync(phpWasmPackageDir) + .map(entry => entry.match(/^php(\d+\.\d+)-node\.(?:mjs|js)$/)) + .filter(Boolean) + .map(match => match[1]) + .filter((version, index, versions) => versions.indexOf(version) === index) + .filter(version => !minVersion || version.localeCompare(minVersion, undefined, { numeric: true }) >= 0) + .sort((left, right) => right.localeCompare(left, undefined, { numeric: true })); + + if(!versions.length) + { + const suffix = minVersion + ? ` >= ${minVersion}` + : ''; + throw new Error(`No local PhpNode runtime build${suffix} is available.`); + } + + return versions[0]; +} + +export function capturePhpIo(php) +{ + let stdout = ''; + let stderr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdout += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stderr += line))); + + return { + get stdout(){ return stdout; }, + get stderr(){ return stderr; }, + reset() + { + stdout = ''; + stderr = ''; + }, + }; +} + +export async function createPhpNode(options = {}) +{ + ensureNavigatorLocks(); + const version = options.version ?? getAvailablePhpNodeVersion(); + const php = new PhpNode(nodeRuntimeOptions({ version, runtime: 'php', ...options })); + + await php.binary; + + return php; +} + +export async function createPhpCgiNode(options = {}) +{ + ensureNavigatorLocks(); + const version = options.version + ?? process.env.PHP_VERSION; + + if(!version) + { + throw new Error('No PhpCgiNode runtime version was specified. Set PHP_VERSION or pass options.version explicitly.'); + } + + const php = new PhpCgiNode(nodeRuntimeOptions({ version, runtime: 'cgi', ...options })); + + await php.binary; + + return php; +} + +export async function withTempDir(callback) +{ + const directory = await mkdtemp(path.join(os.tmpdir(), 'php-wasm-docs-')); + + try + { + return await callback(directory); + } + finally + { + await rm(directory, { recursive: true, force: true }); + } +} + +export async function writeTree(root, tree) +{ + for(const [relativePath, contents] of Object.entries(tree)) + { + const destination = path.join(root, relativePath); + await mkdir(path.dirname(destination), { recursive: true }); + await writeFile(destination, contents); + } +} + +export async function listen(server) +{ + return await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + server.off('error', reject); + resolve(server.address()); + }); + }); +} + +export async function closeServer(server) +{ + return await new Promise((resolve, reject) => { + server.close(error => error ? reject(error) : resolve()); + }); +} + +export function createRequestServer(php) +{ + return http.createServer(async (request, response) => { + const result = await php.request(request); + const reader = result.body.getReader(); + + response.writeHead(result.status, [...result.headers.entries()].flat()); + + let done = false; + + while(!done) + { + const chunk = await reader.read(); + done = chunk.done; + + if(chunk.value) + { + response.write(chunk.value); + } + } + + response.end(); + }); +} diff --git a/test/docs/report.cjs b/test/docs/report.cjs new file mode 100644 index 000000000..d7bf301b1 --- /dev/null +++ b/test/docs/report.cjs @@ -0,0 +1,859 @@ +const fs = require('node:fs'); +const path = require('node:path'); +const { strict: assert } = require('node:assert'); + +const { buildDocsInventory } = require('./lib/inventory.cjs'); +const { builderScript, docsRoot, repoRoot, sourceRoot } = require('./lib/paths.cjs'); +const { + capturePhpIo, + closeServer, + createPhpCgiNode, + createPhpNode, + createRequestServer, + getAvailablePhpNodeVersion, + listen, + withTempDir, + writeTree, +} = require('./lib/runtime.cjs'); +const extensionAssets = require('../lib/extension-assets.js'); + +const { getPackage } = extensionAssets; + +function readLocal(file) +{ + return fs.readFileSync(file, 'utf8'); +} + +function parseSourceDefaultVersion(file) +{ + const match = readLocal(file).match(/defaultVersion\s*=\s*['"](\d+\.\d+)['"]/); + return match?.[1] ?? null; +} + +function coverAll(page, status, summary, details = {}) +{ + const blockRefs = (details.docBlocks ?? page.blocks).map(block => ({ + id: block.id, + file: block.file, + index: block.index, + startLine: block.startLine, + endLine: block.endLine, + })); + const annotatedDetails = { ...details, docBlocks: blockRefs }; + + return page.blocks.map(block => ({ + blockId: block.id, + file: block.file, + index: block.index, + language: block.language, + headingPath: block.headingPath, + status, + summary, + details: annotatedDetails, + })); +} + +async function detectVrznoRuntime(php) +{ + let marshalledValue; + let marshalError = null; + + try + { + marshalledValue = await php.x`321`; + } + catch(error) + { + marshalError = error; + } + + const hasVrznoClass = await php.exec(`class_exists('Vrzno') ? '1' : '0'`) === '1'; + + return { + hasVrznoClass, + hasTaggedMarshalling: marshalledValue === 321, + marshalledValue, + marshalError, + }; +} + +async function validateCustomBuilds(page) +{ + const builderSource = readLocal(builderScript); + const blocksText = page.blocks.map(block => block.code).join('\n'); + + assert.match(blocksText, /php-wasm-builder build worker cgi mjs/); + assert.match(builderSource, /let buildType = 'js'/); + assert.match(builderSource, /if\(buildArgs\.includes\('mjs'\)\)/); + assert.match(builderSource, /if\(buildArgs\.includes\('cgi'\)\)/); + + return coverAll( + page, + 'static_validated', + 'Builder commands and defaults were validated against bin/php-wasm-builder.js.', + { source: builderScript } + ); +} + +async function validatePhpWasmRc(page) +{ + const makefile = readLocal(path.join(repoRoot, 'Makefile')); + const envFiles = readLocal(path.join(repoRoot, '.github/.env_8.5.shared.ci')); + const text = page.blocks.map(block => block.code).join('\n'); + const markdown = readLocal(path.join(docsRoot, page.file)); + + for(const token of [ + 'PHP_VERSION', + 'PHP_DIST_DIR', + 'PHP_ASSET_DIR', + 'PHP_CGI_DIST_DIR', + 'PHP_CGI_ASSET_DIR', + 'PRELOAD_ASSETS', + 'INITIAL_MEMORY', + 'ASSERTIONS', + 'WITH_GD', + 'WITH_LIBPNG', + 'WITH_LIBJPEG', + 'WITH_FREETYPE', + ]) + { + assert.match(text, new RegExp(`\\b${token}\\b`)); + } + assert.match(text, /\bOPTIMIZE\b|\bOPTIMIZATION\b/); + + assert.match(makefile, /BUILD_TYPE \?=js/); + assert.match(makefile, /PHP_DIST_DIR/); + assert.match(envFiles, /WITH_GD=static/); + assert.match(markdown, /php-?8\.x-pdo-sqlite\.so/); + assert.match(markdown, /8\.0\|8\.1\|8\.2\|\*\*8\.3\*\*|8\.0\|8\.1\|8\.2\|8\.3\|8\.4\|8\.5/); + + return coverAll( + page, + 'static_validated', + '.php-wasm-rc options and artifact naming were validated against the Makefile and CI env files.', + { source: path.join(repoRoot, 'Makefile') } + ); +} + +async function validateInstallAndInclude(page) + { + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/install-and-include.md + // Blocks 1-6 + const cdnImport = "const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');"; + const unpkgImport = "const { PhpWeb } = await import('https://unpkg.com/php-wasm/PhpWeb.mjs');"; + const npmInstalls = '$ npm i php-wasm\n$ npm i php-cgi-wasm\n$ npm i php-cli-wasm\n$ npm i php-dbg-wasm\n$ npm i php-wasm-builder'; + const localAssets = 'node_modules/php-wasm/php8.4-web.mjs.wasm\nnode_modules/php-cgi-wasm/php8.4-cgi-worker.mjs.wasm'; + const esmImport = "import { PhpWeb } from 'php-wasm/PhpWeb.mjs';"; + const cjsRequire = "const { PhpNode } = require('php-wasm/PhpNode');"; + const text = page.blocks.map(block => block.code).join('\n'); + const markdown = readLocal(path.join(docsRoot, page.file)); + + assert.match(text, new RegExp(cdnImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(unpkgImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(npmInstalls.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(localAssets.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(esmImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(cjsRequire.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(markdown, /Core Node runtimes support both ESM and CommonJS\./); + assert.match(markdown, /Extension helper JS packages (?:also )?remain ESM-only\./); + + return coverAll( + page, + 'static_validated', + 'CDN, package-install, and ESM/CommonJS import snippets were copied from the docs page and validated against current package entrypoints.', + { + source: path.join(repoRoot, 'packages/php-wasm'), + } + ); +} + +async function validatePhpInJs(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + const php = await createPhpNode({ version: runtimeVersion }); + const io = capturePhpIo(php); + const vrznoRuntime = await detectVrznoRuntime(php); + + if(!vrznoRuntime.hasVrznoClass || !vrznoRuntime.hasTaggedMarshalling) + { + return coverAll( + page, + 'allowed_gap', + 'php.x examples require a VRZNO-capable PhpNode runtime, but the local runtime did not expose tagged-template marshalling.', + { + gap: 'vrzno_runtime_unavailable', + runtimeVersion, + hasVrznoClass: vrznoRuntime.hasVrznoClass, + hasTaggedMarshalling: vrznoRuntime.hasTaggedMarshalling, + marshalledValue: vrznoRuntime.marshalledValue ?? null, + marshalError: vrznoRuntime.marshalError?.message ?? null, + } + ); + } + + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-js.md + // Block 4 + const helloWorldSnippet = ' block.code).join('\n'); + + for(const snippet of [ + 'php-tags.jsdelivr.mjs', + 'php-tags.unpkg.mjs', + 'data-stdout', + 'data-stdin', + 'data-stderr', + 'data-libs', + 'data-files', + 'php8.4-yaml.so', + 'php8.4-gd.so', + ]) + { + assert.match(text, new RegExp(snippet.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + } + + return coverAll( + page, + 'allowed_gap', + 'Static HTML snippets were source-validated, but executing php-tags examples still requires a dedicated browser harness.', + { gap: 'browser_php_tags_runtime' } + ); +} + +async function validatePhpIni(page) +{ + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/php.ini.md + // Block 2 + const inlineIni = ` + date.timezone=UTC + tidy.clean_output=1 + expose_php=0 +`; + + const php = await createPhpNode({ + ini: inlineIni + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal(await php.run(` block.code).join('\n'), /extension=php\\?\$\{PHP_VERSION\}-phar\.so/); + assert.equal(extensionIni, 'extension=php${PHP_VERSION}-phar.so'); + + return coverAll( + page, + 'executable_node', + 'php.ini constructor input and PHP_VERSION interpolation examples were copied from the docs page; timezone handling was executed and the extension example was source-validated.', + { + runtimeVersion: getAvailablePhpNodeVersion(), + } + ); +} + +async function validateFsOperations(page) +{ + const php = await createPhpNode({}); + + await php.mkdir('/docs'); + await php.writeFile('/docs/example.txt', 'hello', { encoding: 'utf8' }); + assert.equal(await php.readFile('/docs/example.txt', { encoding: 'utf8' }), 'hello'); + assert.deepEqual(await php.readdir('/docs'), ['.', '..', 'example.txt']); + assert.equal((await php.analyzePath('/docs/example.txt')).exists, true); + assert.equal((await php.stat('/docs/example.txt')).size, 5); + await php.rename('/docs/example.txt', '/docs/renamed.txt'); + assert.equal(await php.readFile('/docs/renamed.txt', { encoding: 'utf8' }), 'hello'); + await php.unlink('/docs/renamed.txt'); + await php.rmdir('/docs'); + + const text = page.blocks.map(block => block.code).join('\n'); + assert.match(text, /sendMessage\('writeFile'/); + assert.match(text, /sendMessage\('refresh'/); + + return coverAll( + page, + 'executable_node', + 'Filesystem helper methods were executed through PhpNode; worker msg-bus examples were source-validated.', + { runtimeVersion: getAvailablePhpNodeVersion() } + ); +} + +async function validateLoadingFiles(page) +{ + await withTempDir(async directory => { + const preloadFile = path.join(directory, 'hello.txt'); + await writeTree(directory, { 'hello.txt': 'Hello, world!\n' }); + const text = page.blocks.map(block => block.code).join('\n'); + + const php = await createPhpNode({ + files: [ + { + name: 'hello.txt', + parent: '/preload/', + url: new URL(`file://${preloadFile}`), + } + ], + persist: { mountPath: '/persist', localPath: directory }, + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal(await php.run(` block.code).join('\n'); + const baseSource = readLocal(path.join(sourceRoot, 'PhpBase.mjs')); + const webTransactionSource = readLocal(path.join(sourceRoot, 'webTransactions.mjs')); + + assert.match(readLocal(page.file.startsWith('/') ? page.file : path.join(docsRoot, page.file)), /Web and Worker environments only/i); + assert.match(baseSource, /this\.autoTransaction = \('autoTransaction' in args\) \? args\.autoTransaction : true;/); + assert.match(webTransactionSource, /No transaction initialized\./); + assert.match(text, /startTransaction/); + assert.match(text, /commitTransaction/); + + return coverAll( + page, + 'allowed_gap', + 'Transaction docs were validated against the web/worker transaction implementation; runtime execution still needs a browser or worker harness.', + { gap: 'web_worker_transaction_runtime' } + ); +} + +async function validateUsingExtensions(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + const php = await createPhpNode({ + version: runtimeVersion, + sharedLibs: [ + getPackage('sqlite', runtimeVersion), + getPackage('yaml', runtimeVersion), + ], + dynamicLibs: [ + getPackage('libxml', runtimeVersion), + getPackage('dom', runtimeVersion), + ], + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal( + await php.run(`query('SELECT 1')->fetchColumn(); + `), + 0 + ); + assert.equal(io.stdout, '1'); + + io.reset(); + assert.equal(await php.run(`Date; + var_dump($Date->now()); + `), 0); + assert.match(io.stdout, /^int\(-?\d+\)\n$/); + + io.reset(); + assert.equal(await php.run(`Date; + $d = new $Date; + var_dump($d->toISOString()); + `), 0); + assert.match(io.stdout, /^string\(24\) "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z"\n$/); + + io.reset(); + assert.equal(await php.r`Promise; + $p = new $Promise(function($accept, $reject) { + $accept('Pass.'); + }); + $dump = fn($value) => var_dump($value); + $p->then($dump)->catch($dump); + `, 0); + assert.equal(io.stdout, "string(5) \"Pass.\"\n"); + + const fetched = await php.x`${{ value: 'from-js' }}`; + assert.deepEqual(fetched, { value: 'from-js' }); + + return coverAll( + page, + 'executable_node', + 'Documented Vrzno PHP snippets were executed through PhpNode, with JS-to-PHP marshalling validated through php.x.', + { runtimeVersion } + ); +} + +async function validatePdoPglite(page) +{ + const text = page.blocks.map(block => block.code).join('\n'); + + assert.match(text, /@electric-sql\/pglite/); + assert.match(text, /new PDO\('pgsql:idb-storage'\)/); + assert.match(text, /data-imports/); + + return coverAll( + page, + 'allowed_gap', + 'PGlite examples were source-validated, but the documented idb-storage flow still needs a browser/IDB harness for runtime execution.', + { gap: 'browser_pglite_runtime' } + ); +} + +async function validatePdoCfd1(page) +{ + const text = page.blocks.map(block => block.code).join('\n'); + + assert.match(text, /cfd1: \{ mainDb: event\.env\.mainDb \}/); + assert.match(text, /new PDO\('cfd1:mainDb'\)/); + + return coverAll( + page, + 'allowed_gap', + 'Cloudflare D1 examples were source-validated, but executing them requires a Cloudflare Worker-compatible runtime.', + { gap: 'cloudflare_d1_runtime' } + ); +} + +async function validateCgiInNodeJs(page) +{ + await withTempDir(async directory => { + await writeTree(directory, { + 'persist/www/index.php': ' block.code).join('\n'); + + for(const snippet of [ + "php-cgi-wasm/PhpCgiWorker", + "php-cgi-wasm/msg-bus", + "handleInstallEvent", + "handleActivateEvent", + "handleFetchEvent", + "handleMessageEvent", + ]) + { + assert.match(text, new RegExp(snippet.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + } + + return coverAll( + page, + 'allowed_gap', + 'Service worker snippets were source-validated, but executing them still requires a browser worker harness.', + { gap: 'browser_service_worker_runtime' } + ); +} + +async function validateMethodsPhpCgi(page) +{ + await withTempDir(async directory => { + await writeTree(directory, { + 'persist/public/index.php': ' pathName === '/php-wasm' ? '/php-wasm/index.php' : pathName, + onRequest: (request, response) => { + seenStatus = response.status; + }, + notFound: () => new Response('404 - Not Found', { status: 404 }), + env: { APP_ENV: 'development' }, + actions: { + helloWorld: (instance, name) => `Hello, ${name}!`, + }, + }); + + const server = createRequestServer(php); + + try + { + const address = await listen(server); + const baseUrl = `http://${address.address}:${address.port}`; + + const okResponse = await fetch(`${baseUrl}/php-wasm`); + assert.equal(okResponse.status, 200); + assert.equal(await okResponse.text(), 'development|OK'); + assert.equal(seenStatus, 200); + + const missingResponse = await fetch(`${baseUrl}/php-wasm/nope.php`); + assert.equal(missingResponse.status, 404); + assert.equal(await missingResponse.text(), '404 - Not Found'); + } + finally + { + await closeServer(server); + } + + const sourceMessages = []; + await php.handleMessageEvent({ + data: { action: 'helloWorld', token: '1', params: ['Sean'] }, + source: { postMessage: message => sourceMessages.push(message) }, + }); + assert.equal(sourceMessages[0].result, 'Hello, Sean!'); + }); + + return coverAll( + page, + 'executable_cgi_node', + 'Representative constructor, request, rewrite, notFound, env, onRequest, and action examples were exercised through PhpCgiNode.', + { runtimeVersion: '8.4' } + ); +} + +async function validateMethodsPhpWasm(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + let hasVrzno = false; + + await withTempDir(async directory => { + await writeTree(directory, { + 'hello.txt': 'Hello, World!', + }); + + const php = await createPhpNode({ + version: runtimeVersion, + sharedLibs: [getPackage('sqlite', runtimeVersion)], + files: [ + { + name: 'hello.txt', + parent: '/preload/', + url: new URL(`file://${path.join(directory, 'hello.txt')}`), + }, + ], + ini: 'display_errors=1\nmemory_limit=256M\n', + }); + const io = capturePhpIo(php); + const vrznoRuntime = await detectVrznoRuntime(php); + hasVrzno = vrznoRuntime.hasVrznoClass && vrznoRuntime.hasTaggedMarshalling; + + io.reset(); + assert.equal(await php.run(` page.blockCount > 0) + .filter(page => shouldIncludePage(page.file, normalizedOptions)); + const blocksByFile = new Map; + + for(const block of inventory.blocks) + { + if(!shouldIncludePage(block.file, normalizedOptions)) + { + continue; + } + + if(!blocksByFile.has(block.file)) + { + blocksByFile.set(block.file, []); + } + + blocksByFile.get(block.file).push(block); + } + + const files = []; + + for(const pageInfo of pagesWithBlocks) + { + const blocks = blocksByFile.get(pageInfo.file) ?? []; + const validator = allPageValidators[pageInfo.file]; + if(process.env.DOCS_COVERAGE_DEBUG) + { + console.error(`Validating ${pageInfo.file}`); + } + + if(!validator) + { + files.push({ + file: pageInfo.file, + blockCount: blocks.length, + results: coverAll({ blocks }, 'uncovered', 'No validator is registered for this docs page.'), + }); + continue; + } + + const results = await validator({ ...pageInfo, blocks }); + + assert.equal( + results.length, + blocks.length, + `${pageInfo.file} coverage results did not account for every code block.` + ); + + files.push({ + file: pageInfo.file, + blockCount: blocks.length, + results, + }); + } + + const flatResults = files.flatMap(file => file.results); + const summary = flatResults.reduce((result, entry) => { + result.total += 1; + result.byStatus[entry.status] = (result.byStatus[entry.status] ?? 0) + 1; + return result; + }, { total: 0, byStatus: {} }); + + return { + generatedAt: new Date().toISOString(), + docsRoot: inventory.docsRoot, + nodeRuntimeVersion: getAvailablePhpNodeVersion(), + cgiNodeRuntimeVersion: normalizedOptions.includeCgiNode ? (process.env.PHP_VERSION ?? null) : null, + sourceDefaults: { + phpNode: parseSourceDefaultVersion(path.join(sourceRoot, 'PhpNode.mjs')), + phpCgiNode: parseSourceDefaultVersion(path.join(sourceRoot, 'PhpCgiNode.mjs')), + }, + options: normalizedOptions, + files, + summary, + }; +} + +module.exports = { + buildDocsCoverageReport, +}; diff --git a/test/docs/report.mjs b/test/docs/report.mjs new file mode 100644 index 000000000..aa8b084c2 --- /dev/null +++ b/test/docs/report.mjs @@ -0,0 +1,856 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { strict as assert } from 'node:assert'; + +import { buildDocsInventory } from './lib/inventory.mjs'; +import { builderScript, docsRoot, repoRoot, sourceRoot } from './lib/paths.mjs'; +import { + capturePhpIo, + closeServer, + createPhpCgiNode, + createPhpNode, + createRequestServer, + getAvailablePhpNodeVersion, + listen, + withTempDir, + writeTree, +} from './lib/runtime.mjs'; +import { getPackage } from '../lib/extension-assets.mjs'; + +function readLocal(file) +{ + return fs.readFileSync(file, 'utf8'); +} + +function parseSourceDefaultVersion(file) +{ + const match = readLocal(file).match(/defaultVersion\s*=\s*['"](\d+\.\d+)['"]/); + return match?.[1] ?? null; +} + +function coverAll(page, status, summary, details = {}) +{ + const blockRefs = (details.docBlocks ?? page.blocks).map(block => ({ + id: block.id, + file: block.file, + index: block.index, + startLine: block.startLine, + endLine: block.endLine, + })); + const annotatedDetails = { ...details, docBlocks: blockRefs }; + + return page.blocks.map(block => ({ + blockId: block.id, + file: block.file, + index: block.index, + language: block.language, + headingPath: block.headingPath, + status, + summary, + details: annotatedDetails, + })); +} + +async function detectVrznoRuntime(php) +{ + let marshalledValue; + let marshalError = null; + + try + { + marshalledValue = await php.x`321`; + } + catch(error) + { + marshalError = error; + } + + const hasVrznoClass = await php.exec(`class_exists('Vrzno') ? '1' : '0'`) === '1'; + + return { + hasVrznoClass, + hasTaggedMarshalling: marshalledValue === 321, + marshalledValue, + marshalError, + }; +} + +async function validateCustomBuilds(page) +{ + const builderSource = readLocal(builderScript); + const blocksText = page.blocks.map(block => block.code).join('\n'); + + assert.match(blocksText, /php-wasm-builder build worker cgi mjs/); + assert.match(builderSource, /let buildType = 'js'/); + assert.match(builderSource, /if\(buildArgs\.includes\('mjs'\)\)/); + assert.match(builderSource, /if\(buildArgs\.includes\('cgi'\)\)/); + + return coverAll( + page, + 'static_validated', + 'Builder commands and defaults were validated against bin/php-wasm-builder.js.', + { source: builderScript } + ); +} + +async function validatePhpWasmRc(page) +{ + const makefile = readLocal(path.join(repoRoot, 'Makefile')); + const envFiles = readLocal(path.join(repoRoot, '.github/.env_8.5.shared.ci')); + const text = page.blocks.map(block => block.code).join('\n'); + const markdown = readLocal(path.join(docsRoot, page.file)); + + for(const token of [ + 'PHP_VERSION', + 'PHP_DIST_DIR', + 'PHP_ASSET_DIR', + 'PHP_CGI_DIST_DIR', + 'PHP_CGI_ASSET_DIR', + 'PRELOAD_ASSETS', + 'INITIAL_MEMORY', + 'ASSERTIONS', + 'WITH_GD', + 'WITH_LIBPNG', + 'WITH_LIBJPEG', + 'WITH_FREETYPE', + ]) + { + assert.match(text, new RegExp(`\\b${token}\\b`)); + } + assert.match(text, /\bOPTIMIZE\b|\bOPTIMIZATION\b/); + + assert.match(makefile, /BUILD_TYPE \?=js/); + assert.match(makefile, /PHP_DIST_DIR/); + assert.match(envFiles, /WITH_GD=static/); + assert.match(markdown, /php-?8\.x-pdo-sqlite\.so/); + assert.match(markdown, /8\.0\|8\.1\|8\.2\|\*\*8\.3\*\*|8\.0\|8\.1\|8\.2\|8\.3\|8\.4\|8\.5/); + + return coverAll( + page, + 'static_validated', + '.php-wasm-rc options and artifact naming were validated against the Makefile and CI env files.', + { source: path.join(repoRoot, 'Makefile') } + ); +} + +async function validateInstallAndInclude(page) +{ + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/install-and-include.md + // Blocks 1-6 + const cdnImport = "const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mjs');"; + const unpkgImport = "const { PhpWeb } = await import('https://unpkg.com/php-wasm/PhpWeb.mjs');"; + const npmInstalls = '$ npm i php-wasm\n$ npm i php-cgi-wasm\n$ npm i php-cli-wasm\n$ npm i php-dbg-wasm\n$ npm i php-wasm-builder'; + const localAssets = 'node_modules/php-wasm/php8.4-web.mjs.wasm\nnode_modules/php-cgi-wasm/php8.4-cgi-worker.mjs.wasm'; + const esmImport = "import { PhpWeb } from 'php-wasm/PhpWeb.mjs';"; + const cjsRequire = "const { PhpNode } = require('php-wasm/PhpNode');"; + const text = page.blocks.map(block => block.code).join('\n'); + const markdown = readLocal(path.join(docsRoot, page.file)); + + assert.match(text, new RegExp(cdnImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(unpkgImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(npmInstalls.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(localAssets.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(esmImport.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(text, new RegExp(cjsRequire.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + assert.match(markdown, /Core Node runtimes support both ESM and CommonJS\./); + assert.match(markdown, /Extension helper JS packages (?:also )?remain ESM-only\./); + + return coverAll( + page, + 'static_validated', + 'CDN, package-install, and ESM/CommonJS import snippets were copied from the docs page and validated against current package entrypoints.', + { + source: path.join(repoRoot, 'packages/php-wasm'), + } + ); +} + +async function validatePhpInJs(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + const php = await createPhpNode({ version: runtimeVersion }); + const io = capturePhpIo(php); + const vrznoRuntime = await detectVrznoRuntime(php); + + if(!vrznoRuntime.hasVrznoClass || !vrznoRuntime.hasTaggedMarshalling) + { + return coverAll( + page, + 'allowed_gap', + 'php.x examples require a VRZNO-capable PhpNode runtime, but the local runtime did not expose tagged-template marshalling.', + { + gap: 'vrzno_runtime_unavailable', + runtimeVersion, + hasVrznoClass: vrznoRuntime.hasVrznoClass, + hasTaggedMarshalling: vrznoRuntime.hasTaggedMarshalling, + marshalledValue: vrznoRuntime.marshalledValue ?? null, + marshalError: vrznoRuntime.marshalError?.message ?? null, + } + ); + } + + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/php-in-js.md + // Block 4 + const helloWorldSnippet = ' block.code).join('\n'); + + for(const snippet of [ + 'php-tags.jsdelivr.mjs', + 'php-tags.unpkg.mjs', + 'data-stdout', + 'data-stdin', + 'data-stderr', + 'data-libs', + 'data-files', + 'php8.4-yaml.so', + 'php8.4-gd.so', + ]) + { + assert.match(text, new RegExp(snippet.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + } + + return coverAll( + page, + 'allowed_gap', + 'Static HTML snippets were source-validated, but executing php-tags examples still requires a dedicated browser harness.', + { gap: 'browser_php_tags_runtime' } + ); +} + +async function validatePhpIni(page) +{ + // Source: test/docs/fixtures/php-wasm-site/pages/getting-started/php.ini.md + // Block 2 + const inlineIni = ` + date.timezone=UTC + tidy.clean_output=1 + expose_php=0 +`; + + const php = await createPhpNode({ + ini: inlineIni + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal(await php.run(` block.code).join('\n'), /extension=php\\?\$\{PHP_VERSION\}-phar\.so/); + assert.equal(extensionIni, 'extension=php${PHP_VERSION}-phar.so'); + + return coverAll( + page, + 'executable_node', + 'php.ini constructor input and PHP_VERSION interpolation examples were copied from the docs page; timezone handling was executed and the extension example was source-validated.', + { + runtimeVersion: getAvailablePhpNodeVersion(), + } + ); +} + +async function validateFsOperations(page) +{ + const php = await createPhpNode({}); + + await php.mkdir('/docs'); + await php.writeFile('/docs/example.txt', 'hello', { encoding: 'utf8' }); + assert.equal(await php.readFile('/docs/example.txt', { encoding: 'utf8' }), 'hello'); + assert.deepEqual(await php.readdir('/docs'), ['.', '..', 'example.txt']); + assert.equal((await php.analyzePath('/docs/example.txt')).exists, true); + assert.equal((await php.stat('/docs/example.txt')).size, 5); + await php.rename('/docs/example.txt', '/docs/renamed.txt'); + assert.equal(await php.readFile('/docs/renamed.txt', { encoding: 'utf8' }), 'hello'); + await php.unlink('/docs/renamed.txt'); + await php.rmdir('/docs'); + + const text = page.blocks.map(block => block.code).join('\n'); + assert.match(text, /sendMessage\('writeFile'/); + assert.match(text, /sendMessage\('refresh'/); + + return coverAll( + page, + 'executable_node', + 'Filesystem helper methods were executed through PhpNode; worker msg-bus examples were source-validated.', + { runtimeVersion: getAvailablePhpNodeVersion() } + ); +} + +async function validateLoadingFiles(page) +{ + await withTempDir(async directory => { + const preloadFile = path.join(directory, 'hello.txt'); + await writeTree(directory, { 'hello.txt': 'Hello, world!\n' }); + const text = page.blocks.map(block => block.code).join('\n'); + + const php = await createPhpNode({ + files: [ + { + name: 'hello.txt', + parent: '/preload/', + url: new URL(`file://${preloadFile}`), + } + ], + persist: { mountPath: '/persist', localPath: directory }, + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal(await php.run(` block.code).join('\n'); + const baseSource = readLocal(path.join(sourceRoot, 'PhpBase.mjs')); + const webTransactionSource = readLocal(path.join(sourceRoot, 'webTransactions.mjs')); + + assert.match(readLocal(page.file.startsWith('/') ? page.file : path.join(docsRoot, page.file)), /Web and Worker environments only/i); + assert.match(baseSource, /this\.autoTransaction = \('autoTransaction' in args\) \? args\.autoTransaction : true;/); + assert.match(webTransactionSource, /No transaction initialized\./); + assert.match(text, /startTransaction/); + assert.match(text, /commitTransaction/); + + return coverAll( + page, + 'allowed_gap', + 'Transaction docs were validated against the web/worker transaction implementation; runtime execution still needs a browser or worker harness.', + { gap: 'web_worker_transaction_runtime' } + ); +} + +async function validateUsingExtensions(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + const php = await createPhpNode({ + version: runtimeVersion, + sharedLibs: [ + getPackage('sqlite', runtimeVersion), + getPackage('yaml', runtimeVersion), + ], + dynamicLibs: [ + getPackage('libxml', runtimeVersion), + getPackage('dom', runtimeVersion), + ], + }); + const io = capturePhpIo(php); + + io.reset(); + assert.equal( + await php.run(`query('SELECT 1')->fetchColumn(); + `), + 0 + ); + assert.equal(io.stdout, '1'); + + io.reset(); + assert.equal(await php.run(`Date; + var_dump($Date->now()); + `), 0); + assert.match(io.stdout, /^int\(-?\d+\)\n$/); + + io.reset(); + assert.equal(await php.run(`Date; + $d = new $Date; + var_dump($d->toISOString()); + `), 0); + assert.match(io.stdout, /^string\(24\) "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z"\n$/); + + io.reset(); + assert.equal(await php.r`Promise; + $p = new $Promise(function($accept, $reject) { + $accept('Pass.'); + }); + $dump = fn($value) => var_dump($value); + $p->then($dump)->catch($dump); + `, 0); + assert.equal(io.stdout, "string(5) \"Pass.\"\n"); + + const fetched = await php.x`${{ value: 'from-js' }}`; + assert.deepEqual(fetched, { value: 'from-js' }); + + return coverAll( + page, + 'executable_node', + 'Documented Vrzno PHP snippets were executed through PhpNode, with JS-to-PHP marshalling validated through php.x.', + { runtimeVersion } + ); +} + +async function validatePdoPglite(page) +{ + const text = page.blocks.map(block => block.code).join('\n'); + + assert.match(text, /@electric-sql\/pglite/); + assert.match(text, /new PDO\('pgsql:idb-storage'\)/); + assert.match(text, /data-imports/); + + return coverAll( + page, + 'allowed_gap', + 'PGlite examples were source-validated, but the documented idb-storage flow still needs a browser/IDB harness for runtime execution.', + { gap: 'browser_pglite_runtime' } + ); +} + +async function validatePdoCfd1(page) +{ + const text = page.blocks.map(block => block.code).join('\n'); + + assert.match(text, /cfd1: \{ mainDb: event\.env\.mainDb \}/); + assert.match(text, /new PDO\('cfd1:mainDb'\)/); + + return coverAll( + page, + 'allowed_gap', + 'Cloudflare D1 examples were source-validated, but executing them requires a Cloudflare Worker-compatible runtime.', + { gap: 'cloudflare_d1_runtime' } + ); +} + +async function validateCgiInNodeJs(page) +{ + await withTempDir(async directory => { + await writeTree(directory, { + 'persist/www/index.php': ' block.code).join('\n'); + + for(const snippet of [ + "php-cgi-wasm/PhpCgiWorker", + "php-cgi-wasm/msg-bus", + "handleInstallEvent", + "handleActivateEvent", + "handleFetchEvent", + "handleMessageEvent", + ]) + { + assert.match(text, new RegExp(snippet.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); + } + + return coverAll( + page, + 'allowed_gap', + 'Service worker snippets were source-validated, but executing them still requires a browser worker harness.', + { gap: 'browser_service_worker_runtime' } + ); +} + +async function validateMethodsPhpCgi(page) +{ + await withTempDir(async directory => { + await writeTree(directory, { + 'persist/public/index.php': ' pathName === '/php-wasm' ? '/php-wasm/index.php' : pathName, + onRequest: (request, response) => { + seenStatus = response.status; + }, + notFound: () => new Response('404 - Not Found', { status: 404 }), + env: { APP_ENV: 'development' }, + actions: { + helloWorld: (instance, name) => `Hello, ${name}!`, + }, + }); + + const server = createRequestServer(php); + + try + { + const address = await listen(server); + const baseUrl = `http://${address.address}:${address.port}`; + + const okResponse = await fetch(`${baseUrl}/php-wasm`); + assert.equal(okResponse.status, 200); + assert.equal(await okResponse.text(), 'development|OK'); + assert.equal(seenStatus, 200); + + const missingResponse = await fetch(`${baseUrl}/php-wasm/nope.php`); + assert.equal(missingResponse.status, 404); + assert.equal(await missingResponse.text(), '404 - Not Found'); + } + finally + { + await closeServer(server); + } + + const sourceMessages = []; + await php.handleMessageEvent({ + data: { action: 'helloWorld', token: '1', params: ['Sean'] }, + source: { postMessage: message => sourceMessages.push(message) }, + }); + assert.equal(sourceMessages[0].result, 'Hello, Sean!'); + }); + + return coverAll( + page, + 'executable_cgi_node', + 'Representative constructor, request, rewrite, notFound, env, onRequest, and action examples were exercised through PhpCgiNode.', + { runtimeVersion: '8.4' } + ); +} + +async function validateMethodsPhpWasm(page) +{ + const runtimeVersion = getAvailablePhpNodeVersion(); + let hasVrzno = false; + + await withTempDir(async directory => { + await writeTree(directory, { + 'hello.txt': 'Hello, World!', + }); + + const php = await createPhpNode({ + version: runtimeVersion, + sharedLibs: [getPackage('sqlite', runtimeVersion)], + files: [ + { + name: 'hello.txt', + parent: '/preload/', + url: new URL(`file://${path.join(directory, 'hello.txt')}`), + }, + ], + ini: 'display_errors=1\nmemory_limit=256M\n', + }); + const io = capturePhpIo(php); + const vrznoRuntime = await detectVrznoRuntime(php); + hasVrzno = vrznoRuntime.hasVrznoClass && vrznoRuntime.hasTaggedMarshalling; + + io.reset(); + assert.equal(await php.run(` page.blockCount > 0) + .filter(page => shouldIncludePage(page.file, normalizedOptions)); + const blocksByFile = new Map; + + for(const block of inventory.blocks) + { + if(!shouldIncludePage(block.file, normalizedOptions)) + { + continue; + } + + if(!blocksByFile.has(block.file)) + { + blocksByFile.set(block.file, []); + } + + blocksByFile.get(block.file).push(block); + } + + const files = []; + + for(const pageInfo of pagesWithBlocks) + { + const blocks = blocksByFile.get(pageInfo.file) ?? []; + const validator = allPageValidators[pageInfo.file]; + if(process.env.DOCS_COVERAGE_DEBUG) + { + console.error(`Validating ${pageInfo.file}`); + } + + if(!validator) + { + files.push({ + file: pageInfo.file, + blockCount: blocks.length, + results: coverAll({ blocks }, 'uncovered', 'No validator is registered for this docs page.'), + }); + continue; + } + + const results = await validator({ ...pageInfo, blocks }); + + assert.equal( + results.length, + blocks.length, + `${pageInfo.file} coverage results did not account for every code block.` + ); + + files.push({ + file: pageInfo.file, + blockCount: blocks.length, + results, + }); + } + + const flatResults = files.flatMap(file => file.results); + const summary = flatResults.reduce((result, entry) => { + result.total += 1; + result.byStatus[entry.status] = (result.byStatus[entry.status] ?? 0) + 1; + return result; + }, { total: 0, byStatus: {} }); + + return { + generatedAt: new Date().toISOString(), + docsRoot: inventory.docsRoot, + nodeRuntimeVersion: getAvailablePhpNodeVersion(), + cgiNodeRuntimeVersion: normalizedOptions.includeCgiNode ? (process.env.PHP_VERSION ?? null) : null, + sourceDefaults: { + phpNode: parseSourceDefaultVersion(path.join(sourceRoot, 'PhpNode.mjs')), + phpCgiNode: parseSourceDefaultVersion(path.join(sourceRoot, 'PhpCgiNode.mjs')), + }, + options: normalizedOptions, + files, + summary, + }; +} diff --git a/test/files.cjs b/test/files.cjs new file mode 100644 index 000000000..58fd64e14 --- /dev/null +++ b/test/files.cjs @@ -0,0 +1,47 @@ +const { test } = require('node:test'); +const { strict: assert } = require('node:assert'); + +const { PhpNode } = require('./lib/PhpNode.cjs'); + +test('Can read files from JS through the FS interface', async () => { + const php = new PhpNode({ persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }); + const contents = new TextDecoder().decode(await php.readFile('/persist/test-content.txt')); + + assert.equal(contents, `Hello, world!\n`); +}); + +test('Can write files from JS through the FS interface', async () => { + const php = new PhpNode({ persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }); + + await php.writeFile('/persist/test-content-2.txt', `WRITE TEST\n`); + + const aboutPath = await php.analyzePath('/persist/test-content-2.txt'); + assert.equal(aboutPath.exists, true); + + const contents = new TextDecoder().decode(await php.readFile('/persist/test-content-2.txt')); + assert.equal(contents, `WRITE TEST\n`); +}); + +test('Can delete files from JS through the FS interface', async () => { + const php = new PhpNode({ persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }); + + await php.writeFile('/persist/test-content-2.txt', `WRITE TEST\n`); + await php.unlink('/persist/test-content-2.txt'); + + const aboutPath = await php.analyzePath('/persist/test-content-2.txt'); + assert.equal(aboutPath.exists, false); +}); + +test('Can create & delete directories through the FS interface', async () => { + const php = new PhpNode({ persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }); + + await php.mkdir('/persist/test-dir'); + + const aboutPathBefore = await php.analyzePath('/persist/test-dir'); + assert.equal(aboutPathBefore.exists, true); + + await php.rmdir('/persist/test-dir'); + + const aboutPathAfter = await php.analyzePath('/persist/test-dir'); + assert.equal(aboutPathAfter.exists, false); +}); diff --git a/test/files.mjs b/test/files.mjs index 474790ffa..f8fdd65ab 100644 --- a/test/files.mjs +++ b/test/files.mjs @@ -1,6 +1,15 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; -import { PhpNode } from '../packages/php-wasm/PhpNode.mjs'; +import { PhpNode as BasePhpNode } from '../packages/php-wasm/PhpNode.mjs'; +import { nodeRuntimeOptions } from './lib/node-runtime-options.mjs'; + +class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions(args)); + } +} test('Can read files from JS through the FS interface', async () => { const php = new PhpNode( { persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } } ); diff --git a/test/lib/PhpNode.cjs b/test/lib/PhpNode.cjs new file mode 100644 index 000000000..84b459381 --- /dev/null +++ b/test/lib/PhpNode.cjs @@ -0,0 +1,14 @@ +const { PhpNode: BasePhpNode } = require('php-wasm/PhpNode'); +const { nodeRuntimeOptions } = require('./node-runtime-options.cjs'); + +class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions({ runtime: 'php', ...args })); + } +} + +module.exports = { + PhpNode, +}; diff --git a/test/lib/PhpNode.mjs b/test/lib/PhpNode.mjs new file mode 100644 index 000000000..dd03e7c15 --- /dev/null +++ b/test/lib/PhpNode.mjs @@ -0,0 +1,10 @@ +import { PhpNode as BasePhpNode } from '../../packages/php-wasm/PhpNode.mjs'; +import { nodeRuntimeOptions } from './node-runtime-options.mjs'; + +export class PhpNode extends BasePhpNode +{ + constructor(args = {}) + { + super(nodeRuntimeOptions({ runtime: 'php', ...args })); + } +} diff --git a/test/lib/extension-assets.js b/test/lib/extension-assets.js new file mode 100644 index 000000000..3875323bc --- /dev/null +++ b/test/lib/extension-assets.js @@ -0,0 +1,173 @@ +const path = require('node:path'); +const { pathToFileURL } = require('node:url'); + +const repoRoot = path.resolve(__dirname, '../..'); +const extensionNamePattern = /^php\d+\.\d+-/; + +const packageRoots = { + dom: path.join(repoRoot, 'packages/dom'), + gd: path.join(repoRoot, 'packages/gd'), + iconv: path.join(repoRoot, 'packages/iconv'), + intl: path.join(repoRoot, 'packages/intl'), + libxml: path.join(repoRoot, 'packages/libxml'), + libzip: path.join(repoRoot, 'packages/libzip'), + mbstring: path.join(repoRoot, 'packages/mbstring'), + openssl: path.join(repoRoot, 'packages/openssl'), + phar: path.join(repoRoot, 'packages/phar'), + simplexml: path.join(repoRoot, 'packages/simplexml'), + sqlite: path.join(repoRoot, 'packages/sqlite'), + tidy: path.join(repoRoot, 'packages/tidy'), + xml: path.join(repoRoot, 'packages/xml'), + xmlreader: path.join(repoRoot, 'packages/xmlreader'), + xmlwriter: path.join(repoRoot, 'packages/xmlwriter'), + yaml: path.join(repoRoot, 'packages/libyaml'), + zlib: path.join(repoRoot, 'packages/zlib'), +}; + +const cloneRecord = record => ({ ...record }); +const clonePackage = pkg => ({ + getLibs: () => (pkg.getLibs?.() ?? []).map(cloneRecord), + getFiles: () => (pkg.getFiles?.() ?? []).map(cloneRecord), +}); + +const fileUrl = hostPath => pathToFileURL(hostPath).href; +const versionedExtension = (phpVersion, name) => `php${phpVersion}-${name}.so`; +const libDef = (packageKey, name, ini) => ({ + name, + url: fileUrl(path.join(packageRoots[packageKey], name)), + ...(ini === undefined ? {} : { ini }), +}); +const preloadFileDef = (packageKey, name, virtualPath) => ({ + name, + path: virtualPath, + url: fileUrl(path.join(packageRoots[packageKey], name)), +}); + +const packageFactories = { + dom: phpVersion => ({ + getLibs: () => [libDef('dom', versionedExtension(phpVersion, 'dom'), true)], + }), + gd: phpVersion => ({ + getLibs: () => [ + libDef('gd', versionedExtension(phpVersion, 'gd'), true), + libDef('gd', 'libfreetype.so'), + libDef('gd', 'libwebp.so'), + libDef('gd', 'libjpeg.so'), + libDef('gd', 'libpng.so'), + ], + }), + iconv: phpVersion => ({ + getLibs: () => [ + libDef('iconv', versionedExtension(phpVersion, 'iconv'), true), + libDef('iconv', 'libiconv.so'), + ], + }), + intl: phpVersion => ({ + getLibs: () => [ + libDef('intl', versionedExtension(phpVersion, 'intl'), true), + libDef('intl', 'libicuuc.so'), + libDef('intl', 'libicutu.so'), + libDef('intl', 'libicutest.so'), + libDef('intl', 'libicuio.so'), + libDef('intl', 'libicui18n.so'), + libDef('intl', 'libicudata.so'), + ], + getFiles: () => [preloadFileDef('intl', 'icudt72l.dat', '/preload/icudt72l.dat')], + }), + libxml: () => ({ + getLibs: () => [libDef('libxml', 'libxml2.so')], + }), + libzip: phpVersion => ({ + getLibs: () => [ + libDef('libzip', versionedExtension(phpVersion, 'zip'), true), + libDef('libzip', 'libzip.so'), + ], + }), + mbstring: phpVersion => ({ + getLibs: () => [ + libDef('mbstring', versionedExtension(phpVersion, 'mbstring'), true), + libDef('mbstring', 'libonig.so'), + ], + }), + openssl: phpVersion => ({ + getLibs: () => [ + libDef('openssl', versionedExtension(phpVersion, 'openssl'), true), + libDef('openssl', 'libssl.so'), + libDef('openssl', 'libcrypto.so'), + ], + }), + phar: phpVersion => ({ + getLibs: () => [libDef('phar', versionedExtension(phpVersion, 'phar'), true)], + }), + simplexml: phpVersion => ({ + getLibs: () => [libDef('simplexml', versionedExtension(phpVersion, 'simplexml'), true)], + }), + sqlite: phpVersion => ({ + getLibs: () => [ + libDef('sqlite', versionedExtension(phpVersion, 'sqlite'), true), + libDef('sqlite', versionedExtension(phpVersion, 'pdo-sqlite'), true), + libDef('sqlite', 'libsqlite3.so'), + ], + }), + tidy: phpVersion => ({ + getLibs: () => [ + libDef('tidy', versionedExtension(phpVersion, 'tidy'), true), + libDef('tidy', 'libtidy.so'), + ], + }), + xml: phpVersion => ({ + getLibs: () => [libDef('xml', versionedExtension(phpVersion, 'xml'), true)], + }), + xmlreader: phpVersion => ({ + getLibs: () => [libDef('xmlreader', versionedExtension(phpVersion, 'xmlreader'), true)], + }), + xmlwriter: phpVersion => ({ + getLibs: () => [libDef('xmlwriter', versionedExtension(phpVersion, 'xmlwriter'), true)], + }), + yaml: phpVersion => ({ + getLibs: () => [ + libDef('yaml', versionedExtension(phpVersion, 'yaml'), true), + libDef('yaml', 'libyaml.so'), + ], + }), + zlib: phpVersion => ({ + getLibs: () => [ + libDef('zlib', versionedExtension(phpVersion, 'zlib'), true), + libDef('zlib', 'libz.so'), + ], + }), +}; + +const getPackage = (packageKey, phpVersion = '8.4') => { + const factory = packageFactories[packageKey]; + + if(!factory) + { + throw new Error(`Unknown extension asset package: ${packageKey}`); + } + + return clonePackage(factory(phpVersion)); +}; + +const getSupportPackage = (packageKey, phpVersion = '8.4') => { + const extensionPackage = getPackage(packageKey, phpVersion); + const libs = extensionPackage + .getLibs() + .filter(lib => !extensionNamePattern.test(lib.name ?? '')); + const files = extensionPackage.getFiles(); + + return clonePackage({ + getLibs: () => libs, + getFiles: () => files, + }); +}; + +module.exports = { + repoRoot, + packageRoots, + getPackage, + getSupportPackage, + fileUrl, + preloadFileDef, + versionedExtension, +}; diff --git a/test/lib/extension-assets.mjs b/test/lib/extension-assets.mjs new file mode 100644 index 000000000..243237942 --- /dev/null +++ b/test/lib/extension-assets.mjs @@ -0,0 +1,183 @@ +import path from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); +const extensionNamePattern = /^php\d+\.\d+-/; + +const packageRoots = { + dom: path.join(repoRoot, 'packages/dom') + , gd: path.join(repoRoot, 'packages/gd') + , iconv: path.join(repoRoot, 'packages/iconv') + , intl: path.join(repoRoot, 'packages/intl') + , libxml: path.join(repoRoot, 'packages/libxml') + , libzip: path.join(repoRoot, 'packages/libzip') + , mbstring: path.join(repoRoot, 'packages/mbstring') + , openssl: path.join(repoRoot, 'packages/openssl') + , phar: path.join(repoRoot, 'packages/phar') + , simplexml: path.join(repoRoot, 'packages/simplexml') + , sqlite: path.join(repoRoot, 'packages/sqlite') + , tidy: path.join(repoRoot, 'packages/tidy') + , xml: path.join(repoRoot, 'packages/xml') + , xmlreader: path.join(repoRoot, 'packages/xmlreader') + , xmlwriter: path.join(repoRoot, 'packages/xmlwriter') + , yaml: path.join(repoRoot, 'packages/libyaml') + , zlib: path.join(repoRoot, 'packages/zlib') +}; + +const cloneRecord = record => ({...record}); +const clonePackage = pkg => ({ + getLibs: () => (pkg.getLibs?.() ?? []).map(cloneRecord) + , getFiles: () => (pkg.getFiles?.() ?? []).map(cloneRecord) +}); + +const fileUrl = hostPath => pathToFileURL(hostPath).href; +const versionedExtension = (phpVersion, name) => `php${phpVersion}-${name}.so`; +const libDef = (packageKey, name, ini) => ({ + name + , url: fileUrl(path.join(packageRoots[packageKey], name)) + , ...(ini === undefined ? {} : {ini}) +}); +const preloadFileDef = (packageKey, name, virtualPath) => ({ + name + , path: virtualPath + , url: fileUrl(path.join(packageRoots[packageKey], name)) +}); + +const packageFactories = { + dom: phpVersion => ({ + getLibs: () => [libDef('dom', versionedExtension(phpVersion, 'dom'), true)] + }) + , gd: phpVersion => ({ + getLibs: () => [ + libDef('gd', versionedExtension(phpVersion, 'gd'), true) + , libDef('gd', 'libfreetype.so') + , libDef('gd', 'libwebp.so') + , libDef('gd', 'libjpeg.so') + , libDef('gd', 'libpng.so') + ] + }) + , iconv: phpVersion => ({ + getLibs: () => [ + libDef('iconv', versionedExtension(phpVersion, 'iconv'), true) + , libDef('iconv', 'libiconv.so') + ] + }) + , intl: phpVersion => ({ + getLibs: () => [ + libDef('intl', versionedExtension(phpVersion, 'intl'), true) + , libDef('intl', 'libicuuc.so') + , libDef('intl', 'libicutu.so') + , libDef('intl', 'libicutest.so') + , libDef('intl', 'libicuio.so') + , libDef('intl', 'libicui18n.so') + , libDef('intl', 'libicudata.so') + ] + , getFiles: () => [preloadFileDef('intl', 'icudt72l.dat', '/preload/icudt72l.dat')] + }) + , libxml: () => ({ + getLibs: () => [libDef('libxml', 'libxml2.so')] + }) + , libzip: phpVersion => ({ + getLibs: () => [ + libDef('libzip', versionedExtension(phpVersion, 'zip'), true) + , libDef('libzip', 'libzip.so') + ] + }) + , mbstring: phpVersion => ({ + getLibs: () => [ + libDef('mbstring', versionedExtension(phpVersion, 'mbstring'), true) + , libDef('mbstring', 'libonig.so') + ] + }) + , openssl: phpVersion => ({ + getLibs: () => [ + libDef('openssl', versionedExtension(phpVersion, 'openssl'), true) + , libDef('openssl', 'libssl.so') + , libDef('openssl', 'libcrypto.so') + ] + }) + , phar: phpVersion => ({ + getLibs: () => [libDef('phar', versionedExtension(phpVersion, 'phar'), true)] + }) + , simplexml: phpVersion => ({ + getLibs: () => [libDef('simplexml', versionedExtension(phpVersion, 'simplexml'), true)] + }) + , sqlite: phpVersion => ({ + getLibs: () => [ + libDef('sqlite', versionedExtension(phpVersion, 'sqlite'), true) + , libDef('sqlite', versionedExtension(phpVersion, 'pdo-sqlite'), true) + , libDef('sqlite', 'libsqlite3.so') + ] + }) + , tidy: phpVersion => ({ + getLibs: () => [ + libDef('tidy', versionedExtension(phpVersion, 'tidy'), true) + , libDef('tidy', 'libtidy.so') + ] + }) + , xml: phpVersion => ({ + getLibs: () => [libDef('xml', versionedExtension(phpVersion, 'xml'), true)] + }) + , xmlreader: phpVersion => ({ + getLibs: () => [libDef('xmlreader', versionedExtension(phpVersion, 'xmlreader'), true)] + }) + , xmlwriter: phpVersion => ({ + getLibs: () => [libDef('xmlwriter', versionedExtension(phpVersion, 'xmlwriter'), true)] + }) + , yaml: phpVersion => ({ + getLibs: () => [ + libDef('yaml', versionedExtension(phpVersion, 'yaml'), true) + , libDef('yaml', 'libyaml.so') + ] + }) + , zlib: phpVersion => ({ + getLibs: () => [ + libDef('zlib', versionedExtension(phpVersion, 'zlib'), true) + , libDef('zlib', 'libz.so') + ] + }) +}; + +const getPackage = (packageKey, phpVersion = '8.4') => { + const factory = packageFactories[packageKey]; + + if(!factory) + { + throw new Error(`Unknown extension asset package: ${packageKey}`); + } + + return clonePackage(factory(phpVersion)); +}; + +const getSupportPackage = (packageKey, phpVersion = '8.4') => { + const extensionPackage = getPackage(packageKey, phpVersion); + const libs = extensionPackage + .getLibs() + .filter(lib => !extensionNamePattern.test(lib.name ?? '')); + const files = extensionPackage.getFiles(); + + return clonePackage({ + getLibs: () => libs + , getFiles: () => files + }); +}; + +export { + repoRoot, + packageRoots, + getPackage, + getSupportPackage, + fileUrl, + preloadFileDef, + versionedExtension, +}; + +export default { + repoRoot, + packageRoots, + getPackage, + getSupportPackage, + fileUrl, + preloadFileDef, + versionedExtension, +}; diff --git a/test/lib/node-runtime-options.cjs b/test/lib/node-runtime-options.cjs new file mode 100644 index 000000000..f775dbad9 --- /dev/null +++ b/test/lib/node-runtime-options.cjs @@ -0,0 +1,260 @@ +const fs = require('node:fs'); +const path = require('node:path'); + +const { + getPackage, + getSupportPackage, +} = require('./extension-assets.js'); + +const currentEnv = () => globalThis.process?.env ?? {}; +const envFlagIsShared = value => value === 'shared'; +const envFlagNeedsOpenSslLibs = value => ['1', 'shared', 'dynamic'].includes(value ?? ''); +const normalizeBuildMode = value => value === '1' ? 'dynamic' : value; +const sharedWrapperMarkers = ['php.data', 'getDylinkMetadata', 'LDSO']; +const sharedBuildFlags = new Set([ + 'WITH_LIBXML' + , 'WITH_ZLIB' + , 'WITH_LIBZIP' + , 'WITH_GD' + , 'WITH_LIBPNG' + , 'WITH_FREETYPE' + , 'WITH_LIBJPEG' + , 'WITH_LIBWEBP' + , 'WITH_ICONV' + , 'WITH_INTL' + , 'WITH_MBSTRING' + , 'WITH_ONIGURUMA' + , 'WITH_OPENSSL' + , 'WITH_SQLITE' + , 'WITH_XMLREADER' + , 'WITH_TIDY' + , 'WITH_YAML' +]); +const runtimeWrapperByKind = { + php: version => path.resolve(`/app/packages/php-wasm/php${version}-node.mjs`) + , cgi: version => path.resolve(`/app/packages/php-cgi-wasm/php${version}-cgi-node.mjs`) + , cli: version => path.resolve(`/app/packages/php-cli-wasm/php${version}-cli-node.mjs`) + , dbg: version => path.resolve(`/app/packages/php-dbg-wasm/php${version}-dbg-node.mjs`) +}; +const packageBuildFlagMap = { + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , libxml: 'WITH_LIBXML' + , libzip: 'WITH_LIBZIP' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zlib: 'WITH_ZLIB' +}; +const runtimeLibraryPackages = { + cgi: ['libxml', 'dom', 'zlib', 'libzip', 'gd', 'iconv', 'intl', 'openssl', 'mbstring', 'phar', 'sqlite', 'xml', 'simplexml', 'tidy', 'yaml'] +}; + +const tagPackage = (packageKey, pkg) => ({ __packageKey: packageKey, ...pkg }); + +const dedupeSharedLibEntries = sharedLibs => { + const deduped = []; + const seenPackages = new Set; + + for(const entry of sharedLibs) + { + const packageKey = entry?.__packageKey; + + if(packageKey && seenPackages.has(packageKey)) + { + continue; + } + + packageKey && seenPackages.add(packageKey); + deduped.push(entry); + } + + return deduped; +}; + +const sharedLibraryPackages = [ + [env => envFlagIsShared(env.WITH_LIBXML), 'libxml'] + , [env => envFlagIsShared(env.WITH_ZLIB), 'zlib'] + , [env => envFlagIsShared(env.WITH_LIBZIP), 'libzip'] + , [env => ( + envFlagIsShared(env.WITH_GD) + || envFlagIsShared(env.WITH_LIBPNG) + || envFlagIsShared(env.WITH_FREETYPE) + || envFlagIsShared(env.WITH_LIBJPEG) + || envFlagIsShared(env.WITH_LIBWEBP) + ), 'gd'] + , [env => envFlagIsShared(env.WITH_ICONV), 'iconv'] + , [env => envFlagIsShared(env.WITH_INTL), 'intl'] + , [env => envFlagIsShared(env.WITH_MBSTRING) || envFlagIsShared(env.WITH_ONIGURUMA), 'mbstring'] + , [env => envFlagNeedsOpenSslLibs(env.WITH_OPENSSL), 'openssl'] + , [env => envFlagIsShared(env.WITH_SQLITE), 'sqlite'] + , [env => envFlagIsShared(env.WITH_TIDY), 'tidy'] + , [env => envFlagIsShared(env.WITH_YAML), 'yaml'] +]; + +const currentPhpVersion = env => env.PHP_VERSION ?? '8.4'; +const hasExplicitBuildFlags = env => Object.keys(env).some(key => sharedBuildFlags.has(key)); +const currentBuildType = env => String(env.LIB_TYPE ?? '').toLowerCase(); + +const parseEnvFile = envFile => { + if(!fs.existsSync(envFile)) + { + return {}; + } + + return fs.readFileSync(envFile, 'utf8') + .split(/\r?\n/) + .reduce((parsed, line) => { + const trimmed = line.trim(); + + if(!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!') || !trimmed.includes('=')) + { + return parsed; + } + + const [key, ...rest] = trimmed.split('='); + parsed[key] = rest.join('='); + return parsed; + }, {}); +}; + +const runtimeLooksShared = wrapperFile => { + if(!wrapperFile || !fs.existsSync(wrapperFile)) + { + return false; + } + + const wrapperSource = fs.readFileSync(wrapperFile, 'utf8'); + + return sharedWrapperMarkers.every(marker => wrapperSource.includes(marker)); +}; + +const resolveNodeTestEnv = (options = {}, env = currentEnv()) => { + if(hasExplicitBuildFlags(env)) + { + return env; + } + + const phpVersion = options.version ?? currentPhpVersion(env); + const buildType = currentBuildType(env); + const runtimeKind = options.runtime; + const wrapperFile = runtimeKind && runtimeWrapperByKind[runtimeKind]?.(phpVersion); + const buildTypeEnvFile = buildType && ['dynamic', 'shared', 'static'].includes(buildType) + ? path.resolve(`/app/.github/.env_${phpVersion}.${buildType}.ci`) + : null; + + if(buildTypeEnvFile) + { + return { + ...parseEnvFile(buildTypeEnvFile) + , ...env + , PHP_VERSION: phpVersion + }; + } + + if(!runtimeLooksShared(wrapperFile)) + { + return env; + } + + const sharedEnvFile = path.resolve(`/app/.github/.env_${phpVersion}.shared.ci`); + + return { + ...parseEnvFile(sharedEnvFile) + , ...env + , PHP_VERSION: phpVersion + }; +}; + +const getNodeEnvSharedLibs = (env = currentEnv()) => { + const phpVersion = currentPhpVersion(env); + const supportPackages = []; + + for(const [shouldInclude, packageKey] of sharedLibraryPackages) + { + if(!shouldInclude(env)) + { + continue; + } + + const supportPackage = getSupportPackage(packageKey, phpVersion); + + if(supportPackage.getLibs().length || supportPackage.getFiles().length) + { + supportPackages.push(tagPackage(packageKey, supportPackage)); + } + } + + return supportPackages; +}; + +const effectivePackageBuildMode = (packageKey, env = currentEnv()) => normalizeBuildMode( + env[packageBuildFlagMap[packageKey]] ?? 'dynamic' +); + +const getNodeEnvRuntimeLibs = (options = {}, env = currentEnv()) => { + const runtimePackages = runtimeLibraryPackages[options.runtime] ?? []; + + if(!runtimePackages.length) + { + return []; + } + + const phpVersion = options.version ?? currentPhpVersion(env); + const resolvedPackages = []; + const seenPackages = new Set(); + + for(const packageKey of runtimePackages) + { + if(seenPackages.has(packageKey)) + { + continue; + } + + seenPackages.add(packageKey); + + switch(effectivePackageBuildMode(packageKey, env)) + { + case 'dynamic': + resolvedPackages.push(tagPackage(packageKey, getPackage(packageKey, phpVersion))); + break; + + case 'shared': + resolvedPackages.push(tagPackage(packageKey, getSupportPackage(packageKey, phpVersion))); + break; + } + } + + return resolvedPackages.filter(pkg => pkg.getLibs().length || pkg.getFiles().length); +}; + +const nodeRuntimeOptions = (options = {}, env = currentEnv()) => { + const resolvedEnv = resolveNodeTestEnv(options, env); + const sharedLibs = dedupeSharedLibEntries([ + ...getNodeEnvSharedLibs(resolvedEnv), + ...getNodeEnvRuntimeLibs(options, resolvedEnv), + ...(options.sharedLibs ?? []) + ]); + + if(!sharedLibs.length) + { + return options; + } + + return { ...options, sharedLibs }; +}; + +module.exports = { + getNodeEnvSharedLibs, + nodeRuntimeOptions, + resolveNodeTestEnv, +}; diff --git a/test/lib/node-runtime-options.mjs b/test/lib/node-runtime-options.mjs new file mode 100644 index 000000000..79d7e5415 --- /dev/null +++ b/test/lib/node-runtime-options.mjs @@ -0,0 +1,251 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { getPackage, getSupportPackage } from './extension-assets.mjs'; + +const currentEnv = () => globalThis.process?.env ?? {}; +const envFlagIsShared = value => value === 'shared'; +const envFlagNeedsOpenSslLibs = value => ['1', 'shared', 'dynamic'].includes(value ?? ''); +const normalizeBuildMode = value => value === '1' ? 'dynamic' : value; +const sharedWrapperMarkers = ['php.data', 'getDylinkMetadata', 'LDSO']; +const sharedBuildFlags = new Set([ + 'WITH_LIBXML' + , 'WITH_ZLIB' + , 'WITH_LIBZIP' + , 'WITH_GD' + , 'WITH_LIBPNG' + , 'WITH_FREETYPE' + , 'WITH_LIBJPEG' + , 'WITH_LIBWEBP' + , 'WITH_ICONV' + , 'WITH_INTL' + , 'WITH_MBSTRING' + , 'WITH_ONIGURUMA' + , 'WITH_OPENSSL' + , 'WITH_SQLITE' + , 'WITH_XMLREADER' + , 'WITH_TIDY' + , 'WITH_YAML' +]); +const runtimeWrapperByKind = { + php: version => path.resolve(`/app/packages/php-wasm/php${version}-node.mjs`) + , cgi: version => path.resolve(`/app/packages/php-cgi-wasm/php${version}-cgi-node.mjs`) + , cli: version => path.resolve(`/app/packages/php-cli-wasm/php${version}-cli-node.mjs`) + , dbg: version => path.resolve(`/app/packages/php-dbg-wasm/php${version}-dbg-node.mjs`) +}; +const packageBuildFlagMap = { + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , libxml: 'WITH_LIBXML' + , libzip: 'WITH_LIBZIP' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zlib: 'WITH_ZLIB' +}; +const runtimeLibraryPackages = { + cgi: ['libxml', 'dom', 'zlib', 'libzip', 'gd', 'iconv', 'intl', 'openssl', 'mbstring', 'phar', 'sqlite', 'xml', 'simplexml', 'tidy', 'yaml'] +}; + +const tagPackage = (packageKey, pkg) => ({ __packageKey: packageKey, ...pkg }); + +const dedupeSharedLibEntries = sharedLibs => { + const deduped = []; + const seenPackages = new Set; + + for(const entry of sharedLibs) + { + const packageKey = entry?.__packageKey; + + if(packageKey && seenPackages.has(packageKey)) + { + continue; + } + + packageKey && seenPackages.add(packageKey); + deduped.push(entry); + } + + return deduped; +}; + +const sharedLibraryPackages = [ + [env => envFlagIsShared(env.WITH_LIBXML), 'libxml'] + , [env => envFlagIsShared(env.WITH_ZLIB), 'zlib'] + , [env => envFlagIsShared(env.WITH_LIBZIP), 'libzip'] + , [env => ( + envFlagIsShared(env.WITH_GD) + || envFlagIsShared(env.WITH_LIBPNG) + || envFlagIsShared(env.WITH_FREETYPE) + || envFlagIsShared(env.WITH_LIBJPEG) + || envFlagIsShared(env.WITH_LIBWEBP) + ), 'gd'] + , [env => envFlagIsShared(env.WITH_ICONV), 'iconv'] + , [env => envFlagIsShared(env.WITH_INTL), 'intl'] + , [env => envFlagIsShared(env.WITH_MBSTRING) || envFlagIsShared(env.WITH_ONIGURUMA), 'mbstring'] + , [env => envFlagNeedsOpenSslLibs(env.WITH_OPENSSL), 'openssl'] + , [env => envFlagIsShared(env.WITH_SQLITE), 'sqlite'] + , [env => envFlagIsShared(env.WITH_TIDY), 'tidy'] + , [env => envFlagIsShared(env.WITH_YAML), 'yaml'] +]; + +const currentPhpVersion = env => env.PHP_VERSION ?? '8.4'; +const hasExplicitBuildFlags = env => Object.keys(env).some(key => sharedBuildFlags.has(key)); +const currentBuildType = env => String(env.LIB_TYPE ?? '').toLowerCase(); + +const parseEnvFile = envFile => { + if(!fs.existsSync(envFile)) + { + return {}; + } + + return fs.readFileSync(envFile, 'utf8') + .split(/\r?\n/) + .reduce((parsed, line) => { + const trimmed = line.trim(); + + if(!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!') || !trimmed.includes('=')) + { + return parsed; + } + + const [key, ...rest] = trimmed.split('='); + parsed[key] = rest.join('='); + return parsed; + }, {}); +}; + +const runtimeLooksShared = wrapperFile => { + if(!wrapperFile || !fs.existsSync(wrapperFile)) + { + return false; + } + + const wrapperSource = fs.readFileSync(wrapperFile, 'utf8'); + + return sharedWrapperMarkers.every(marker => wrapperSource.includes(marker)); +}; + +export const resolveNodeTestEnv = (options = {}, env = currentEnv()) => { + if(hasExplicitBuildFlags(env)) + { + return env; + } + + const phpVersion = options.version ?? currentPhpVersion(env); + const buildType = currentBuildType(env); + const runtimeKind = options.runtime; + const wrapperFile = runtimeKind && runtimeWrapperByKind[runtimeKind]?.(phpVersion); + const buildTypeEnvFile = buildType && ['dynamic', 'shared', 'static'].includes(buildType) + ? path.resolve(`/app/.github/.env_${phpVersion}.${buildType}.ci`) + : null; + + if(buildTypeEnvFile) + { + return { + ...parseEnvFile(buildTypeEnvFile) + , ...env + , PHP_VERSION: phpVersion + }; + } + + if(!runtimeLooksShared(wrapperFile)) + { + return env; + } + + const sharedEnvFile = path.resolve(`/app/.github/.env_${phpVersion}.shared.ci`); + + return { + ...parseEnvFile(sharedEnvFile) + , ...env + , PHP_VERSION: phpVersion + }; +}; + +export const getNodeEnvSharedLibs = (env = currentEnv()) => { + const phpVersion = currentPhpVersion(env); + const supportPackages = []; + + for(const [shouldInclude, packageKey] of sharedLibraryPackages) + { + if(!shouldInclude(env)) + { + continue; + } + + const supportPackage = getSupportPackage(packageKey, phpVersion); + + if(supportPackage.getLibs().length || supportPackage.getFiles().length) + { + supportPackages.push(tagPackage(packageKey, supportPackage)); + } + } + + return supportPackages; +}; + +const effectivePackageBuildMode = (packageKey, env = currentEnv()) => normalizeBuildMode( + env[packageBuildFlagMap[packageKey]] ?? 'dynamic' +); + +const getNodeEnvRuntimeLibs = (options = {}, env = currentEnv()) => { + const runtimePackages = runtimeLibraryPackages[options.runtime] ?? []; + + if(!runtimePackages.length) + { + return []; + } + + const phpVersion = options.version ?? currentPhpVersion(env); + const resolvedPackages = []; + const seenPackages = new Set(); + + for(const packageKey of runtimePackages) + { + if(seenPackages.has(packageKey)) + { + continue; + } + + seenPackages.add(packageKey); + + switch(effectivePackageBuildMode(packageKey, env)) + { + case 'dynamic': + resolvedPackages.push(tagPackage(packageKey, getPackage(packageKey, phpVersion))); + break; + + case 'shared': + resolvedPackages.push(tagPackage(packageKey, getSupportPackage(packageKey, phpVersion))); + break; + } + } + + return resolvedPackages.filter(pkg => pkg.getLibs().length || pkg.getFiles().length); +}; + +export const nodeRuntimeOptions = (options = {}, env = currentEnv()) => { + const resolvedEnv = resolveNodeTestEnv(options, env); + const sharedLibs = dedupeSharedLibEntries([ + ...getNodeEnvSharedLibs(resolvedEnv), + ...getNodeEnvRuntimeLibs(options, resolvedEnv), + ...(options.sharedLibs ?? []) + ]); + + if(!sharedLibs.length) + { + return options; + } + + return { ...options, sharedLibs }; +}; diff --git a/test/lib/phpt.cjs b/test/lib/phpt.cjs new file mode 100644 index 000000000..4985a7092 --- /dev/null +++ b/test/lib/phpt.cjs @@ -0,0 +1,577 @@ +const fs = require('node:fs/promises'); +const os = require('node:os'); +const path = require('node:path'); +const { strict: assert } = require('node:assert'); + +const { PhpCliNode } = require('php-cli-wasm/PhpCliNode'); +const extensionAssets = require('./extension-assets.js'); +const { nodeRuntimeOptions, resolveNodeTestEnv } = require('./node-runtime-options.cjs'); + +const { getPackage, getSupportPackage } = extensionAssets; +const normalize = text => String(text ?? '').replace(/\r\n/g, '\n'); +const normalizeExpectation = text => normalize(text).trim(); +const normalizeActualCandidates = text => { + const normalized = normalizeExpectation(text); + const withoutTrailingStackTrace = normalized.replace(/\nStack trace:\n(?:#\d+[^\n]*(?:\n|$))+$/u, ''); + + return withoutTrailingStackTrace !== normalized + ? [normalized, withoutTrailingStackTrace] + : [normalized]; +}; +const extensionPackageMap = new Map([ + ['dom', ['libxml', 'dom']] + , ['gd', ['zlib']] + , ['iconv', ['iconv']] + , ['intl', ['intl']] + , ['mbstring', ['mbstring']] + , ['openssl', ['openssl']] + , ['pdo_sqlite', ['sqlite']] + , ['phar', ['phar']] + , ['simplexml', ['libxml', 'simplexml']] + , ['sqlite3', ['sqlite']] + , ['tidy', ['tidy']] + , ['xml', ['libxml', 'xml']] + , ['xmlreader', ['libxml', 'dom', 'xmlreader']] + , ['xmlwriter', ['libxml', 'xmlwriter']] + , ['yaml', ['yaml']] + , ['zip', ['zlib', 'libzip']] + , ['zlib', ['zlib']] +]); +const packageBuildFlagMap = { + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , libxml: 'WITH_LIBXML' + , libzip: 'WITH_LIBZIP' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zlib: 'WITH_ZLIB' +}; +const parsePhpt = source => { + const sections = {}; + let currentSection = null; + + for(const line of normalize(source).split('\n')) + { + const section = line.match(/^--([A-Z_]+)(?:--)?$/); + + if(section) + { + currentSection = section[1]; + sections[currentSection] = ''; + continue; + } + + if(currentSection) + { + sections[currentSection] += line + '\n'; + } + } + + return sections; +}; + +const expectfTextToPattern = text => text + .replace(/[|\\{}()[\]^$+?.*]/g, '\\$&') + .replaceAll('%e', '[\\\\/]') + .replaceAll('%s', '[^\\r\\n]+') + .replaceAll('%S', '[^\\r\\n]*') + .replaceAll('%a', '[\\s\\S]+') + .replaceAll('%A', '[\\s\\S]*') + .replaceAll('%w', '\\s*') + .replaceAll('%i', '[+-]?\\d+') + .replaceAll('%d', '\\d+') + .replaceAll('%x', '[0-9a-fA-F]+') + .replaceAll('%f', '[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[Ee][+-]?\\d+)?') + .replaceAll('%c', '.'); + +const expectfToRegExp = expectf => { + const source = normalize(expectf); + let pattern = ''; + let cursor = 0; + + while(cursor < source.length) + { + const regexStart = source.indexOf('%r', cursor); + + if(regexStart === -1) + { + pattern += expectfTextToPattern(source.slice(cursor)); + break; + } + + pattern += expectfTextToPattern(source.slice(cursor, regexStart)); + + const regexEnd = source.indexOf('%r', regexStart + 2); + + if(regexEnd === -1) + { + pattern += expectfTextToPattern(source.slice(regexStart)); + break; + } + + pattern += `(?:${source.slice(regexStart + 2, regexEnd)})`; + cursor = regexEnd + 2; + } + + return new RegExp(`^${pattern}$`); +}; + +const stripHtmlErrorFormatting = text => normalize(text) + .replace(/\s*\[[^<]*<\/a>\]/g, '') + .replace(/
/g, '') + .replace(/<\/?b>/g, '') + .replace(/<\/?a[^>]*>/g, '') + .replace(/:\s{2,}/g, ': '); + +const expectationVariants = expected => { + const variants = [expected]; + + if(!/[<][^>]+[>]/.test(expected.value)) + { + return variants; + } + + const stripped = normalizeExpectation(stripHtmlErrorFormatting(expected.value)); + + if(stripped && stripped !== expected.value) + { + variants.push({ ...expected, value: stripped }); + } + + return variants; +}; + +const getExpectation = sections => { + if('EXPECT' in sections) + { + return { type: 'EXPECT', value: normalizeExpectation(sections.EXPECT) }; + } + + if('EXPECTF' in sections) + { + return { type: 'EXPECTF', value: normalizeExpectation(sections.EXPECTF) }; + } + + if('EXPECTREGEX' in sections) + { + return { type: 'EXPECTREGEX', value: normalizeExpectation(sections.EXPECTREGEX) }; + } + + throw new Error('PHPT is missing EXPECT, EXPECTF, or EXPECTREGEX'); +}; + +const expectationMatches = (expected, actual) => { + return expectationVariants(expected).some(variant => { + if(variant.type === 'EXPECT') + { + return actual === variant.value; + } + + if(variant.type === 'EXPECTF') + { + return expectfToRegExp(variant.value).test(actual); + } + + return new RegExp(variant.value).test(actual); + }); +}; + +const assertExpectationMatches = (expected, actual) => { + for(const candidate of normalizeActualCandidates(actual)) + { + if(expectationMatches(expected, candidate)) + { + return candidate; + } + } + + if(expected.type === 'EXPECT') + { + assert.equal(actual, expected.value); + } + else if(expected.type === 'EXPECTF') + { + assert.match(actual, expectfToRegExp(expectationVariants(expected).at(-1).value)); + } + else + { + assert.match(actual, new RegExp(expectationVariants(expected).at(-1).value)); + } +}; + +const collectFixtureFiles = async (rootDir, currentDir = rootDir, relativeDir = '') => { + const entries = await fs.readdir(currentDir, { withFileTypes: true }); + const files = []; + + for(const entry of entries) + { + const hostPath = path.join(currentDir, entry.name); + const relativePath = path.posix.join(relativeDir, entry.name); + + if(entry.isDirectory()) + { + files.push(...await collectFixtureFiles(rootDir, hostPath, relativePath)); + continue; + } + + if(!entry.isFile() || entry.name.endsWith('.phpt')) + { + continue; + } + + files.push({ + parent: path.posix.join('/preload/phpt', path.posix.dirname(relativePath)).replace(/\/\.$/, ''), + name: path.posix.basename(relativePath), + url: `file://${hostPath}` + }); + } + + return files; +}; + +const substitutePhptPathTokens = (text, phptDir) => String(text ?? '') + .replaceAll('{PWD}', phptDir); + +const parsePhpStringLiteral = value => { + const trimmed = String(value ?? '').trim(); + + if((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith('\'') && trimmed.endsWith('\''))) + { + return trimmed.slice(1, -1); + } + + return trimmed; +}; + +const quotePhpSingle = value => `'${String(value).replace(/\\/g, '\\\\').replace(/'/g, '\\\'')}'`; + +const parseIniSettings = (iniSection, phptDir) => { + const lines = []; + let autoPrependFile = null; + + for(const line of normalize(iniSection).split('\n').map(line => line.trim()).filter(Boolean)) + { + const substituted = substitutePhptPathTokens(line, phptDir); + const autoPrependMatch = substituted.match(/^auto_prepend_file\s*=(.*)$/); + + if(autoPrependMatch) + { + autoPrependFile = parsePhpStringLiteral(autoPrependMatch[1]); + continue; + } + + lines.push(substituted); + } + + return { lines, autoPrependFile }; +}; + +const parseExtensions = extensionSection => [...new Set( + normalize(extensionSection) + .split(/\s+/) + .map(name => name.trim().toLowerCase()) + .filter(Boolean) +)]; + +const inferExtensionsFromSkipif = skipifSection => [...new Set( + [...normalize(skipifSection ?? '').matchAll(/extension_loaded\s*\(\s*["']([^"']+)["']\s*\)/g)] + .map(([, extensionName]) => extensionName.trim().toLowerCase()) + .filter(Boolean) +)]; + +const inferExtensionSection = phptFile => { + const normalized = phptFile.replace(/\\/g, '/'); + const match = normalized.match(/\/ext\/([^/]+)\/tests\//); + + if(!match) + { + return null; + } + + return match[1].toLowerCase(); +}; + +const collectReferencedRelativeFiles = async ({ fileBody, phptDir, runtimeDir }) => { + const files = []; + const seen = new Set(); + const stringLiteralPattern = /(['"])([^'"\\]*(?:\\.[^'"\\]*)*)\1/g; + + for(const match of normalize(fileBody).matchAll(stringLiteralPattern)) + { + const literal = match[2]; + const relativeLiteral = literal.startsWith('/../') || literal.startsWith('/./') + ? `.${literal}` + : literal; + + if(!relativeLiteral || relativeLiteral.startsWith('php://') || relativeLiteral.startsWith('http://') || relativeLiteral.startsWith('https://')) + { + continue; + } + + if(!relativeLiteral.startsWith('./') && !relativeLiteral.startsWith('../')) + { + continue; + } + + const hostPath = path.resolve(phptDir, relativeLiteral); + let stat; + + try + { + stat = await fs.stat(hostPath); + } + catch + { + continue; + } + + if(!stat.isFile()) + { + continue; + } + + const virtualPath = path.posix.normalize(path.posix.join(runtimeDir, relativeLiteral)); + + if(seen.has(virtualPath)) + { + continue; + } + + seen.add(virtualPath); + + files.push({ + parent: path.posix.dirname(virtualPath) + , name: path.posix.basename(virtualPath) + , url: `file://${hostPath}` + }); + } + + return files; +}; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut + , stdErr: () => stdErr + }; +}; + +const probeLoadedExtensions = async ({ version, phpOptions = {} }) => { + const php = new PhpCliNode(nodeRuntimeOptions({ + ...phpOptions + , runtime: 'cli' + , version + , code: 'echo json_encode(array_map("strtolower", get_loaded_extensions()));' + })); + const { stdOut, stdErr } = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0, `Extension probe failed for PHP ${version}: ${stdErr()}`); + assert.equal(stdErr(), '', `Extension probe emitted stderr for PHP ${version}`); + + return new Set(JSON.parse(stdOut())); +}; + +const resolveExtensionPackages = async ({ sections, version, phpOptions = {} }) => { + if(!sections.EXTENSIONS) + { + return []; + } + + const requestedExtensions = parseExtensions(sections.EXTENSIONS); + + if(!requestedExtensions.length) + { + return []; + } + + const loadedExtensions = await probeLoadedExtensions({ version, phpOptions }); + const extraPackages = []; + const seenPackages = new Set(); + const resolvedEnv = resolveNodeTestEnv({ runtime: 'cli', version, ...phpOptions }); + + for(const extensionName of requestedExtensions) + { + if(loadedExtensions.has(extensionName)) + { + continue; + } + + let packages = extensionPackageMap.get(extensionName); + + if(!packages?.length) + { + throw new Error(`Unsupported unloaded PHPT extension requirement: ${extensionName}`); + } + + const buildFlag = ({ + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , pdo_sqlite: 'WITH_SQLITE' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite3: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zip: 'WITH_LIBZIP' + , zlib: 'WITH_ZLIB' + })[extensionName]; + + if(buildFlag && resolvedEnv[buildFlag] === '0') + { + throw new Error(`Required extension ${extensionName} is disabled by ${buildFlag}=0`); + } + + if(extensionName === 'intl' && resolvedEnv.WITH_INTL === 'shared') + { + if(!seenPackages.has('intl-support')) + { + seenPackages.add('intl-support'); + extraPackages.push(getSupportPackage('intl', version)); + } + + continue; + } + + for(const packageKey of packages) + { + const packageBuildFlag = packageBuildFlagMap[packageKey]; + const packageBuildMode = packageBuildFlag ? resolvedEnv[packageBuildFlag] : undefined; + + if(packageBuildMode === 'shared' || packageBuildMode === 'static') + { + continue; + } + + if(seenPackages.has(packageKey)) + { + continue; + } + + seenPackages.add(packageKey); + extraPackages.push(getPackage(packageKey, version)); + } + } + + return extraPackages; +}; + +const runCliPhpt = async ({ phptFile, version, phpOptions = {} }) => { + const source = await fs.readFile(phptFile, 'utf8'); + const sections = parsePhpt(source); + const phptDir = path.dirname(phptFile); + const phptBase = path.basename(phptFile, '.phpt'); + const runtimeDir = '/preload/phpt'; + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), `phpt-${phptBase}-`)); + const subjectHost = path.join(tempDir, `${phptBase}.php`); + const prependHost = path.join(tempDir, `prepend-${phptBase}.php`); + const iniSettings = sections.INI ? parseIniSettings(sections.INI, phptDir) : { lines: [], autoPrependFile: null }; + + const fileSection = sections.FILE ?? sections.FILEEOF; + + if(!fileSection) + { + throw new Error(`PHPT is missing FILE/FILEEOF section: ${phptFile}`); + } + + if(!sections.EXTENSIONS) + { + const inferredExtensions = new Set(inferExtensionsFromSkipif(sections.SKIPIF)); + const inferredExtension = inferExtensionSection(phptFile); + + if(inferredExtension) + { + inferredExtensions.add(inferredExtension); + } + + if(inferredExtensions.size) + { + sections.EXTENSIONS = `${[...inferredExtensions].join('\n')}\n`; + } + } + + await fs.writeFile(subjectHost, normalize(fileSection)); + + let prependBody = ` event.detail.forEach(line => void (stdOut += line, combined += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line, combined += line))); + + await php.binary; + + const exitCode = await php.run([ + '-d', `auto_prepend_file=${runtimeDir}/${path.basename(prependHost)}`, + ]); + const actual = normalizeExpectation(combined); + const expected = getExpectation(sections); + const matchedActual = assertExpectationMatches(expected, actual) ?? actual; + + await fs.rm(tempDir, { recursive: true, force: true }); + + return { actual: matchedActual, expected, exitCode, sections, stdErr, stdOut }; +}; + +module.exports = { + runCliPhpt, +}; diff --git a/test/lib/phpt.mjs b/test/lib/phpt.mjs new file mode 100644 index 000000000..0433f7bbd --- /dev/null +++ b/test/lib/phpt.mjs @@ -0,0 +1,571 @@ +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import { strict as assert } from 'node:assert'; + +import { PhpCliNode } from '../../packages/php-cli-wasm/PhpCliNode.mjs'; +import { getPackage, getSupportPackage } from './extension-assets.mjs'; +import { nodeRuntimeOptions, resolveNodeTestEnv } from './node-runtime-options.mjs'; +const normalize = text => String(text ?? '').replace(/\r\n/g, '\n'); +const normalizeExpectation = text => normalize(text).trim(); +const normalizeActualCandidates = text => { + const normalized = normalizeExpectation(text); + const withoutTrailingStackTrace = normalized.replace(/\nStack trace:\n(?:#\d+[^\n]*(?:\n|$))+$/u, ''); + + return withoutTrailingStackTrace !== normalized + ? [normalized, withoutTrailingStackTrace] + : [normalized]; +}; +const extensionPackageMap = new Map([ + ['dom', ['libxml', 'dom']] + , ['gd', ['zlib']] + , ['iconv', ['iconv']] + , ['intl', ['intl']] + , ['mbstring', ['mbstring']] + , ['openssl', ['openssl']] + , ['pdo_sqlite', ['sqlite']] + , ['phar', ['phar']] + , ['simplexml', ['libxml', 'simplexml']] + , ['sqlite3', ['sqlite']] + , ['tidy', ['tidy']] + , ['xml', ['libxml', 'xml']] + , ['xmlreader', ['libxml', 'dom', 'xmlreader']] + , ['xmlwriter', ['libxml', 'xmlwriter']] + , ['yaml', ['yaml']] + , ['zip', ['zlib', 'libzip']] + , ['zlib', ['zlib']] +]); +const packageBuildFlagMap = { + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , libxml: 'WITH_LIBXML' + , libzip: 'WITH_LIBZIP' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zlib: 'WITH_ZLIB' +}; +const parsePhpt = source => { + const sections = {}; + let currentSection = null; + + for(const line of normalize(source).split('\n')) + { + const section = line.match(/^--([A-Z_]+)(?:--)?$/); + + if(section) + { + currentSection = section[1]; + sections[currentSection] = ''; + continue; + } + + if(currentSection) + { + sections[currentSection] += line + '\n'; + } + } + + return sections; +}; + +const expectfTextToPattern = text => text + .replace(/[|\\{}()[\]^$+?.*]/g, '\\$&') + .replaceAll('%e', '[\\\\/]') + .replaceAll('%s', '[^\\r\\n]+') + .replaceAll('%S', '[^\\r\\n]*') + .replaceAll('%a', '[\\s\\S]+') + .replaceAll('%A', '[\\s\\S]*') + .replaceAll('%w', '\\s*') + .replaceAll('%i', '[+-]?\\d+') + .replaceAll('%d', '\\d+') + .replaceAll('%x', '[0-9a-fA-F]+') + .replaceAll('%f', '[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[Ee][+-]?\\d+)?') + .replaceAll('%c', '.'); + +const expectfToRegExp = expectf => { + const source = normalize(expectf); + let pattern = ''; + let cursor = 0; + + while(cursor < source.length) + { + const regexStart = source.indexOf('%r', cursor); + + if(regexStart === -1) + { + pattern += expectfTextToPattern(source.slice(cursor)); + break; + } + + pattern += expectfTextToPattern(source.slice(cursor, regexStart)); + + const regexEnd = source.indexOf('%r', regexStart + 2); + + if(regexEnd === -1) + { + pattern += expectfTextToPattern(source.slice(regexStart)); + break; + } + + pattern += `(?:${source.slice(regexStart + 2, regexEnd)})`; + cursor = regexEnd + 2; + } + + return new RegExp(`^${pattern}$`); +}; + +const stripHtmlErrorFormatting = text => normalize(text) + .replace(/\s*\[
[^<]*<\/a>\]/g, '') + .replace(/
/g, '') + .replace(/<\/?b>/g, '') + .replace(/<\/?a[^>]*>/g, '') + .replace(/:\s{2,}/g, ': '); + +const expectationVariants = expected => { + const variants = [expected]; + + if(!/[<][^>]+[>]/.test(expected.value)) + { + return variants; + } + + const stripped = normalizeExpectation(stripHtmlErrorFormatting(expected.value)); + + if(stripped && stripped !== expected.value) + { + variants.push({ ...expected, value: stripped }); + } + + return variants; +}; + +const getExpectation = sections => { + if('EXPECT' in sections) + { + return { type: 'EXPECT', value: normalizeExpectation(sections.EXPECT) }; + } + + if('EXPECTF' in sections) + { + return { type: 'EXPECTF', value: normalizeExpectation(sections.EXPECTF) }; + } + + if('EXPECTREGEX' in sections) + { + return { type: 'EXPECTREGEX', value: normalizeExpectation(sections.EXPECTREGEX) }; + } + + throw new Error('PHPT is missing EXPECT, EXPECTF, or EXPECTREGEX'); +}; + +const expectationMatches = (expected, actual) => { + return expectationVariants(expected).some(variant => { + if(variant.type === 'EXPECT') + { + return actual === variant.value; + } + + if(variant.type === 'EXPECTF') + { + return expectfToRegExp(variant.value).test(actual); + } + + return new RegExp(variant.value).test(actual); + }); +}; + +const assertExpectationMatches = (expected, actual) => { + for(const candidate of normalizeActualCandidates(actual)) + { + if(expectationMatches(expected, candidate)) + { + return candidate; + } + } + + if(expected.type === 'EXPECT') + { + assert.equal(actual, expected.value); + } + else if(expected.type === 'EXPECTF') + { + assert.match(actual, expectfToRegExp(expectationVariants(expected).at(-1).value)); + } + else + { + assert.match(actual, new RegExp(expectationVariants(expected).at(-1).value)); + } +}; + +const collectFixtureFiles = async (rootDir, currentDir = rootDir, relativeDir = '') => { + const entries = await fs.readdir(currentDir, { withFileTypes: true }); + const files = []; + + for(const entry of entries) + { + const hostPath = path.join(currentDir, entry.name); + const relativePath = path.posix.join(relativeDir, entry.name); + + if(entry.isDirectory()) + { + files.push(...await collectFixtureFiles(rootDir, hostPath, relativePath)); + continue; + } + + if(!entry.isFile() || entry.name.endsWith('.phpt')) + { + continue; + } + + files.push({ + parent: path.posix.join('/preload/phpt', path.posix.dirname(relativePath)).replace(/\/\.$/, ''), + name: path.posix.basename(relativePath), + url: `file://${hostPath}` + }); + } + + return files; +}; + +const substitutePhptPathTokens = (text, phptDir) => String(text ?? '') + .replaceAll('{PWD}', phptDir); + +const parsePhpStringLiteral = value => { + const trimmed = String(value ?? '').trim(); + + if((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith('\'') && trimmed.endsWith('\''))) + { + return trimmed.slice(1, -1); + } + + return trimmed; +}; + +const quotePhpSingle = value => `'${String(value).replace(/\\/g, '\\\\').replace(/'/g, '\\\'')}'`; + +const parseIniSettings = (iniSection, phptDir) => { + const lines = []; + let autoPrependFile = null; + + for(const line of normalize(iniSection).split('\n').map(line => line.trim()).filter(Boolean)) + { + const substituted = substitutePhptPathTokens(line, phptDir); + const autoPrependMatch = substituted.match(/^auto_prepend_file\s*=(.*)$/); + + if(autoPrependMatch) + { + autoPrependFile = parsePhpStringLiteral(autoPrependMatch[1]); + continue; + } + + lines.push(substituted); + } + + return { lines, autoPrependFile }; +}; + +const parseExtensions = extensionSection => [...new Set( + normalize(extensionSection) + .split(/\s+/) + .map(name => name.trim().toLowerCase()) + .filter(Boolean) +)]; + +const inferExtensionsFromSkipif = skipifSection => [...new Set( + [...normalize(skipifSection ?? '').matchAll(/extension_loaded\s*\(\s*["']([^"']+)["']\s*\)/g)] + .map(([, extensionName]) => extensionName.trim().toLowerCase()) + .filter(Boolean) +)]; + +const inferExtensionSection = phptFile => { + const normalized = phptFile.replace(/\\/g, '/'); + const match = normalized.match(/\/ext\/([^/]+)\/tests\//); + + if(!match) + { + return null; + } + + return match[1].toLowerCase(); +}; + +const collectReferencedRelativeFiles = async ({ fileBody, phptDir, runtimeDir }) => { + const files = []; + const seen = new Set(); + const stringLiteralPattern = /(['"])([^'"\\]*(?:\\.[^'"\\]*)*)\1/g; + + for(const match of normalize(fileBody).matchAll(stringLiteralPattern)) + { + const literal = match[2]; + const relativeLiteral = literal.startsWith('/../') || literal.startsWith('/./') + ? `.${literal}` + : literal; + + if(!relativeLiteral || relativeLiteral.startsWith('php://') || relativeLiteral.startsWith('http://') || relativeLiteral.startsWith('https://')) + { + continue; + } + + if(!relativeLiteral.startsWith('./') && !relativeLiteral.startsWith('../')) + { + continue; + } + + const hostPath = path.resolve(phptDir, relativeLiteral); + let stat; + + try + { + stat = await fs.stat(hostPath); + } + catch + { + continue; + } + + if(!stat.isFile()) + { + continue; + } + + const virtualPath = path.posix.normalize(path.posix.join(runtimeDir, relativeLiteral)); + + if(seen.has(virtualPath)) + { + continue; + } + + seen.add(virtualPath); + + files.push({ + parent: path.posix.dirname(virtualPath) + , name: path.posix.basename(virtualPath) + , url: `file://${hostPath}` + }); + } + + return files; +}; + +const attachOutput = php => { + let stdOut = ''; + let stdErr = ''; + + php.addEventListener('output', event => event.detail.forEach(line => void (stdOut += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line))); + + return { + stdOut: () => stdOut + , stdErr: () => stdErr + }; +}; + +const probeLoadedExtensions = async ({ version, phpOptions = {} }) => { + const php = new PhpCliNode(nodeRuntimeOptions({ + ...phpOptions + , runtime: 'cli' + , version + , code: 'echo json_encode(array_map("strtolower", get_loaded_extensions()));' + })); + const { stdOut, stdErr } = attachOutput(php); + + await php.binary; + + const exitCode = await php.run(); + + assert.equal(exitCode, 0, `Extension probe failed for PHP ${version}: ${stdErr()}`); + assert.equal(stdErr(), '', `Extension probe emitted stderr for PHP ${version}`); + + return new Set(JSON.parse(stdOut())); +}; + +const resolveExtensionPackages = async ({ sections, version, phpOptions = {} }) => { + if(!sections.EXTENSIONS) + { + return []; + } + + const requestedExtensions = parseExtensions(sections.EXTENSIONS); + + if(!requestedExtensions.length) + { + return []; + } + + const loadedExtensions = await probeLoadedExtensions({ version, phpOptions }); + const extraPackages = []; + const seenPackages = new Set(); + const resolvedEnv = resolveNodeTestEnv({ runtime: 'cli', version, ...phpOptions }); + + for(const extensionName of requestedExtensions) + { + if(loadedExtensions.has(extensionName)) + { + continue; + } + + let packages = extensionPackageMap.get(extensionName); + + if(!packages?.length) + { + throw new Error(`Unsupported unloaded PHPT extension requirement: ${extensionName}`); + } + + const buildFlag = ({ + dom: 'WITH_DOM' + , gd: 'WITH_GD' + , iconv: 'WITH_ICONV' + , intl: 'WITH_INTL' + , mbstring: 'WITH_MBSTRING' + , openssl: 'WITH_OPENSSL' + , pdo_sqlite: 'WITH_SQLITE' + , phar: 'WITH_PHAR' + , simplexml: 'WITH_SIMPLEXML' + , sqlite3: 'WITH_SQLITE' + , tidy: 'WITH_TIDY' + , xml: 'WITH_XML' + , xmlreader: 'WITH_XMLREADER' + , xmlwriter: 'WITH_XMLWRITER' + , yaml: 'WITH_YAML' + , zip: 'WITH_LIBZIP' + , zlib: 'WITH_ZLIB' + })[extensionName]; + + if(buildFlag && resolvedEnv[buildFlag] === '0') + { + throw new Error(`Required extension ${extensionName} is disabled by ${buildFlag}=0`); + } + + if(extensionName === 'intl' && resolvedEnv.WITH_INTL === 'shared') + { + if(!seenPackages.has('intl-support')) + { + seenPackages.add('intl-support'); + extraPackages.push(getSupportPackage('intl', version)); + } + + continue; + } + + for(const packageKey of packages) + { + const packageBuildFlag = packageBuildFlagMap[packageKey]; + const packageBuildMode = packageBuildFlag ? resolvedEnv[packageBuildFlag] : undefined; + + if(packageBuildMode === 'shared' || packageBuildMode === 'static') + { + continue; + } + + if(seenPackages.has(packageKey)) + { + continue; + } + + seenPackages.add(packageKey); + extraPackages.push(getPackage(packageKey, version)); + } + } + + return extraPackages; +}; + +export const runCliPhpt = async ({ phptFile, version, phpOptions = {} }) => { + const source = await fs.readFile(phptFile, 'utf8'); + const sections = parsePhpt(source); + const phptDir = path.dirname(phptFile); + const phptBase = path.basename(phptFile, '.phpt'); + const runtimeDir = '/preload/phpt'; + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), `phpt-${phptBase}-`)); + const subjectHost = path.join(tempDir, `${phptBase}.php`); + const prependHost = path.join(tempDir, `prepend-${phptBase}.php`); + const iniSettings = sections.INI ? parseIniSettings(sections.INI, phptDir) : { lines: [], autoPrependFile: null }; + + const fileSection = sections.FILE ?? sections.FILEEOF; + + if(!fileSection) + { + throw new Error(`PHPT is missing FILE/FILEEOF section: ${phptFile}`); + } + + if(!sections.EXTENSIONS) + { + const inferredExtensions = new Set(inferExtensionsFromSkipif(sections.SKIPIF)); + const inferredExtension = inferExtensionSection(phptFile); + + if(inferredExtension) + { + inferredExtensions.add(inferredExtension); + } + + if(inferredExtensions.size) + { + sections.EXTENSIONS = `${[...inferredExtensions].join('\n')}\n`; + } + } + + await fs.writeFile(subjectHost, normalize(fileSection)); + + let prependBody = ` event.detail.forEach(line => void (stdOut += line, combined += line))); + php.addEventListener('error', event => event.detail.forEach(line => void (stdErr += line, combined += line))); + + await php.binary; + + const exitCode = await php.run([ + '-d', `auto_prepend_file=${runtimeDir}/${path.basename(prependHost)}`, + ]); + const actual = normalizeExpectation(combined); + const expected = getExpectation(sections); + const matchedActual = assertExpectationMatches(expected, actual) ?? actual; + + await fs.rm(tempDir, { recursive: true, force: true }); + + return { actual: matchedActual, expected, exitCode, sections, stdErr, stdOut }; +}; diff --git a/test/lib/playwright-browser.mjs b/test/lib/playwright-browser.mjs new file mode 100644 index 000000000..a285f2b2a --- /dev/null +++ b/test/lib/playwright-browser.mjs @@ -0,0 +1,44 @@ +import fs from 'node:fs'; + +const linuxCandidates = [ + '/usr/bin/chromium', + '/usr/bin/chromium-browser', + '/usr/bin/google-chrome', + '/usr/bin/google-chrome-stable', +]; + +const macCandidates = [ + '/Applications/Chromium.app/Contents/MacOS/Chromium', + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', +]; + +export const resolvePlaywrightExecutablePath = () => { + const envCandidates = [ + process.env.PLAYWRIGHT_CHROMIUM_PATH, + process.env.CHROMIUM_BIN, + process.env.CHROME_BIN, + ]; + + const platformCandidates = process.platform === 'darwin' + ? macCandidates + : linuxCandidates; + + return [...envCandidates, ...platformCandidates] + .find(candidate => candidate && fs.existsSync(candidate)); +}; + +export const getPlaywrightLaunchOptions = () => { + const executablePath = resolvePlaywrightExecutablePath(); + const headless = !Boolean(Number(process.env.TEST_VISIBLE ?? 0)); + + return { + headless, + launchOptions: { + ...(executablePath ? { executablePath } : {}) + , args: [ + '--no-sandbox', + ...(headless ? ['--disable-gpu'] : []) + ] + } + }; +}; diff --git a/test/node-cgi-test.sh b/test/node-cgi-test.sh new file mode 100755 index 000000000..b0f5922d0 --- /dev/null +++ b/test/node-cgi-test.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -euo pipefail +PORT=9001 +export CI="${CI:-}" +STARTUP_TIMEOUT_SECONDS="${CGI_NODE_TEST_STARTUP_TIMEOUT_SECONDS:-45}" +NODE_IMAGE="${CGI_NODE_TEST_IMAGE:-node:24}" +TEST_FORMAT="${TEST_FORMAT:-mjs}" +SERVER_FILE="test/cgi-node/server.${TEST_FORMAT}" +TEST_FILE="test/cgi-node/cgi-node.test.${TEST_FORMAT}" + +docker kill php-cgi-wasm-test-node >/dev/null 2>&1 || true + +HOST_DIR="${PWD}" +MOUNTED_DIR="/app" +docker_env=( + -e "PHP_VERSION=${PHP_VERSION}" + -e "LIB_TYPE=${LIB_TYPE:-}" + -e "CGI_NODE_TEST_PORT=3003" +) + +while IFS='=' read -r env_name _; do + docker_env+=(-e "${env_name}=${!env_name}") +done < <(env | grep '^WITH_' | sort) + +docker pull "${NODE_IMAGE}" >/dev/null + +docker run --rm --name php-cgi-wasm-test-node "${docker_env[@]}" -p ${PORT}:3003 -v ${HOST_DIR}:${MOUNTED_DIR} -w /app "${NODE_IMAGE}" node "${SERVER_FILE}" & +docker_run_pid=$! +trap "docker kill php-cgi-wasm-test-node" 0; + +deadline=$((SECONDS + STARTUP_TIMEOUT_SECONDS)) +until docker exec php-cgi-wasm-test-node sh -lc 'wget -qO- http://127.0.0.1:3003/php-wasm/cgi-bin/test/version.php >/dev/null' >/dev/null 2>&1; do + if ! kill -0 "${docker_run_pid}" >/dev/null 2>&1; then + echo "php-cgi-wasm-test-node exited before becoming ready." >&2 + docker logs php-cgi-wasm-test-node >&2 || true + exit 1 + fi + + if (( SECONDS >= deadline )); then + echo "Timed out after ${STARTUP_TIMEOUT_SECONDS}s waiting for CGI Node server readiness." >&2 + docker logs php-cgi-wasm-test-node >&2 || true + exit 1 + fi + + sleep 0.1 +done + +docker exec \ + -e PHP_VERSION="${PHP_VERSION}" \ + -e LIB_TYPE="${LIB_TYPE:-}" \ + -e CGI_NODE_TEST_PORT=3003 \ + php-cgi-wasm-test-node \ + node --test "${TEST_FILE}" diff --git a/test/packaging.test.mjs b/test/packaging.test.mjs new file mode 100644 index 000000000..22e272983 --- /dev/null +++ b/test/packaging.test.mjs @@ -0,0 +1,94 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { execFileSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { test } from 'node:test'; +import { strict as assert } from 'node:assert'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const packageDirs = [ + 'packages/php-wasm', + 'packages/php-cgi-wasm', + 'packages/php-cli-wasm', + 'packages/php-dbg-wasm', +]; + +function packFiles(packageDir) +{ + const output = execFileSync( + 'npm', + ['pack', '--dry-run', `./${packageDir}`, '--json'], + { + cwd: repoRoot, + encoding: 'utf8', + maxBuffer: 16 * 1024 * 1024, + } + ); + const [result] = JSON.parse(output); + + return new Set(result.files.map(file => file.path)); +} + +function addTarget(targets, value) +{ + if(typeof value !== 'string' || value.includes('*')) + { + return; + } + + targets.add(value.replace(/^\.\//, '')); +} + +function collectExportTargets(targets, value) +{ + if(typeof value === 'string') + { + addTarget(targets, value); + return; + } + + if(!value || typeof value !== 'object') + { + return; + } + + for(const nestedValue of Object.values(value)) + { + collectExportTargets(targets, nestedValue); + } +} + +function collectPackageTargets(packageJson) +{ + const targets = new Set; + + addTarget(targets, packageJson.main); + addTarget(targets, packageJson.module); + addTarget(targets, packageJson.types); + + for(const exportValue of Object.values(packageJson.exports ?? {})) + { + collectExportTargets(targets, exportValue); + } + + return targets; +} + +test('package metadata only references files that ship in the npm tarballs', () => { + for(const packageDir of packageDirs) + { + const packageJson = JSON.parse( + fs.readFileSync(path.join(repoRoot, packageDir, 'package.json'), 'utf8') + ); + const tarballFiles = packFiles(packageDir); + const metadataTargets = collectPackageTargets(packageJson); + + for(const target of metadataTargets) + { + assert.ok( + tarballFiles.has(target), + `${packageJson.name} metadata target is missing from npm pack output: ${target}` + ); + } + } +}); diff --git a/test/stdlib.mjs b/test/stdlib.mjs index c5597601d..3e591653a 100644 --- a/test/stdlib.mjs +++ b/test/stdlib.mjs @@ -2,8 +2,9 @@ import { test } from 'node:test'; import { strict as assert } from 'node:assert'; const phpVersion = process.env.PHP_VERSION ?? '8.4'; +const stdlibEnabled = process.env.WITH_LIBXML === 'dynamic'; -if(['8.4', '8.3', '8.2',].includes(phpVersion)) { +if(stdlibEnabled && ['8.4', '8.3', '8.2',].includes(phpVersion)) { const { microtime, date, sprintf, json_decode } = await import(`../packages/php-wasm/stdlib/${phpVersion}-node.mjs`); test('Can use PHP functions that return NUMBERS in JS', () => { @@ -34,3 +35,7 @@ if(['8.4', '8.3', '8.2',].includes(phpVersion)) { assert.equal( x["a"], 1 ); }); } +else +{ + test('stdlib is only generated for dynamic 8.2-8.4 builds', { skip: true }, () => {}); +}