diff --git a/.github/workflows/e2e_tests.yaml b/.github/workflows/e2e_tests.yaml
index 0c92e0727e..25feaf670d 100644
--- a/.github/workflows/e2e_tests.yaml
+++ b/.github/workflows/e2e_tests.yaml
@@ -4,23 +4,25 @@ on:
push:
branches:
- staging
+ - feat-e2e-tests
jobs:
test:
runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./e2e-tests
steps:
- uses: actions/setup-node@v3
with:
node-version: 18.x
- uses: actions/checkout@v3
- with:
- repository: 'serlo/frontend-e2e-tests'
- uses: patrickedqvist/wait-for-vercel-preview@v1.3.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
max_timeout: 1200
check_interval: 20
- run: yarn
- - run: yarn test-workers
+ - run: yarn e2e-workers
- uses: actions/upload-artifact@v3
if: failure()
with:
diff --git a/.github/workflows/e2e_tests_firefox.yaml b/.github/workflows/e2e_tests_firefox.yaml
index 4fe539c043..0621126325 100644
--- a/.github/workflows/e2e_tests_firefox.yaml
+++ b/.github/workflows/e2e_tests_firefox.yaml
@@ -4,23 +4,25 @@ on:
push:
branches:
- staging
+ - feat-e2e-tests
jobs:
test:
runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./e2e-tests
steps:
+ - uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18.x
- - uses: actions/checkout@v3
- with:
- repository: 'serlo/frontend-e2e-tests'
- uses: patrickedqvist/wait-for-vercel-preview@v1.3.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
max_timeout: 1200
check_interval: 20
- run: yarn
- - run: yarn test-firefox tests/4*.ts
+ - run: yarn e2e-firefox tests/4*.ts
- uses: actions/upload-artifact@v3
if: failure()
with:
diff --git a/.gitignore b/.gitignore
index 8f4fca1408..eef35d88a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,4 +39,15 @@ yarn-error.log*
.tool-versions
# nvm
-.nvmrc
\ No newline at end of file
+.nvmrc
+
+# E2E tests output
+e2e-tests/output
+
+# E2E tests Yarn
+e2e-tests/.yarn/*
+!e2e-tests/.yarn/cache
+!e2e-tests/.yarn/plugins
+!e2e-tests/.yarn/releases
+e2e-tests/yarn-debug.log*
+e2e-tests/yarn-error.log*
diff --git a/.yarn/cache/@next-swc-linux-arm64-musl-npm-13.5.6-b77ca7b049-8.zip b/.yarn/cache/@next-swc-linux-arm64-musl-npm-13.5.6-b77ca7b049-8.zip
new file mode 100644
index 0000000000..e3bf9016eb
Binary files /dev/null and b/.yarn/cache/@next-swc-linux-arm64-musl-npm-13.5.6-b77ca7b049-8.zip differ
diff --git a/.yarn/cache/@next-swc-linux-arm64-musl-npm-14.0.3-bb94b70bd6-8.zip b/.yarn/cache/@next-swc-linux-arm64-musl-npm-14.0.3-bb94b70bd6-8.zip
new file mode 100644
index 0000000000..7f99d87722
Binary files /dev/null and b/.yarn/cache/@next-swc-linux-arm64-musl-npm-14.0.3-bb94b70bd6-8.zip differ
diff --git a/.yarn/cache/@next-swc-linux-x64-musl-npm-13.5.6-b283330cf9-8.zip b/.yarn/cache/@next-swc-linux-x64-musl-npm-13.5.6-b283330cf9-8.zip
new file mode 100644
index 0000000000..1597f2be30
Binary files /dev/null and b/.yarn/cache/@next-swc-linux-x64-musl-npm-13.5.6-b283330cf9-8.zip differ
diff --git a/.yarn/cache/@next-swc-linux-x64-musl-npm-14.0.3-3c88b04db3-8.zip b/.yarn/cache/@next-swc-linux-x64-musl-npm-14.0.3-3c88b04db3-8.zip
new file mode 100644
index 0000000000..34d65b8399
Binary files /dev/null and b/.yarn/cache/@next-swc-linux-x64-musl-npm-14.0.3-3c88b04db3-8.zip differ
diff --git a/.yarnrc.yml b/.yarnrc.yml
index 476de13b36..8e55e311ad 100644
--- a/.yarnrc.yml
+++ b/.yarnrc.yml
@@ -7,6 +7,10 @@ plugins:
spec: 'https://mskelton.dev/yarn-outdated/v2'
supportedArchitectures:
+ libc:
+ - current
+ - libc
+ - musl
os:
- linux
- darwin
diff --git a/e2e-tests/.env b/e2e-tests/.env
new file mode 100644
index 0000000000..14069930fb
--- /dev/null
+++ b/e2e-tests/.env
@@ -0,0 +1,7 @@
+# Uncomment if using local frontend
+# Warning: Testing dev server can sometimes be unreliable,
+# then use a production build instead: `yarn build && yarn start`
+# FRONTEND_URL=http://localhost:3000
+
+# Uncomment if frontend is using local api (sets url to localhost as well)
+#FRONTEND_API=local
\ No newline at end of file
diff --git a/e2e-tests/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c0641144cf.zip b/e2e-tests/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c0641144cf.zip
new file mode 100644
index 0000000000..1cf46fb0b3
Binary files /dev/null and b/e2e-tests/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c0641144cf.zip differ
diff --git a/e2e-tests/.yarn/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-136412784d.zip b/e2e-tests/.yarn/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-136412784d.zip
new file mode 100644
index 0000000000..53d7fc0339
Binary files /dev/null and b/e2e-tests/.yarn/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-136412784d.zip differ
diff --git a/e2e-tests/.yarn/cache/@babel-parser-npm-7.23.6-2fad283d6e-140801c437.zip b/e2e-tests/.yarn/cache/@babel-parser-npm-7.23.6-2fad283d6e-140801c437.zip
new file mode 100644
index 0000000000..5537b3ffb2
Binary files /dev/null and b/e2e-tests/.yarn/cache/@babel-parser-npm-7.23.6-2fad283d6e-140801c437.zip differ
diff --git a/e2e-tests/.yarn/cache/@babel-types-npm-7.23.6-4e68ac9e9b-68187dbec0.zip b/e2e-tests/.yarn/cache/@babel-types-npm-7.23.6-4e68ac9e9b-68187dbec0.zip
new file mode 100644
index 0000000000..cb120e9247
Binary files /dev/null and b/e2e-tests/.yarn/cache/@babel-types-npm-7.23.6-4e68ac9e9b-68187dbec0.zip differ
diff --git a/e2e-tests/.yarn/cache/@codeceptjs-configure-npm-0.8.0-620f1ec880-ec530dcf16.zip b/e2e-tests/.yarn/cache/@codeceptjs-configure-npm-0.8.0-620f1ec880-ec530dcf16.zip
new file mode 100644
index 0000000000..399aa9ac85
Binary files /dev/null and b/e2e-tests/.yarn/cache/@codeceptjs-configure-npm-0.8.0-620f1ec880-ec530dcf16.zip differ
diff --git a/e2e-tests/.yarn/cache/@codeceptjs-helper-npm-1.0.2-458696996c-e1f9bdc76c.zip b/e2e-tests/.yarn/cache/@codeceptjs-helper-npm-1.0.2-458696996c-e1f9bdc76c.zip
new file mode 100644
index 0000000000..4d8ba9430e
Binary files /dev/null and b/e2e-tests/.yarn/cache/@codeceptjs-helper-npm-1.0.2-458696996c-e1f9bdc76c.zip differ
diff --git a/e2e-tests/.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-5718f26708.zip b/e2e-tests/.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-5718f26708.zip
new file mode 100644
index 0000000000..1a4763a4fe
Binary files /dev/null and b/e2e-tests/.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-5718f26708.zip differ
diff --git a/e2e-tests/.yarn/cache/@cucumber-cucumber-expressions-npm-16.1.2-9c57852232-636a903a74.zip b/e2e-tests/.yarn/cache/@cucumber-cucumber-expressions-npm-16.1.2-9c57852232-636a903a74.zip
new file mode 100644
index 0000000000..4a169bbc6c
Binary files /dev/null and b/e2e-tests/.yarn/cache/@cucumber-cucumber-expressions-npm-16.1.2-9c57852232-636a903a74.zip differ
diff --git a/e2e-tests/.yarn/cache/@cucumber-gherkin-npm-26.2.0-8df6a26563-d7bcc12fe5.zip b/e2e-tests/.yarn/cache/@cucumber-gherkin-npm-26.2.0-8df6a26563-d7bcc12fe5.zip
new file mode 100644
index 0000000000..12d3c2dab5
Binary files /dev/null and b/e2e-tests/.yarn/cache/@cucumber-gherkin-npm-26.2.0-8df6a26563-d7bcc12fe5.zip differ
diff --git a/e2e-tests/.yarn/cache/@cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip b/e2e-tests/.yarn/cache/@cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip
new file mode 100644
index 0000000000..86e6310c0b
Binary files /dev/null and b/e2e-tests/.yarn/cache/@cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip differ
diff --git a/e2e-tests/.yarn/cache/@cucumber-messages-npm-22.0.0-923f9d93f5-e9e8f3bda0.zip b/e2e-tests/.yarn/cache/@cucumber-messages-npm-22.0.0-923f9d93f5-e9e8f3bda0.zip
new file mode 100644
index 0000000000..70e86422b0
Binary files /dev/null and b/e2e-tests/.yarn/cache/@cucumber-messages-npm-22.0.0-923f9d93f5-e9e8f3bda0.zip differ
diff --git a/e2e-tests/.yarn/cache/@hapi-hoek-npm-9.3.0-447eb8d274-4771c7a776.zip b/e2e-tests/.yarn/cache/@hapi-hoek-npm-9.3.0-447eb8d274-4771c7a776.zip
new file mode 100644
index 0000000000..ff8a0ee9c1
Binary files /dev/null and b/e2e-tests/.yarn/cache/@hapi-hoek-npm-9.3.0-447eb8d274-4771c7a776.zip differ
diff --git a/e2e-tests/.yarn/cache/@hapi-topo-npm-5.1.0-5e0b776809-604dfd5dde.zip b/e2e-tests/.yarn/cache/@hapi-topo-npm-5.1.0-5e0b776809-604dfd5dde.zip
new file mode 100644
index 0000000000..de25bd9e86
Binary files /dev/null and b/e2e-tests/.yarn/cache/@hapi-topo-npm-5.1.0-5e0b776809-604dfd5dde.zip differ
diff --git a/e2e-tests/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip b/e2e-tests/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip
new file mode 100644
index 0000000000..d19176fadd
Binary files /dev/null and b/e2e-tests/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip differ
diff --git a/e2e-tests/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-f5b441fe79.zip b/e2e-tests/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-f5b441fe79.zip
new file mode 100644
index 0000000000..0cb5724371
Binary files /dev/null and b/e2e-tests/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-f5b441fe79.zip differ
diff --git a/e2e-tests/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip b/e2e-tests/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip
new file mode 100644
index 0000000000..402f52b7ae
Binary files /dev/null and b/e2e-tests/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip differ
diff --git a/e2e-tests/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-d89597752f.zip b/e2e-tests/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-d89597752f.zip
new file mode 100644
index 0000000000..8bf87a916e
Binary files /dev/null and b/e2e-tests/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-d89597752f.zip differ
diff --git a/e2e-tests/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-3b25312edb.zip b/e2e-tests/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-3b25312edb.zip
new file mode 100644
index 0000000000..d6bb06d7ed
Binary files /dev/null and b/e2e-tests/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-3b25312edb.zip differ
diff --git a/e2e-tests/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-a50a6818de.zip b/e2e-tests/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-a50a6818de.zip
new file mode 100644
index 0000000000..2fca778dd0
Binary files /dev/null and b/e2e-tests/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-a50a6818de.zip differ
diff --git a/e2e-tests/.yarn/cache/@one-ini-wasm-npm-0.1.1-cee8120e33-11de17108e.zip b/e2e-tests/.yarn/cache/@one-ini-wasm-npm-0.1.1-cee8120e33-11de17108e.zip
new file mode 100644
index 0000000000..636d88198b
Binary files /dev/null and b/e2e-tests/.yarn/cache/@one-ini-wasm-npm-0.1.1-cee8120e33-11de17108e.zip differ
diff --git a/e2e-tests/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip b/e2e-tests/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip
new file mode 100644
index 0000000000..96f576f7de
Binary files /dev/null and b/e2e-tests/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip differ
diff --git a/e2e-tests/.yarn/cache/@sideway-address-npm-4.1.4-32f94bc9f5-b9fca2a93a.zip b/e2e-tests/.yarn/cache/@sideway-address-npm-4.1.4-32f94bc9f5-b9fca2a93a.zip
new file mode 100644
index 0000000000..0d78830d8d
Binary files /dev/null and b/e2e-tests/.yarn/cache/@sideway-address-npm-4.1.4-32f94bc9f5-b9fca2a93a.zip differ
diff --git a/e2e-tests/.yarn/cache/@sideway-formula-npm-3.0.1-ee371b2ddf-e4beeebc9d.zip b/e2e-tests/.yarn/cache/@sideway-formula-npm-3.0.1-ee371b2ddf-e4beeebc9d.zip
new file mode 100644
index 0000000000..c4835760e9
Binary files /dev/null and b/e2e-tests/.yarn/cache/@sideway-formula-npm-3.0.1-ee371b2ddf-e4beeebc9d.zip differ
diff --git a/e2e-tests/.yarn/cache/@sideway-pinpoint-npm-2.0.0-66d94e687e-0f4491e589.zip b/e2e-tests/.yarn/cache/@sideway-pinpoint-npm-2.0.0-66d94e687e-0f4491e589.zip
new file mode 100644
index 0000000000..dec4ec2607
Binary files /dev/null and b/e2e-tests/.yarn/cache/@sideway-pinpoint-npm-2.0.0-66d94e687e-0f4491e589.zip differ
diff --git a/e2e-tests/.yarn/cache/@tsconfig-node10-npm-1.0.9-f2e2d20feb-a33ae4dc2a.zip b/e2e-tests/.yarn/cache/@tsconfig-node10-npm-1.0.9-f2e2d20feb-a33ae4dc2a.zip
new file mode 100644
index 0000000000..b213bf3439
Binary files /dev/null and b/e2e-tests/.yarn/cache/@tsconfig-node10-npm-1.0.9-f2e2d20feb-a33ae4dc2a.zip differ
diff --git a/e2e-tests/.yarn/cache/@tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip b/e2e-tests/.yarn/cache/@tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip
new file mode 100644
index 0000000000..001dd135c0
Binary files /dev/null and b/e2e-tests/.yarn/cache/@tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip differ
diff --git a/e2e-tests/.yarn/cache/@tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip b/e2e-tests/.yarn/cache/@tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip
new file mode 100644
index 0000000000..9b825a0f17
Binary files /dev/null and b/e2e-tests/.yarn/cache/@tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip differ
diff --git a/e2e-tests/.yarn/cache/@tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip b/e2e-tests/.yarn/cache/@tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip
new file mode 100644
index 0000000000..2638f0fa88
Binary files /dev/null and b/e2e-tests/.yarn/cache/@tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip differ
diff --git a/e2e-tests/.yarn/cache/@types-node-npm-18.19.3-9a233afc47-58c4fa45a7.zip b/e2e-tests/.yarn/cache/@types-node-npm-18.19.3-9a233afc47-58c4fa45a7.zip
new file mode 100644
index 0000000000..d67ce4d3b3
Binary files /dev/null and b/e2e-tests/.yarn/cache/@types-node-npm-18.19.3-9a233afc47-58c4fa45a7.zip differ
diff --git a/e2e-tests/.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip b/e2e-tests/.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip
new file mode 100644
index 0000000000..2e4a25adb6
Binary files /dev/null and b/e2e-tests/.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip differ
diff --git a/e2e-tests/.yarn/cache/@types-uuid-npm-9.0.1-b44e45eb8a-c472b8a77c.zip b/e2e-tests/.yarn/cache/@types-uuid-npm-9.0.1-b44e45eb8a-c472b8a77c.zip
new file mode 100644
index 0000000000..b197329d12
Binary files /dev/null and b/e2e-tests/.yarn/cache/@types-uuid-npm-9.0.1-b44e45eb8a-c472b8a77c.zip differ
diff --git a/e2e-tests/.yarn/cache/@xmldom-xmldom-npm-0.7.13-652e4dab05-b405407853.zip b/e2e-tests/.yarn/cache/@xmldom-xmldom-npm-0.7.13-652e4dab05-b405407853.zip
new file mode 100644
index 0000000000..27a7d45ede
Binary files /dev/null and b/e2e-tests/.yarn/cache/@xmldom-xmldom-npm-0.7.13-652e4dab05-b405407853.zip differ
diff --git a/e2e-tests/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-0e994ad2aa.zip b/e2e-tests/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-0e994ad2aa.zip
new file mode 100644
index 0000000000..bcebdcb6a4
Binary files /dev/null and b/e2e-tests/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-0e994ad2aa.zip differ
diff --git a/e2e-tests/.yarn/cache/acorn-npm-8.11.2-a470f49bb6-8184504086.zip b/e2e-tests/.yarn/cache/acorn-npm-8.11.2-a470f49bb6-8184504086.zip
new file mode 100644
index 0000000000..88d69d271f
Binary files /dev/null and b/e2e-tests/.yarn/cache/acorn-npm-8.11.2-a470f49bb6-8184504086.zip differ
diff --git a/e2e-tests/.yarn/cache/acorn-walk-npm-8.3.1-2a7e2dbd77-5c8926ddb5.zip b/e2e-tests/.yarn/cache/acorn-walk-npm-8.3.1-2a7e2dbd77-5c8926ddb5.zip
new file mode 100644
index 0000000000..ebd9041093
Binary files /dev/null and b/e2e-tests/.yarn/cache/acorn-walk-npm-8.3.1-2a7e2dbd77-5c8926ddb5.zip differ
diff --git a/e2e-tests/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip b/e2e-tests/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip
new file mode 100644
index 0000000000..cfa8ee7b64
Binary files /dev/null and b/e2e-tests/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip differ
diff --git a/e2e-tests/.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip b/e2e-tests/.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip
new file mode 100644
index 0000000000..7db0127bfd
Binary files /dev/null and b/e2e-tests/.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-colors-npm-4.1.1-97ad42f223-138d04a510.zip b/e2e-tests/.yarn/cache/ansi-colors-npm-4.1.1-97ad42f223-138d04a510.zip
new file mode 100644
index 0000000000..19c6d99a78
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-colors-npm-4.1.1-97ad42f223-138d04a510.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-escapes-npm-3.2.0-a9d573100e-0f94695b67.zip b/e2e-tests/.yarn/cache/ansi-escapes-npm-3.2.0-a9d573100e-0f94695b67.zip
new file mode 100644
index 0000000000..6faf69c10b
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-escapes-npm-3.2.0-a9d573100e-0f94695b67.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip b/e2e-tests/.yarn/cache/ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip
new file mode 100644
index 0000000000..b7e261d15b
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip b/e2e-tests/.yarn/cache/ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip
new file mode 100644
index 0000000000..e568811030
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip b/e2e-tests/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip
new file mode 100644
index 0000000000..fffc17acac
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip b/e2e-tests/.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip
new file mode 100644
index 0000000000..088e552d0f
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip b/e2e-tests/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip
new file mode 100644
index 0000000000..4ffdcc4946
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip b/e2e-tests/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip
new file mode 100644
index 0000000000..a18e3e6439
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip differ
diff --git a/e2e-tests/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip b/e2e-tests/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip
new file mode 100644
index 0000000000..aa1bdfde18
Binary files /dev/null and b/e2e-tests/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip differ
diff --git a/e2e-tests/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip b/e2e-tests/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip
new file mode 100644
index 0000000000..095ff20933
Binary files /dev/null and b/e2e-tests/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip differ
diff --git a/e2e-tests/.yarn/cache/arg-npm-4.1.3-1748b966a8-544af8dd3f.zip b/e2e-tests/.yarn/cache/arg-npm-4.1.3-1748b966a8-544af8dd3f.zip
new file mode 100644
index 0000000000..21128e2b87
Binary files /dev/null and b/e2e-tests/.yarn/cache/arg-npm-4.1.3-1748b966a8-544af8dd3f.zip differ
diff --git a/e2e-tests/.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip b/e2e-tests/.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip
new file mode 100644
index 0000000000..26a9ce4aca
Binary files /dev/null and b/e2e-tests/.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip differ
diff --git a/e2e-tests/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip b/e2e-tests/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip
new file mode 100644
index 0000000000..5dbd5402d5
Binary files /dev/null and b/e2e-tests/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip differ
diff --git a/e2e-tests/.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip b/e2e-tests/.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip
new file mode 100644
index 0000000000..e7b45eee3a
Binary files /dev/null and b/e2e-tests/.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip differ
diff --git a/e2e-tests/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip b/e2e-tests/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip
new file mode 100644
index 0000000000..bb08c24f1b
Binary files /dev/null and b/e2e-tests/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip differ
diff --git a/e2e-tests/.yarn/cache/axios-npm-0.26.1-a6641ce4e3-d9eb58ff4b.zip b/e2e-tests/.yarn/cache/axios-npm-0.26.1-a6641ce4e3-d9eb58ff4b.zip
new file mode 100644
index 0000000000..35d97b5c67
Binary files /dev/null and b/e2e-tests/.yarn/cache/axios-npm-0.26.1-a6641ce4e3-d9eb58ff4b.zip differ
diff --git a/e2e-tests/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip b/e2e-tests/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip
new file mode 100644
index 0000000000..e616f86cd0
Binary files /dev/null and b/e2e-tests/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip differ
diff --git a/e2e-tests/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip b/e2e-tests/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip
new file mode 100644
index 0000000000..0693b6d7be
Binary files /dev/null and b/e2e-tests/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip differ
diff --git a/e2e-tests/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip b/e2e-tests/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip
new file mode 100644
index 0000000000..a49ec87ac2
Binary files /dev/null and b/e2e-tests/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip differ
diff --git a/e2e-tests/.yarn/cache/binary-extensions-npm-2.2.0-180c33fec7-ccd267956c.zip b/e2e-tests/.yarn/cache/binary-extensions-npm-2.2.0-180c33fec7-ccd267956c.zip
new file mode 100644
index 0000000000..2ac750c15e
Binary files /dev/null and b/e2e-tests/.yarn/cache/binary-extensions-npm-2.2.0-180c33fec7-ccd267956c.zip differ
diff --git a/e2e-tests/.yarn/cache/bl-npm-4.1.0-7f94cdcf3f-9e8521fa7e.zip b/e2e-tests/.yarn/cache/bl-npm-4.1.0-7f94cdcf3f-9e8521fa7e.zip
new file mode 100644
index 0000000000..0b0454bb89
Binary files /dev/null and b/e2e-tests/.yarn/cache/bl-npm-4.1.0-7f94cdcf3f-9e8521fa7e.zip differ
diff --git a/e2e-tests/.yarn/cache/bo-selector-npm-0.0.10-ececd665cc-b52e0e5267.zip b/e2e-tests/.yarn/cache/bo-selector-npm-0.0.10-ececd665cc-b52e0e5267.zip
new file mode 100644
index 0000000000..7135b76408
Binary files /dev/null and b/e2e-tests/.yarn/cache/bo-selector-npm-0.0.10-ececd665cc-b52e0e5267.zip differ
diff --git a/e2e-tests/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip b/e2e-tests/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip
new file mode 100644
index 0000000000..9deab64add
Binary files /dev/null and b/e2e-tests/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip differ
diff --git a/e2e-tests/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip b/e2e-tests/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip
new file mode 100644
index 0000000000..11d5bd0dbc
Binary files /dev/null and b/e2e-tests/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip differ
diff --git a/e2e-tests/.yarn/cache/braces-npm-3.0.2-782240b28a-e2a8e769a8.zip b/e2e-tests/.yarn/cache/braces-npm-3.0.2-782240b28a-e2a8e769a8.zip
new file mode 100644
index 0000000000..92998e3cc7
Binary files /dev/null and b/e2e-tests/.yarn/cache/braces-npm-3.0.2-782240b28a-e2a8e769a8.zip differ
diff --git a/e2e-tests/.yarn/cache/browser-stdout-npm-1.3.1-6b2376bf3f-b717b19b25.zip b/e2e-tests/.yarn/cache/browser-stdout-npm-1.3.1-6b2376bf3f-b717b19b25.zip
new file mode 100644
index 0000000000..bf43caa582
Binary files /dev/null and b/e2e-tests/.yarn/cache/browser-stdout-npm-1.3.1-6b2376bf3f-b717b19b25.zip differ
diff --git a/e2e-tests/.yarn/cache/buffer-npm-5.7.1-513ef8259e-e2cf8429e1.zip b/e2e-tests/.yarn/cache/buffer-npm-5.7.1-513ef8259e-e2cf8429e1.zip
new file mode 100644
index 0000000000..15c7810bc9
Binary files /dev/null and b/e2e-tests/.yarn/cache/buffer-npm-5.7.1-513ef8259e-e2cf8429e1.zip differ
diff --git a/e2e-tests/.yarn/cache/cacache-npm-18.0.1-11c6564db0-5a0b3b2ea4.zip b/e2e-tests/.yarn/cache/cacache-npm-18.0.1-11c6564db0-5a0b3b2ea4.zip
new file mode 100644
index 0000000000..2b83327a09
Binary files /dev/null and b/e2e-tests/.yarn/cache/cacache-npm-18.0.1-11c6564db0-5a0b3b2ea4.zip differ
diff --git a/e2e-tests/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip b/e2e-tests/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip
new file mode 100644
index 0000000000..df3951c35d
Binary files /dev/null and b/e2e-tests/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip differ
diff --git a/e2e-tests/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip b/e2e-tests/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip
new file mode 100644
index 0000000000..c10ab683ed
Binary files /dev/null and b/e2e-tests/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip differ
diff --git a/e2e-tests/.yarn/cache/chai-deep-match-npm-1.2.1-dabaea01b5-fb8500cab7.zip b/e2e-tests/.yarn/cache/chai-deep-match-npm-1.2.1-dabaea01b5-fb8500cab7.zip
new file mode 100644
index 0000000000..2b83a45a18
Binary files /dev/null and b/e2e-tests/.yarn/cache/chai-deep-match-npm-1.2.1-dabaea01b5-fb8500cab7.zip differ
diff --git a/e2e-tests/.yarn/cache/chai-npm-4.3.10-96f52a35f0-536668c60a.zip b/e2e-tests/.yarn/cache/chai-npm-4.3.10-96f52a35f0-536668c60a.zip
new file mode 100644
index 0000000000..1e8d11f1dc
Binary files /dev/null and b/e2e-tests/.yarn/cache/chai-npm-4.3.10-96f52a35f0-536668c60a.zip differ
diff --git a/e2e-tests/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip b/e2e-tests/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip
new file mode 100644
index 0000000000..3f58a7b233
Binary files /dev/null and b/e2e-tests/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip differ
diff --git a/e2e-tests/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip b/e2e-tests/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip
new file mode 100644
index 0000000000..03d46b8646
Binary files /dev/null and b/e2e-tests/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip differ
diff --git a/e2e-tests/.yarn/cache/chardet-npm-0.7.0-27933dd6c7-6fd5da1f5d.zip b/e2e-tests/.yarn/cache/chardet-npm-0.7.0-27933dd6c7-6fd5da1f5d.zip
new file mode 100644
index 0000000000..0316560c62
Binary files /dev/null and b/e2e-tests/.yarn/cache/chardet-npm-0.7.0-27933dd6c7-6fd5da1f5d.zip differ
diff --git a/e2e-tests/.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip b/e2e-tests/.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip
new file mode 100644
index 0000000000..4a3d2b537e
Binary files /dev/null and b/e2e-tests/.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip differ
diff --git a/e2e-tests/.yarn/cache/chokidar-npm-3.5.3-c5f9b0a56a-b49fcde401.zip b/e2e-tests/.yarn/cache/chokidar-npm-3.5.3-c5f9b0a56a-b49fcde401.zip
new file mode 100644
index 0000000000..f5261bc278
Binary files /dev/null and b/e2e-tests/.yarn/cache/chokidar-npm-3.5.3-c5f9b0a56a-b49fcde401.zip differ
diff --git a/e2e-tests/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip b/e2e-tests/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip
new file mode 100644
index 0000000000..e074b2f4c7
Binary files /dev/null and b/e2e-tests/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip differ
diff --git a/e2e-tests/.yarn/cache/class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip b/e2e-tests/.yarn/cache/class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip
new file mode 100644
index 0000000000..0dadc13be3
Binary files /dev/null and b/e2e-tests/.yarn/cache/class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip differ
diff --git a/e2e-tests/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-045ff6fcf4.zip b/e2e-tests/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-045ff6fcf4.zip
new file mode 100644
index 0000000000..ee504fea7f
Binary files /dev/null and b/e2e-tests/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-045ff6fcf4.zip differ
diff --git a/e2e-tests/.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip b/e2e-tests/.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip
new file mode 100644
index 0000000000..c510995715
Binary files /dev/null and b/e2e-tests/.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip differ
diff --git a/e2e-tests/.yarn/cache/cli-cursor-npm-2.1.0-3920629c9c-d88e97bfda.zip b/e2e-tests/.yarn/cache/cli-cursor-npm-2.1.0-3920629c9c-d88e97bfda.zip
new file mode 100644
index 0000000000..b8aff0b465
Binary files /dev/null and b/e2e-tests/.yarn/cache/cli-cursor-npm-2.1.0-3920629c9c-d88e97bfda.zip differ
diff --git a/e2e-tests/.yarn/cache/cli-cursor-npm-3.1.0-fee1e46b5e-2692784c6c.zip b/e2e-tests/.yarn/cache/cli-cursor-npm-3.1.0-fee1e46b5e-2692784c6c.zip
new file mode 100644
index 0000000000..2a8723c64e
Binary files /dev/null and b/e2e-tests/.yarn/cache/cli-cursor-npm-3.1.0-fee1e46b5e-2692784c6c.zip differ
diff --git a/e2e-tests/.yarn/cache/cli-spinners-npm-2.9.2-be9c08efee-1bd588289b.zip b/e2e-tests/.yarn/cache/cli-spinners-npm-2.9.2-be9c08efee-1bd588289b.zip
new file mode 100644
index 0000000000..84deb09e2d
Binary files /dev/null and b/e2e-tests/.yarn/cache/cli-spinners-npm-2.9.2-be9c08efee-1bd588289b.zip differ
diff --git a/e2e-tests/.yarn/cache/cli-width-npm-2.2.1-4bdb77393c-3c21b897a2.zip b/e2e-tests/.yarn/cache/cli-width-npm-2.2.1-4bdb77393c-3c21b897a2.zip
new file mode 100644
index 0000000000..c75e542aa2
Binary files /dev/null and b/e2e-tests/.yarn/cache/cli-width-npm-2.2.1-4bdb77393c-3c21b897a2.zip differ
diff --git a/e2e-tests/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip b/e2e-tests/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip
new file mode 100644
index 0000000000..24f58564e4
Binary files /dev/null and b/e2e-tests/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip differ
diff --git a/e2e-tests/.yarn/cache/clone-npm-1.0.4-a610fcbcf9-d06418b733.zip b/e2e-tests/.yarn/cache/clone-npm-1.0.4-a610fcbcf9-d06418b733.zip
new file mode 100644
index 0000000000..e06cc8632e
Binary files /dev/null and b/e2e-tests/.yarn/cache/clone-npm-1.0.4-a610fcbcf9-d06418b733.zip differ
diff --git a/e2e-tests/.yarn/cache/codeceptjs-npm-3.5.2-8c1b566c17-b1b3f19d62.zip b/e2e-tests/.yarn/cache/codeceptjs-npm-3.5.2-8c1b566c17-b1b3f19d62.zip
new file mode 100644
index 0000000000..bb2c3f4112
Binary files /dev/null and b/e2e-tests/.yarn/cache/codeceptjs-npm-3.5.2-8c1b566c17-b1b3f19d62.zip differ
diff --git a/e2e-tests/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip b/e2e-tests/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip
new file mode 100644
index 0000000000..1b4c9391ea
Binary files /dev/null and b/e2e-tests/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip differ
diff --git a/e2e-tests/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip b/e2e-tests/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip
new file mode 100644
index 0000000000..b3499adbb8
Binary files /dev/null and b/e2e-tests/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip differ
diff --git a/e2e-tests/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip b/e2e-tests/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip
new file mode 100644
index 0000000000..f158de9e2e
Binary files /dev/null and b/e2e-tests/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip differ
diff --git a/e2e-tests/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip b/e2e-tests/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip
new file mode 100644
index 0000000000..ce1ffc4bf3
Binary files /dev/null and b/e2e-tests/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip differ
diff --git a/e2e-tests/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip b/e2e-tests/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip
new file mode 100644
index 0000000000..89c8caa0fd
Binary files /dev/null and b/e2e-tests/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip differ
diff --git a/e2e-tests/.yarn/cache/commander-npm-10.0.1-f17613b72b-436901d64a.zip b/e2e-tests/.yarn/cache/commander-npm-10.0.1-f17613b72b-436901d64a.zip
new file mode 100644
index 0000000000..6e5dd2648d
Binary files /dev/null and b/e2e-tests/.yarn/cache/commander-npm-10.0.1-f17613b72b-436901d64a.zip differ
diff --git a/e2e-tests/.yarn/cache/commander-npm-11.1.0-56e979613c-fd1a8557c6.zip b/e2e-tests/.yarn/cache/commander-npm-11.1.0-56e979613c-fd1a8557c6.zip
new file mode 100644
index 0000000000..6b16e27dfc
Binary files /dev/null and b/e2e-tests/.yarn/cache/commander-npm-11.1.0-56e979613c-fd1a8557c6.zip differ
diff --git a/e2e-tests/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip b/e2e-tests/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip
new file mode 100644
index 0000000000..6a14adf507
Binary files /dev/null and b/e2e-tests/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip differ
diff --git a/e2e-tests/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip b/e2e-tests/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip
new file mode 100644
index 0000000000..66b4c329f8
Binary files /dev/null and b/e2e-tests/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip differ
diff --git a/e2e-tests/.yarn/cache/config-chain-npm-1.1.13-82e06afbc4-828137a28e.zip b/e2e-tests/.yarn/cache/config-chain-npm-1.1.13-82e06afbc4-828137a28e.zip
new file mode 100644
index 0000000000..b6b3d5f2bb
Binary files /dev/null and b/e2e-tests/.yarn/cache/config-chain-npm-1.1.13-82e06afbc4-828137a28e.zip differ
diff --git a/e2e-tests/.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip b/e2e-tests/.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip
new file mode 100644
index 0000000000..afbfac2109
Binary files /dev/null and b/e2e-tests/.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip differ
diff --git a/e2e-tests/.yarn/cache/cross-env-npm-7.0.3-96d81820f4-26f2f3ea2a.zip b/e2e-tests/.yarn/cache/cross-env-npm-7.0.3-96d81820f4-26f2f3ea2a.zip
new file mode 100644
index 0000000000..5f6297f326
Binary files /dev/null and b/e2e-tests/.yarn/cache/cross-env-npm-7.0.3-96d81820f4-26f2f3ea2a.zip differ
diff --git a/e2e-tests/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip b/e2e-tests/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip
new file mode 100644
index 0000000000..9613e383d1
Binary files /dev/null and b/e2e-tests/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip differ
diff --git a/e2e-tests/.yarn/cache/css-to-xpath-npm-0.1.0-cde91ed602-48e7150d8c.zip b/e2e-tests/.yarn/cache/css-to-xpath-npm-0.1.0-cde91ed602-48e7150d8c.zip
new file mode 100644
index 0000000000..0135d1cada
Binary files /dev/null and b/e2e-tests/.yarn/cache/css-to-xpath-npm-0.1.0-cde91ed602-48e7150d8c.zip differ
diff --git a/e2e-tests/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip b/e2e-tests/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip
new file mode 100644
index 0000000000..d3a11d8e2a
Binary files /dev/null and b/e2e-tests/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip differ
diff --git a/e2e-tests/.yarn/cache/decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip b/e2e-tests/.yarn/cache/decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip
new file mode 100644
index 0000000000..ab2e946434
Binary files /dev/null and b/e2e-tests/.yarn/cache/decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip differ
diff --git a/e2e-tests/.yarn/cache/deep-eql-npm-4.1.3-020a64f862-7f6d30cb41.zip b/e2e-tests/.yarn/cache/deep-eql-npm-4.1.3-020a64f862-7f6d30cb41.zip
new file mode 100644
index 0000000000..754bfdf3ad
Binary files /dev/null and b/e2e-tests/.yarn/cache/deep-eql-npm-4.1.3-020a64f862-7f6d30cb41.zip differ
diff --git a/e2e-tests/.yarn/cache/deep-keys-npm-0.5.0-e62ee82f7b-0f8a9b4042.zip b/e2e-tests/.yarn/cache/deep-keys-npm-0.5.0-e62ee82f7b-0f8a9b4042.zip
new file mode 100644
index 0000000000..3e93ce245d
Binary files /dev/null and b/e2e-tests/.yarn/cache/deep-keys-npm-0.5.0-e62ee82f7b-0f8a9b4042.zip differ
diff --git a/e2e-tests/.yarn/cache/defaults-npm-1.0.4-f3fbaf2528-3a88b7a587.zip b/e2e-tests/.yarn/cache/defaults-npm-1.0.4-f3fbaf2528-3a88b7a587.zip
new file mode 100644
index 0000000000..cbd9cc402f
Binary files /dev/null and b/e2e-tests/.yarn/cache/defaults-npm-1.0.4-f3fbaf2528-3a88b7a587.zip differ
diff --git a/e2e-tests/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip b/e2e-tests/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip
new file mode 100644
index 0000000000..71514340e4
Binary files /dev/null and b/e2e-tests/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip differ
diff --git a/e2e-tests/.yarn/cache/diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip b/e2e-tests/.yarn/cache/diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip
new file mode 100644
index 0000000000..e532815fd0
Binary files /dev/null and b/e2e-tests/.yarn/cache/diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip differ
diff --git a/e2e-tests/.yarn/cache/diff-npm-5.0.0-ad6900db18-f19fe29284.zip b/e2e-tests/.yarn/cache/diff-npm-5.0.0-ad6900db18-f19fe29284.zip
new file mode 100644
index 0000000000..301b142879
Binary files /dev/null and b/e2e-tests/.yarn/cache/diff-npm-5.0.0-ad6900db18-f19fe29284.zip differ
diff --git a/e2e-tests/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip b/e2e-tests/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip
new file mode 100644
index 0000000000..7bdd10c0d7
Binary files /dev/null and b/e2e-tests/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip differ
diff --git a/e2e-tests/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip b/e2e-tests/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip
new file mode 100644
index 0000000000..10385995a6
Binary files /dev/null and b/e2e-tests/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip differ
diff --git a/e2e-tests/.yarn/cache/editorconfig-npm-1.0.4-95c5a5b144-09904f1938.zip b/e2e-tests/.yarn/cache/editorconfig-npm-1.0.4-95c5a5b144-09904f1938.zip
new file mode 100644
index 0000000000..29db2cb776
Binary files /dev/null and b/e2e-tests/.yarn/cache/editorconfig-npm-1.0.4-95c5a5b144-09904f1938.zip differ
diff --git a/e2e-tests/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip b/e2e-tests/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip
new file mode 100644
index 0000000000..d02d887971
Binary files /dev/null and b/e2e-tests/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip differ
diff --git a/e2e-tests/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip b/e2e-tests/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip
new file mode 100644
index 0000000000..e6b0ab4d80
Binary files /dev/null and b/e2e-tests/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip differ
diff --git a/e2e-tests/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip b/e2e-tests/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip
new file mode 100644
index 0000000000..202e93181a
Binary files /dev/null and b/e2e-tests/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip differ
diff --git a/e2e-tests/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip b/e2e-tests/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip
new file mode 100644
index 0000000000..3772a4510c
Binary files /dev/null and b/e2e-tests/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip differ
diff --git a/e2e-tests/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip b/e2e-tests/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip
new file mode 100644
index 0000000000..5fecf17a47
Binary files /dev/null and b/e2e-tests/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip differ
diff --git a/e2e-tests/.yarn/cache/envinfo-npm-7.11.0-5631444898-c45a7d2040.zip b/e2e-tests/.yarn/cache/envinfo-npm-7.11.0-5631444898-c45a7d2040.zip
new file mode 100644
index 0000000000..e9dec103fc
Binary files /dev/null and b/e2e-tests/.yarn/cache/envinfo-npm-7.11.0-5631444898-c45a7d2040.zip differ
diff --git a/e2e-tests/.yarn/cache/err-code-npm-1.1.2-76c4ec5eff-a1c6a194d2.zip b/e2e-tests/.yarn/cache/err-code-npm-1.1.2-76c4ec5eff-a1c6a194d2.zip
new file mode 100644
index 0000000000..c8793a2214
Binary files /dev/null and b/e2e-tests/.yarn/cache/err-code-npm-1.1.2-76c4ec5eff-a1c6a194d2.zip differ
diff --git a/e2e-tests/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip b/e2e-tests/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip
new file mode 100644
index 0000000000..3058584568
Binary files /dev/null and b/e2e-tests/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip differ
diff --git a/e2e-tests/.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip b/e2e-tests/.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip
new file mode 100644
index 0000000000..88c57af4b8
Binary files /dev/null and b/e2e-tests/.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip differ
diff --git a/e2e-tests/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip b/e2e-tests/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip
new file mode 100644
index 0000000000..b7ea3be147
Binary files /dev/null and b/e2e-tests/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip differ
diff --git a/e2e-tests/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip b/e2e-tests/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip
new file mode 100644
index 0000000000..c23e416b5a
Binary files /dev/null and b/e2e-tests/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip differ
diff --git a/e2e-tests/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-3d21519a4f.zip b/e2e-tests/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-3d21519a4f.zip
new file mode 100644
index 0000000000..ea4828ae9a
Binary files /dev/null and b/e2e-tests/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-3d21519a4f.zip differ
diff --git a/e2e-tests/.yarn/cache/external-editor-npm-3.1.0-878e7807af-1c2a616a73.zip b/e2e-tests/.yarn/cache/external-editor-npm-3.1.0-878e7807af-1c2a616a73.zip
new file mode 100644
index 0000000000..6375d6aad0
Binary files /dev/null and b/e2e-tests/.yarn/cache/external-editor-npm-3.1.0-878e7807af-1c2a616a73.zip differ
diff --git a/e2e-tests/.yarn/cache/fast-deep-equal-npm-2.0.1-9c01e08a62-b701835a87.zip b/e2e-tests/.yarn/cache/fast-deep-equal-npm-2.0.1-9c01e08a62-b701835a87.zip
new file mode 100644
index 0000000000..7da7ed6cb4
Binary files /dev/null and b/e2e-tests/.yarn/cache/fast-deep-equal-npm-2.0.1-9c01e08a62-b701835a87.zip differ
diff --git a/e2e-tests/.yarn/cache/figures-npm-2.0.0-f2db814eec-081beb16ea.zip b/e2e-tests/.yarn/cache/figures-npm-2.0.0-f2db814eec-081beb16ea.zip
new file mode 100644
index 0000000000..6f6dfbb7d4
Binary files /dev/null and b/e2e-tests/.yarn/cache/figures-npm-2.0.0-f2db814eec-081beb16ea.zip differ
diff --git a/e2e-tests/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip b/e2e-tests/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip
new file mode 100644
index 0000000000..eac0ef7226
Binary files /dev/null and b/e2e-tests/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip differ
diff --git a/e2e-tests/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-cc283f4e65.zip b/e2e-tests/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-cc283f4e65.zip
new file mode 100644
index 0000000000..1da4a361d8
Binary files /dev/null and b/e2e-tests/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-cc283f4e65.zip differ
diff --git a/e2e-tests/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip b/e2e-tests/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip
new file mode 100644
index 0000000000..034f3a07ef
Binary files /dev/null and b/e2e-tests/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip differ
diff --git a/e2e-tests/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip b/e2e-tests/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip
new file mode 100644
index 0000000000..e3295fae7b
Binary files /dev/null and b/e2e-tests/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip differ
diff --git a/e2e-tests/.yarn/cache/fn-args-npm-4.0.0-840bf02a71-22cc41e5de.zip b/e2e-tests/.yarn/cache/fn-args-npm-4.0.0-840bf02a71-22cc41e5de.zip
new file mode 100644
index 0000000000..ff4942f272
Binary files /dev/null and b/e2e-tests/.yarn/cache/fn-args-npm-4.0.0-840bf02a71-22cc41e5de.zip differ
diff --git a/e2e-tests/.yarn/cache/follow-redirects-npm-1.15.3-ca69c47b72-584da22ec5.zip b/e2e-tests/.yarn/cache/follow-redirects-npm-1.15.3-ca69c47b72-584da22ec5.zip
new file mode 100644
index 0000000000..7dbb7d2a3d
Binary files /dev/null and b/e2e-tests/.yarn/cache/follow-redirects-npm-1.15.3-ca69c47b72-584da22ec5.zip differ
diff --git a/e2e-tests/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-139d270bc8.zip b/e2e-tests/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-139d270bc8.zip
new file mode 100644
index 0000000000..a288850fbb
Binary files /dev/null and b/e2e-tests/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-139d270bc8.zip differ
diff --git a/e2e-tests/.yarn/cache/form-data-npm-4.0.0-916facec2d-01135bf867.zip b/e2e-tests/.yarn/cache/form-data-npm-4.0.0-916facec2d-01135bf867.zip
new file mode 100644
index 0000000000..8ae5189b00
Binary files /dev/null and b/e2e-tests/.yarn/cache/form-data-npm-4.0.0-916facec2d-01135bf867.zip differ
diff --git a/e2e-tests/.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip b/e2e-tests/.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip
new file mode 100644
index 0000000000..feb64dafe9
Binary files /dev/null and b/e2e-tests/.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip differ
diff --git a/e2e-tests/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip b/e2e-tests/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip
new file mode 100644
index 0000000000..21a91aac75
Binary files /dev/null and b/e2e-tests/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip differ
diff --git a/e2e-tests/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip b/e2e-tests/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip
new file mode 100644
index 0000000000..b87db2e0d8
Binary files /dev/null and b/e2e-tests/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip differ
diff --git a/e2e-tests/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip b/e2e-tests/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip
new file mode 100644
index 0000000000..920c4caedc
Binary files /dev/null and b/e2e-tests/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip differ
diff --git a/e2e-tests/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-11e6ea6fea.zip b/e2e-tests/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-11e6ea6fea.zip
new file mode 100644
index 0000000000..044eb1ba3b
Binary files /dev/null and b/e2e-tests/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-11e6ea6fea.zip differ
diff --git a/e2e-tests/.yarn/cache/fsevents-patch-21ad2b1333-8.zip b/e2e-tests/.yarn/cache/fsevents-patch-21ad2b1333-8.zip
new file mode 100644
index 0000000000..c6a96dfcdf
Binary files /dev/null and b/e2e-tests/.yarn/cache/fsevents-patch-21ad2b1333-8.zip differ
diff --git a/e2e-tests/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip b/e2e-tests/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip
new file mode 100644
index 0000000000..0aa2c9cd03
Binary files /dev/null and b/e2e-tests/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip differ
diff --git a/e2e-tests/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip b/e2e-tests/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip
new file mode 100644
index 0000000000..d80affc5a5
Binary files /dev/null and b/e2e-tests/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip differ
diff --git a/e2e-tests/.yarn/cache/glob-npm-10.3.10-da1ef8b112-4f2fe2511e.zip b/e2e-tests/.yarn/cache/glob-npm-10.3.10-da1ef8b112-4f2fe2511e.zip
new file mode 100644
index 0000000000..c64c67dbcd
Binary files /dev/null and b/e2e-tests/.yarn/cache/glob-npm-10.3.10-da1ef8b112-4f2fe2511e.zip differ
diff --git a/e2e-tests/.yarn/cache/glob-npm-6.0.4-dbb227ba4a-c4946c3d01.zip b/e2e-tests/.yarn/cache/glob-npm-6.0.4-dbb227ba4a-c4946c3d01.zip
new file mode 100644
index 0000000000..93c0ddfb6f
Binary files /dev/null and b/e2e-tests/.yarn/cache/glob-npm-6.0.4-dbb227ba4a-c4946c3d01.zip differ
diff --git a/e2e-tests/.yarn/cache/glob-npm-7.2.0-bb4644d239-78a8ea9423.zip b/e2e-tests/.yarn/cache/glob-npm-7.2.0-bb4644d239-78a8ea9423.zip
new file mode 100644
index 0000000000..0ef1638a62
Binary files /dev/null and b/e2e-tests/.yarn/cache/glob-npm-7.2.0-bb4644d239-78a8ea9423.zip differ
diff --git a/e2e-tests/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip b/e2e-tests/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip
new file mode 100644
index 0000000000..8a94317ecb
Binary files /dev/null and b/e2e-tests/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip differ
diff --git a/e2e-tests/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip b/e2e-tests/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip
new file mode 100644
index 0000000000..99f412b523
Binary files /dev/null and b/e2e-tests/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip differ
diff --git a/e2e-tests/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip b/e2e-tests/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip
new file mode 100644
index 0000000000..60eafa65f5
Binary files /dev/null and b/e2e-tests/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip differ
diff --git a/e2e-tests/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip b/e2e-tests/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip
new file mode 100644
index 0000000000..6f5845da2f
Binary files /dev/null and b/e2e-tests/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip differ
diff --git a/e2e-tests/.yarn/cache/he-npm-1.2.0-3b73a2ff07-3d4d6babcc.zip b/e2e-tests/.yarn/cache/he-npm-1.2.0-3b73a2ff07-3d4d6babcc.zip
new file mode 100644
index 0000000000..fe1d45f763
Binary files /dev/null and b/e2e-tests/.yarn/cache/he-npm-1.2.0-3b73a2ff07-3d4d6babcc.zip differ
diff --git a/e2e-tests/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-b426aee771.zip b/e2e-tests/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-b426aee771.zip
new file mode 100644
index 0000000000..88911e5f82
Binary files /dev/null and b/e2e-tests/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-b426aee771.zip differ
diff --git a/e2e-tests/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip b/e2e-tests/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip
new file mode 100644
index 0000000000..19f1e0a201
Binary files /dev/null and b/e2e-tests/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip differ
diff --git a/e2e-tests/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-48d4fac997.zip b/e2e-tests/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-48d4fac997.zip
new file mode 100644
index 0000000000..99aaff14c0
Binary files /dev/null and b/e2e-tests/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-48d4fac997.zip differ
diff --git a/e2e-tests/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-088969a0dd.zip b/e2e-tests/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-088969a0dd.zip
new file mode 100644
index 0000000000..5ef9e3b10c
Binary files /dev/null and b/e2e-tests/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-088969a0dd.zip differ
diff --git a/e2e-tests/.yarn/cache/iconv-lite-npm-0.4.24-c5c4ac6695-bd9f120f5a.zip b/e2e-tests/.yarn/cache/iconv-lite-npm-0.4.24-c5c4ac6695-bd9f120f5a.zip
new file mode 100644
index 0000000000..9cae309cf9
Binary files /dev/null and b/e2e-tests/.yarn/cache/iconv-lite-npm-0.4.24-c5c4ac6695-bd9f120f5a.zip differ
diff --git a/e2e-tests/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip b/e2e-tests/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip
new file mode 100644
index 0000000000..f3f767a22d
Binary files /dev/null and b/e2e-tests/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip differ
diff --git a/e2e-tests/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip b/e2e-tests/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip
new file mode 100644
index 0000000000..74128ad8f2
Binary files /dev/null and b/e2e-tests/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip differ
diff --git a/e2e-tests/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip b/e2e-tests/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip
new file mode 100644
index 0000000000..9ddf4f880f
Binary files /dev/null and b/e2e-tests/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip differ
diff --git a/e2e-tests/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip b/e2e-tests/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip
new file mode 100644
index 0000000000..eedfdb0f37
Binary files /dev/null and b/e2e-tests/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip differ
diff --git a/e2e-tests/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip b/e2e-tests/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip
new file mode 100644
index 0000000000..c5a4bb0725
Binary files /dev/null and b/e2e-tests/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip differ
diff --git a/e2e-tests/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip b/e2e-tests/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip
new file mode 100644
index 0000000000..62c31cb78b
Binary files /dev/null and b/e2e-tests/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip differ
diff --git a/e2e-tests/.yarn/cache/ini-npm-1.3.8-fb5040b4c0-dfd98b0ca3.zip b/e2e-tests/.yarn/cache/ini-npm-1.3.8-fb5040b4c0-dfd98b0ca3.zip
new file mode 100644
index 0000000000..ee9245b9cd
Binary files /dev/null and b/e2e-tests/.yarn/cache/ini-npm-1.3.8-fb5040b4c0-dfd98b0ca3.zip differ
diff --git a/e2e-tests/.yarn/cache/inquirer-npm-6.5.2-4f6408c247-175ad4cd1e.zip b/e2e-tests/.yarn/cache/inquirer-npm-6.5.2-4f6408c247-175ad4cd1e.zip
new file mode 100644
index 0000000000..20b2deb196
Binary files /dev/null and b/e2e-tests/.yarn/cache/inquirer-npm-6.5.2-4f6408c247-175ad4cd1e.zip differ
diff --git a/e2e-tests/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip b/e2e-tests/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip
new file mode 100644
index 0000000000..0aad8938ba
Binary files /dev/null and b/e2e-tests/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip differ
diff --git a/e2e-tests/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip b/e2e-tests/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip
new file mode 100644
index 0000000000..b509d00f58
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip differ
diff --git a/e2e-tests/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip b/e2e-tests/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip
new file mode 100644
index 0000000000..0acbc56e22
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip differ
diff --git a/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip b/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip
new file mode 100644
index 0000000000..56f17d3988
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip differ
diff --git a/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip b/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip
new file mode 100644
index 0000000000..dccc80a970
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip differ
diff --git a/e2e-tests/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip b/e2e-tests/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip
new file mode 100644
index 0000000000..52274ed254
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip differ
diff --git a/e2e-tests/.yarn/cache/is-interactive-npm-1.0.0-7ff7c6e04a-824808776e.zip b/e2e-tests/.yarn/cache/is-interactive-npm-1.0.0-7ff7c6e04a-824808776e.zip
new file mode 100644
index 0000000000..0c1f90e041
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-interactive-npm-1.0.0-7ff7c6e04a-824808776e.zip differ
diff --git a/e2e-tests/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip b/e2e-tests/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip
new file mode 100644
index 0000000000..f981b1bea6
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip differ
diff --git a/e2e-tests/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip b/e2e-tests/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip
new file mode 100644
index 0000000000..e4ae048576
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip differ
diff --git a/e2e-tests/.yarn/cache/is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip b/e2e-tests/.yarn/cache/is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip
new file mode 100644
index 0000000000..49504a5bbc
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip differ
diff --git a/e2e-tests/.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip b/e2e-tests/.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip
new file mode 100644
index 0000000000..7425daa366
Binary files /dev/null and b/e2e-tests/.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip differ
diff --git a/e2e-tests/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip b/e2e-tests/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip
new file mode 100644
index 0000000000..077597d686
Binary files /dev/null and b/e2e-tests/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip differ
diff --git a/e2e-tests/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip b/e2e-tests/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip
new file mode 100644
index 0000000000..7ea5462480
Binary files /dev/null and b/e2e-tests/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip differ
diff --git a/e2e-tests/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-57d43ad11e.zip b/e2e-tests/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-57d43ad11e.zip
new file mode 100644
index 0000000000..7e9aaab68f
Binary files /dev/null and b/e2e-tests/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-57d43ad11e.zip differ
diff --git a/e2e-tests/.yarn/cache/joi-npm-17.11.0-66efd6d755-3a4e9ecba3.zip b/e2e-tests/.yarn/cache/joi-npm-17.11.0-66efd6d755-3a4e9ecba3.zip
new file mode 100644
index 0000000000..33aedc8b9b
Binary files /dev/null and b/e2e-tests/.yarn/cache/joi-npm-17.11.0-66efd6d755-3a4e9ecba3.zip differ
diff --git a/e2e-tests/.yarn/cache/js-beautify-npm-1.14.11-6578c9c9d5-92512b8dcc.zip b/e2e-tests/.yarn/cache/js-beautify-npm-1.14.11-6578c9c9d5-92512b8dcc.zip
new file mode 100644
index 0000000000..cd7afa839c
Binary files /dev/null and b/e2e-tests/.yarn/cache/js-beautify-npm-1.14.11-6578c9c9d5-92512b8dcc.zip differ
diff --git a/e2e-tests/.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip b/e2e-tests/.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip
new file mode 100644
index 0000000000..659c85d097
Binary files /dev/null and b/e2e-tests/.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip differ
diff --git a/e2e-tests/.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip b/e2e-tests/.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip
new file mode 100644
index 0000000000..a8f0e975ad
Binary files /dev/null and b/e2e-tests/.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip differ
diff --git a/e2e-tests/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip b/e2e-tests/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip
new file mode 100644
index 0000000000..b67b77440b
Binary files /dev/null and b/e2e-tests/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip differ
diff --git a/e2e-tests/.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip b/e2e-tests/.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip
new file mode 100644
index 0000000000..22ac44c4ef
Binary files /dev/null and b/e2e-tests/.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip differ
diff --git a/e2e-tests/.yarn/cache/lodash-pickdeep-npm-1.0.2-d49bd1a0b5-ba9aeb5929.zip b/e2e-tests/.yarn/cache/lodash-pickdeep-npm-1.0.2-d49bd1a0b5-ba9aeb5929.zip
new file mode 100644
index 0000000000..2d1d4bf697
Binary files /dev/null and b/e2e-tests/.yarn/cache/lodash-pickdeep-npm-1.0.2-d49bd1a0b5-ba9aeb5929.zip differ
diff --git a/e2e-tests/.yarn/cache/lodash.clonedeep-npm-4.5.0-fbc3cda4e5-92c46f094b.zip b/e2e-tests/.yarn/cache/lodash.clonedeep-npm-4.5.0-fbc3cda4e5-92c46f094b.zip
new file mode 100644
index 0000000000..5765f760d7
Binary files /dev/null and b/e2e-tests/.yarn/cache/lodash.clonedeep-npm-4.5.0-fbc3cda4e5-92c46f094b.zip differ
diff --git a/e2e-tests/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip b/e2e-tests/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip
new file mode 100644
index 0000000000..f6bc72b461
Binary files /dev/null and b/e2e-tests/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip differ
diff --git a/e2e-tests/.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip b/e2e-tests/.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip
new file mode 100644
index 0000000000..a307f13c94
Binary files /dev/null and b/e2e-tests/.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip differ
diff --git a/e2e-tests/.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip b/e2e-tests/.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip
new file mode 100644
index 0000000000..6a7e076159
Binary files /dev/null and b/e2e-tests/.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip differ
diff --git a/e2e-tests/.yarn/cache/loupe-npm-2.3.7-f294c2ef33-96c058ec71.zip b/e2e-tests/.yarn/cache/loupe-npm-2.3.7-f294c2ef33-96c058ec71.zip
new file mode 100644
index 0000000000..92d878f597
Binary files /dev/null and b/e2e-tests/.yarn/cache/loupe-npm-2.3.7-f294c2ef33-96c058ec71.zip differ
diff --git a/e2e-tests/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip b/e2e-tests/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip
new file mode 100644
index 0000000000..1fdb47db5e
Binary files /dev/null and b/e2e-tests/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip differ
diff --git a/e2e-tests/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-58056d33e2.zip b/e2e-tests/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-58056d33e2.zip
new file mode 100644
index 0000000000..43c8ce7528
Binary files /dev/null and b/e2e-tests/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-58056d33e2.zip differ
diff --git a/e2e-tests/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip b/e2e-tests/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip
new file mode 100644
index 0000000000..1635dac9b2
Binary files /dev/null and b/e2e-tests/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip differ
diff --git a/e2e-tests/.yarn/cache/make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip b/e2e-tests/.yarn/cache/make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip
new file mode 100644
index 0000000000..7f7dc189d2
Binary files /dev/null and b/e2e-tests/.yarn/cache/make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip differ
diff --git a/e2e-tests/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-7c7a6d381c.zip b/e2e-tests/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-7c7a6d381c.zip
new file mode 100644
index 0000000000..fa4a8924bc
Binary files /dev/null and b/e2e-tests/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-7c7a6d381c.zip differ
diff --git a/e2e-tests/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip b/e2e-tests/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip
new file mode 100644
index 0000000000..8db7263574
Binary files /dev/null and b/e2e-tests/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip differ
diff --git a/e2e-tests/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip b/e2e-tests/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip
new file mode 100644
index 0000000000..166d33254d
Binary files /dev/null and b/e2e-tests/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip differ
diff --git a/e2e-tests/.yarn/cache/mimic-fn-npm-1.2.0-960bf15ab7-69c0820515.zip b/e2e-tests/.yarn/cache/mimic-fn-npm-1.2.0-960bf15ab7-69c0820515.zip
new file mode 100644
index 0000000000..ae711478fd
Binary files /dev/null and b/e2e-tests/.yarn/cache/mimic-fn-npm-1.2.0-960bf15ab7-69c0820515.zip differ
diff --git a/e2e-tests/.yarn/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-d2421a3444.zip b/e2e-tests/.yarn/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-d2421a3444.zip
new file mode 100644
index 0000000000..1cc2414f46
Binary files /dev/null and b/e2e-tests/.yarn/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-d2421a3444.zip differ
diff --git a/e2e-tests/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip b/e2e-tests/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip
new file mode 100644
index 0000000000..ba0c510402
Binary files /dev/null and b/e2e-tests/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip differ
diff --git a/e2e-tests/.yarn/cache/minimatch-npm-5.0.1-612724f6f0-b34b98463d.zip b/e2e-tests/.yarn/cache/minimatch-npm-5.0.1-612724f6f0-b34b98463d.zip
new file mode 100644
index 0000000000..3e1e05a8e4
Binary files /dev/null and b/e2e-tests/.yarn/cache/minimatch-npm-5.0.1-612724f6f0-b34b98463d.zip differ
diff --git a/e2e-tests/.yarn/cache/minimatch-npm-9.0.1-277fdc6fbd-97f5f5284b.zip b/e2e-tests/.yarn/cache/minimatch-npm-9.0.1-277fdc6fbd-97f5f5284b.zip
new file mode 100644
index 0000000000..66cac932f1
Binary files /dev/null and b/e2e-tests/.yarn/cache/minimatch-npm-9.0.1-277fdc6fbd-97f5f5284b.zip differ
diff --git a/e2e-tests/.yarn/cache/minimatch-npm-9.0.3-69d7d6fad5-253487976b.zip b/e2e-tests/.yarn/cache/minimatch-npm-9.0.3-69d7d6fad5-253487976b.zip
new file mode 100644
index 0000000000..265822fc2b
Binary files /dev/null and b/e2e-tests/.yarn/cache/minimatch-npm-9.0.3-69d7d6fad5-253487976b.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip b/e2e-tests/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip
new file mode 100644
index 0000000000..96df703423
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-af7aad15d5.zip b/e2e-tests/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-af7aad15d5.zip
new file mode 100644
index 0000000000..8eafd96084
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-af7aad15d5.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip b/e2e-tests/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip
new file mode 100644
index 0000000000..913b687a4d
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip b/e2e-tests/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip
new file mode 100644
index 0000000000..26e006f393
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-425dab2887.zip b/e2e-tests/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-425dab2887.zip
new file mode 100644
index 0000000000..c49ee93fbb
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-425dab2887.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-87585e258b.zip b/e2e-tests/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-87585e258b.zip
new file mode 100644
index 0000000000..472202f6bc
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-87585e258b.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip b/e2e-tests/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip
new file mode 100644
index 0000000000..4deae416db
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip differ
diff --git a/e2e-tests/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip b/e2e-tests/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip
new file mode 100644
index 0000000000..b6f4644f62
Binary files /dev/null and b/e2e-tests/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip differ
diff --git a/e2e-tests/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip b/e2e-tests/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip
new file mode 100644
index 0000000000..efb1b7f6b6
Binary files /dev/null and b/e2e-tests/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip differ
diff --git a/e2e-tests/.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip b/e2e-tests/.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip
new file mode 100644
index 0000000000..4625e914a4
Binary files /dev/null and b/e2e-tests/.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip differ
diff --git a/e2e-tests/.yarn/cache/mocha-npm-10.2.0-87db25c7c5-406c45eab1.zip b/e2e-tests/.yarn/cache/mocha-npm-10.2.0-87db25c7c5-406c45eab1.zip
new file mode 100644
index 0000000000..171c682ed7
Binary files /dev/null and b/e2e-tests/.yarn/cache/mocha-npm-10.2.0-87db25c7c5-406c45eab1.zip differ
diff --git a/e2e-tests/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip b/e2e-tests/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip
new file mode 100644
index 0000000000..725e9b8c17
Binary files /dev/null and b/e2e-tests/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip differ
diff --git a/e2e-tests/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip b/e2e-tests/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip
new file mode 100644
index 0000000000..2b635f28eb
Binary files /dev/null and b/e2e-tests/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip differ
diff --git a/e2e-tests/.yarn/cache/mute-stream-npm-0.0.7-22b59a65dd-a9d4772c1c.zip b/e2e-tests/.yarn/cache/mute-stream-npm-0.0.7-22b59a65dd-a9d4772c1c.zip
new file mode 100644
index 0000000000..b1d92e46c3
Binary files /dev/null and b/e2e-tests/.yarn/cache/mute-stream-npm-0.0.7-22b59a65dd-a9d4772c1c.zip differ
diff --git a/e2e-tests/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip b/e2e-tests/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip
new file mode 100644
index 0000000000..d28e91f1ff
Binary files /dev/null and b/e2e-tests/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip differ
diff --git a/e2e-tests/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip b/e2e-tests/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip
new file mode 100644
index 0000000000..e8c5cf4899
Binary files /dev/null and b/e2e-tests/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip differ
diff --git a/e2e-tests/.yarn/cache/no-case-npm-2.3.2-5403767f87-8564877319.zip b/e2e-tests/.yarn/cache/no-case-npm-2.3.2-5403767f87-8564877319.zip
new file mode 100644
index 0000000000..b8d6273fdb
Binary files /dev/null and b/e2e-tests/.yarn/cache/no-case-npm-2.3.2-5403767f87-8564877319.zip differ
diff --git a/e2e-tests/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-60a74e66d3.zip b/e2e-tests/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-60a74e66d3.zip
new file mode 100644
index 0000000000..a0fdba867f
Binary files /dev/null and b/e2e-tests/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-60a74e66d3.zip differ
diff --git a/e2e-tests/.yarn/cache/nopt-npm-7.2.0-dd734b678d-a9c0f57fb8.zip b/e2e-tests/.yarn/cache/nopt-npm-7.2.0-dd734b678d-a9c0f57fb8.zip
new file mode 100644
index 0000000000..ddae56fcb3
Binary files /dev/null and b/e2e-tests/.yarn/cache/nopt-npm-7.2.0-dd734b678d-a9c0f57fb8.zip differ
diff --git a/e2e-tests/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip b/e2e-tests/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip
new file mode 100644
index 0000000000..855af70e63
Binary files /dev/null and b/e2e-tests/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip differ
diff --git a/e2e-tests/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip b/e2e-tests/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip
new file mode 100644
index 0000000000..1b943eec95
Binary files /dev/null and b/e2e-tests/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip differ
diff --git a/e2e-tests/.yarn/cache/onetime-npm-2.0.1-6c39ecc911-bb44015ac7.zip b/e2e-tests/.yarn/cache/onetime-npm-2.0.1-6c39ecc911-bb44015ac7.zip
new file mode 100644
index 0000000000..df76b4087b
Binary files /dev/null and b/e2e-tests/.yarn/cache/onetime-npm-2.0.1-6c39ecc911-bb44015ac7.zip differ
diff --git a/e2e-tests/.yarn/cache/onetime-npm-5.1.2-3ed148fa42-2478859ef8.zip b/e2e-tests/.yarn/cache/onetime-npm-5.1.2-3ed148fa42-2478859ef8.zip
new file mode 100644
index 0000000000..958e05b7dd
Binary files /dev/null and b/e2e-tests/.yarn/cache/onetime-npm-5.1.2-3ed148fa42-2478859ef8.zip differ
diff --git a/e2e-tests/.yarn/cache/openai-npm-3.3.0-62dcac56ba-28ccff8c09.zip b/e2e-tests/.yarn/cache/openai-npm-3.3.0-62dcac56ba-28ccff8c09.zip
new file mode 100644
index 0000000000..c61b95c691
Binary files /dev/null and b/e2e-tests/.yarn/cache/openai-npm-3.3.0-62dcac56ba-28ccff8c09.zip differ
diff --git a/e2e-tests/.yarn/cache/ora-classic-npm-5.4.2-baa3a941a8-f52ec97c8f.zip b/e2e-tests/.yarn/cache/ora-classic-npm-5.4.2-baa3a941a8-f52ec97c8f.zip
new file mode 100644
index 0000000000..09f3e95830
Binary files /dev/null and b/e2e-tests/.yarn/cache/ora-classic-npm-5.4.2-baa3a941a8-f52ec97c8f.zip differ
diff --git a/e2e-tests/.yarn/cache/os-tmpdir-npm-1.0.2-e305b0689b-5666560f7b.zip b/e2e-tests/.yarn/cache/os-tmpdir-npm-1.0.2-e305b0689b-5666560f7b.zip
new file mode 100644
index 0000000000..d68d710638
Binary files /dev/null and b/e2e-tests/.yarn/cache/os-tmpdir-npm-1.0.2-e305b0689b-5666560f7b.zip differ
diff --git a/e2e-tests/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip b/e2e-tests/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip
new file mode 100644
index 0000000000..b87d97ccf8
Binary files /dev/null and b/e2e-tests/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip differ
diff --git a/e2e-tests/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip b/e2e-tests/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip
new file mode 100644
index 0000000000..077f1c6eeb
Binary files /dev/null and b/e2e-tests/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip differ
diff --git a/e2e-tests/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip b/e2e-tests/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip
new file mode 100644
index 0000000000..092fe42ff7
Binary files /dev/null and b/e2e-tests/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip differ
diff --git a/e2e-tests/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip b/e2e-tests/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip
new file mode 100644
index 0000000000..f409d4737a
Binary files /dev/null and b/e2e-tests/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip differ
diff --git a/e2e-tests/.yarn/cache/parse-function-npm-5.6.10-05344a4ba6-84a8c54e9b.zip b/e2e-tests/.yarn/cache/parse-function-npm-5.6.10-05344a4ba6-84a8c54e9b.zip
new file mode 100644
index 0000000000..a603a8bbd8
Binary files /dev/null and b/e2e-tests/.yarn/cache/parse-function-npm-5.6.10-05344a4ba6-84a8c54e9b.zip differ
diff --git a/e2e-tests/.yarn/cache/parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip b/e2e-tests/.yarn/cache/parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip
new file mode 100644
index 0000000000..d6319d936f
Binary files /dev/null and b/e2e-tests/.yarn/cache/parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip differ
diff --git a/e2e-tests/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip b/e2e-tests/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip
new file mode 100644
index 0000000000..b504841699
Binary files /dev/null and b/e2e-tests/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip differ
diff --git a/e2e-tests/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip b/e2e-tests/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip
new file mode 100644
index 0000000000..ce195de705
Binary files /dev/null and b/e2e-tests/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip differ
diff --git a/e2e-tests/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip b/e2e-tests/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip
new file mode 100644
index 0000000000..dd7212e2cd
Binary files /dev/null and b/e2e-tests/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip differ
diff --git a/e2e-tests/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-e2557cff3a.zip b/e2e-tests/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-e2557cff3a.zip
new file mode 100644
index 0000000000..e466a978a7
Binary files /dev/null and b/e2e-tests/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-e2557cff3a.zip differ
diff --git a/e2e-tests/.yarn/cache/pathval-npm-1.1.1-ce0311d7e0-090e314771.zip b/e2e-tests/.yarn/cache/pathval-npm-1.1.1-ce0311d7e0-090e314771.zip
new file mode 100644
index 0000000000..b5cdc46250
Binary files /dev/null and b/e2e-tests/.yarn/cache/pathval-npm-1.1.1-ce0311d7e0-090e314771.zip differ
diff --git a/e2e-tests/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip b/e2e-tests/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip
new file mode 100644
index 0000000000..3384698427
Binary files /dev/null and b/e2e-tests/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip differ
diff --git a/e2e-tests/.yarn/cache/playwright-core-npm-1.36.0-b8372782e2-d6b5fed5ae.zip b/e2e-tests/.yarn/cache/playwright-core-npm-1.36.0-b8372782e2-d6b5fed5ae.zip
new file mode 100644
index 0000000000..d42a31c2a7
Binary files /dev/null and b/e2e-tests/.yarn/cache/playwright-core-npm-1.36.0-b8372782e2-d6b5fed5ae.zip differ
diff --git a/e2e-tests/.yarn/cache/playwright-npm-1.36.0-40ee6045fa-c49ed1666b.zip b/e2e-tests/.yarn/cache/playwright-npm-1.36.0-40ee6045fa-c49ed1666b.zip
new file mode 100644
index 0000000000..a1e65d7293
Binary files /dev/null and b/e2e-tests/.yarn/cache/playwright-npm-1.36.0-40ee6045fa-c49ed1666b.zip differ
diff --git a/e2e-tests/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip b/e2e-tests/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip
new file mode 100644
index 0000000000..0436b17634
Binary files /dev/null and b/e2e-tests/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip differ
diff --git a/e2e-tests/.yarn/cache/promise-retry-npm-1.1.1-56f07257a8-18180b4cf8.zip b/e2e-tests/.yarn/cache/promise-retry-npm-1.1.1-56f07257a8-18180b4cf8.zip
new file mode 100644
index 0000000000..9c43424cb0
Binary files /dev/null and b/e2e-tests/.yarn/cache/promise-retry-npm-1.1.1-56f07257a8-18180b4cf8.zip differ
diff --git a/e2e-tests/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip b/e2e-tests/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip
new file mode 100644
index 0000000000..9cefe07769
Binary files /dev/null and b/e2e-tests/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip differ
diff --git a/e2e-tests/.yarn/cache/proto-list-npm-1.2.4-a96a43df28-4d4826e171.zip b/e2e-tests/.yarn/cache/proto-list-npm-1.2.4-a96a43df28-4d4826e171.zip
new file mode 100644
index 0000000000..5c173ee139
Binary files /dev/null and b/e2e-tests/.yarn/cache/proto-list-npm-1.2.4-a96a43df28-4d4826e171.zip differ
diff --git a/e2e-tests/.yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip b/e2e-tests/.yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip
new file mode 100644
index 0000000000..a58e6bf3e4
Binary files /dev/null and b/e2e-tests/.yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip differ
diff --git a/e2e-tests/.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip b/e2e-tests/.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip
new file mode 100644
index 0000000000..cfc11435d2
Binary files /dev/null and b/e2e-tests/.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip differ
diff --git a/e2e-tests/.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip b/e2e-tests/.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip
new file mode 100644
index 0000000000..0053b67230
Binary files /dev/null and b/e2e-tests/.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip differ
diff --git a/e2e-tests/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip b/e2e-tests/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip
new file mode 100644
index 0000000000..f3687812b2
Binary files /dev/null and b/e2e-tests/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip differ
diff --git a/e2e-tests/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip b/e2e-tests/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip
new file mode 100644
index 0000000000..244085ace9
Binary files /dev/null and b/e2e-tests/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip differ
diff --git a/e2e-tests/.yarn/cache/regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip b/e2e-tests/.yarn/cache/regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip
new file mode 100644
index 0000000000..19b5c0a338
Binary files /dev/null and b/e2e-tests/.yarn/cache/regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip differ
diff --git a/e2e-tests/.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip b/e2e-tests/.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip
new file mode 100644
index 0000000000..f80bccedb1
Binary files /dev/null and b/e2e-tests/.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip differ
diff --git a/e2e-tests/.yarn/cache/relateurl-npm-0.2.7-7687cc0a2a-5891e792ea.zip b/e2e-tests/.yarn/cache/relateurl-npm-0.2.7-7687cc0a2a-5891e792ea.zip
new file mode 100644
index 0000000000..f8f3ef37e8
Binary files /dev/null and b/e2e-tests/.yarn/cache/relateurl-npm-0.2.7-7687cc0a2a-5891e792ea.zip differ
diff --git a/e2e-tests/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-fb47e70bf0.zip b/e2e-tests/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-fb47e70bf0.zip
new file mode 100644
index 0000000000..5af5579b18
Binary files /dev/null and b/e2e-tests/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-fb47e70bf0.zip differ
diff --git a/e2e-tests/.yarn/cache/resq-npm-1.11.0-cdc288c879-a596c01258.zip b/e2e-tests/.yarn/cache/resq-npm-1.11.0-cdc288c879-a596c01258.zip
new file mode 100644
index 0000000000..9b7d9f8687
Binary files /dev/null and b/e2e-tests/.yarn/cache/resq-npm-1.11.0-cdc288c879-a596c01258.zip differ
diff --git a/e2e-tests/.yarn/cache/restore-cursor-npm-2.0.0-80278eb6b7-482e13d02d.zip b/e2e-tests/.yarn/cache/restore-cursor-npm-2.0.0-80278eb6b7-482e13d02d.zip
new file mode 100644
index 0000000000..3b01b88c0e
Binary files /dev/null and b/e2e-tests/.yarn/cache/restore-cursor-npm-2.0.0-80278eb6b7-482e13d02d.zip differ
diff --git a/e2e-tests/.yarn/cache/restore-cursor-npm-3.1.0-52c5a4c98f-f877dd8741.zip b/e2e-tests/.yarn/cache/restore-cursor-npm-3.1.0-52c5a4c98f-f877dd8741.zip
new file mode 100644
index 0000000000..f11afe99bb
Binary files /dev/null and b/e2e-tests/.yarn/cache/restore-cursor-npm-3.1.0-52c5a4c98f-f877dd8741.zip differ
diff --git a/e2e-tests/.yarn/cache/retry-npm-0.10.1-49d64d46ee-133ef7c202.zip b/e2e-tests/.yarn/cache/retry-npm-0.10.1-49d64d46ee-133ef7c202.zip
new file mode 100644
index 0000000000..ffb88b6884
Binary files /dev/null and b/e2e-tests/.yarn/cache/retry-npm-0.10.1-49d64d46ee-133ef7c202.zip differ
diff --git a/e2e-tests/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip b/e2e-tests/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip
new file mode 100644
index 0000000000..12e25fcd41
Binary files /dev/null and b/e2e-tests/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip differ
diff --git a/e2e-tests/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip b/e2e-tests/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip
new file mode 100644
index 0000000000..34c485e0b0
Binary files /dev/null and b/e2e-tests/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip differ
diff --git a/e2e-tests/.yarn/cache/rxjs-npm-6.6.7-055046ea3c-bc334edef1.zip b/e2e-tests/.yarn/cache/rxjs-npm-6.6.7-055046ea3c-bc334edef1.zip
new file mode 100644
index 0000000000..ba92cebbd3
Binary files /dev/null and b/e2e-tests/.yarn/cache/rxjs-npm-6.6.7-055046ea3c-bc334edef1.zip differ
diff --git a/e2e-tests/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip b/e2e-tests/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip
new file mode 100644
index 0000000000..c80798aecd
Binary files /dev/null and b/e2e-tests/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip differ
diff --git a/e2e-tests/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip b/e2e-tests/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip
new file mode 100644
index 0000000000..1a93be6423
Binary files /dev/null and b/e2e-tests/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip differ
diff --git a/e2e-tests/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip b/e2e-tests/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip
new file mode 100644
index 0000000000..f8689471f5
Binary files /dev/null and b/e2e-tests/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip differ
diff --git a/e2e-tests/.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-56f90b562a.zip b/e2e-tests/.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-56f90b562a.zip
new file mode 100644
index 0000000000..46090b6c5b
Binary files /dev/null and b/e2e-tests/.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-56f90b562a.zip differ
diff --git a/e2e-tests/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip b/e2e-tests/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip
new file mode 100644
index 0000000000..727c5471e2
Binary files /dev/null and b/e2e-tests/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip differ
diff --git a/e2e-tests/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip b/e2e-tests/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip
new file mode 100644
index 0000000000..3e891cda95
Binary files /dev/null and b/e2e-tests/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip differ
diff --git a/e2e-tests/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip b/e2e-tests/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip
new file mode 100644
index 0000000000..98720bd8c7
Binary files /dev/null and b/e2e-tests/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip differ
diff --git a/e2e-tests/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip b/e2e-tests/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip
new file mode 100644
index 0000000000..7242dbce48
Binary files /dev/null and b/e2e-tests/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip differ
diff --git a/e2e-tests/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip b/e2e-tests/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip
new file mode 100644
index 0000000000..d587b3db7a
Binary files /dev/null and b/e2e-tests/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip differ
diff --git a/e2e-tests/.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip b/e2e-tests/.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip
new file mode 100644
index 0000000000..f225cdefdf
Binary files /dev/null and b/e2e-tests/.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip differ
diff --git a/e2e-tests/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-4fb165df08.zip b/e2e-tests/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-4fb165df08.zip
new file mode 100644
index 0000000000..a8e45c47bf
Binary files /dev/null and b/e2e-tests/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-4fb165df08.zip differ
diff --git a/e2e-tests/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip b/e2e-tests/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip
new file mode 100644
index 0000000000..5f6c0e46b7
Binary files /dev/null and b/e2e-tests/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip differ
diff --git a/e2e-tests/.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-a3fdac7b49.zip b/e2e-tests/.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-a3fdac7b49.zip
new file mode 100644
index 0000000000..8e2aa35645
Binary files /dev/null and b/e2e-tests/.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-a3fdac7b49.zip differ
diff --git a/e2e-tests/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-0a31b65f21.zip b/e2e-tests/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-0a31b65f21.zip
new file mode 100644
index 0000000000..29bd203c56
Binary files /dev/null and b/e2e-tests/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-0a31b65f21.zip differ
diff --git a/e2e-tests/.yarn/cache/string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip b/e2e-tests/.yarn/cache/string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip
new file mode 100644
index 0000000000..4547a8bf7c
Binary files /dev/null and b/e2e-tests/.yarn/cache/string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip differ
diff --git a/e2e-tests/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip b/e2e-tests/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip
new file mode 100644
index 0000000000..9b4c088118
Binary files /dev/null and b/e2e-tests/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip differ
diff --git a/e2e-tests/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip b/e2e-tests/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip
new file mode 100644
index 0000000000..bd88405658
Binary files /dev/null and b/e2e-tests/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip differ
diff --git a/e2e-tests/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip b/e2e-tests/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip
new file mode 100644
index 0000000000..e12cf75910
Binary files /dev/null and b/e2e-tests/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip differ
diff --git a/e2e-tests/.yarn/cache/strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip b/e2e-tests/.yarn/cache/strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip
new file mode 100644
index 0000000000..f39efd27f2
Binary files /dev/null and b/e2e-tests/.yarn/cache/strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip differ
diff --git a/e2e-tests/.yarn/cache/strip-ansi-npm-5.2.0-275214c316-bdb5f76ade.zip b/e2e-tests/.yarn/cache/strip-ansi-npm-5.2.0-275214c316-bdb5f76ade.zip
new file mode 100644
index 0000000000..2231cf5894
Binary files /dev/null and b/e2e-tests/.yarn/cache/strip-ansi-npm-5.2.0-275214c316-bdb5f76ade.zip differ
diff --git a/e2e-tests/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip b/e2e-tests/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip
new file mode 100644
index 0000000000..1a63f3baa2
Binary files /dev/null and b/e2e-tests/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip differ
diff --git a/e2e-tests/.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-859c73fcf2.zip b/e2e-tests/.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-859c73fcf2.zip
new file mode 100644
index 0000000000..2cc856e86a
Binary files /dev/null and b/e2e-tests/.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-859c73fcf2.zip differ
diff --git a/e2e-tests/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip b/e2e-tests/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip
new file mode 100644
index 0000000000..e74ed10a6f
Binary files /dev/null and b/e2e-tests/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip differ
diff --git a/e2e-tests/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip b/e2e-tests/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip
new file mode 100644
index 0000000000..aa46b9881d
Binary files /dev/null and b/e2e-tests/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip differ
diff --git a/e2e-tests/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip b/e2e-tests/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip
new file mode 100644
index 0000000000..1fd9e12d4e
Binary files /dev/null and b/e2e-tests/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip differ
diff --git a/e2e-tests/.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip b/e2e-tests/.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip
new file mode 100644
index 0000000000..3fd0d6c6a4
Binary files /dev/null and b/e2e-tests/.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip differ
diff --git a/e2e-tests/.yarn/cache/tar-npm-6.2.0-3eb25205a7-db4d9fe74a.zip b/e2e-tests/.yarn/cache/tar-npm-6.2.0-3eb25205a7-db4d9fe74a.zip
new file mode 100644
index 0000000000..6fece5e6bd
Binary files /dev/null and b/e2e-tests/.yarn/cache/tar-npm-6.2.0-3eb25205a7-db4d9fe74a.zip differ
diff --git a/e2e-tests/.yarn/cache/through-npm-2.3.8-df5f72a16e-a38c3e0598.zip b/e2e-tests/.yarn/cache/through-npm-2.3.8-df5f72a16e-a38c3e0598.zip
new file mode 100644
index 0000000000..425b87ec87
Binary files /dev/null and b/e2e-tests/.yarn/cache/through-npm-2.3.8-df5f72a16e-a38c3e0598.zip differ
diff --git a/e2e-tests/.yarn/cache/tmp-npm-0.0.33-bcbf65df2a-902d7aceb7.zip b/e2e-tests/.yarn/cache/tmp-npm-0.0.33-bcbf65df2a-902d7aceb7.zip
new file mode 100644
index 0000000000..fa335bbc04
Binary files /dev/null and b/e2e-tests/.yarn/cache/tmp-npm-0.0.33-bcbf65df2a-902d7aceb7.zip differ
diff --git a/e2e-tests/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip b/e2e-tests/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip
new file mode 100644
index 0000000000..bed5e126bb
Binary files /dev/null and b/e2e-tests/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip differ
diff --git a/e2e-tests/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip b/e2e-tests/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip
new file mode 100644
index 0000000000..acdc9630b7
Binary files /dev/null and b/e2e-tests/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip differ
diff --git a/e2e-tests/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-fde256c907.zip b/e2e-tests/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-fde256c907.zip
new file mode 100644
index 0000000000..437dc2b18d
Binary files /dev/null and b/e2e-tests/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-fde256c907.zip differ
diff --git a/e2e-tests/.yarn/cache/tslib-npm-1.14.1-102499115e-dbe628ef87.zip b/e2e-tests/.yarn/cache/tslib-npm-1.14.1-102499115e-dbe628ef87.zip
new file mode 100644
index 0000000000..5569f012b5
Binary files /dev/null and b/e2e-tests/.yarn/cache/tslib-npm-1.14.1-102499115e-dbe628ef87.zip differ
diff --git a/e2e-tests/.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip b/e2e-tests/.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip
new file mode 100644
index 0000000000..a3c01d86ab
Binary files /dev/null and b/e2e-tests/.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip differ
diff --git a/e2e-tests/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-2007ccb6e5.zip b/e2e-tests/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-2007ccb6e5.zip
new file mode 100644
index 0000000000..eebdd9e659
Binary files /dev/null and b/e2e-tests/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-2007ccb6e5.zip differ
diff --git a/e2e-tests/.yarn/cache/typescript-patch-47de0b8a47-f61375590b.zip b/e2e-tests/.yarn/cache/typescript-patch-47de0b8a47-f61375590b.zip
new file mode 100644
index 0000000000..5f94a45d9b
Binary files /dev/null and b/e2e-tests/.yarn/cache/typescript-patch-47de0b8a47-f61375590b.zip differ
diff --git a/e2e-tests/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip b/e2e-tests/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip
new file mode 100644
index 0000000000..c3d1c955cb
Binary files /dev/null and b/e2e-tests/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip differ
diff --git a/e2e-tests/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip b/e2e-tests/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip
new file mode 100644
index 0000000000..6ab5ae67e3
Binary files /dev/null and b/e2e-tests/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip differ
diff --git a/e2e-tests/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip b/e2e-tests/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip
new file mode 100644
index 0000000000..bb91bbf957
Binary files /dev/null and b/e2e-tests/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip differ
diff --git a/e2e-tests/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-0884b58365.zip b/e2e-tests/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-0884b58365.zip
new file mode 100644
index 0000000000..9d1cb9ff3d
Binary files /dev/null and b/e2e-tests/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-0884b58365.zip differ
diff --git a/e2e-tests/.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip b/e2e-tests/.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip
new file mode 100644
index 0000000000..b49f2fc0bd
Binary files /dev/null and b/e2e-tests/.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip differ
diff --git a/e2e-tests/.yarn/cache/upper-case-npm-1.1.3-061d82781f-991c845de7.zip b/e2e-tests/.yarn/cache/upper-case-npm-1.1.3-061d82781f-991c845de7.zip
new file mode 100644
index 0000000000..f9841879d4
Binary files /dev/null and b/e2e-tests/.yarn/cache/upper-case-npm-1.1.3-061d82781f-991c845de7.zip differ
diff --git a/e2e-tests/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip b/e2e-tests/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip
new file mode 100644
index 0000000000..c2309cfe4d
Binary files /dev/null and b/e2e-tests/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip differ
diff --git a/e2e-tests/.yarn/cache/uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip b/e2e-tests/.yarn/cache/uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip
new file mode 100644
index 0000000000..90b6b788ad
Binary files /dev/null and b/e2e-tests/.yarn/cache/uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip differ
diff --git a/e2e-tests/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip b/e2e-tests/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip
new file mode 100644
index 0000000000..9a64a74202
Binary files /dev/null and b/e2e-tests/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip differ
diff --git a/e2e-tests/.yarn/cache/v8-compile-cache-lib-npm-3.0.1-4886071ece-78089ad549.zip b/e2e-tests/.yarn/cache/v8-compile-cache-lib-npm-3.0.1-4886071ece-78089ad549.zip
new file mode 100644
index 0000000000..005ea72112
Binary files /dev/null and b/e2e-tests/.yarn/cache/v8-compile-cache-lib-npm-3.0.1-4886071ece-78089ad549.zip differ
diff --git a/e2e-tests/.yarn/cache/wcwidth-npm-1.0.1-05fa596453-814e9d1ddc.zip b/e2e-tests/.yarn/cache/wcwidth-npm-1.0.1-05fa596453-814e9d1ddc.zip
new file mode 100644
index 0000000000..b18e4e3458
Binary files /dev/null and b/e2e-tests/.yarn/cache/wcwidth-npm-1.0.1-05fa596453-814e9d1ddc.zip differ
diff --git a/e2e-tests/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip b/e2e-tests/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip
new file mode 100644
index 0000000000..389ec5e25e
Binary files /dev/null and b/e2e-tests/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip differ
diff --git a/e2e-tests/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip b/e2e-tests/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip
new file mode 100644
index 0000000000..093e6f578f
Binary files /dev/null and b/e2e-tests/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip differ
diff --git a/e2e-tests/.yarn/cache/workerpool-npm-6.2.1-1486cb2056-c2c6eebbc5.zip b/e2e-tests/.yarn/cache/workerpool-npm-6.2.1-1486cb2056-c2c6eebbc5.zip
new file mode 100644
index 0000000000..0de5c0c438
Binary files /dev/null and b/e2e-tests/.yarn/cache/workerpool-npm-6.2.1-1486cb2056-c2c6eebbc5.zip differ
diff --git a/e2e-tests/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip b/e2e-tests/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip
new file mode 100644
index 0000000000..ab6ea6e871
Binary files /dev/null and b/e2e-tests/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip differ
diff --git a/e2e-tests/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip b/e2e-tests/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip
new file mode 100644
index 0000000000..2ee78f31c8
Binary files /dev/null and b/e2e-tests/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip differ
diff --git a/e2e-tests/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip b/e2e-tests/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip
new file mode 100644
index 0000000000..6072a9f2e7
Binary files /dev/null and b/e2e-tests/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip differ
diff --git a/e2e-tests/.yarn/cache/xpath-builder-npm-0.0.7-e84a5490b8-00df6ba4a0.zip b/e2e-tests/.yarn/cache/xpath-builder-npm-0.0.7-e84a5490b8-00df6ba4a0.zip
new file mode 100644
index 0000000000..2d7f2027cd
Binary files /dev/null and b/e2e-tests/.yarn/cache/xpath-builder-npm-0.0.7-e84a5490b8-00df6ba4a0.zip differ
diff --git a/e2e-tests/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-54f0fb9562.zip b/e2e-tests/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-54f0fb9562.zip
new file mode 100644
index 0000000000..bf39a466ce
Binary files /dev/null and b/e2e-tests/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-54f0fb9562.zip differ
diff --git a/e2e-tests/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip b/e2e-tests/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip
new file mode 100644
index 0000000000..f2d3306fed
Binary files /dev/null and b/e2e-tests/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip differ
diff --git a/e2e-tests/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip b/e2e-tests/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip
new file mode 100644
index 0000000000..d11c27d510
Binary files /dev/null and b/e2e-tests/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip differ
diff --git a/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip b/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip
new file mode 100644
index 0000000000..fe57a9c8d6
Binary files /dev/null and b/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip differ
diff --git a/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip b/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip
new file mode 100644
index 0000000000..f230038cfc
Binary files /dev/null and b/e2e-tests/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip differ
diff --git a/e2e-tests/.yarn/cache/yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip b/e2e-tests/.yarn/cache/yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip
new file mode 100644
index 0000000000..2d106745e6
Binary files /dev/null and b/e2e-tests/.yarn/cache/yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip differ
diff --git a/e2e-tests/.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip b/e2e-tests/.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip
new file mode 100644
index 0000000000..4a3116218c
Binary files /dev/null and b/e2e-tests/.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip differ
diff --git a/e2e-tests/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip b/e2e-tests/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip
new file mode 100644
index 0000000000..f56730df00
Binary files /dev/null and b/e2e-tests/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip differ
diff --git a/e2e-tests/LICENSE b/e2e-tests/LICENSE
new file mode 100644
index 0000000000..261eeb9e9f
--- /dev/null
+++ b/e2e-tests/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ 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.
diff --git a/e2e-tests/README.md b/e2e-tests/README.md
new file mode 100644
index 0000000000..1f0ce5220d
--- /dev/null
+++ b/e2e-tests/README.md
@@ -0,0 +1,42 @@
+# frontend-e2e-tests
+
+integration tests for serlo.org
+
+```sh
+git clone https://github.com/serlo/frontend-e2e-tests.git
+cd frontend-e2e-tests
+yarn
+yarn test
+```
+
+output should look something like that:
+
+![grafik](https://user-images.githubusercontent.com/13507950/210520199-ad502693-8f84-4956-9417-f750a243911d.png)
+
+Tests are written with Playwright (wrapped by CodeceptJS), extensive documentation can be found at https://codecept.io/helpers/Playwright/
+
+To run a single test, use `--grep`:
+
+```sh
+yarn test --grep "Quickbar"
+```
+
+You can also run a single file:
+
+```sh
+yarn test tests/000-general.ts
+```
+
+Run all editor tests:
+
+```sh
+yarn test tests/4*.ts
+```
+
+You can run tests on firefox instead of chromium with
+
+```sh
+yarn test-firefox
+```
+
+The tests are written in `/tests`, the file names are setting the order of execution. The browser session is stored between tests, TypeScript is supported.
diff --git a/e2e-tests/assets/sample-image.png b/e2e-tests/assets/sample-image.png
new file mode 100644
index 0000000000..ab3f53e19c
Binary files /dev/null and b/e2e-tests/assets/sample-image.png differ
diff --git a/e2e-tests/codecept.config.ts b/e2e-tests/codecept.config.ts
new file mode 100644
index 0000000000..042bb1acbd
--- /dev/null
+++ b/e2e-tests/codecept.config.ts
@@ -0,0 +1,80 @@
+const useLocalAPI = process.env.FRONTEND_API == 'local'
+
+const adminUser = useLocalAPI ? 'admin' : 'Kulla'
+const isCI = Boolean(process.env.CI)
+const browser = process.env.BROWSER ?? 'chromium'
+const frontendUrl =
+ process.env.FRONTEND_URL ?? useLocalAPI
+ ? 'http://localhost:3000'
+ : 'https://de.serlo-staging.dev'
+
+const isChromium = browser === 'chromium'
+
+exports.config = {
+ tests: 'tests/**.ts',
+ output: './output', // we are not using any artifacts right now, but still need an output directory
+ helpers: {
+ Playwright: {
+ url: frontendUrl,
+ restart: 'keep',
+ keepBrowserState: true,
+ keepCookies: true,
+ show: isCI ? false : true,
+ ...(isCI && isChromium
+ ? {
+ chromium: {
+ args: ['--no-sandbox'], // this is needed for github CI to work
+ },
+ }
+ : { browser }),
+ },
+ },
+ name: 'frontend-e2e-tests',
+ plugins: {
+ // https://codecept.io/locators/#custom-locators
+ customLocator: {
+ enabled: true,
+ // Allows data-qa attributes to be selected with $ prefix. E.g
+ // `I.click({ css: '[data-qa=register_button]'})` becomes `I.click('$register_button')`
+ attribute: 'data-qa',
+ },
+ autoLogin: {
+ enabled: true,
+ saveToFile: false,
+ inject: 'login',
+ users: {
+ admin: {
+ login: (I) => {
+ I.amOnPage('/')
+ I.see('Anmelden')
+ I.click('Anmelden')
+ I.waitForText('Benutzername oder E-Mailadresse', 10)
+ I.fillField('Benutzername oder E-Mailadresse', adminUser)
+ I.fillField('Passwort', '123456')
+ I.click('Anmelden', "button[value='password']")
+ I.waitForText(`Willkommen ${adminUser}!`, 30)
+ // Wait as a fix for: https://github.com/microsoft/playwright/issues/20749
+ I.wait(1)
+ },
+ check: (I) => {
+ I.amOnPage('/')
+ I.waitForElement(`header nav img[alt='Avatar']`, 15)
+ },
+ // see https://github.com/codeceptjs/CodeceptJS/issues/1591#issuecomment-480800333
+ fetch: () => 'whatever',
+ restore: () => {},
+ },
+ },
+ },
+ pauseOnFail: {},
+ retryFailedStep: {
+ enabled: true,
+ },
+ tryTo: {
+ enabled: true,
+ },
+ screenshotOnFail: {
+ enabled: true,
+ },
+ },
+}
diff --git a/e2e-tests/config.ts b/e2e-tests/config.ts
new file mode 100644
index 0000000000..bd024dcfa6
--- /dev/null
+++ b/e2e-tests/config.ts
@@ -0,0 +1,21 @@
+import dotenv from 'dotenv'
+
+function createConfig() {
+ dotenv.config()
+
+ const useLocalAPI = process.env.FRONTEND_API == 'local'
+
+ return {
+ adminUser: useLocalAPI ? 'admin' : 'Kulla',
+ isCI: Boolean(process.env.CI),
+ browser: process.env.BROWSER ?? 'chromium',
+ frontendUrl:
+ process.env.FRONTEND_URL ?? useLocalAPI
+ ? 'http://localhost:3000'
+ : 'https://de.serlo-staging.dev',
+ }
+}
+
+const config = createConfig()
+
+export default config
diff --git a/e2e-tests/package.json b/e2e-tests/package.json
new file mode 100644
index 0000000000..d584a1aae1
--- /dev/null
+++ b/e2e-tests/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "@serlo/e2e-tests",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "e2e": "codeceptjs run --debug",
+ "e2e-firefox": "cross-env BROWSER=firefox codeceptjs run --steps",
+ "e2e-firefox-localhost": "cross-env BROWSER=firefox FRONTEND_URL=http://localhost:3000 codeceptjs run --steps",
+ "e2e-localapi": "cross-env FRONTEND_API=local codeceptjs run --steps",
+ "e2e-localhost": "cross-env FRONTEND_URL=http://localhost:3000 codeceptjs run --steps",
+ "e2e-workers": "codeceptjs run-workers --suites 3"
+ },
+ "devDependencies": {
+ "@types/node": "^18.16.19",
+ "codeceptjs": "3.5.2",
+ "cross-env": "^7.0.3",
+ "dotenv": "^16.3.1",
+ "playwright": "1.36.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.1.6"
+ },
+ "packageManager": "yarn@3.6.1",
+ "engines": {
+ "node": "^18.0.0"
+ }
+}
diff --git a/e2e-tests/steps.d.ts b/e2e-tests/steps.d.ts
new file mode 100644
index 0000000000..a0a2ad89ad
--- /dev/null
+++ b/e2e-tests/steps.d.ts
@@ -0,0 +1,14 @@
+///
+
+declare namespace CodeceptJS {
+ interface SupportObject {
+ I: I
+ current: any
+ login: any
+ }
+ interface Methods extends Playwright {}
+ interface I extends WithTranslation {}
+ namespace Translation {
+ interface Actions {}
+ }
+}
diff --git a/e2e-tests/tests/000-general.ts b/e2e-tests/tests/000-general.ts
new file mode 100644
index 0000000000..933134ceac
--- /dev/null
+++ b/e2e-tests/tests/000-general.ts
@@ -0,0 +1,286 @@
+import assert from 'assert'
+
+Feature('General')
+
+Scenario('About Serlo', ({ I }) => {
+ I.amOnPage('/')
+
+ // Make sure it's the landing page
+ I.see('einfache Erklärungen')
+ I.see('Biologie')
+ I.see('werbefrei')
+
+ // Rounded corners are probably causing problems, move cursor a bit
+ I.click('Mehr über uns', null, { position: { x: 10, y: 10 } })
+
+ // Try to reduce flakyness
+ I.waitForText('Über Serlo', 10, 'h1')
+
+ // I am on the about page
+ I.seeInTitle('Über Serlo')
+ I.see('mehr als 10 Jahren')
+
+ // Navigating around
+ I.click('Pädagogisches Konzept')
+ I.click('Anleitung für die Lernplattform serlo.org')
+ I.scrollPageToBottom()
+ I.click('Community')
+
+ // Make sure it's the right page, wait longer to reduce flakiness
+ I.waitForText("Was gibt's zu tun?", 20)
+})
+
+Scenario('Main Menu', async ({ I }) => {
+ async function ensureMenuState(
+ button: string,
+ item: string,
+ open: boolean,
+ context = 'ul.bg-white'
+ ) {
+ let maxLoop = 20
+ while (
+ (await tryTo(() => {
+ I.see(item, context)
+ })) != open
+ ) {
+ await I.click(button, 'ul')
+ await I.wait(0.2)
+ maxLoop--
+ if (maxLoop <= 0) throw 'endless loop'
+ }
+ }
+
+ async function testMenu() {
+ await ensureMenuState('Fächer', 'Angewandte Nachhaltigkeit', true)
+ I.see('Mathematik', 'ul.bg-white')
+ await ensureMenuState('Fächer', 'Angewandte Nachhaltigkeit', false)
+
+ await ensureMenuState('Über Uns', 'Transparenz', true)
+ I.see('Wirkung', 'ul.bg-white')
+ I.see('Transparenz', 'ul.bg-white')
+ await ensureMenuState('Über Uns', 'Transparenz', false)
+
+ // The li is clickable, therefore the context is ul
+ await ensureMenuState('Mitmachen', 'Neu hier?', true, 'div.bg-white')
+ I.see('Neu hier?')
+ I.see('Teste den Editor', 'li')
+ I.see('Hilfe', 'li')
+ }
+
+ // Test menu on landing and in content
+ I.amOnPage('/')
+ await testMenu()
+
+ I.amOnPage('/mathe')
+ await testMenu()
+})
+
+Scenario('Quickbar', ({ I }) => {
+ I.amOnPage('/')
+
+ I.say('Open quickbar')
+ I.click('$quickbar-input')
+ I.type('Vektor')
+
+ // Check dropdown
+ I.seeElement('$quickbar-combobox-overlay')
+ I.see('Kreuzprodukt')
+ I.see('Vektorbegriff')
+ I.see('Auf Serlo nach')
+
+ I.say('Assert aria attributes and navigate options using keyboard')
+ I.seeAttributesOnElements('$quickbar-combobox-overlay', { role: 'listbox' })
+ I.seeAttributesOnElements('$quickbar-input', { role: 'combobox' })
+
+ I.seeAttributesOnElements('$quickbar-option-0', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$quickbar-option-1', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$quickbar-option-2', { 'aria-selected': 'false' })
+
+ I.pressKey('ArrowDown')
+ I.seeAttributesOnElements('$quickbar-option-0', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$quickbar-option-1', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$quickbar-option-2', { 'aria-selected': 'false' })
+
+ I.pressKey('ArrowUp')
+ I.seeAttributesOnElements('$quickbar-option-0', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$quickbar-option-1', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$quickbar-option-2', { 'aria-selected': 'false' })
+
+ I.pressKey('Enter')
+ I.seeInTitle('Vektor')
+
+ I.say('Perform another search')
+ I.amOnPage('/')
+ I.click('$quickbar-input')
+ I.type('Aufgaben zu Urnenmodellen')
+
+ I.click('Aufgaben zu Urnenmodellen')
+ I.seeInTitle('Aufgaben zu Urnenmodellen')
+ I.see('Abiturkurs Stochastik')
+})
+
+Scenario('Share modal', ({ I }) => {
+ I.amOnPage('/1553')
+ I.click('Teilen')
+ I.see('Link kopieren')
+ I.see('Als PDF herunterladen')
+
+ // QR code
+ I.seeElement('svg[width="128"][height="128"]')
+})
+
+// Language versions are testing production
+// This is not intended
+/*
+Scenario('Languages', ({ I }) => {
+ I.amOnPage('/')
+ I.click('Serlo in anderen Sprachen')
+ I.see('Serlo.org in other languages')
+
+ I.click('English')
+ I.see('personalized learning')
+ I.click('Serlo in other languages')
+
+ I.click('Français')
+ I.see('Notre vision est de permettre un apprentissage')
+ I.click("Serlo dans d'autres langues")
+
+ I.click('Español')
+ I.see('Somos una organización de base')
+ I.click('Serlo en otros idiomas')
+
+ I.click('हिंदी')
+ I.see('हम नॉनप्रॉफिट आर्गेनाइजेशन संगठन')
+ // Somehow this is the only way to go back
+ I.usePlaywrightTo('go back', async ({ page }) => {
+ await page.goBack()
+ })
+
+ I.click('தமிழ் (Tamil)')
+ I.see('நாம் சமமான கல்வி வாய்ப்புகளை')
+})
+*/
+
+Scenario('Donation', ({ I }) => {
+ I.amOnPage('/')
+ I.click('Jetzt Spenden')
+ I.see('Deine Spende macht einen Unterschied')
+ I.see('Mit PayPal spenden')
+
+ I.click('Spendenformular laden')
+ I.switchTo('iframe')
+ I.waitForText('Bitte gib einen Spendenbetrag ein', 30)
+ I.click('Jetzt spenden')
+ I.see('Wähle eine Zahlungsart')
+ I.switchTo() // back from iframe
+
+ I.amOnPage('/')
+ I.click('Einwilligungen widerrufen')
+ I.see('Einwilligungen für externe Inhalte', 'h1')
+})
+
+Scenario('Legal Pages', async ({ I }) => {
+ I.amOnPage('/')
+ I.click('Impressum')
+ I.see('Amtsgericht München')
+ I.see('Haftung für Inhalte')
+ I.seeInCurrentUrl('/legal')
+
+ I.amOnPage('/')
+ I.click('Datenschutz')
+ I.see('personenbezogene Daten')
+ I.see('Verarbeitung der Nutzerdaten')
+ I.see('Einwilligungen für externe Inhalte')
+ const date = await I.grabTextFrom('time')
+ assert.equal(true, date && date.length !== 0)
+ I.seeInCurrentUrl('/privacy')
+
+ I.amOnPage('/')
+ I.click('Nutzungsbedingungen und Urheberrecht')
+ I.see('Änderungsvorbehalt')
+ I.see('CC-BY-SA-Lizenz')
+
+ I.amOnPage('/hi/privacy')
+ I.see('Privacy Policy')
+ I.see('en@serlo.org')
+})
+
+Scenario('Consent', async ({ I }) => {
+ I.amOnPage('/')
+ I.click('Jetzt Spenden')
+
+ // Make sure that twingle is activated
+ const needConfirmation = await tryTo(() => {
+ I.see('Spendenformular laden')
+ })
+ if (needConfirmation) {
+ I.click('Spendenformular laden')
+ }
+
+ I.amOnPage('/')
+ I.click('Einwilligungen widerrufen')
+ I.see('Twingle')
+ I.click('Nicht mehr erlauben')
+ I.see('Keine Einwilligungen gespeichert')
+
+ // Go back and check
+ I.amOnPage('/')
+ I.click('Jetzt Spenden')
+ I.see('Spendenformular laden')
+})
+
+Scenario('Special Pages', ({ I }) => {
+ I.amOnPage('/')
+ I.click('Kontakt')
+ I.see('Kontakt und Standorte', 'h1')
+ I.click('Jobs')
+ I.see('Digitale Bildung braucht dich', 'h1')
+ I.see('Unsere offenen Stellen')
+ I.see('Weiterbildung')
+
+ I.amOnPage('/')
+ I.click('Kontakt')
+
+ // Wait for next page to load before clicking team
+ I.see('Kontakt und Standorte', 'h1')
+ I.click('Team')
+
+ // Needs to do external fetching, so wait a bit longer
+ I.waitForText('Softwareentwicklung', 30)
+})
+
+Scenario('Meta robots tags', ({ I }) => {
+ // should index
+ I.amOnPage('/')
+ I.dontSeeElementInDOM('meta[content=noindex]')
+
+ I.amOnPage('/serlo')
+ I.dontSeeElementInDOM('meta[content=noindex]')
+
+ I.amOnPage('/1555')
+ I.dontSeeElementInDOM('meta[content=noindex]')
+
+ // hide test area
+ I.amOnPage('/community/106082/testbereich')
+ I.seeElementInDOM('meta[content=noindex]')
+
+ I.amOnPage('/community/185201/kullas-testartikel-nicht-l%C3%B6schen')
+ I.seeElementInDOM('meta[content=noindex]')
+
+ // hide trashed
+ I.amOnPage('/268814')
+ I.seeElementInDOM('meta[content=noindex]')
+})
+
+Scenario('Link component should not rewrite assets.serlo.org', ({ I }) => {
+ I.amOnPage('/transparenz')
+ I.click('Serlo Education Jahresbericht 2010')
+ I.wait(2)
+ I.dontSee('Es tut uns leid')
+})
+
+Scenario('Link to community chat should work', ({ I }) => {
+ I.amOnPage('/19880/mitmachen-in-mathematik')
+ I.click('Chat für Mathe-AutorInnen')
+ I.seeInTitle('Serlo Communitychat')
+})
diff --git a/e2e-tests/tests/100-learners.ts b/e2e-tests/tests/100-learners.ts
new file mode 100644
index 0000000000..2a24e8b1b3
--- /dev/null
+++ b/e2e-tests/tests/100-learners.ts
@@ -0,0 +1,365 @@
+Feature('Learners')
+
+const subjectQuickbarSelector = 'input[placeholder*="heute lerne ich"]'
+
+interface LandingPageData {
+ iconSelector: string
+ headingText: string
+ taxRootName: string
+ quickbarKeyword: string
+ quickbarKeywordResult: string
+ quickbarDistractor: string
+ quickbarDistractorDontSee: string
+ taxonomy1: string
+ taxonomyEntry1: string
+ taxonomy2: string
+ taxonomyEntry2: string
+}
+
+async function testLandingPage(I: CodeceptJS.I, data: LandingPageData) {
+ I.amOnPage('/')
+
+ // Use icon
+ I.click(data.iconSelector)
+
+ I.see(data.headingText)
+
+ // Visit taxonomy
+ I.click('Alle Themen')
+ I.click(data.taxRootName, 'nav > a')
+
+ // Check correct filter
+ I.click(subjectQuickbarSelector)
+ I.type(data.quickbarKeyword)
+ I.see(data.quickbarKeywordResult, 'div.shadow')
+
+ // Clear input
+ I.pressKey('Escape')
+ I.click(subjectQuickbarSelector)
+
+ I.type(data.quickbarDistractor)
+ I.dontSee(data.quickbarDistractorDontSee, 'div.shadow')
+
+ // Close quickbar
+ I.refreshPage()
+
+ // Taxonomy explorer
+ I.dontSee(data.taxonomyEntry1, 'li > a.serlo-link')
+ I.click(data.taxonomy1)
+ I.see(data.taxonomyEntry1, 'li > a.serlo-link')
+ I.dontSee(data.taxonomyEntry2, 'li > a.serlo-link')
+ I.click(data.taxonomy2)
+ I.see(data.taxonomyEntry2, 'li > a.serlo-link')
+
+ // Mitmachen
+ I.click('Mitmachen', '.bg-blueWave')
+ I.see('Werde Teil der Serlo Community')
+}
+
+const landingPages: LandingPageData[] = [
+ {
+ iconSelector: 'svg.superspecial-math',
+ headingText: 'Keine Angst vor Zahlen',
+ taxRootName: 'Mathematik',
+ quickbarKeyword: 'vektor',
+ quickbarKeywordResult: 'Vektorbegriff',
+ quickbarDistractor: 'zelle',
+ quickbarDistractorDontSee: 'Brennstoffzelle',
+ taxonomy1: 'Zahlen & Größen',
+ taxonomyEntry1: 'Grundrechenarten',
+ taxonomy2: 'Stochastik',
+ taxonomyEntry2: 'Kombinatorik',
+ },
+ {
+ iconSelector: 'svg.superspecial-sus',
+ headingText: 'Unsere Welt gibt es nur einmal',
+ taxRootName: 'Angewandte Nachhaltigkeit',
+ quickbarKeyword: 'umwelt',
+ quickbarKeywordResult: 'Umweltschutz',
+ quickbarDistractor: 'zelle',
+ quickbarDistractorDontSee: 'Brennstoffzelle',
+ taxonomy1: 'Plastik',
+ taxonomyEntry1: 'Leben ohne Plastik?',
+ taxonomy2: 'Klimaschutz aktiv leben',
+ taxonomyEntry2: 'Klimawandel',
+ },
+ {
+ iconSelector: 'svg.superspecial-bio',
+ headingText: 'Gib deinem Hirn einen Evolutionssprung',
+ taxRootName: 'Biologie',
+ quickbarKeyword: 'zelle',
+ quickbarKeywordResult: 'Tierische Zelle',
+ quickbarDistractor: 'zelle',
+ quickbarDistractorDontSee: 'Brennstoffzelle',
+ taxonomy1: 'Ökologie',
+ taxonomyEntry1: 'Populationsdynamik',
+ taxonomy2: 'Vielfalt der Lebewesen',
+ taxonomyEntry2: 'Wirbellose Tiere',
+ },
+ {
+ iconSelector: 'svg.superspecial-chem',
+ headingText: 'In der Chemie ist nicht alles ätzend',
+ taxRootName: 'Chemie',
+ quickbarKeyword: 'chemie',
+ quickbarKeywordResult: 'Chemie Startseite',
+ quickbarDistractor: 'zelle',
+ quickbarDistractorDontSee: 'Tierische Zelle',
+ taxonomy1: 'Grundlagen',
+ taxonomyEntry1: 'Was ist Chemie?',
+ taxonomy2: 'Stoffmenge',
+ taxonomyEntry2: 'Stoffmenge und Mol',
+ },
+ {
+ iconSelector: 'svg.superspecial-informatics',
+ headingText: 'Keine Angst vor Computern',
+ taxRootName: 'Informatik',
+ quickbarKeyword: 'bin',
+ quickbarKeywordResult: 'Binärsystem',
+ quickbarDistractor: 'zelle',
+ quickbarDistractorDontSee: 'Tierische Zelle',
+ taxonomy1: 'Daten & Informationen',
+ taxonomyEntry1: 'Verarbeitung von Informationen',
+ taxonomy2: 'Theoretische Informatik',
+ taxonomyEntry2: 'Formale Sprachen',
+ },
+]
+
+Scenario('Subject landing page', ({ I }) => {
+ testLandingPage(
+ I,
+ landingPages[Math.floor(Math.random() * landingPages.length)]
+ )
+})
+
+Scenario('Interact with single choice', ({ I }) => {
+ // Feedback from content
+ I.amOnPage('/3383')
+ I.see('Klicke auf eine der Optionen')
+ I.click('15')
+ I.click("Stimmt's?")
+ I.see('Diese Antwort passt leider nicht')
+ I.click('120')
+ I.dontSee('Diese Antwort passt leider nicht')
+ I.click("Stimmt's?")
+ I.see('Diese Antwort passt leider nicht')
+ I.click('495')
+ I.click("Stimmt's?")
+ I.see('Super!')
+
+ // Fallback feedback
+ I.amOnPage('/145139')
+ I.click('mit dem Graphen')
+ I.click("Stimmt's?")
+ I.see('Leider nicht richtig')
+ I.click('gestreckt')
+ I.click("Stimmt's?")
+ I.see('Richtig')
+ I.dontSee('Leider nicht')
+ I.click('gestaucht')
+ I.click("Stimmt's?")
+ I.see('Leider nicht richtig')
+})
+
+Scenario('Interact with multiple choice', ({ I }) => {
+ I.amOnPage('/131435')
+ I.see('Welche beiden Aufgaben')
+ I.click("Stimmt's")
+ I.see('Leider nicht richtig')
+ I.click('15% von 400€')
+ I.click("Stimmt's")
+ I.see('Fast! Dir fehlt noch mindestens eine richtige Antwort.')
+
+ // Deselect
+ I.click('15% von 400€')
+ I.dontSee('Fast! Dir fehlt noch mindestens eine richtige Antwort.')
+
+ I.click('30% von 200€')
+ I.click('15% von 400€')
+ I.click("Stimmt's")
+ I.see('Richtig')
+})
+
+Scenario('Geogebra', ({ I }) => {
+ I.amOnPage('/43563')
+ I.click('Applet laden von GeoGebra')
+ I.waitForElement('canvas[data-test="euclidianView"]', 10)
+
+ I.amOnPage('/')
+
+ I.amOnPage('/279849')
+ I.click('Applet laden von GeoGebra')
+ I.waitForElement('canvas[data-test="euclidianView"]', 10)
+})
+
+Scenario('Video + Injection', ({ I }) => {
+ I.amOnPage('/18524')
+ I.see('dass externe Inhalte von')
+ I.click('Video abspielen von YouTube')
+ I.switchTo('iframe')
+ I.see('Satz des Pythagoras für rechtwinklige Dreiecke')
+})
+
+Scenario('Toggle Solution', ({ I }) => {
+ I.amOnPage('/37779')
+ I.see('Die Klasse 8a')
+ I.dontSee('Für diese Aufgabe benötigst Du')
+ I.click('Lösung anzeigen')
+ I.see('Für diese Aufgabe benötigst Du')
+ I.click('Lösung ausblenden')
+ I.dontSee('Für diese Aufgabe benötigst Du')
+})
+
+Scenario('Taxonomy', ({ I }) => {
+ // Math all topics
+ I.amOnPage('/5')
+ I.see('Zahlen und Größen')
+ I.see('Bereiche')
+ I.see('Grundrechenarten')
+
+ // Meta nav
+ I.click('Realschule')
+
+ // Running around a bit more
+ I.see('Klasse 5')
+ I.see('Klasse 6')
+ I.click('Klasse 7')
+ I.see('Aufgaben')
+ I.click('Grundwissenstest 7. Klasse')
+ I.see('Aufgaben')
+ I.click('2021')
+
+ // Takes a long time to load
+ I.waitForText('Berechne', 30)
+
+ I.amOnPage('/24370')
+ I.see('Artikel')
+ I.see('Videos')
+ I.see('Applets')
+ I.see('Aufgaben')
+})
+
+Scenario('Breadcrumbs', ({ I }) => {
+ // Check entries
+ I.amOnPage('/247918')
+ I.see('Mathematik', 'a.hidden')
+ I.see('Realschule', 'a.hidden')
+ I.see('Klasse 7', 'a.hidden')
+ I.see('Grundwissenstest 7. Klasse', 'a.serlo-button')
+
+ // Is short-circuit
+ I.dontSee('Deutschland')
+
+ // Nav
+ I.click('Realschule')
+ I.see('Dieser Bereich orientiert sich')
+
+ // Another test
+ I.amOnPage('/35149')
+ I.see('Angewandte Nachhaltigkeit', 'a.hidden')
+ I.see('Was bedeutet Nachhaltigkeit?', 'a.hidden')
+ I.see('Grundlagen der Nachhaltigkeit', 'a.serlo-button')
+
+ // Check description
+ I.click('Grundlagen der Nachhaltigkeit')
+ I.seeElement('img.serlo-img')
+
+ // Check if right taxonomy is selected
+ I.amOnPage('/1555')
+ I.see('Wichtige Grundkörper', 'a.serlo-button')
+ I.dontSee('Realschule')
+ I.dontSee('Gymnasium')
+})
+
+Scenario('Small subject', ({ I }) => {
+ I.amOnPage('/politik')
+ I.click('Alle Themen')
+
+ // Meta mneu
+ I.see('Alle Themen', 'a.block')
+
+ // Breadcrumbs
+ I.click('Politik')
+ I.see('Politik Startseite', 'h1')
+})
+
+// This is not a good way of accessing language versions because it's testing production
+// Find another way if suitable
+/* Scenario('Subject on language version', ({ I }) => {
+ I.amOnPage('/')
+ I.click('Serlo in anderen Sprachen')
+ I.click('Español')
+ I.click('Diásporas Africanas')
+ I.click('Todos los temas')
+
+ // All topics
+ I.see('Construimos una plataforma')
+
+ I.click('Estudios en Diásporas Africanas para la Escuela')
+ I.see('¡Bienvenidos a la')
+})*/
+
+Scenario('Exercise folder', ({ I }) => {
+ I.amOnPage('/23869')
+
+ // Check numbering
+ for (let i = 1; i <= 20; i++) {
+ I.see(i.toString(), 'a.rounded-full')
+ }
+
+ // Some random text
+ I.see('Berlin nach München')
+
+ // License
+ I.see('Dieses Werk steht unter der freien Lizenz')
+
+ // Guest invites
+ I.click('Aufgaben überarbeiten')
+ I.see('Erstelle mit uns Lerninhalte')
+
+ // This line takes some time?
+ I.click('$modal-close-button')
+
+ I.click('Aufgabe hinzufügen')
+ I.see('Erstelle mit uns Lerninhalte')
+})
+
+Scenario('Course', ({ I }) => {
+ I.amOnPage('/1327')
+ I.see('Kurse')
+ I.click('Einführung lineare Funktionen')
+ I.see('1', 'span.rounded-full')
+ I.see('Kursübersicht', 'h1')
+ I.click('Weiter')
+ I.see('2', 'span.rounded-full')
+ I.see('Aufstieg zur Zugspitze', 'h1')
+ I.click('Zurück')
+ I.see('Kursübersicht', 'h1')
+ I.click('Kursübersicht')
+ I.see('Zusammenfassung')
+ I.click('Weiterführende Übungen')
+ I.see('Lösung anzeigen')
+})
+
+Scenario('Comments', ({ I }) => {
+ // End of entity
+ I.amOnPage('/1537')
+ I.scrollTo('#comment-area-begin-scrollpoint')
+ I.see('Hast du eine Frage oder Feedback?')
+ I.see('Der Artikel Koordinatesystem ist nicht')
+
+ // In exercise
+ I.amOnPage('/37296')
+ I.click('Lösung anzeigen')
+ I.scrollTo('#comment-area-begin-scrollpoint')
+ I.see('Ich weiß nicht, ob es vom Computer')
+})
+
+Scenario('Check picture in scmc exercise', ({ I }) => {
+ I.amOnPage('/mathe/54749/54749')
+
+ I.see('Aufgaben zu Kreisen und Kreisteilen')
+
+ I.seeInSource(
+ 'https://assets.serlo.org/legacy/56ebffb3bb393_1fe5b83b4ff8aae9bbc0026f127423c166e1ce93.png'
+ )
+})
diff --git a/e2e-tests/tests/200-login.ts b/e2e-tests/tests/200-login.ts
new file mode 100644
index 0000000000..831c053aa7
--- /dev/null
+++ b/e2e-tests/tests/200-login.ts
@@ -0,0 +1,34 @@
+Feature('Login')
+
+Scenario('Login', ({ I }) => {
+ I.amOnPage('/')
+ I.see('Anmelden')
+ I.click('Anmelden')
+
+ // Reduce flakiness
+ I.waitForText('Benutzername oder E-Mailadresse', 10)
+
+ I.fillField('Benutzername oder E-Mailadresse', 'dal')
+ I.fillField('Passwort', '123456')
+
+ // More robust selector
+ I.click('Anmelden', "button[value='password']")
+
+ I.waitForText('Willkommen dal!', 10)
+
+ // Wait as a fix for: https://github.com/microsoft/playwright/issues/20749
+ I.wait(1)
+})
+
+Scenario('Logout', ({ I }) => {
+ I.amOnPage('/')
+
+ // The asterix is mistaken as css selector sometimes, so remove it
+ I.click('Benutzer')
+
+ I.click('Abmelden')
+ I.waitForText('Bis bald!', 10)
+ I.see('Anmelden')
+})
+
+// make sure user is logged out at the end of the tests
diff --git a/e2e-tests/tests/300-authors.ts b/e2e-tests/tests/300-authors.ts
new file mode 100644
index 0000000000..bd0109192a
--- /dev/null
+++ b/e2e-tests/tests/300-authors.ts
@@ -0,0 +1,168 @@
+Feature('Authors')
+
+// expecting user to be logged out before start of tests
+
+Before(({ login }) => {
+ login('admin') // login as admin for now
+})
+
+// Articles only for now
+Scenario('Saving without changes', ({ I }) => {
+ I.amOnPage('/entity/repository/add-revision/74888')
+ I.click('Speichern')
+ I.waitForText('Bisher hast du nichts geändert')
+ I.dontSee('Beschreibe deine Änderungen am Inhalt')
+})
+
+Scenario('Open Editor from article', async ({ I }) => {
+ I.amOnPage('/74888')
+
+ // Make sure we see the latest version
+ I.refreshPage()
+
+ // only works for 1 level
+ const hasRevisions = await tryTo(() => {
+ // Menu takes time to load
+ I.wait(3)
+ I.see('Zeige neue Bearbeitungen')
+ })
+ if (hasRevisions) {
+ I.click('Zeige neue Bearbeitungen')
+
+ // Select first new revision by title value
+ I.click('Diese Bearbeitung anzeigen')
+
+ I.click('Nicht akzeptieren')
+ I.click('Bestätigen')
+ I.amOnPage('/74888')
+ }
+
+ I.click('Überarbeiten')
+ I.waitForText('Speichern', 10)
+ I.see('Treibhausgase')
+})
+
+// This test fails regulary due to sychronization issues
+// Especially bad: it will leave staging in a undetermined state
+// and break subsequent test runs
+// I will disable this test for now
+// In the future, try to break to behaviour into parts
+/*
+Scenario('Add Revision and reject', async ({ I }) => {
+ I.amOnPage('/entity/repository/add-revision/74888')
+ I.click("input[placeholder='Titel']")
+ I.pressKey('-')
+ I.pressKey('T')
+ I.pressKey('e')
+ I.pressKey('s')
+ I.pressKey('t')
+ I.pressKey('Space')
+
+ // Randomize script so that revisions are not ignored
+ I.type(Math.random().toString())
+
+ I.click('Speichern')
+ I.click('Speichern und reviewen lassen')
+ I.waitForText('Bitte alle Pflichtfelder ausfüllen', 10)
+
+ // Use class instead of text because text is super long and not reliable
+ I.click('.license-wrapper')
+ I.click('Speichern und reviewen lassen')
+ I.waitForText('Bitte alle Pflichtfelder ausfüllen', 10)
+
+ I.fillField('label textarea', 'automated-test')
+ I.click('Speichern und reviewen lassen')
+ I.dontSee('Bitte alle Pflichtfelder ausfüllen')
+
+ I.waitForText('Danke für deine Bearbeitung', 60)
+ I.see('Bearbeitungsverlauf')
+
+ // updates are sometimes not fast enough
+ I.refreshPage()
+
+ // I can't predict if it's the one or the other string
+ const seeVersion1 = await tryTo(() => {
+ I.see('vor einer Weile')
+ })
+ if (!seeVersion1) {
+ I.see('gerade eben')
+ }
+
+ I.click('automated-test')
+ // For local testing, it's slow
+ I.waitForText('Treibhausgase-Test', 30)
+
+ // Reject revision
+ I.click('Nicht akzeptieren')
+ I.click('Bestätigen')
+ I.waitForText('Bearbeitung wurde nicht akzeptiert', 15)
+})
+*/
+
+/*Scenario('Reject Revision @current', ({ I }) => {
+ // clean up revision
+ pause()
+})*/
+
+// LocalStorage tests
+
+// Logout in second Tab…
+
+Scenario('Sort taxonomy entities', async ({ I }) => {
+ I.amOnPage('/taxonomy/term/sort/entities/75211')
+ I.see('Artikel')
+ I.see('Codierungen')
+
+ I.see('Kurse')
+ I.see('Webseite selbst erstellen')
+
+ I.see('Bereiche')
+ I.see('Technische Informatik')
+})
+
+Scenario('Sort exercise folder', async ({ I }) => {
+ I.amOnPage('/taxonomy/term/sort/entities/23869')
+
+ I.see('Aufgaben')
+
+ const firstElement = locate('li').withText('(1) Aufgabe')
+ const secondElement = locate('li').withText('(2) Aufgabe')
+
+ // initial order
+ I.seeElement(locate(firstElement).before(secondElement))
+
+ I.focus(firstElement)
+ I.pressKey('Space')
+ I.pressKey('ArrowDown')
+ I.pressKey('Space')
+
+ //changed order
+ I.seeElement(locate(secondElement).before(firstElement))
+ I.see('(20)')
+})
+
+// removed by https://github.com/serlo/frontend/pull/3044
+/*Scenario('Solution revision should be visible', async ({ I }) => {
+ I.amOnPage('/entity/repository/compare/279738/279739')
+ I.see('Der Zeiger ist alle 12 Stunden')
+})*/
+
+Scenario("Switching tabs shouldn't lose work", async ({ I }) => {
+ I.amOnPage('/entity/repository/add-revision/74888')
+ I.click("input[placeholder='Titel']")
+ I.pressKey('-')
+ I.pressKey('T')
+ I.pressKey('e')
+ I.pressKey('s')
+ I.pressKey('t')
+
+ I.seeInField("input[placeholder='Titel']", 'Treibhausgase-Test')
+
+ I.openNewTab()
+ I.wait(2)
+ I.closeCurrentTab()
+
+ I.wait(2)
+
+ I.seeInField("input[placeholder='Titel']", 'Treibhausgase-Test')
+})
diff --git a/e2e-tests/tests/400-serlo-editor.ts b/e2e-tests/tests/400-serlo-editor.ts
new file mode 100644
index 0000000000..1c0b10f327
--- /dev/null
+++ b/e2e-tests/tests/400-serlo-editor.ts
@@ -0,0 +1,182 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor')
+
+Before(popupWarningFix)
+
+Scenario('Basic text interactions', async ({ I }) => {
+ I.amOnPage('/entity/repository/add-revision/74888')
+
+ I.click('$plugin-text-editor')
+
+ const testString = 'TESTTESTTEST'
+ I.type(testString)
+ I.see(testString)
+ for (let i = 0; i < testString.length; i++) {
+ I.pressKey('Backspace')
+ }
+ I.dontSee(testString)
+})
+
+Scenario('Add new plugins', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Enter')
+
+ // Only one text plugin visible
+ I.see('Schreib etwas oder füge')
+
+ // workaround: plugin toolbar is hiding add-new-plugin-row-button
+ // unfocus to make it visible
+ I.click('input[placeholder="Titel"]')
+ I.click('$add-new-plugin-row-button')
+
+ for (let i = 0; i < 3; i++) {
+ I.pressKey('ArrowDown')
+ }
+ // Spoiler
+ I.pressKey('Enter')
+
+ I.seeElement('input[placeholder="Titel eingeben"]')
+
+ I.pressKey('/')
+ for (let i = 0; i < 4; i++) {
+ I.pressKey('ArrowDown')
+ }
+ // Box
+ I.pressKey('Enter')
+
+ I.see('Art der Box')
+ I.click('Merke')
+
+ I.see('(optionaler Titel)')
+})
+
+Scenario('Close plugin selection modal', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ I.click('Füge ein Element hinzu')
+ const textPluginDescription =
+ 'Schreibe Text und Matheformeln, und formatiere sie.'
+ I.see(textPluginDescription)
+
+ I.pressKey('Escape')
+ // Modal should be closed
+ I.dontSee(textPluginDescription)
+
+ // Open modal again
+ I.type('/')
+ I.see(textPluginDescription)
+
+ // focus something different by clicking outside of the modal, in this
+ // instance into the quickbar
+ I.click('$quickbar-input')
+ // Modal should now be closed
+ I.dontSee(textPluginDescription)
+})
+
+Scenario('Add plugin via slash command', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ // ensure there is no table yet
+ I.dontSeeElement('.serlo-table')
+ I.click('$add-new-plugin-row-button')
+ I.type('Tabelle')
+ I.pressKey('Enter')
+
+ I.seeElement('.serlo-table')
+})
+
+/**
+ * Most of the input of the editor happens within the editor contenteditable
+ * div. However, there are some input fields whose undo/redo behavior could
+ * function differently because we have one global undo/redo handler and the
+ * browser also natively handles it unless we specifically overwrite the behavior.
+ * Therefore, we want to ensure that we never do 2 undos when ctrl+z is pressed.
+ */
+Scenario(
+ 'Undo via keyboard in input field for article heading',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ const articleHeadingInput = 'input[placeholder="Titel"]'
+ I.click(articleHeadingInput)
+
+ const firstWord = 'Some '
+ I.type(firstWord)
+ I.wait(2)
+
+ const secondWord = 'Text'
+ I.type(secondWord)
+
+ I.seeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+
+ I.pressKey(['CommandOrControl', 'Z'])
+ I.dontSeeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+ I.dontSeeInField(articleHeadingInput, `${secondWord}`)
+ I.seeInField(articleHeadingInput, firstWord)
+
+ I.pressKey(['CommandOrControl', 'Z'])
+ I.dontSeeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+ I.dontSeeInField(articleHeadingInput, firstWord)
+ }
+)
+
+Scenario(
+ 'Undo via keyboard in input field of picture plugin',
+ async ({ I }) => {
+ // make sure autofocus logic after opening is done
+ I.wait(0.5)
+ // No need to create the image plugin first as the multimedia plugin at the
+ // beginning of each page already contains one. But, we do need to focus it,
+ // in order to make the src input visible
+ I.click('$plugin-image-editor')
+ const imagePluginUrlInput =
+ 'input[placeholder="https://example.com/image.png"]'
+
+ I.click(imagePluginUrlInput)
+
+ const firstWord = 'Some '
+ I.type(firstWord)
+ I.wait(2)
+
+ const secondWord = 'Text'
+ I.type(secondWord)
+
+ I.seeInField(imagePluginUrlInput, `${firstWord}${secondWord}`)
+
+ I.pressKey(['CommandOrControl', 'Z'])
+ I.dontSeeInField(imagePluginUrlInput, `${firstWord}${secondWord}`)
+ I.dontSeeInField(imagePluginUrlInput, `${secondWord}`)
+ I.seeInField(imagePluginUrlInput, firstWord)
+
+ I.pressKey(['CommandOrControl', 'Z'])
+ I.dontSeeInField(imagePluginUrlInput, `${firstWord}${secondWord}`)
+ I.dontSeeInField(imagePluginUrlInput, firstWord)
+ }
+)
+
+Scenario(
+ 'Redo in input field for article heading via keyboard',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ const articleHeadingInput = { xpath: '//input[@placeholder="Titel"]' }
+ I.click(articleHeadingInput)
+
+ const firstWord = 'Some '
+ I.type(firstWord)
+ I.wait(2)
+
+ const secondWord = 'Text'
+ I.type(secondWord)
+ I.seeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+
+ I.pressKey(['CommandOrControl', 'Z'])
+ I.dontSeeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+ I.dontSeeInField(articleHeadingInput, `${secondWord}`)
+ I.seeInField(articleHeadingInput, firstWord)
+
+ I.pressKey(['CommandOrControl', 'Y'])
+ I.seeInField(articleHeadingInput, `${firstWord}${secondWord}`)
+ }
+)
diff --git a/e2e-tests/tests/410-plugin-toolbar.ts b/e2e-tests/tests/410-plugin-toolbar.ts
new file mode 100644
index 0000000000..44f65c0ad1
--- /dev/null
+++ b/e2e-tests/tests/410-plugin-toolbar.ts
@@ -0,0 +1,50 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - plugin toolbar')
+
+Before(popupWarningFix)
+
+// First Text plugin is the multimedia explanation,
+// second is multimedia image caption,
+// third is default empty text plugin
+const initialTextPluginCount = 3
+
+Scenario('Duplicate plugin', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.moveCursorTo(
+ locate('[data-radix-collection-item]').inside('.plugin-toolbar')
+ )
+ I.click('$duplicate-plugin-button')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 2)
+})
+
+Scenario('Delete plugin', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.moveCursorTo(
+ locate('[data-radix-collection-item]').inside('.plugin-toolbar')
+ )
+ I.click('$remove-plugin-button')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+})
+
+// The anchor link copy tool is currently not rendered in Codecept.
+// If this feature passes experimental stage, it's worth finding a way
+// to render it in Codecept. Otherwise, this todo can be removed.
+// (https://trello.com/c/W6ZXhNpv/95-anchor-sprungmarke)
+Scenario.todo('Copy link to plugin')
diff --git a/e2e-tests/tests/420-text-plugin.ts b/e2e-tests/tests/420-text-plugin.ts
new file mode 100644
index 0000000000..d520642a5d
--- /dev/null
+++ b/e2e-tests/tests/420-text-plugin.ts
@@ -0,0 +1,351 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Text plugin basic interactions')
+
+Before(popupWarningFix)
+
+// First Text plugin is the multimedia explanation,
+// second is multimedia image caption,
+// third is default empty text plugin
+const initialTextPluginCount = 3
+
+Scenario('Add a new line using Enter', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.say('Press Enter to add a new line')
+ I.pressKey('Enter')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+})
+
+Scenario('Add new line in plugin using Enter', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ const firstText = 'first'
+ const secondText = 'second'
+
+ I.say('Type some text and move the cursor in the middle of it')
+ I.type(firstText + secondText)
+ I.see(firstText + secondText)
+ for (let i = 0; i < secondText.length; i++) {
+ I.pressKey('ArrowLeft')
+ }
+
+ I.say('Add new line in plugin using Enter')
+ I.pressKey('Enter')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+ I.dontSee(firstText + secondText)
+ I.see(firstText)
+ I.see(secondText)
+})
+
+Scenario('Remove empty Text plugin using Backspace key', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.say('Focus the default Text plugin')
+ I.pressKey('ArrowDown')
+
+ I.say('Nothing happens when Backspace is pressed in the first plugin')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.say('Add a second Text plugin')
+ I.click('$add-new-plugin-row-button')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.say('Remove the forward slash')
+ I.pressKey('Backspace')
+
+ I.say('Remove the plugin using Backspace')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+})
+
+Scenario('Remove empty Text plugin using Delete key', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+
+ I.say('Focus the default Text plugin')
+ I.pressKey('ArrowDown')
+
+ I.say('Add a second Text plugin')
+ I.click('$add-new-plugin-row-button')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.say('Remove the forward slash')
+ I.pressKey('Backspace')
+
+ I.say('Nothing happens when Delete is pressed in the last plugin')
+ I.pressKey('Delete')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+
+ I.say('Focus the first plugin')
+ I.pressKey('ArrowUp')
+
+ I.say('Remove the plugin using Delete')
+ I.pressKey('Delete')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+})
+
+Scenario('Merge with previous plugin using Backspace key', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.say('Create another text plugin')
+ I.click('$add-new-plugin-row-button')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+ I.pressKey('Backspace')
+ I.type('- Second text plugin')
+ I.see('Second text plugin')
+
+ I.say('Focus the first text plugin')
+ I.pressKey('ArrowUp')
+ I.pressKey('ArrowUp')
+
+ I.say('Write text into the first text plugin')
+ I.type('- First text plugin')
+ I.see('First text plugin')
+
+ I.say('Focus the second text plugin')
+ I.pressKey('ArrowDown')
+
+ I.say('Merge the 2 text plugins by pressing Backspace')
+ // We need to duplicate the 'Backspace' command since only once doesn't have the expected effect
+ I.pressKey('Backspace')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+})
+
+// Test related to issue: https://github.com/serlo/backlog/issues/158
+Scenario(
+ 'Merge with previous plugin containing list using Backspace key',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.say('Create a text plugin')
+ I.click('$add-new-plugin-row-button')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount + 1)
+ I.pressKey('Backspace')
+ I.type('- Plain text')
+ I.see('Plain text')
+
+ I.say('Focus the first text plugin')
+ I.pressKey('ArrowUp')
+ I.pressKey('ArrowUp')
+
+ I.say('Create an ordered list')
+ I.type('- Unordered list')
+ I.click('$plugin-toolbar-button-nummerierte-liste')
+ I.see('Unordered list', 'ol')
+
+ I.say('Focus the second text plugin')
+ I.pressKey('ArrowDown')
+
+ I.say('Merge the 2 text plugins by pressing Backspace')
+ // We need to duplicate the 'Backspace' command since only once doesn't have the expected effect
+ I.pressKey('Backspace')
+ I.pressKey('Backspace')
+ I.seeNumberOfElements('$plugin-text-editor', initialTextPluginCount)
+ }
+)
+
+Scenario.todo('Merge with next plugin using Delete key')
+
+Scenario('Undo', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+ I.see('Some text')
+
+ I.click('$editor-toolbar-undo')
+
+ I.dontSee('Some text')
+})
+
+Scenario('Undo using keyboard', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+ I.see('Some text')
+
+ I.pressKey(['CommandOrControl', 'Z'])
+
+ I.dontSee('Some text')
+})
+
+Scenario('Redo', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+
+ I.see('Some text')
+
+ I.click('$editor-toolbar-undo')
+
+ I.dontSee('Some text')
+
+ I.click('$editor-toolbar-redo')
+
+ I.see('Some text')
+})
+
+Scenario('Redo using keyboard', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+
+ I.see('Some text')
+
+ I.pressKey(['CommandOrControl', 'Z'])
+
+ I.dontSee('Some text')
+
+ // ! For some reason, the first redo does not work. The second one does. If
+ // one puts a pause() here and runs the command only once through the
+ // interactive shell , it works just as fine as clicking the button.
+ // Therefore, I thought the Ctrl+Y was maybe happening too quickly after the
+ // Ctrl+Z, but even with I.wait(1) inbetween, two executions were needed.
+ I.pressKey(['CommandOrControl', 'Y'])
+ I.pressKey(['CommandOrControl', 'Y'])
+
+ I.see('Some text')
+})
+
+Scenario('Copy/cut/paste text', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('TESTTESTTEST')
+
+ I.see('TESTTESTTEST')
+
+ for (let i = 0; i < 12; i++) {
+ I.pressKey(['Shift', 'LeftArrow'])
+ }
+
+ I.pressKey(['CommandOrControl', 'C'])
+
+ I.pressKey('Backspace')
+
+ I.dontSee('TESTTESTTEST')
+
+ I.pressKey(['CommandOrControl', 'V'])
+
+ I.see('TESTTESTTEST')
+
+ for (let i = 0; i < 12; i++) {
+ I.pressKey('Backspace')
+ }
+
+ I.type('CUTCUTCUT')
+
+ I.see('CUTCUTCUT')
+
+ for (let i = 0; i < 9; i++) {
+ I.pressKey(['Shift', 'LeftArrow'])
+ }
+
+ I.pressKey(['CommandOrControl', 'X'])
+
+ I.dontSee('CUTCUTCUT')
+
+ I.pressKey(['CommandOrControl', 'V'])
+
+ I.see('CUTCUTCUT')
+})
+
+Scenario('Empty line restrictions while typing', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click(locate('$plugin-text-editor').inside('.plugin-rows'))
+ I.type('First line')
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element').inside('.plugin-rows'),
+ 1
+ )
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element-with-placeholder').inside('.plugin-rows'),
+ 0
+ )
+
+ I.say('First Enter key press adds a new line with a placeholder')
+ I.pressKey('Enter')
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element').inside('.plugin-rows'),
+ 2
+ )
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element-with-placeholder').inside('.plugin-rows'),
+ 1
+ )
+
+ I.say('Second Enter key press adds another new line with a placeholder')
+ I.pressKey('Enter')
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element').inside('.plugin-rows'),
+ 3
+ )
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element-with-placeholder').inside('.plugin-rows'),
+ 1
+ )
+
+ I.say('Third Enter key press does not add a new line')
+ I.pressKey('Enter')
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element').inside('.plugin-rows'),
+ 3
+ )
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element-with-placeholder').inside('.plugin-rows'),
+ 1
+ )
+
+ I.say(
+ 'Text plugin blur removes one of the adjacent empty lines and hides the placeholder'
+ )
+ I.click('$plugin-multimedia-wrapper')
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element').inside('.plugin-rows'),
+ 2
+ )
+ I.seeNumberOfElements(
+ locate('$plugin-text-leaf-element-with-placeholder').inside('.plugin-rows'),
+ 0
+ )
+})
+
+// Couldn't find any info on testing paste behavior with Codecept.js
+Scenario.todo('Empty line restrictions when pasting text')
diff --git a/e2e-tests/tests/421-text-plugin-formatting-options.ts b/e2e-tests/tests/421-text-plugin-formatting-options.ts
new file mode 100644
index 0000000000..dd20a4e8ea
--- /dev/null
+++ b/e2e-tests/tests/421-text-plugin-formatting-options.ts
@@ -0,0 +1,244 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Text plugin - formatting options')
+
+Before(popupWarningFix)
+
+Scenario(
+ 'Toggle text formatting options using keyboard shortcuts',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+ I.type('Some text')
+ I.see('Some text')
+
+ I.pressKey(['CommandOrControl', 'A'])
+
+ I.say('Toggle bold on')
+ I.pressKey(['CommandOrControl', 'B'])
+ I.seeElement({ css: 'b' })
+
+ I.say('Toggle bold off')
+ I.pressKey(['CommandOrControl', 'B'])
+ I.dontSeeElement({ css: 'b' })
+
+ I.say('Toggle italic on')
+ I.pressKey(['CommandOrControl', 'I'])
+ I.seeElement({ css: 'i' })
+
+ I.say('Toggle italic off')
+ I.pressKey(['CommandOrControl', 'I'])
+ I.dontSeeElement({ css: 'i' })
+
+ I.say('Toggle link on')
+ I.pressKey(['CommandOrControl', 'K'])
+ I.type('https://de.serlo.org/mathe/1541/hypotenuse')
+ I.click('$link-suggestion-0')
+ I.click('Some text')
+ I.see('Hypotenuse')
+ I.seeElement({ css: '.serlo-editor-hacks a' })
+
+ I.say('Toggle link off')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey(['CommandOrControl', 'K'])
+ I.dontSeeElement({ css: '.serlo-editor-hacks a' })
+
+ // Clear link
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+
+ I.say('Toggle math on')
+ I.pressKey(['CommandOrControl', 'M'])
+ I.seeElement('$plugin-math-latex-editor')
+ I.type('\\frac12 test42')
+ I.pressKey('ArrowRight')
+ I.dontSee('LaTeX')
+ I.seeElement('span.katex')
+
+ I.say('Remove math element')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+ I.dontSeeElement('span.katex')
+
+ I.say('Toggle unordered list on')
+ I.type('- Some text')
+ I.see('Some text', 'ul')
+
+ I.say('Toggle unordered list off by deleting hyphen')
+ for (let i = 0; i < 9; i++) {
+ I.pressKey('LeftArrow')
+ }
+ I.pressKey('Backspace')
+ I.dontSee('Some text', 'ul')
+
+ // Clear remnants of the list
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+
+ I.say('Toggle H1 on')
+ I.type('# Some text')
+ I.see('Some text', 'h1')
+
+ I.say('Toggle H1 off')
+ for (let i = 0; i < 9; i++) {
+ I.pressKey('LeftArrow')
+ }
+ I.type('# ')
+ I.dontSee('Some text', 'h1')
+
+ I.say('Toggle H2 on')
+ I.type('## ')
+ I.see('Some text', 'h2')
+
+ I.say('Toggle H2 off')
+ for (let i = 0; i < 9; i++) {
+ I.pressKey('LeftArrow')
+ }
+ I.type('## ')
+ I.dontSee('Some text', 'h2')
+
+ I.say('Toggle H3 on')
+ I.type('### ')
+ I.see('Some text', 'h3')
+
+ I.say('Toggle H3 off')
+ for (let i = 0; i < 9; i++) {
+ I.pressKey('LeftArrow')
+ }
+ I.type('### ')
+ I.dontSee('Some text', 'h3')
+ }
+)
+
+Scenario(
+ 'Toggle text formatting options using plugin toolbar',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+
+ I.say('Toggle bold on')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.click('$plugin-toolbar-button-fett')
+ I.seeElement({ css: 'b' })
+
+ I.say('Toggle bold off')
+ I.click('$plugin-toolbar-button-fett')
+ I.dontSeeElement({ css: 'b' })
+
+ I.say('Toggle italic on')
+ I.click('$plugin-toolbar-button-kursiv')
+ I.seeElement({ css: 'i' })
+
+ I.say('Toggle italic off')
+ I.click('$plugin-toolbar-button-kursiv')
+ I.dontSeeElement({ css: 'i' })
+
+ I.say('Toggle code on')
+ I.click('$plugin-toolbar-button-code')
+ I.see('Some text', 'code')
+ I.seeElement({ css: '.serlo-editor-hacks code' })
+
+ I.say('Toggle code off')
+ I.click('$plugin-toolbar-button-code')
+ I.dontSeeElement({ css: '.serlo-editor-hacks code' })
+
+ I.say('Toggle link on')
+ I.click('$plugin-toolbar-button-link')
+ I.type('https://de.serlo.org/mathe/1541/hypotenuse')
+ // select the very first suggestion (index 0)
+ I.click('$link-suggestion-0')
+ I.seeElement({ css: '.serlo-editor-hacks a' })
+
+ I.say('Refocus link')
+ I.click('Some text')
+ I.see('Hypotenuse')
+
+ I.say('Toggle link off via plugin bar')
+ I.click('Some text')
+ I.click('$plugin-toolbar-button-link')
+ I.dontSeeElement({ css: '.serlo-editor-hacks a' })
+
+ I.say('Toggle unordered list on')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.click('$plugin-toolbar-button-aufzählung')
+ I.see('Some text', 'ul')
+
+ I.say('Toggle unordered list off')
+ I.click('$plugin-toolbar-button-aufzählung')
+ I.dontSee('Some text', 'ul')
+
+ I.say('Toggle ordered list on')
+ I.click('$plugin-toolbar-button-nummerierte-liste')
+ I.see('Some text', 'ol')
+
+ I.say('Toggle ordered list off')
+ I.click('$plugin-toolbar-button-nummerierte-liste')
+ I.dontSeeElement({ css: '.serlo-editor-hacks ol' })
+
+ I.say('Toggle H1 on')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-1')
+ I.see('Some text', 'h1')
+
+ I.say('Toggle H1 off')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-1')
+ I.dontSee('Some text', 'h1')
+
+ I.say('Toggle H2 on')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-2')
+ I.see('Some text', 'h2')
+
+ I.say('Toggle H2 off')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-2')
+ I.dontSee('Some text', 'h2')
+
+ I.say('Toggle H3 on')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-3')
+ I.see('Some text', 'h3')
+
+ I.say('Toggle H3 off')
+ I.click('$plugin-toolbar-button-überschriften')
+ I.click('$plugin-toolbar-heading-3')
+ I.dontSee('Some text', 'h3')
+
+ I.say('Change text color to orange')
+ I.click('$plugin-toolbar-button-textfarben')
+ I.click('$plugin-toolbar-button-orange')
+ I.seeElement('span[style="color: rgb(255, 102, 0);"]')
+
+ I.say('Reset color')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.click('$plugin-toolbar-button-textfarben')
+ I.click('$plugin-toolbar-button-farbe-zurücksetzen')
+ I.dontSeeElement('span[style="color: rgb(255, 102, 0);"]')
+
+ I.say('Toggle math on')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+ I.click('$plugin-toolbar-button-matheformel')
+ I.seeElement('$plugin-math-latex-editor')
+
+ I.type('\\frac12')
+ I.pressKey('ArrowRight')
+ I.dontSee('LaTeX')
+ I.seeElement('span.katex')
+
+ I.say('Toggle math off')
+ // show LaTeX editor again to remove it upon clicking into the toolbar
+ I.pressKey('ArrowLeft')
+ I.see('LaTeX')
+ I.click('$plugin-toolbar-button-matheformel')
+ I.dontSeeElement('span.katex')
+ }
+)
diff --git a/e2e-tests/tests/422-text-plugin-math.ts b/e2e-tests/tests/422-text-plugin-math.ts
new file mode 100644
index 0000000000..269cd0cdaa
--- /dev/null
+++ b/e2e-tests/tests/422-text-plugin-math.ts
@@ -0,0 +1,78 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Text plugin - math formula')
+
+Before(popupWarningFix)
+
+Scenario('Add a math formula', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.type('Some text ')
+ I.pressKey(['CommandOrControl', 'M'])
+
+ I.seeElement('$plugin-math-latex-editor')
+ I.type('\\frac12')
+})
+
+Scenario('Close math formula using arrow keys', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.type('Some text ')
+ I.pressKey(['CommandOrControl', 'M'])
+ I.type('\\frac12')
+
+ I.say('Close math editor with cursor at the end and ArrowRight')
+ I.pressKey('ArrowRight')
+ I.dontSee('LaTeX')
+ I.seeElement('span.katex')
+
+ I.say('Refocus math editor')
+
+ // Codecept tries to scroll into view, but this causes sticky header to hide element
+ I.forceClick('span.katex')
+ I.seeElement('$plugin-math-latex-editor')
+
+ I.say('Close math editor with cursor at the start and ArrowLeft')
+ I.pressKey('Home')
+ I.pressKey('ArrowLeft')
+ I.dontSee('LaTeX')
+ I.seeElement('span.katex')
+})
+
+Scenario('Close math formula using Escape', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.type('Some text ')
+ I.pressKey(['CommandOrControl', 'M'])
+ I.type('\\frac12')
+
+ I.say('Close math editor with ESC key')
+ I.pressKey('Escape')
+ I.dontSee('LaTeX')
+ I.seeElement('span.katex')
+})
+
+Scenario('Close math formula using close button', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.type('Some text ')
+ I.pressKey(['CommandOrControl', 'M'])
+ I.type('\\frac12')
+
+ I.say('Close math editor with close button')
+ I.click('$plugin-math-close-formula-editor')
+ I.dontSeeElement('$plugin-math-latex-editor')
+ I.seeElement('span.katex')
+})
diff --git a/e2e-tests/tests/423-text-plugin-list.ts b/e2e-tests/tests/423-text-plugin-list.ts
new file mode 100644
index 0000000000..fd1c2d6219
--- /dev/null
+++ b/e2e-tests/tests/423-text-plugin-list.ts
@@ -0,0 +1,96 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Text plugin - list')
+
+Before(popupWarningFix)
+
+Scenario('Unordered list shortcuts (indentation missing)', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.say('Add a new text plugin and delete the backslash')
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.say('Create an unordered list')
+ I.type('- Some text')
+ I.see('Some text', 'ul')
+
+ I.say('Add new list item on Enter')
+ I.pressKey('Enter')
+ I.type('Some more text')
+ I.see('Some more text', 'ul')
+
+ I.say('Indent list item on Tab')
+ I.dontSee('ul > li > ul > li')
+ I.pressKey('Tab')
+ I.seeElement({ css: 'ul > li > ul > li' })
+
+ I.say('Unindent list item on Shift+Tab')
+ I.pressKey(['Shift', 'Tab'])
+ I.dontSeeElement({ css: 'ul > li > ul > li' })
+
+ I.say('Exit the list on double Enter')
+ I.pressKey('Enter')
+ I.pressKey('Enter')
+ I.type('Exit the list')
+ I.dontSee('Exit the list', 'ul')
+
+ I.say('Clear Text in list')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+ I.seeElement({
+ css: '.serlo-editor-hacks div[data-slate-editor="true"] ul:not(.unstyled-list)',
+ })
+
+ I.say('Remove empty list item on backspace')
+ I.pressKey('Backspace')
+ I.dontSeeElement({
+ css: '.serlo-editor-hacks div[data-slate-editor="true"] ul:not(.unstyled-list)',
+ })
+})
+
+Scenario('Ordered list shortcuts', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.say('Add a new text plugin and delete the backslash')
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.say('Create an ordered list')
+ I.type('First list item')
+ I.click('$plugin-toolbar-button-nummerierte-liste')
+ I.see('First list item', 'ol')
+
+ I.say('Add new list item on Enter')
+ I.pressKey('Enter')
+ I.type('Second list item')
+ I.see('Second list item', 'ol')
+
+ I.say('Indent list item on Tab')
+ I.dontSee('ol > li > ul > li')
+ I.pressKey('Tab')
+ I.seeElement({ css: 'ol > li > ul > li' })
+
+ I.say('Unindent list item on Shift+Tab')
+ I.pressKey(['Shift', 'Tab'])
+ I.dontSeeElement({ css: 'ol > li > ul > li' })
+
+ I.say('Exit the list on double Enter')
+ I.pressKey('Enter')
+ I.pressKey('Enter')
+ I.type('Exit the list')
+ I.dontSee('Exit the list', 'ol')
+
+ I.say('Clear Text in list')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.pressKey('Backspace')
+ I.seeElement({
+ css: '.serlo-editor-hacks div[data-slate-editor="true"] ol:not(.unstyled-list)',
+ })
+
+ I.say('Remove empty list item on backspace')
+ I.pressKey('Backspace')
+ I.dontSeeElement({
+ css: '.serlo-editor-hacks div[data-slate-editor="true"] ol:not(.unstyled-list)',
+ })
+})
diff --git a/e2e-tests/tests/424-text-plugin-link.ts b/e2e-tests/tests/424-text-plugin-link.ts
new file mode 100644
index 0000000000..f05d491a65
--- /dev/null
+++ b/e2e-tests/tests/424-text-plugin-link.ts
@@ -0,0 +1,111 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Text plugin - link')
+
+Before(popupWarningFix)
+
+Scenario('Add a link using link suggestion menu', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.say('Create text of link and select it')
+ I.type('Some text')
+ I.pressKey(['CommandOrControl', 'A'])
+
+ I.say('Toggle link on')
+ I.click('$plugin-toolbar-button-link')
+
+ // Should find a plentitude of link suggestions (most likely way more than 3)
+ I.say('Search for math articles')
+ I.type('Math')
+ I.seeElement('$link-suggestion-0')
+ I.seeElement('$link-suggestion-1')
+ I.seeElement('$link-suggestion-2')
+
+ I.say('Navigate through the link suggestion menu and assert the a11y')
+ I.seeAttributesOnElements('$link-suggestion-0', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$link-suggestion-1', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-2', { 'aria-selected': 'false' })
+
+ I.pressKey('ArrowDown')
+ I.seeAttributesOnElements('$link-suggestion-0', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-1', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$link-suggestion-2', { 'aria-selected': 'false' })
+
+ I.pressKey('ArrowDown')
+ I.seeAttributesOnElements('$link-suggestion-0', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-1', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-2', { 'aria-selected': 'true' })
+
+ I.pressKey('ArrowUp')
+ I.seeAttributesOnElements('$link-suggestion-0', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-1', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$link-suggestion-2', { 'aria-selected': 'false' })
+
+ I.say(
+ 'Hovering on a different suggestion than the selected one should not change aria-selected'
+ )
+ I.moveCursorTo('$link-suggestion-0')
+ I.seeAttributesOnElements('$link-suggestion-0', { 'aria-selected': 'false' })
+ I.seeAttributesOnElements('$link-suggestion-1', { 'aria-selected': 'true' })
+ I.seeAttributesOnElements('$link-suggestion-2', { 'aria-selected': 'false' })
+
+ I.say('Select first suggestion')
+ I.click('$link-suggestion-0')
+ I.seeElement({ css: '.serlo-editor-hacks a' })
+})
+
+Scenario('Edit existing link', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.say('Create a link')
+ I.type('Some text')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.click('$plugin-toolbar-button-link')
+ I.type('Math')
+ I.seeElement('$link-suggestion-1')
+ I.pressKey('ArrowDown')
+ I.pressKey('Enter')
+ I.seeElement(
+ locate({ css: '.serlo-editor-hacks a' }).withAttr({ href: '/83249' })
+ )
+
+ I.say('Click edit button')
+ I.click('Some text')
+ I.click('$edit-link-button')
+
+ I.say('Change the link href value')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.type('Geo')
+ I.seeElement('$link-suggestion-1')
+ I.pressKey('ArrowDown')
+ I.pressKey('Enter')
+ I.seeElement(
+ locate({ css: '.serlo-editor-hacks a' }).withAttr({ href: '/274643' })
+ )
+})
+
+Scenario('Remove existing link', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('$add-new-plugin-row-button')
+ I.pressKey('Backspace')
+
+ I.say('Create a link')
+ I.type('Some text')
+ I.pressKey(['CommandOrControl', 'A'])
+ I.click('$plugin-toolbar-button-link')
+ I.type('Math')
+ I.click('$link-suggestion-0')
+ I.seeElement({ css: '.serlo-editor-hacks a' })
+
+ I.say('Remove link using the remove link button')
+ I.click('Some text')
+ I.click('$remove-link-button')
+ I.dontSeeElement({ css: '.serlo-editor-hacks a' })
+})
diff --git a/e2e-tests/tests/430-multimedia-plugin.ts b/e2e-tests/tests/430-multimedia-plugin.ts
new file mode 100644
index 0000000000..c1c6cde353
--- /dev/null
+++ b/e2e-tests/tests/430-multimedia-plugin.ts
@@ -0,0 +1,61 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Multimedia plugin')
+
+Before(popupWarningFix)
+
+export async function addMultimediaPlugin(I: CodeceptJS.I) {
+ // Ensure that only the Multimedia plugin from article introduction is present
+ I.seeNumberOfElements('$plugin-multimedia-wrapper', 1)
+
+ I.say('Replace default Text plugin with a Multimedia plugin')
+ I.click(locate('$plugin-text-editor').inside('.plugin-rows'))
+ I.type('/')
+ I.type('Multimedia')
+ I.pressKey('Enter')
+ I.seeNumberOfElements('$plugin-multimedia-wrapper', 2)
+}
+
+Scenario('Multimedia plugin toolbar controls', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addMultimediaPlugin(I)
+
+ // When adding a new Multimedia plugin, the caption of its Image plugin is focused.
+ // In order to focus the actual Multimedia plugin, click the parent indicator.
+ I.click('$plugin-multimedia-parent-button')
+
+ I.say('Change the size of the multimedia content')
+ I.click('$plugin-multimedia-settings-button')
+ I.seeAttributesOnElements('$plugin-multimedia-size-button-50', {
+ 'aria-selected': 'true',
+ })
+ I.seeAttributesOnElements('$plugin-multimedia-size-button-25', {
+ 'aria-selected': 'false',
+ })
+ I.click('$plugin-multimedia-size-button-25')
+ I.seeAttributesOnElements('$plugin-multimedia-size-button-50', {
+ 'aria-selected': 'false',
+ })
+ I.seeAttributesOnElements('$plugin-multimedia-size-button-25', {
+ 'aria-selected': 'true',
+ })
+ I.click('$modal-close-button')
+ I.seeElement('.media-wrapper.mobile\\:w-1\\/4')
+
+ I.say('Change the type of the multimedia content to video')
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Video')
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('$plugin-video-placeholder').inside('$plugin-multimedia-wrapper')
+ )
+
+ I.say('Change the type of the multimedia content to GeoGebra')
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'GeoGebra Applet')
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('$plugin-geogebra-placeholder').inside('$plugin-multimedia-wrapper')
+ )
+})
diff --git a/e2e-tests/tests/431-multimedia-plugin-image.ts b/e2e-tests/tests/431-multimedia-plugin-image.ts
new file mode 100644
index 0000000000..78c1763693
--- /dev/null
+++ b/e2e-tests/tests/431-multimedia-plugin-image.ts
@@ -0,0 +1,180 @@
+import { addMultimediaPlugin } from './430-multimedia-plugin'
+
+Feature('Serlo Editor - Multimedia plugin - image multimedia type')
+
+Before(({ login }) => {
+ login('admin')
+})
+
+// Currently, we're not displaying any messages when users try to upload image
+// while not logged in. This scenario should be added when that is implemented.
+Scenario.todo('Multimedia plugin unauthorized image upload')
+
+// To test this with the current approach, we would need to host a big image
+// in this repo. Is it worth it?
+Scenario.todo('Multimedia plugin too big image upload')
+
+Scenario('Multimedia plugin successful image upload', ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addMultimediaPlugin(I)
+
+ I.say('Focus multimedia Image plugin')
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ I.seeElement('$plugin-image-placeholder')
+
+ I.say('Upload an image')
+ I.attachFile('$plugin-image-upload', 'assets/sample-image.png')
+ I.waitForElement('img.serlo-img', 10)
+ I.dontSeeElement(locate('$plugin-image-placeholder').inside('plugin-rows'))
+
+ I.say('Edit image description')
+ const description = 'Simple sample image'
+ I.click('$plugin-image-settings')
+ I.fillField('Beschreibung (wird nicht angezeigt)', description)
+ I.click('$modal-close-button')
+ I.seeElement(locate('img.serlo-img').withAttr({ alt: description }))
+
+ I.say('Edit image link')
+ const href = 'https://de.serlo.org/mathe/test'
+ I.click('$plugin-image-settings')
+ I.fillField('Link', href)
+ I.fillField('Maximale Breite', 200)
+ I.click('$modal-close-button')
+ I.seeElement(locate('$plugin-image-link').withAttr({ href }))
+
+ I.say('Edit image max width')
+ const maxWidth = 200
+ I.click('$plugin-image-settings')
+ I.fillField('Maximale Breite', maxWidth)
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('.mx-auto').withAttr({ style: `max-width: ${maxWidth}px;` })
+ )
+
+ I.say(
+ 'Switch to video and back to image - uploaded image and settings should stay'
+ )
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ I.click('$plugin-multimedia-parent-button')
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Video')
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('$plugin-video-placeholder').inside('$plugin-multimedia-wrapper')
+ )
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Bild')
+ I.click('$modal-close-button')
+ I.seeElement(locate('img.serlo-img').withAttr({ alt: description }))
+ I.seeElement(locate('$plugin-image-link').withAttr({ href }))
+ I.seeElement(
+ locate('.mx-auto').withAttr({ style: `max-width: ${maxWidth}px;` })
+ )
+})
+
+Scenario('Multimedia plugin invalid image URL', ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addMultimediaPlugin(I)
+
+ I.say('Type in the image src')
+ // Focus the image plugin to make the src input visible
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ // Focus the src input
+ I.click(locate('$plugin-image-src').inside('.plugin-rows'))
+ I.type('https://de.serlo.org/_assets/img/serlo-logo')
+ // Unfortunately, our handling of invalid URLs is the same as handling of valid URLs, at the moment.
+ // I couldn't figure out how to test for default browser "broken image".
+ I.seeElement(
+ locate('img.serlo-img').withAttr({
+ src: 'https://de.serlo.org/_assets/img/serlo-logo',
+ })
+ )
+ I.dontSeeElement(locate('$plugin-image-placeholder').inside('plugin-rows'))
+})
+
+Scenario('Multimedia plugin valid image URL', ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addMultimediaPlugin(I)
+
+ I.say('Type in the image src')
+ const src = 'https://de.serlo.org/_assets/img/serlo-logo.svg'
+ // Focus the image plugin to make the src input visible
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ // Focus the src input
+ I.click(locate('$plugin-image-src').inside('.plugin-rows'))
+ I.type(src)
+ I.seeElement(locate('img.serlo-img').withAttr({ src }))
+ I.dontSeeElement(locate('$plugin-image-placeholder').inside('plugin-rows'))
+
+ I.say('Edit image description')
+ const description = 'Simple sample image'
+ I.click('$plugin-image-settings')
+ I.fillField('Beschreibung (wird nicht angezeigt)', description)
+ I.click('$modal-close-button')
+ I.seeElement(locate('img.serlo-img').withAttr({ alt: description }))
+
+ I.say('Edit image link')
+ const link = 'https://de.serlo.org/mathe/test'
+ I.click('$plugin-image-settings')
+ I.fillField('Link', link)
+ I.fillField('Maximale Breite', 200)
+ I.click('$modal-close-button')
+ I.seeElement(locate('$plugin-image-link').withAttr({ href: link }))
+
+ I.say('Edit image max width')
+ const maxWidth = 200
+ I.click('$plugin-image-settings')
+ I.fillField('Maximale Breite', maxWidth)
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('.mx-auto').withAttr({ style: `max-width: ${maxWidth}px;` })
+ )
+
+ I.say('Switch to video and back to image - image and settings should stay')
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ I.click('$plugin-multimedia-parent-button')
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Video')
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('$plugin-video-placeholder').inside('$plugin-multimedia-wrapper')
+ )
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Bild')
+ I.click('$modal-close-button')
+ I.seeElement(locate('img.serlo-img').withAttr({ src }))
+ I.seeElement(locate('img.serlo-img').withAttr({ alt: description }))
+ I.seeElement(locate('$plugin-image-link').withAttr({ href: link }))
+ I.seeElement(
+ locate('.mx-auto').withAttr({ style: `max-width: ${maxWidth}px;` })
+ )
+})
+
+Scenario('Multimedia plugin fill in image caption', ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addMultimediaPlugin(I)
+
+ I.say('Type in the caption')
+ const caption = 'Pleasant image caption'
+ I.click(locate('$plugin-text-editor').inside('$plugin-image-editor'))
+ I.type(caption)
+ I.see(caption, locate('$plugin-text-editor').inside('$plugin-image-editor'))
+
+ I.say('Switch to video and back to image - caption should stay')
+ I.click(locate('$plugin-image-editor').inside('.plugin-rows'))
+ I.click('$plugin-multimedia-parent-button')
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Video')
+ I.click('$modal-close-button')
+ I.seeElement(
+ locate('$plugin-video-placeholder').inside('$plugin-multimedia-wrapper')
+ )
+ I.click('$plugin-multimedia-settings-button')
+ I.selectOption('$plugin-multimedia-type-select', 'Bild')
+ I.click('$modal-close-button')
+ I.see(caption, locate('$plugin-text-editor').inside('$plugin-image-editor'))
+})
diff --git a/e2e-tests/tests/440-box-plugin.ts b/e2e-tests/tests/440-box-plugin.ts
new file mode 100644
index 0000000000..278939ff2c
--- /dev/null
+++ b/e2e-tests/tests/440-box-plugin.ts
@@ -0,0 +1,139 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - Box plugin')
+
+Before(popupWarningFix)
+
+async function addBoxPlugin(I: CodeceptJS.I, type: string) {
+ I.say('Create box plugin and set type')
+ I.click('$plugin-text-editor', '$plugin-article-content')
+ I.type('/')
+ I.type('Box')
+ I.pressKey('Enter')
+ I.seeElement('$plugin-box-initial-type-chooser')
+ I.click(`$plugin-box-initial-type-chooser-option-${type}`)
+}
+
+Scenario('Create box plugin and set initial type', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ addBoxPlugin(I, 'attention')
+
+ I.seeElement('$plugin-box') // Box plugin still there
+ I.dontSeeElement('$plugin-box-initial-type-chooser') // Box initial type chooser gone
+ I.see('Vorsicht') // Box type is Vorsicht
+ // TODO: Check if focused & toolbar visible
+})
+
+Scenario('Change box type in toolbar', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Change box type')
+ I.selectOption('$plugin-box-type-chooser', 'quote')
+
+ I.seeElement('$plugin-box')
+ I.see('Zitat')
+})
+
+Scenario('Type inside box title', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Type inside box title.')
+ I.click('$plugin-text-editor', '$plugin-box-title')
+ I.type('Boxtitel')
+
+ I.see('Boxtitel', '$plugin-box-title')
+})
+
+Scenario('Type inside box content', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Type inside box content')
+ I.click('$plugin-text-editor', '$plugin-box-content')
+ I.type('Boxinhalt')
+
+ I.see('Boxinhalt', '$plugin-box-content')
+})
+
+Scenario(
+ 'Arrow keys can be used to switch between title and content',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Switch between title and content')
+ I.click('$plugin-text-editor', '$plugin-box-title')
+ I.pressKey('ArrowDown')
+ I.type('Boxinhalt')
+ I.pressKey('ArrowUp') // Set cursor to start of content text
+ I.pressKey('ArrowUp') // Move cursor to box title
+ I.type('Boxtitel')
+
+ I.see('Boxtitel', '$plugin-box-title')
+ I.see('Boxinhalt', '$plugin-box-content')
+ }
+)
+
+Scenario(
+ 'Empty box warning message appears when box content is empty',
+ async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Empty warning message visible after creating new box')
+ I.click('input[placeholder="Titel"]') // unfocus box plugin
+ I.seeElement('$plugin-box-empty-content-warning')
+
+ I.say('Empty warning message visible even if title is not empty')
+ I.click('$plugin-text-editor', '$plugin-box-title')
+ I.type('Boxtitel')
+ I.click('input[placeholder="Titel"]') // unfocus box plugin
+ I.seeElement('$plugin-box-empty-content-warning')
+
+ I.say('Empty warning message not visible if content not empty')
+ I.click('$plugin-text-editor', '$plugin-box-content')
+ I.type('Boxinhalt')
+ I.click('input[placeholder="Titel"]') // unfocus box plugin
+ I.dontSeeElement('$plugin-box-empty-content-warning')
+ }
+)
+
+Scenario('Set box type using keyboard', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.say('Create box plugin')
+ I.click('$plugin-text-editor', '$plugin-article-content')
+ I.type('/')
+ I.type('Box')
+ I.pressKey('Enter')
+ I.seeElement('$plugin-box-initial-type-chooser')
+
+ I.say('Use the Tab key to select a box type')
+ I.pressKey('Tab')
+ I.pressKey('Tab')
+ I.pressKey('Enter')
+ I.see('Beispiel', locate('span.text-brand').inside('$plugin-box'))
+ I.dontSeeElement('$plugin-box-initial-type-chooser')
+})
+
+Scenario('Move between box title and content with Tab', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+ addBoxPlugin(I, 'blank')
+
+ I.say('Select the box title')
+ I.click('$plugin-text-editor', '$plugin-box-title')
+ I.type('Boxtitel')
+
+ I.say('Move to the box content with Tab')
+ // Selects the row drag button of the box content first
+ I.pressKey('Tab')
+ // Selects the box content
+ I.pressKey('Tab')
+ I.type('Boxinhalt')
+
+ I.see('Boxtitel', '$plugin-box-title')
+ I.see('Boxinhalt', '$plugin-box-content')
+})
diff --git a/e2e-tests/tests/490-save-changes.ts b/e2e-tests/tests/490-save-changes.ts
new file mode 100644
index 0000000000..01e9b795fe
--- /dev/null
+++ b/e2e-tests/tests/490-save-changes.ts
@@ -0,0 +1,32 @@
+import { popupWarningFix } from './helpers/popup-warning-fix'
+
+Feature('Serlo Editor - save changes')
+
+Before(popupWarningFix)
+
+Scenario('Save changes', async ({ I }) => {
+ I.amOnPage('/entity/create/Article/1377')
+
+ I.click('h1')
+
+ I.type('Test save changes')
+
+ I.click('$add-new-plugin-row-button')
+
+ I.pressKey('Backspace')
+
+ I.type('Some text')
+
+ I.see('Some text')
+
+ I.click('button.serlo-button-green.ml-2')
+
+ I.see('Beschreibe deine Änderungen am Inhalt')
+
+ // Use class instead of text because text is super long and not reliable
+ I.click('.license-wrapper')
+
+ I.fillField('label textarea', 'I wrote some Text')
+ I.click('button.serlo-button.ml-2.serlo-button-green')
+ I.dontSee('Bitte alle Pflichtfelder ausfüllen')
+})
diff --git a/e2e-tests/tests/helpers/popup-warning-fix.ts b/e2e-tests/tests/helpers/popup-warning-fix.ts
new file mode 100644
index 0000000000..18d81f828c
--- /dev/null
+++ b/e2e-tests/tests/helpers/popup-warning-fix.ts
@@ -0,0 +1,8 @@
+// Fixes warning "Popup already exists and was not closed. Popups must always be
+// closed by calling either I.acceptPopup() or I.cancelPopup()"
+export const popupWarningFix = async ({ I }) => {
+ I.executeScript(() => {
+ window.onbeforeunload = null
+ })
+ I.refreshPage()
+}
diff --git a/e2e-tests/tsconfig.json b/e2e-tests/tsconfig.json
new file mode 100644
index 0000000000..a87ba62fe8
--- /dev/null
+++ b/e2e-tests/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "ts-node": {
+ "files": true
+ },
+ "compilerOptions": {
+ "target": "es2018",
+ "lib": ["es2018", "DOM"],
+ "esModuleInterop": true,
+ "module": "commonjs",
+ "strictNullChecks": false,
+ "types": ["codeceptjs", "node"],
+ "declaration": true,
+ "skipLibCheck": true
+ },
+ "exclude": ["node_modules"]
+}
diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock
new file mode 100644
index 0000000000..1340824f1f
--- /dev/null
+++ b/e2e-tests/yarn.lock
@@ -0,0 +1,2945 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 6
+ cacheKey: 8
+
+"@babel/helper-string-parser@npm:^7.23.4":
+ version: 7.23.4
+ resolution: "@babel/helper-string-parser@npm:7.23.4"
+ checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90
+ languageName: node
+ linkType: hard
+
+"@babel/helper-validator-identifier@npm:^7.22.20":
+ version: 7.22.20
+ resolution: "@babel/helper-validator-identifier@npm:7.22.20"
+ checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc
+ languageName: node
+ linkType: hard
+
+"@babel/parser@npm:^7.8.3":
+ version: 7.23.6
+ resolution: "@babel/parser@npm:7.23.6"
+ bin:
+ parser: ./bin/babel-parser.js
+ checksum: 140801c43731a6c41fd193f5c02bc71fd647a0360ca616b23d2db8be4b9739b9f951a03fc7c2db4f9b9214f4b27c1074db0f18bc3fa653783082d5af7c8860d5
+ languageName: node
+ linkType: hard
+
+"@babel/types@npm:^7.8.3":
+ version: 7.23.6
+ resolution: "@babel/types@npm:7.23.6"
+ dependencies:
+ "@babel/helper-string-parser": ^7.23.4
+ "@babel/helper-validator-identifier": ^7.22.20
+ to-fast-properties: ^2.0.0
+ checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0
+ languageName: node
+ linkType: hard
+
+"@codeceptjs/configure@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "@codeceptjs/configure@npm:0.8.0"
+ dependencies:
+ lodash.merge: ^4.6.2
+ lodash.mergewith: ^4.6.2
+ checksum: ec530dcf16a04c9484ee65be88887ad46f4a4b700da7679abe9aa57581f2c43ce156361926f82c0d8c5b63e724e650ea9ea7e71c4af76af55e260a2ab0c8509d
+ languageName: node
+ linkType: hard
+
+"@codeceptjs/helper@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "@codeceptjs/helper@npm:1.0.2"
+ checksum: e1f9bdc76c2cf30ef46654c90db83a6cca9ff1e545a0b7a0f41e29fa15c9bfcf66058fd8b0c41d172f7d3ecca0bf07922f0c55db63365c803968e369108233c5
+ languageName: node
+ linkType: hard
+
+"@cspotcode/source-map-support@npm:^0.8.0":
+ version: 0.8.1
+ resolution: "@cspotcode/source-map-support@npm:0.8.1"
+ dependencies:
+ "@jridgewell/trace-mapping": 0.3.9
+ checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa
+ languageName: node
+ linkType: hard
+
+"@cucumber/cucumber-expressions@npm:^16":
+ version: 16.1.2
+ resolution: "@cucumber/cucumber-expressions@npm:16.1.2"
+ dependencies:
+ regexp-match-indices: 1.0.2
+ checksum: 636a903a748da18d256097f898eac848ec352943507a02808cff71de9a713d47f7c214f9df45ea9e673e7b8f29d5708cf17c196bc80651fbab5d97e93c930b08
+ languageName: node
+ linkType: hard
+
+"@cucumber/gherkin@npm:^26":
+ version: 26.2.0
+ resolution: "@cucumber/gherkin@npm:26.2.0"
+ dependencies:
+ "@cucumber/messages": ">=19.1.4 <=22"
+ checksum: d7bcc12fe50dd8dba6897f03ec41ae8e4a51d1582f72e55fa57137a449bd03e2ecab360ba9674fb00a17fc8482f784a45482e69e1df06f2786520e5e20e4083e
+ languageName: node
+ linkType: hard
+
+"@cucumber/messages@npm:>=19.1.4 <=22":
+ version: 22.0.0
+ resolution: "@cucumber/messages@npm:22.0.0"
+ dependencies:
+ "@types/uuid": 9.0.1
+ class-transformer: 0.5.1
+ reflect-metadata: 0.1.13
+ uuid: 9.0.0
+ checksum: e9e8f3bda063ad87c23e2e5daed9e2965fb3e65c08ad5d27213d0f63d0e12574b27b2834d9360f958ad4418f7f5f22f5d78d63e45da52356ee8dfeaa3153e56c
+ languageName: node
+ linkType: hard
+
+"@cucumber/messages@npm:^21.0.1":
+ version: 21.0.1
+ resolution: "@cucumber/messages@npm:21.0.1"
+ dependencies:
+ "@types/uuid": 8.3.4
+ class-transformer: 0.5.1
+ reflect-metadata: 0.1.13
+ uuid: 9.0.0
+ checksum: 01849f35bb38593a3833174e141b78b576e70128be015ebd2e61a86cf0c0e4e43a15ff38ce2a3c6404b5e99dc9cd6b269b8bcb4d014f2e023bf968fe70fdc867
+ languageName: node
+ linkType: hard
+
+"@hapi/hoek@npm:^9.0.0":
+ version: 9.3.0
+ resolution: "@hapi/hoek@npm:9.3.0"
+ checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43
+ languageName: node
+ linkType: hard
+
+"@hapi/topo@npm:^5.0.0":
+ version: 5.1.0
+ resolution: "@hapi/topo@npm:5.1.0"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014
+ languageName: node
+ linkType: hard
+
+"@isaacs/cliui@npm:^8.0.2":
+ version: 8.0.2
+ resolution: "@isaacs/cliui@npm:8.0.2"
+ 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"
+ checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb
+ languageName: node
+ linkType: hard
+
+"@jridgewell/resolve-uri@npm:^3.0.3":
+ version: 3.1.1
+ resolution: "@jridgewell/resolve-uri@npm:3.1.1"
+ checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653
+ languageName: node
+ linkType: hard
+
+"@jridgewell/sourcemap-codec@npm:^1.4.10":
+ version: 1.4.15
+ resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
+ checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
+ languageName: node
+ linkType: hard
+
+"@jridgewell/trace-mapping@npm:0.3.9":
+ version: 0.3.9
+ resolution: "@jridgewell/trace-mapping@npm:0.3.9"
+ dependencies:
+ "@jridgewell/resolve-uri": ^3.0.3
+ "@jridgewell/sourcemap-codec": ^1.4.10
+ checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef
+ languageName: node
+ linkType: hard
+
+"@npmcli/agent@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "@npmcli/agent@npm:2.2.0"
+ dependencies:
+ agent-base: ^7.1.0
+ http-proxy-agent: ^7.0.0
+ https-proxy-agent: ^7.0.1
+ lru-cache: ^10.0.1
+ socks-proxy-agent: ^8.0.1
+ checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4
+ languageName: node
+ linkType: hard
+
+"@npmcli/fs@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "@npmcli/fs@npm:3.1.0"
+ dependencies:
+ semver: ^7.3.5
+ checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e
+ languageName: node
+ linkType: hard
+
+"@one-ini/wasm@npm:0.1.1":
+ version: 0.1.1
+ resolution: "@one-ini/wasm@npm:0.1.1"
+ checksum: 11de17108eae57c797e552e36b259398aede999b4a689d78be6459652edc37f3428472410590a9d328011a8751b771063a5648dd5c4205631c55d1d58e313156
+ languageName: node
+ linkType: hard
+
+"@pkgjs/parseargs@npm:^0.11.0":
+ version: 0.11.0
+ resolution: "@pkgjs/parseargs@npm:0.11.0"
+ checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f
+ languageName: node
+ linkType: hard
+
+"@serlo/e2e-tests@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "@serlo/e2e-tests@workspace:."
+ dependencies:
+ "@types/node": ^18.16.19
+ codeceptjs: 3.5.2
+ cross-env: ^7.0.3
+ dotenv: ^16.3.1
+ playwright: 1.36.0
+ ts-node: ^10.9.1
+ typescript: ^5.1.6
+ languageName: unknown
+ linkType: soft
+
+"@sideway/address@npm:^4.1.3":
+ version: 4.1.4
+ resolution: "@sideway/address@npm:4.1.4"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb
+ languageName: node
+ linkType: hard
+
+"@sideway/formula@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "@sideway/formula@npm:3.0.1"
+ checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a
+ languageName: node
+ linkType: hard
+
+"@sideway/pinpoint@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "@sideway/pinpoint@npm:2.0.0"
+ checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2
+ languageName: node
+ linkType: hard
+
+"@tsconfig/node10@npm:^1.0.7":
+ version: 1.0.9
+ resolution: "@tsconfig/node10@npm:1.0.9"
+ checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df
+ languageName: node
+ linkType: hard
+
+"@tsconfig/node12@npm:^1.0.7":
+ version: 1.0.11
+ resolution: "@tsconfig/node12@npm:1.0.11"
+ checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a
+ languageName: node
+ linkType: hard
+
+"@tsconfig/node14@npm:^1.0.0":
+ version: 1.0.3
+ resolution: "@tsconfig/node14@npm:1.0.3"
+ checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d
+ languageName: node
+ linkType: hard
+
+"@tsconfig/node16@npm:^1.0.2":
+ version: 1.0.4
+ resolution: "@tsconfig/node16@npm:1.0.4"
+ checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:^18.16.19":
+ version: 18.19.3
+ resolution: "@types/node@npm:18.19.3"
+ dependencies:
+ undici-types: ~5.26.4
+ checksum: 58c4fa45a78fcec75c78182a4b266395905957633654eb0311c5f9c30ac15c179ea2287ab1af034e46c2db7bb0589ef0000ee64c1de8f568a0aad29eaadb100c
+ languageName: node
+ linkType: hard
+
+"@types/uuid@npm:8.3.4":
+ version: 8.3.4
+ resolution: "@types/uuid@npm:8.3.4"
+ checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f
+ languageName: node
+ linkType: hard
+
+"@types/uuid@npm:9.0.1":
+ version: 9.0.1
+ resolution: "@types/uuid@npm:9.0.1"
+ checksum: c472b8a77cbeded4bc529220b8611afa39bd64677f507838f8083d8aac8033b1f88cb9ddaa2f8589e0dcd2317291d0f6e1379f82d5ceebd6f74f3b4825288e00
+ languageName: node
+ linkType: hard
+
+"@xmldom/xmldom@npm:^0.7.9":
+ version: 0.7.13
+ resolution: "@xmldom/xmldom@npm:0.7.13"
+ checksum: b4054078530e5fa8ede9677425deff0fce6d965f4c477ca73f8490d8a089e60b8498a15560425a1335f5ff99ecb851ed2c734b0a9a879299a5694302f212f37a
+ languageName: node
+ linkType: hard
+
+"abbrev@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "abbrev@npm:2.0.0"
+ checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36
+ languageName: node
+ linkType: hard
+
+"acorn-walk@npm:^8.1.1":
+ version: 8.3.1
+ resolution: "acorn-walk@npm:8.3.1"
+ checksum: 5c8926ddb5400bc825b6baca782931f9df4ace603ba1a517f5243290fd9cdb089d52877840687b5d5c939591ebc314e2e63721514feaa37c6829c828f2b940ce
+ languageName: node
+ linkType: hard
+
+"acorn@npm:^8.10.0, acorn@npm:^8.4.1":
+ version: 8.11.2
+ resolution: "acorn@npm:8.11.2"
+ bin:
+ acorn: bin/acorn
+ checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7
+ languageName: node
+ linkType: hard
+
+"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "agent-base@npm:7.1.0"
+ dependencies:
+ debug: ^4.3.4
+ checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f
+ languageName: node
+ linkType: hard
+
+"aggregate-error@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "aggregate-error@npm:3.1.0"
+ dependencies:
+ clean-stack: ^2.0.0
+ indent-string: ^4.0.0
+ checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
+ languageName: node
+ linkType: hard
+
+"ansi-colors@npm:4.1.1":
+ version: 4.1.1
+ resolution: "ansi-colors@npm:4.1.1"
+ checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0
+ languageName: node
+ linkType: hard
+
+"ansi-escapes@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "ansi-escapes@npm:3.2.0"
+ checksum: 0f94695b677ea742f7f1eed961f7fd8d05670f744c6ad1f8f635362f6681dcfbc1575cb05b43abc7bb6d67e25a75fb8c7ea8f2a57330eb2c76b33f18cb2cef0a
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "ansi-regex@npm:3.0.1"
+ checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^4.1.0":
+ version: 4.1.1
+ resolution: "ansi-regex@npm:4.1.1"
+ checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "ansi-regex@npm:5.0.1"
+ checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^6.0.1":
+ version: 6.0.1
+ resolution: "ansi-regex@npm:6.0.1"
+ checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^3.2.1":
+ version: 3.2.1
+ resolution: "ansi-styles@npm:3.2.1"
+ dependencies:
+ color-convert: ^1.9.0
+ checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0":
+ version: 4.3.0
+ resolution: "ansi-styles@npm:4.3.0"
+ dependencies:
+ color-convert: ^2.0.1
+ checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^6.1.0":
+ version: 6.2.1
+ resolution: "ansi-styles@npm:6.2.1"
+ checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9
+ languageName: node
+ linkType: hard
+
+"anymatch@npm:~3.1.2":
+ version: 3.1.3
+ resolution: "anymatch@npm:3.1.3"
+ dependencies:
+ normalize-path: ^3.0.0
+ picomatch: ^2.0.4
+ checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2
+ languageName: node
+ linkType: hard
+
+"arg@npm:^4.1.0":
+ version: 4.1.3
+ resolution: "arg@npm:4.1.3"
+ checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43
+ languageName: node
+ linkType: hard
+
+"argparse@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "argparse@npm:2.0.1"
+ checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced
+ languageName: node
+ linkType: hard
+
+"arrify@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "arrify@npm:2.0.1"
+ checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209
+ languageName: node
+ linkType: hard
+
+"assertion-error@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "assertion-error@npm:1.1.0"
+ checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf
+ languageName: node
+ linkType: hard
+
+"asynckit@npm:^0.4.0":
+ version: 0.4.0
+ resolution: "asynckit@npm:0.4.0"
+ checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be
+ languageName: node
+ linkType: hard
+
+"axios@npm:^0.26.0":
+ version: 0.26.1
+ resolution: "axios@npm:0.26.1"
+ dependencies:
+ follow-redirects: ^1.14.8
+ checksum: d9eb58ff4bc0b36a04783fc9ff760e9245c829a5a1052ee7ca6013410d427036b1d10d04e7380c02f3508c5eaf3485b1ae67bd2adbfec3683704745c8d7a6e1a
+ languageName: node
+ linkType: hard
+
+"axios@npm:^1.3.3":
+ version: 1.6.2
+ resolution: "axios@npm:1.6.2"
+ dependencies:
+ follow-redirects: ^1.15.0
+ form-data: ^4.0.0
+ proxy-from-env: ^1.1.0
+ checksum: 4a7429e2b784be0f2902ca2680964391eae7236faa3967715f30ea45464b98ae3f1c6f631303b13dfe721b17126b01f486c7644b9ef276bfc63112db9fd379f8
+ languageName: node
+ linkType: hard
+
+"balanced-match@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "balanced-match@npm:1.0.2"
+ checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65
+ languageName: node
+ linkType: hard
+
+"base64-js@npm:^1.3.1":
+ version: 1.5.1
+ resolution: "base64-js@npm:1.5.1"
+ checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005
+ languageName: node
+ linkType: hard
+
+"binary-extensions@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "binary-extensions@npm:2.2.0"
+ checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8
+ languageName: node
+ linkType: hard
+
+"bl@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "bl@npm:4.1.0"
+ dependencies:
+ buffer: ^5.5.0
+ inherits: ^2.0.4
+ readable-stream: ^3.4.0
+ checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662
+ languageName: node
+ linkType: hard
+
+"bo-selector@npm:0.0.10":
+ version: 0.0.10
+ resolution: "bo-selector@npm:0.0.10"
+ checksum: b52e0e52679637051b2d62bb291642dec3e72147612e4316a7927a2cb55bd229df277fc049bb377b3d40b463f83781b5396cb8a0309306cbf5031748acc06ba3
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^1.1.7":
+ version: 1.1.11
+ resolution: "brace-expansion@npm:1.1.11"
+ dependencies:
+ balanced-match: ^1.0.0
+ concat-map: 0.0.1
+ checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "brace-expansion@npm:2.0.1"
+ dependencies:
+ balanced-match: ^1.0.0
+ checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1
+ languageName: node
+ linkType: hard
+
+"braces@npm:~3.0.2":
+ version: 3.0.2
+ resolution: "braces@npm:3.0.2"
+ dependencies:
+ fill-range: ^7.0.1
+ checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459
+ languageName: node
+ linkType: hard
+
+"browser-stdout@npm:1.3.1":
+ version: 1.3.1
+ resolution: "browser-stdout@npm:1.3.1"
+ checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3
+ languageName: node
+ linkType: hard
+
+"buffer@npm:^5.5.0":
+ version: 5.7.1
+ resolution: "buffer@npm:5.7.1"
+ dependencies:
+ base64-js: ^1.3.1
+ ieee754: ^1.1.13
+ checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84
+ languageName: node
+ linkType: hard
+
+"cacache@npm:^18.0.0":
+ version: 18.0.1
+ resolution: "cacache@npm:18.0.1"
+ dependencies:
+ "@npmcli/fs": ^3.1.0
+ fs-minipass: ^3.0.0
+ glob: ^10.2.2
+ lru-cache: ^10.0.1
+ minipass: ^7.0.3
+ minipass-collect: ^2.0.1
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ p-map: ^4.0.0
+ ssri: ^10.0.0
+ tar: ^6.1.11
+ unique-filename: ^3.0.0
+ checksum: 5a0b3b2ea451a0379814dc1d3c81af48c7c6db15cd8f7d72e028501ae0036a599a99bbac9687bfec307afb2760808d1c7708e9477c8c70d2b166e7d80b162a23
+ languageName: node
+ linkType: hard
+
+"camel-case@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "camel-case@npm:3.0.0"
+ dependencies:
+ no-case: ^2.2.0
+ upper-case: ^1.1.1
+ checksum: 4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a
+ languageName: node
+ linkType: hard
+
+"camelcase@npm:^6.0.0":
+ version: 6.3.0
+ resolution: "camelcase@npm:6.3.0"
+ checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d
+ languageName: node
+ linkType: hard
+
+"chai-deep-match@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "chai-deep-match@npm:1.2.1"
+ dependencies:
+ deep-keys: ^0.5.0
+ lodash: ^4.17.10
+ lodash-pickdeep: ^1.0.2
+ peerDependencies:
+ chai: ">=2.1.2"
+ checksum: fb8500cab7dc2227a5da7dee7d24ed04d5e0d0cabad8c34f0c55ac1109cc812905370af0f71aa2663c7b672896e3e8dbfc40d069559db7b61c909bc9a206206d
+ languageName: node
+ linkType: hard
+
+"chai@npm:^4.3.6":
+ version: 4.3.10
+ resolution: "chai@npm:4.3.10"
+ dependencies:
+ assertion-error: ^1.1.0
+ check-error: ^1.0.3
+ deep-eql: ^4.1.3
+ get-func-name: ^2.0.2
+ loupe: ^2.3.6
+ pathval: ^1.1.1
+ type-detect: ^4.0.8
+ checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d
+ languageName: node
+ linkType: hard
+
+"chalk@npm:^2.4.2":
+ version: 2.4.2
+ resolution: "chalk@npm:2.4.2"
+ dependencies:
+ ansi-styles: ^3.2.1
+ escape-string-regexp: ^1.0.5
+ supports-color: ^5.3.0
+ checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2
+ languageName: node
+ linkType: hard
+
+"chalk@npm:^4.1.0, chalk@npm:^4.1.2":
+ version: 4.1.2
+ resolution: "chalk@npm:4.1.2"
+ dependencies:
+ ansi-styles: ^4.1.0
+ supports-color: ^7.1.0
+ checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc
+ languageName: node
+ linkType: hard
+
+"chardet@npm:^0.7.0":
+ version: 0.7.0
+ resolution: "chardet@npm:0.7.0"
+ checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d
+ languageName: node
+ linkType: hard
+
+"check-error@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "check-error@npm:1.0.3"
+ dependencies:
+ get-func-name: ^2.0.2
+ checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399
+ languageName: node
+ linkType: hard
+
+"chokidar@npm:3.5.3":
+ version: 3.5.3
+ resolution: "chokidar@npm:3.5.3"
+ dependencies:
+ anymatch: ~3.1.2
+ braces: ~3.0.2
+ fsevents: ~2.3.2
+ glob-parent: ~5.1.2
+ is-binary-path: ~2.1.0
+ is-glob: ~4.0.1
+ normalize-path: ~3.0.0
+ readdirp: ~3.6.0
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c
+ languageName: node
+ linkType: hard
+
+"chownr@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "chownr@npm:2.0.0"
+ checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
+ languageName: node
+ linkType: hard
+
+"class-transformer@npm:0.5.1":
+ version: 0.5.1
+ resolution: "class-transformer@npm:0.5.1"
+ checksum: f191c8b4cc4239990f5efdd790cabdd852c243ed66248e39f6616a349c910c6eed2d9fd1fbf7ee6ea89f69b4f1d0b493b27347fe0cd0ae26b47c3745a805b6d3
+ languageName: node
+ linkType: hard
+
+"clean-css@npm:^4.2.1":
+ version: 4.2.4
+ resolution: "clean-css@npm:4.2.4"
+ dependencies:
+ source-map: ~0.6.0
+ checksum: 045ff6fcf4b5c76a084b24e1633e0c78a13b24080338fc8544565a9751559aa32ff4ee5886d9e52c18a644a6ff119bd8e37bc58e574377c05382a1fb7dbe39f8
+ languageName: node
+ linkType: hard
+
+"clean-stack@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "clean-stack@npm:2.2.0"
+ checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
+ languageName: node
+ linkType: hard
+
+"cli-cursor@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "cli-cursor@npm:2.1.0"
+ dependencies:
+ restore-cursor: ^2.0.0
+ checksum: d88e97bfdac01046a3ffe7d49f06757b3126559d7e44aa2122637eb179284dc6cd49fca2fac4f67c19faaf7e6dab716b6fe1dfcd309977407d8c7578ec2d044d
+ languageName: node
+ linkType: hard
+
+"cli-cursor@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "cli-cursor@npm:3.1.0"
+ dependencies:
+ restore-cursor: ^3.1.0
+ checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29
+ languageName: node
+ linkType: hard
+
+"cli-spinners@npm:^2.5.0":
+ version: 2.9.2
+ resolution: "cli-spinners@npm:2.9.2"
+ checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c
+ languageName: node
+ linkType: hard
+
+"cli-width@npm:^2.0.0":
+ version: 2.2.1
+ resolution: "cli-width@npm:2.2.1"
+ checksum: 3c21b897a2ff551ae5b3c3ab32c866ed2965dcf7fb442f81adf0e27f4a397925c8f84619af7bcc6354821303f6ee9b2aa31d248306174f32c287986158cf4eed
+ languageName: node
+ linkType: hard
+
+"cliui@npm:^7.0.2":
+ version: 7.0.4
+ resolution: "cliui@npm:7.0.4"
+ dependencies:
+ string-width: ^4.2.0
+ strip-ansi: ^6.0.0
+ wrap-ansi: ^7.0.0
+ checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f
+ languageName: node
+ linkType: hard
+
+"clone@npm:^1.0.2":
+ version: 1.0.4
+ resolution: "clone@npm:1.0.4"
+ checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd
+ languageName: node
+ linkType: hard
+
+"codeceptjs@npm:3.5.2":
+ version: 3.5.2
+ resolution: "codeceptjs@npm:3.5.2"
+ dependencies:
+ "@codeceptjs/configure": ^0.8.0
+ "@codeceptjs/helper": ^1.0.2
+ "@cucumber/cucumber-expressions": ^16
+ "@cucumber/gherkin": ^26
+ "@cucumber/messages": ^21.0.1
+ "@xmldom/xmldom": ^0.7.9
+ acorn: ^8.10.0
+ arrify: ^2.0.1
+ axios: ^1.3.3
+ chai: ^4.3.6
+ chai-deep-match: ^1.2.1
+ chalk: ^4.1.2
+ commander: ^11.0.0
+ cross-spawn: ^7.0.3
+ css-to-xpath: ^0.1.0
+ envinfo: ^7.8.1
+ escape-string-regexp: ^4.0.0
+ figures: ^3.2.0
+ fn-args: ^4.0.0
+ fs-extra: ^8.1.0
+ glob: ^6.0.1
+ html-minifier: ^4.0.0
+ inquirer: ^6.5.2
+ joi: ^17.6.0
+ js-beautify: ^1.14.0
+ lodash.clonedeep: ^4.5.0
+ lodash.merge: ^4.6.2
+ mkdirp: ^1.0.4
+ mocha: ^10.2.0
+ ms: ^2.1.3
+ openai: ^3.2.1
+ ora-classic: ^5.4.2
+ parse-function: ^5.6.4
+ parse5: ^7.1.2
+ promise-retry: ^1.1.1
+ resq: ^1.10.2
+ sprintf-js: ^1.1.1
+ uuid: ^9.0
+ bin:
+ codeceptjs: bin/codecept.js
+ checksum: b1b3f19d62419e42685598789639051f81a74b7ce8e618d05c986011b99ad06e9ea016bbfa51216897e8a662f87123cb206d17d9ac923ab00524b7c16b431000
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^1.9.0":
+ version: 1.9.3
+ resolution: "color-convert@npm:1.9.3"
+ dependencies:
+ color-name: 1.1.3
+ checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "color-convert@npm:2.0.1"
+ dependencies:
+ color-name: ~1.1.4
+ checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336
+ languageName: node
+ linkType: hard
+
+"color-name@npm:1.1.3":
+ version: 1.1.3
+ resolution: "color-name@npm:1.1.3"
+ checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d
+ languageName: node
+ linkType: hard
+
+"color-name@npm:~1.1.4":
+ version: 1.1.4
+ resolution: "color-name@npm:1.1.4"
+ checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
+ languageName: node
+ linkType: hard
+
+"combined-stream@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "combined-stream@npm:1.0.8"
+ dependencies:
+ delayed-stream: ~1.0.0
+ checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c
+ languageName: node
+ linkType: hard
+
+"commander@npm:^10.0.0":
+ version: 10.0.1
+ resolution: "commander@npm:10.0.1"
+ checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948
+ languageName: node
+ linkType: hard
+
+"commander@npm:^11.0.0":
+ version: 11.1.0
+ resolution: "commander@npm:11.1.0"
+ checksum: fd1a8557c6b5b622c89ecdfde703242ab7db3b628ea5d1755784c79b8e7cb0d74d65b4a262289b533359cd58e1bfc0bf50245dfbcd2954682a6f367c828b79ef
+ languageName: node
+ linkType: hard
+
+"commander@npm:^2.19.0":
+ version: 2.20.3
+ resolution: "commander@npm:2.20.3"
+ checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e
+ languageName: node
+ linkType: hard
+
+"concat-map@npm:0.0.1":
+ version: 0.0.1
+ resolution: "concat-map@npm:0.0.1"
+ checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af
+ languageName: node
+ linkType: hard
+
+"config-chain@npm:^1.1.13":
+ version: 1.1.13
+ resolution: "config-chain@npm:1.1.13"
+ dependencies:
+ ini: ^1.3.4
+ proto-list: ~1.2.1
+ checksum: 828137a28e7c2fc4b7fb229bd0cd6c1397bcf83434de54347e608154008f411749041ee392cbe42fab6307e02de4c12480260bf769b7d44b778fdea3839eafab
+ languageName: node
+ linkType: hard
+
+"create-require@npm:^1.1.0":
+ version: 1.1.1
+ resolution: "create-require@npm:1.1.1"
+ checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff
+ languageName: node
+ linkType: hard
+
+"cross-env@npm:^7.0.3":
+ version: 7.0.3
+ resolution: "cross-env@npm:7.0.3"
+ dependencies:
+ cross-spawn: ^7.0.1
+ bin:
+ cross-env: src/bin/cross-env.js
+ cross-env-shell: src/bin/cross-env-shell.js
+ checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79
+ languageName: node
+ linkType: hard
+
+"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3":
+ version: 7.0.3
+ resolution: "cross-spawn@npm:7.0.3"
+ dependencies:
+ path-key: ^3.1.0
+ shebang-command: ^2.0.0
+ which: ^2.0.1
+ checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52
+ languageName: node
+ linkType: hard
+
+"css-to-xpath@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "css-to-xpath@npm:0.1.0"
+ dependencies:
+ bo-selector: 0.0.10
+ xpath-builder: 0.0.7
+ checksum: 48e7150d8c7bcef3946cecd4b2e3ec0d7a0cf8bef25eb20fdb016c76ad524b9db726c9fc9f82e0919a4c8cbbccb96e47bf497bd67da7fb85d53c47c3fd846225
+ languageName: node
+ linkType: hard
+
+"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.3.4":
+ version: 4.3.4
+ resolution: "debug@npm:4.3.4"
+ dependencies:
+ ms: 2.1.2
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
+ languageName: node
+ linkType: hard
+
+"decamelize@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "decamelize@npm:4.0.0"
+ checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809
+ languageName: node
+ linkType: hard
+
+"deep-eql@npm:^4.1.3":
+ version: 4.1.3
+ resolution: "deep-eql@npm:4.1.3"
+ dependencies:
+ type-detect: ^4.0.0
+ checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f
+ languageName: node
+ linkType: hard
+
+"deep-keys@npm:^0.5.0":
+ version: 0.5.0
+ resolution: "deep-keys@npm:0.5.0"
+ checksum: 0f8a9b4042f37067e7bb573a5e4d1250fa6a872012dbbfc1db533874207348ae88140765b04301105ef926bcf95ee849eaa05a535f76ed6702cff9de7724c51b
+ languageName: node
+ linkType: hard
+
+"defaults@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "defaults@npm:1.0.4"
+ dependencies:
+ clone: ^1.0.2
+ checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a
+ languageName: node
+ linkType: hard
+
+"delayed-stream@npm:~1.0.0":
+ version: 1.0.0
+ resolution: "delayed-stream@npm:1.0.0"
+ checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020
+ languageName: node
+ linkType: hard
+
+"diff@npm:5.0.0":
+ version: 5.0.0
+ resolution: "diff@npm:5.0.0"
+ checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46
+ languageName: node
+ linkType: hard
+
+"diff@npm:^4.0.1":
+ version: 4.0.2
+ resolution: "diff@npm:4.0.2"
+ checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d
+ languageName: node
+ linkType: hard
+
+"dotenv@npm:^16.3.1":
+ version: 16.3.1
+ resolution: "dotenv@npm:16.3.1"
+ checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd
+ languageName: node
+ linkType: hard
+
+"eastasianwidth@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "eastasianwidth@npm:0.2.0"
+ checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed
+ languageName: node
+ linkType: hard
+
+"editorconfig@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "editorconfig@npm:1.0.4"
+ dependencies:
+ "@one-ini/wasm": 0.1.1
+ commander: ^10.0.0
+ minimatch: 9.0.1
+ semver: ^7.5.3
+ bin:
+ editorconfig: bin/editorconfig
+ checksum: 09904f19381b3ddf132cea0762971aba887236f387be3540909e96b8eb9337e1793834e10f06890cd8e8e7bb1ba80cb13e7d50a863f227806c9ca74def4165fb
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "emoji-regex@npm:8.0.0"
+ checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^9.2.2":
+ version: 9.2.2
+ resolution: "emoji-regex@npm:9.2.2"
+ checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601
+ languageName: node
+ linkType: hard
+
+"encoding@npm:^0.1.13":
+ version: 0.1.13
+ resolution: "encoding@npm:0.1.13"
+ dependencies:
+ iconv-lite: ^0.6.2
+ checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f
+ languageName: node
+ linkType: hard
+
+"entities@npm:^4.4.0":
+ version: 4.5.0
+ resolution: "entities@npm:4.5.0"
+ checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7
+ languageName: node
+ linkType: hard
+
+"env-paths@npm:^2.2.0":
+ version: 2.2.1
+ resolution: "env-paths@npm:2.2.1"
+ checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
+ languageName: node
+ linkType: hard
+
+"envinfo@npm:^7.8.1":
+ version: 7.11.0
+ resolution: "envinfo@npm:7.11.0"
+ bin:
+ envinfo: dist/cli.js
+ checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef
+ languageName: node
+ linkType: hard
+
+"err-code@npm:^1.0.0":
+ version: 1.1.2
+ resolution: "err-code@npm:1.1.2"
+ checksum: a1c6a194d21084241c09e0ea78db4c503030042098048903f2d940ef48c1484bbf97e99d32d6b35e5f8871dd6b292fabf904f115914f5792a591157ac6584e31
+ languageName: node
+ linkType: hard
+
+"err-code@npm:^2.0.2":
+ version: 2.0.3
+ resolution: "err-code@npm:2.0.3"
+ checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54
+ languageName: node
+ linkType: hard
+
+"escalade@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "escalade@npm:3.1.1"
+ checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133
+ languageName: node
+ linkType: hard
+
+"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "escape-string-regexp@npm:4.0.0"
+ checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5
+ languageName: node
+ linkType: hard
+
+"escape-string-regexp@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "escape-string-regexp@npm:1.0.5"
+ checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410
+ languageName: node
+ linkType: hard
+
+"exponential-backoff@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "exponential-backoff@npm:3.1.1"
+ checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48
+ languageName: node
+ linkType: hard
+
+"external-editor@npm:^3.0.3":
+ version: 3.1.0
+ resolution: "external-editor@npm:3.1.0"
+ dependencies:
+ chardet: ^0.7.0
+ iconv-lite: ^0.4.24
+ tmp: ^0.0.33
+ checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7
+ languageName: node
+ linkType: hard
+
+"fast-deep-equal@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "fast-deep-equal@npm:2.0.1"
+ checksum: b701835a87985e0ec4925bdf1f0c1e7eb56309b5d12d534d5b4b69d95a54d65bb16861c081781ead55f73f12d6c60ba668713391ee7fbf6b0567026f579b7b0b
+ languageName: node
+ linkType: hard
+
+"figures@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "figures@npm:2.0.0"
+ dependencies:
+ escape-string-regexp: ^1.0.5
+ checksum: 081beb16ea57d1716f8447c694f637668322398b57017b20929376aaf5def9823b35245b734cdd87e4832dc96e9c6f46274833cada77bfe15e5f980fea1fd21f
+ languageName: node
+ linkType: hard
+
+"figures@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "figures@npm:3.2.0"
+ dependencies:
+ escape-string-regexp: ^1.0.5
+ checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b
+ languageName: node
+ linkType: hard
+
+"fill-range@npm:^7.0.1":
+ version: 7.0.1
+ resolution: "fill-range@npm:7.0.1"
+ dependencies:
+ to-regex-range: ^5.0.1
+ checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917
+ languageName: node
+ linkType: hard
+
+"find-up@npm:5.0.0":
+ version: 5.0.0
+ resolution: "find-up@npm:5.0.0"
+ dependencies:
+ locate-path: ^6.0.0
+ path-exists: ^4.0.0
+ checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095
+ languageName: node
+ linkType: hard
+
+"flat@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "flat@npm:5.0.2"
+ bin:
+ flat: cli.js
+ checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d
+ languageName: node
+ linkType: hard
+
+"fn-args@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "fn-args@npm:4.0.0"
+ checksum: 22cc41e5de4e1feb27ab6848197c01cf59daac40cdd6976dd5de6c57d7d5a3a861c6eec58f037709e0fe8e63e8b783e744b15b4076059c8effeca3c472e90a2e
+ languageName: node
+ linkType: hard
+
+"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.0":
+ version: 1.15.3
+ resolution: "follow-redirects@npm:1.15.3"
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231
+ languageName: node
+ linkType: hard
+
+"foreground-child@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "foreground-child@npm:3.1.1"
+ dependencies:
+ cross-spawn: ^7.0.0
+ signal-exit: ^4.0.1
+ checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5
+ languageName: node
+ linkType: hard
+
+"form-data@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "form-data@npm:4.0.0"
+ dependencies:
+ asynckit: ^0.4.0
+ combined-stream: ^1.0.8
+ mime-types: ^2.1.12
+ checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c
+ languageName: node
+ linkType: hard
+
+"fs-extra@npm:^8.1.0":
+ version: 8.1.0
+ resolution: "fs-extra@npm:8.1.0"
+ dependencies:
+ graceful-fs: ^4.2.0
+ jsonfile: ^4.0.0
+ universalify: ^0.1.0
+ checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880
+ languageName: node
+ linkType: hard
+
+"fs-minipass@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "fs-minipass@npm:2.1.0"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
+ languageName: node
+ linkType: hard
+
+"fs-minipass@npm:^3.0.0":
+ version: 3.0.3
+ resolution: "fs-minipass@npm:3.0.3"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802
+ languageName: node
+ linkType: hard
+
+"fs.realpath@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "fs.realpath@npm:1.0.0"
+ checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0
+ languageName: node
+ linkType: hard
+
+"fsevents@npm:~2.3.2":
+ version: 2.3.3
+ resolution: "fsevents@npm:2.3.3"
+ dependencies:
+ node-gyp: latest
+ checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"fsevents@patch:fsevents@~2.3.2#~builtin":
+ version: 2.3.3
+ resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1"
+ dependencies:
+ node-gyp: latest
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"get-caller-file@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "get-caller-file@npm:2.0.5"
+ checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9
+ languageName: node
+ linkType: hard
+
+"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "get-func-name@npm:2.0.2"
+ checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:~5.1.2":
+ version: 5.1.2
+ resolution: "glob-parent@npm:5.1.2"
+ dependencies:
+ is-glob: ^4.0.1
+ checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
+ languageName: node
+ linkType: hard
+
+"glob@npm:7.2.0":
+ version: 7.2.0
+ resolution: "glob@npm:7.2.0"
+ dependencies:
+ fs.realpath: ^1.0.0
+ inflight: ^1.0.4
+ inherits: 2
+ minimatch: ^3.0.4
+ once: ^1.3.0
+ path-is-absolute: ^1.0.0
+ checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134
+ languageName: node
+ linkType: hard
+
+"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.3":
+ version: 10.3.10
+ resolution: "glob@npm:10.3.10"
+ dependencies:
+ foreground-child: ^3.1.0
+ jackspeak: ^2.3.5
+ minimatch: ^9.0.1
+ minipass: ^5.0.0 || ^6.0.2 || ^7.0.0
+ path-scurry: ^1.10.1
+ bin:
+ glob: dist/esm/bin.mjs
+ checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3
+ languageName: node
+ linkType: hard
+
+"glob@npm:^6.0.1":
+ version: 6.0.4
+ resolution: "glob@npm:6.0.4"
+ dependencies:
+ inflight: ^1.0.4
+ inherits: 2
+ minimatch: 2 || 3
+ once: ^1.3.0
+ path-is-absolute: ^1.0.0
+ checksum: c4946c3d015ac81f704d185f2b3a55eb670100693c2cf7bc833d0efd970ec727d860d4839a5178e46a7e594b34a34661bae2f4c3405727c9fd189f84954ca3c0
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6":
+ version: 4.2.11
+ resolution: "graceful-fs@npm:4.2.11"
+ checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "has-flag@npm:3.0.0"
+ checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "has-flag@npm:4.0.0"
+ checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad
+ languageName: node
+ linkType: hard
+
+"he@npm:1.2.0, he@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "he@npm:1.2.0"
+ bin:
+ he: bin/he
+ checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7
+ languageName: node
+ linkType: hard
+
+"html-minifier@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "html-minifier@npm:4.0.0"
+ dependencies:
+ camel-case: ^3.0.0
+ clean-css: ^4.2.1
+ commander: ^2.19.0
+ he: ^1.2.0
+ param-case: ^2.1.1
+ relateurl: ^0.2.7
+ uglify-js: ^3.5.1
+ bin:
+ html-minifier: ./cli.js
+ checksum: b426aee771d9da104c1c9554e3ebd3a4f483d2ce01f4dcc4156ba33a5959044acf6bea192d5ae63b290cdb92c30a9d07fd6924c65609aa82382ce411328f94ca
+ languageName: node
+ linkType: hard
+
+"http-cache-semantics@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "http-cache-semantics@npm:4.1.1"
+ checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236
+ languageName: node
+ linkType: hard
+
+"http-proxy-agent@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "http-proxy-agent@npm:7.0.0"
+ dependencies:
+ agent-base: ^7.1.0
+ debug: ^4.3.4
+ checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6
+ languageName: node
+ linkType: hard
+
+"https-proxy-agent@npm:^7.0.1":
+ version: 7.0.2
+ resolution: "https-proxy-agent@npm:7.0.2"
+ dependencies:
+ agent-base: ^7.0.2
+ debug: 4
+ checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292
+ languageName: node
+ linkType: hard
+
+"iconv-lite@npm:^0.4.24":
+ version: 0.4.24
+ resolution: "iconv-lite@npm:0.4.24"
+ dependencies:
+ safer-buffer: ">= 2.1.2 < 3"
+ checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6
+ languageName: node
+ linkType: hard
+
+"iconv-lite@npm:^0.6.2":
+ version: 0.6.3
+ resolution: "iconv-lite@npm:0.6.3"
+ dependencies:
+ safer-buffer: ">= 2.1.2 < 3.0.0"
+ checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf
+ languageName: node
+ linkType: hard
+
+"ieee754@npm:^1.1.13":
+ version: 1.2.1
+ resolution: "ieee754@npm:1.2.1"
+ checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e
+ languageName: node
+ linkType: hard
+
+"imurmurhash@npm:^0.1.4":
+ version: 0.1.4
+ resolution: "imurmurhash@npm:0.1.4"
+ checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7
+ languageName: node
+ linkType: hard
+
+"indent-string@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "indent-string@npm:4.0.0"
+ checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
+ languageName: node
+ linkType: hard
+
+"inflight@npm:^1.0.4":
+ version: 1.0.6
+ resolution: "inflight@npm:1.0.6"
+ dependencies:
+ once: ^1.3.0
+ wrappy: 1
+ checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd
+ languageName: node
+ linkType: hard
+
+"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4":
+ version: 2.0.4
+ resolution: "inherits@npm:2.0.4"
+ checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
+ languageName: node
+ linkType: hard
+
+"ini@npm:^1.3.4":
+ version: 1.3.8
+ resolution: "ini@npm:1.3.8"
+ checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3
+ languageName: node
+ linkType: hard
+
+"inquirer@npm:^6.5.2":
+ version: 6.5.2
+ resolution: "inquirer@npm:6.5.2"
+ dependencies:
+ ansi-escapes: ^3.2.0
+ chalk: ^2.4.2
+ cli-cursor: ^2.1.0
+ cli-width: ^2.0.0
+ external-editor: ^3.0.3
+ figures: ^2.0.0
+ lodash: ^4.17.12
+ mute-stream: 0.0.7
+ run-async: ^2.2.0
+ rxjs: ^6.4.0
+ string-width: ^2.1.0
+ strip-ansi: ^5.1.0
+ through: ^2.3.6
+ checksum: 175ad4cd1ebed493b231b240185f1da5afeace5f4e8811dfa83cf55dcae59c3255eaed990aa71871b0fd31aa9dc212f43c44c50ed04fb529364405e72f484d28
+ languageName: node
+ linkType: hard
+
+"ip@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "ip@npm:2.0.0"
+ checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349
+ languageName: node
+ linkType: hard
+
+"is-binary-path@npm:~2.1.0":
+ version: 2.1.0
+ resolution: "is-binary-path@npm:2.1.0"
+ dependencies:
+ binary-extensions: ^2.0.0
+ checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c
+ languageName: node
+ linkType: hard
+
+"is-extglob@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "is-extglob@npm:2.1.1"
+ checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85
+ languageName: node
+ linkType: hard
+
+"is-fullwidth-code-point@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "is-fullwidth-code-point@npm:2.0.0"
+ checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8
+ languageName: node
+ linkType: hard
+
+"is-fullwidth-code-point@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "is-fullwidth-code-point@npm:3.0.0"
+ checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
+ languageName: node
+ linkType: hard
+
+"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1":
+ version: 4.0.3
+ resolution: "is-glob@npm:4.0.3"
+ dependencies:
+ is-extglob: ^2.1.1
+ checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4
+ languageName: node
+ linkType: hard
+
+"is-interactive@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "is-interactive@npm:1.0.0"
+ checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9
+ languageName: node
+ linkType: hard
+
+"is-lambda@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-lambda@npm:1.0.1"
+ checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35
+ languageName: node
+ linkType: hard
+
+"is-number@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "is-number@npm:7.0.0"
+ checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a
+ languageName: node
+ linkType: hard
+
+"is-plain-obj@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "is-plain-obj@npm:2.1.0"
+ checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa
+ languageName: node
+ linkType: hard
+
+"is-unicode-supported@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "is-unicode-supported@npm:0.1.0"
+ checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "isexe@npm:2.0.0"
+ checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "isexe@npm:3.1.1"
+ checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e
+ languageName: node
+ linkType: hard
+
+"jackspeak@npm:^2.3.5":
+ version: 2.3.6
+ resolution: "jackspeak@npm:2.3.6"
+ dependencies:
+ "@isaacs/cliui": ^8.0.2
+ "@pkgjs/parseargs": ^0.11.0
+ dependenciesMeta:
+ "@pkgjs/parseargs":
+ optional: true
+ checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54
+ languageName: node
+ linkType: hard
+
+"joi@npm:^17.6.0":
+ version: 17.11.0
+ resolution: "joi@npm:17.11.0"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ "@hapi/topo": ^5.0.0
+ "@sideway/address": ^4.1.3
+ "@sideway/formula": ^3.0.1
+ "@sideway/pinpoint": ^2.0.0
+ checksum: 3a4e9ecba345cdafe585e7ed8270a44b39718e11dff3749aa27e0001a63d578b75100c062be28e6f48f960b594864034e7a13833f33fbd7ad56d5ce6b617f9bf
+ languageName: node
+ linkType: hard
+
+"js-beautify@npm:^1.14.0":
+ version: 1.14.11
+ resolution: "js-beautify@npm:1.14.11"
+ dependencies:
+ config-chain: ^1.1.13
+ editorconfig: ^1.0.3
+ glob: ^10.3.3
+ nopt: ^7.2.0
+ bin:
+ css-beautify: js/bin/css-beautify.js
+ html-beautify: js/bin/html-beautify.js
+ js-beautify: js/bin/js-beautify.js
+ checksum: 92512b8dcc54330fe075569fd0226a1960da3fbb68f91e35dbfb110cc2b85e53e3ef17878c8be88b0888277bc5d51b1a692d72a00142d653ce7a8cbd48c66ee0
+ languageName: node
+ linkType: hard
+
+"js-yaml@npm:4.1.0":
+ version: 4.1.0
+ resolution: "js-yaml@npm:4.1.0"
+ dependencies:
+ argparse: ^2.0.1
+ bin:
+ js-yaml: bin/js-yaml.js
+ checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a
+ languageName: node
+ linkType: hard
+
+"jsonfile@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "jsonfile@npm:4.0.0"
+ dependencies:
+ graceful-fs: ^4.1.6
+ dependenciesMeta:
+ graceful-fs:
+ optional: true
+ checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e
+ languageName: node
+ linkType: hard
+
+"locate-path@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "locate-path@npm:6.0.0"
+ dependencies:
+ p-locate: ^5.0.0
+ checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a
+ languageName: node
+ linkType: hard
+
+"lodash-pickdeep@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "lodash-pickdeep@npm:1.0.2"
+ dependencies:
+ lodash: ">= 3.7.0"
+ checksum: ba9aeb592969e895e7c29eb6fa657c8667165c391d28317a3fd92e9d60a06f35102c22800b545bdd68a71f9428865c8359e38467e560dc1959e3dee5ad72bd6b
+ languageName: node
+ linkType: hard
+
+"lodash.clonedeep@npm:^4.5.0":
+ version: 4.5.0
+ resolution: "lodash.clonedeep@npm:4.5.0"
+ checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489
+ languageName: node
+ linkType: hard
+
+"lodash.merge@npm:^4.6.2":
+ version: 4.6.2
+ resolution: "lodash.merge@npm:4.6.2"
+ checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005
+ languageName: node
+ linkType: hard
+
+"lodash.mergewith@npm:^4.6.2":
+ version: 4.6.2
+ resolution: "lodash.mergewith@npm:4.6.2"
+ checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8
+ languageName: node
+ linkType: hard
+
+"lodash@npm:>= 3.7.0, lodash@npm:^4.17.10, lodash@npm:^4.17.12":
+ version: 4.17.21
+ resolution: "lodash@npm:4.17.21"
+ checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
+ languageName: node
+ linkType: hard
+
+"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "log-symbols@npm:4.1.0"
+ dependencies:
+ chalk: ^4.1.0
+ is-unicode-supported: ^0.1.0
+ checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74
+ languageName: node
+ linkType: hard
+
+"loupe@npm:^2.3.6":
+ version: 2.3.7
+ resolution: "loupe@npm:2.3.7"
+ dependencies:
+ get-func-name: ^2.0.1
+ checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b
+ languageName: node
+ linkType: hard
+
+"lower-case@npm:^1.1.1":
+ version: 1.1.4
+ resolution: "lower-case@npm:1.1.4"
+ checksum: 1ca9393b5eaef94a64e3f89e38b63d15bc7182a91171e6ad1550f51d710ec941540a065b274188f2e6b4576110cc2d11b50bc4bb7c603a040ddeb1db4ca95197
+ languageName: node
+ linkType: hard
+
+"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0":
+ version: 10.1.0
+ resolution: "lru-cache@npm:10.1.0"
+ checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab
+ languageName: node
+ linkType: hard
+
+"lru-cache@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "lru-cache@npm:6.0.0"
+ dependencies:
+ yallist: ^4.0.0
+ checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297
+ languageName: node
+ linkType: hard
+
+"make-error@npm:^1.1.1":
+ version: 1.3.6
+ resolution: "make-error@npm:1.3.6"
+ checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402
+ languageName: node
+ linkType: hard
+
+"make-fetch-happen@npm:^13.0.0":
+ version: 13.0.0
+ resolution: "make-fetch-happen@npm:13.0.0"
+ dependencies:
+ "@npmcli/agent": ^2.0.0
+ cacache: ^18.0.0
+ http-cache-semantics: ^4.1.1
+ is-lambda: ^1.0.1
+ minipass: ^7.0.2
+ minipass-fetch: ^3.0.0
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ negotiator: ^0.6.3
+ promise-retry: ^2.0.1
+ ssri: ^10.0.0
+ checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af
+ languageName: node
+ linkType: hard
+
+"mime-db@npm:1.52.0":
+ version: 1.52.0
+ resolution: "mime-db@npm:1.52.0"
+ checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f
+ languageName: node
+ linkType: hard
+
+"mime-types@npm:^2.1.12":
+ version: 2.1.35
+ resolution: "mime-types@npm:2.1.35"
+ dependencies:
+ mime-db: 1.52.0
+ checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836
+ languageName: node
+ linkType: hard
+
+"mimic-fn@npm:^1.0.0":
+ version: 1.2.0
+ resolution: "mimic-fn@npm:1.2.0"
+ checksum: 69c08205156a1f4906d9c46f9b4dc08d18a50176352e77fdeb645cedfe9f20c0b19865d465bd2dec27a5c432347f24dc07fc3695e11159d193f892834233e939
+ languageName: node
+ linkType: hard
+
+"mimic-fn@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "mimic-fn@npm:2.1.0"
+ checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:2 || 3, minimatch@npm:^3.0.4":
+ version: 3.1.2
+ resolution: "minimatch@npm:3.1.2"
+ dependencies:
+ brace-expansion: ^1.1.7
+ checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:5.0.1":
+ version: 5.0.1
+ resolution: "minimatch@npm:5.0.1"
+ dependencies:
+ brace-expansion: ^2.0.1
+ checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:9.0.1":
+ version: 9.0.1
+ resolution: "minimatch@npm:9.0.1"
+ dependencies:
+ brace-expansion: ^2.0.1
+ checksum: 97f5f5284bb57dc65b9415dec7f17a0f6531a33572193991c60ff18450dcfad5c2dad24ffeaf60b5261dccd63aae58cc3306e2209d57e7f88c51295a532d8ec3
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^9.0.1":
+ version: 9.0.3
+ resolution: "minimatch@npm:9.0.3"
+ dependencies:
+ brace-expansion: ^2.0.1
+ checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5
+ languageName: node
+ linkType: hard
+
+"minipass-collect@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "minipass-collect@npm:2.0.1"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342
+ languageName: node
+ linkType: hard
+
+"minipass-fetch@npm:^3.0.0":
+ version: 3.0.4
+ resolution: "minipass-fetch@npm:3.0.4"
+ dependencies:
+ encoding: ^0.1.13
+ minipass: ^7.0.3
+ minipass-sized: ^1.0.3
+ minizlib: ^2.1.2
+ dependenciesMeta:
+ encoding:
+ optional: true
+ checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a
+ languageName: node
+ linkType: hard
+
+"minipass-flush@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "minipass-flush@npm:1.0.5"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf
+ languageName: node
+ linkType: hard
+
+"minipass-pipeline@npm:^1.2.4":
+ version: 1.2.4
+ resolution: "minipass-pipeline@npm:1.2.4"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b
+ languageName: node
+ linkType: hard
+
+"minipass-sized@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "minipass-sized@npm:1.0.3"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^3.0.0":
+ version: 3.3.6
+ resolution: "minipass@npm:3.3.6"
+ dependencies:
+ yallist: ^4.0.0
+ checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "minipass@npm:5.0.0"
+ checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3":
+ version: 7.0.4
+ resolution: "minipass@npm:7.0.4"
+ checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21
+ languageName: node
+ linkType: hard
+
+"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "minizlib@npm:2.1.2"
+ dependencies:
+ minipass: ^3.0.0
+ yallist: ^4.0.0
+ checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
+ languageName: node
+ linkType: hard
+
+"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "mkdirp@npm:1.0.4"
+ bin:
+ mkdirp: bin/cmd.js
+ checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f
+ languageName: node
+ linkType: hard
+
+"mocha@npm:^10.2.0":
+ version: 10.2.0
+ resolution: "mocha@npm:10.2.0"
+ dependencies:
+ ansi-colors: 4.1.1
+ browser-stdout: 1.3.1
+ chokidar: 3.5.3
+ debug: 4.3.4
+ diff: 5.0.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 7.2.0
+ he: 1.2.0
+ js-yaml: 4.1.0
+ log-symbols: 4.1.0
+ minimatch: 5.0.1
+ ms: 2.1.3
+ nanoid: 3.3.3
+ serialize-javascript: 6.0.0
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ workerpool: 6.2.1
+ yargs: 16.2.0
+ yargs-parser: 20.2.4
+ yargs-unparser: 2.0.0
+ bin:
+ _mocha: bin/_mocha
+ mocha: bin/mocha.js
+ checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719
+ languageName: node
+ linkType: hard
+
+"ms@npm:2.1.2":
+ version: 2.1.2
+ resolution: "ms@npm:2.1.2"
+ checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
+ languageName: node
+ linkType: hard
+
+"ms@npm:2.1.3, ms@npm:^2.1.3":
+ version: 2.1.3
+ resolution: "ms@npm:2.1.3"
+ checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
+ languageName: node
+ linkType: hard
+
+"mute-stream@npm:0.0.7":
+ version: 0.0.7
+ resolution: "mute-stream@npm:0.0.7"
+ checksum: a9d4772c1c84206aa37c218ed4751cd060239bf1d678893124f51e037f6f22f4a159b2918c030236c93252638a74beb29c9b1fd3267c9f24d4b3253cf1eaa86f
+ languageName: node
+ linkType: hard
+
+"nanoid@npm:3.3.3":
+ version: 3.3.3
+ resolution: "nanoid@npm:3.3.3"
+ bin:
+ nanoid: bin/nanoid.cjs
+ checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0
+ languageName: node
+ linkType: hard
+
+"negotiator@npm:^0.6.3":
+ version: 0.6.3
+ resolution: "negotiator@npm:0.6.3"
+ checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
+ languageName: node
+ linkType: hard
+
+"no-case@npm:^2.2.0":
+ version: 2.3.2
+ resolution: "no-case@npm:2.3.2"
+ dependencies:
+ lower-case: ^1.1.1
+ checksum: 856487731936fef44377ca74fdc5076464aba2e0734b56a4aa2b2a23d5b154806b591b9b2465faa59bb982e2b5c9391e3685400957fb4eeb38f480525adcf3dd
+ languageName: node
+ linkType: hard
+
+"node-gyp@npm:latest":
+ version: 10.0.1
+ resolution: "node-gyp@npm:10.0.1"
+ dependencies:
+ env-paths: ^2.2.0
+ exponential-backoff: ^3.1.1
+ glob: ^10.3.10
+ graceful-fs: ^4.2.6
+ make-fetch-happen: ^13.0.0
+ nopt: ^7.0.0
+ proc-log: ^3.0.0
+ semver: ^7.3.5
+ tar: ^6.1.2
+ which: ^4.0.0
+ bin:
+ node-gyp: bin/node-gyp.js
+ checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f
+ languageName: node
+ linkType: hard
+
+"nopt@npm:^7.0.0, nopt@npm:^7.2.0":
+ version: 7.2.0
+ resolution: "nopt@npm:7.2.0"
+ dependencies:
+ abbrev: ^2.0.0
+ bin:
+ nopt: bin/nopt.js
+ checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410
+ languageName: node
+ linkType: hard
+
+"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
+ version: 3.0.0
+ resolution: "normalize-path@npm:3.0.0"
+ checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20
+ languageName: node
+ linkType: hard
+
+"once@npm:^1.3.0":
+ version: 1.4.0
+ resolution: "once@npm:1.4.0"
+ dependencies:
+ wrappy: 1
+ checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68
+ languageName: node
+ linkType: hard
+
+"onetime@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "onetime@npm:2.0.1"
+ dependencies:
+ mimic-fn: ^1.0.0
+ checksum: bb44015ac7a525d0fb43b029a583d4ad359834632b4424ca209b438aacf6d669dda81b5edfbdb42c22636e607b276ba5589f46694a729e3bc27948ce26f4cc1a
+ languageName: node
+ linkType: hard
+
+"onetime@npm:^5.1.0":
+ version: 5.1.2
+ resolution: "onetime@npm:5.1.2"
+ dependencies:
+ mimic-fn: ^2.1.0
+ checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34
+ languageName: node
+ linkType: hard
+
+"openai@npm:^3.2.1":
+ version: 3.3.0
+ resolution: "openai@npm:3.3.0"
+ dependencies:
+ axios: ^0.26.0
+ form-data: ^4.0.0
+ checksum: 28ccff8c09b6f47828c9583bb3bafc38a8459c76ea10eb9e08ca880f65523c5a9cc6c5f3c7669dded6f4c93e7cf49dd5c4dbfd12732a0f958c923117740d677b
+ languageName: node
+ linkType: hard
+
+"ora-classic@npm:^5.4.2":
+ version: 5.4.2
+ resolution: "ora-classic@npm:5.4.2"
+ dependencies:
+ bl: ^4.1.0
+ chalk: ^4.1.0
+ cli-cursor: ^3.1.0
+ cli-spinners: ^2.5.0
+ is-interactive: ^1.0.0
+ is-unicode-supported: ^0.1.0
+ log-symbols: ^4.1.0
+ strip-ansi: ^6.0.0
+ wcwidth: ^1.0.1
+ checksum: f52ec97c8fbb051dd883d6bbb75a0b658a173f8230aba0d39b2cf5957b79dcaf7da53dda72d744d726ac8cb7e693fe6d7eb0c27a59298aa35f0ec06651c4626f
+ languageName: node
+ linkType: hard
+
+"os-tmpdir@npm:~1.0.2":
+ version: 1.0.2
+ resolution: "os-tmpdir@npm:1.0.2"
+ checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d
+ languageName: node
+ linkType: hard
+
+"p-limit@npm:^3.0.2":
+ version: 3.1.0
+ resolution: "p-limit@npm:3.1.0"
+ dependencies:
+ yocto-queue: ^0.1.0
+ checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360
+ languageName: node
+ linkType: hard
+
+"p-locate@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "p-locate@npm:5.0.0"
+ dependencies:
+ p-limit: ^3.0.2
+ checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3
+ languageName: node
+ linkType: hard
+
+"p-map@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "p-map@npm:4.0.0"
+ dependencies:
+ aggregate-error: ^3.0.0
+ checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
+ languageName: node
+ linkType: hard
+
+"param-case@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "param-case@npm:2.1.1"
+ dependencies:
+ no-case: ^2.2.0
+ checksum: 3a63dcb8d8dc7995a612de061afdc7bb6fe7bd0e6db994db8d4cae999ed879859fd24389090e1a0d93f4c9207ebf8c048c870f468a3f4767161753e03cb9ab58
+ languageName: node
+ linkType: hard
+
+"parse-function@npm:^5.6.4":
+ version: 5.6.10
+ resolution: "parse-function@npm:5.6.10"
+ dependencies:
+ "@babel/parser": ^7.8.3
+ arrify: ^2.0.1
+ checksum: 84a8c54e9bf7da1f8856d2008957643dfe821e422bee70d71cefa513788f5489d2fa67ca208a38fac54b911d8e424f42c0b1e761c6cefba6003321303a9d6cfd
+ languageName: node
+ linkType: hard
+
+"parse5@npm:^7.1.2":
+ version: 7.1.2
+ resolution: "parse5@npm:7.1.2"
+ dependencies:
+ entities: ^4.4.0
+ checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713
+ languageName: node
+ linkType: hard
+
+"path-exists@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "path-exists@npm:4.0.0"
+ checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1
+ languageName: node
+ linkType: hard
+
+"path-is-absolute@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "path-is-absolute@npm:1.0.1"
+ checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8
+ languageName: node
+ linkType: hard
+
+"path-key@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "path-key@npm:3.1.1"
+ checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020
+ languageName: node
+ linkType: hard
+
+"path-scurry@npm:^1.10.1":
+ version: 1.10.1
+ resolution: "path-scurry@npm:1.10.1"
+ dependencies:
+ lru-cache: ^9.1.1 || ^10.0.0
+ minipass: ^5.0.0 || ^6.0.2 || ^7.0.0
+ checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90
+ languageName: node
+ linkType: hard
+
+"pathval@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "pathval@npm:1.1.1"
+ checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1":
+ version: 2.3.1
+ resolution: "picomatch@npm:2.3.1"
+ checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf
+ languageName: node
+ linkType: hard
+
+"playwright-core@npm:1.36.0":
+ version: 1.36.0
+ resolution: "playwright-core@npm:1.36.0"
+ bin:
+ playwright-core: cli.js
+ checksum: d6b5fed5ae95238dc36a1be3e2cfd250221810e6a2d20592c29d7044a2d1f96e8e6cfff83d937605b6e26d7c3058231d16784e17979fbb11208880829e406e85
+ languageName: node
+ linkType: hard
+
+"playwright@npm:1.36.0":
+ version: 1.36.0
+ resolution: "playwright@npm:1.36.0"
+ dependencies:
+ playwright-core: 1.36.0
+ bin:
+ playwright: cli.js
+ checksum: c49ed1666b28f8b9177f4682b51e0bc77a83d32265725bc29a8210c0fe83a92e1f1b7051e315a7299fa39c6e952eebe0fe80a22c174569636a27a5a737b3aef4
+ languageName: node
+ linkType: hard
+
+"proc-log@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "proc-log@npm:3.0.0"
+ checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02
+ languageName: node
+ linkType: hard
+
+"promise-retry@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "promise-retry@npm:1.1.1"
+ dependencies:
+ err-code: ^1.0.0
+ retry: ^0.10.0
+ checksum: 18180b4cf8e383768ebffccc55df51385d82bb0241e4506af607e8459b80bd8db01bf5d2bc257549c67a2cc506955750389d1dafb7862216d596ee1bf349cc27
+ languageName: node
+ linkType: hard
+
+"promise-retry@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "promise-retry@npm:2.0.1"
+ dependencies:
+ err-code: ^2.0.2
+ retry: ^0.12.0
+ checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
+ languageName: node
+ linkType: hard
+
+"proto-list@npm:~1.2.1":
+ version: 1.2.4
+ resolution: "proto-list@npm:1.2.4"
+ checksum: 4d4826e1713cbfa0f15124ab0ae494c91b597a3c458670c9714c36e8baddf5a6aad22842776f2f5b137f259c8533e741771445eb8df82e861eea37a6eaba03f7
+ languageName: node
+ linkType: hard
+
+"proxy-from-env@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "proxy-from-env@npm:1.1.0"
+ checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4
+ languageName: node
+ linkType: hard
+
+"randombytes@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "randombytes@npm:2.1.0"
+ dependencies:
+ safe-buffer: ^5.1.0
+ checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6
+ languageName: node
+ linkType: hard
+
+"readable-stream@npm:^3.4.0":
+ version: 3.6.2
+ resolution: "readable-stream@npm:3.6.2"
+ dependencies:
+ inherits: ^2.0.3
+ string_decoder: ^1.1.1
+ util-deprecate: ^1.0.1
+ checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d
+ languageName: node
+ linkType: hard
+
+"readdirp@npm:~3.6.0":
+ version: 3.6.0
+ resolution: "readdirp@npm:3.6.0"
+ dependencies:
+ picomatch: ^2.2.1
+ checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320
+ languageName: node
+ linkType: hard
+
+"reflect-metadata@npm:0.1.13":
+ version: 0.1.13
+ resolution: "reflect-metadata@npm:0.1.13"
+ checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4
+ languageName: node
+ linkType: hard
+
+"regexp-match-indices@npm:1.0.2":
+ version: 1.0.2
+ resolution: "regexp-match-indices@npm:1.0.2"
+ dependencies:
+ regexp-tree: ^0.1.11
+ checksum: 8cc779f6cf8f404ead828d09970a7d4bd66bd78d43ab9eb2b5e65f2ef2ba1ed53536f5b5fa839fb90b350365fb44b6a851c7f16289afc3f37789c113ab2a7916
+ languageName: node
+ linkType: hard
+
+"regexp-tree@npm:^0.1.11":
+ version: 0.1.27
+ resolution: "regexp-tree@npm:0.1.27"
+ bin:
+ regexp-tree: bin/regexp-tree
+ checksum: 129aebb34dae22d6694ab2ac328be3f99105143737528ab072ef624d599afecbcfae1f5c96a166fa9e5f64fa1ecf30b411c4691e7924c3e11bbaf1712c260c54
+ languageName: node
+ linkType: hard
+
+"relateurl@npm:^0.2.7":
+ version: 0.2.7
+ resolution: "relateurl@npm:0.2.7"
+ checksum: 5891e792eae1dfc3da91c6fda76d6c3de0333a60aa5ad848982ebb6dccaa06e86385fb1235a1582c680a3d445d31be01c6bfc0804ebbcab5aaf53fa856fde6b6
+ languageName: node
+ linkType: hard
+
+"require-directory@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "require-directory@npm:2.1.1"
+ checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80
+ languageName: node
+ linkType: hard
+
+"resq@npm:^1.10.2":
+ version: 1.11.0
+ resolution: "resq@npm:1.11.0"
+ dependencies:
+ fast-deep-equal: ^2.0.1
+ checksum: a596c0125883246946cf6b9172557265d00334019327c09b84c9016b1e7e876e15c35c81d2f8ed315adf6b93ac035f3d993f9a8b323dcd80ffd6cf8f3eb5cc7e
+ languageName: node
+ linkType: hard
+
+"restore-cursor@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "restore-cursor@npm:2.0.0"
+ dependencies:
+ onetime: ^2.0.0
+ signal-exit: ^3.0.2
+ checksum: 482e13d02d834b6e5e3aa90304a8b5e840775d6f06916cc92a50038adf9f098dcc72405b567da8a37e137ae40ad3e31896fa3136ae62f7a426c2fbf53d036536
+ languageName: node
+ linkType: hard
+
+"restore-cursor@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "restore-cursor@npm:3.1.0"
+ dependencies:
+ onetime: ^5.1.0
+ signal-exit: ^3.0.2
+ checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630
+ languageName: node
+ linkType: hard
+
+"retry@npm:^0.10.0":
+ version: 0.10.1
+ resolution: "retry@npm:0.10.1"
+ checksum: 133ef7c2028bcb09544a6fb9bed9f8266fffeaf72c855f73c2918ace9ef2abd7ccba03744564bcd1a8e948ed70518f8970852f46e649f9e3db6fefb0148cda35
+ languageName: node
+ linkType: hard
+
+"retry@npm:^0.12.0":
+ version: 0.12.0
+ resolution: "retry@npm:0.12.0"
+ checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c
+ languageName: node
+ linkType: hard
+
+"run-async@npm:^2.2.0":
+ version: 2.4.1
+ resolution: "run-async@npm:2.4.1"
+ checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797
+ languageName: node
+ linkType: hard
+
+"rxjs@npm:^6.4.0":
+ version: 6.6.7
+ resolution: "rxjs@npm:6.6.7"
+ dependencies:
+ tslib: ^1.9.0
+ checksum: bc334edef1bb8bbf56590b0b25734ba0deaf8825b703256a93714308ea36dff8a11d25533671adf8e104e5e8f256aa6fdfe39b2e248cdbd7a5f90c260acbbd1b
+ languageName: node
+ linkType: hard
+
+"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0":
+ version: 5.2.1
+ resolution: "safe-buffer@npm:5.2.1"
+ checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
+ languageName: node
+ linkType: hard
+
+"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0":
+ version: 2.1.2
+ resolution: "safer-buffer@npm:2.1.2"
+ checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.3.5, semver@npm:^7.5.3":
+ version: 7.5.4
+ resolution: "semver@npm:7.5.4"
+ dependencies:
+ lru-cache: ^6.0.0
+ bin:
+ semver: bin/semver.js
+ checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3
+ languageName: node
+ linkType: hard
+
+"serialize-javascript@npm:6.0.0":
+ version: 6.0.0
+ resolution: "serialize-javascript@npm:6.0.0"
+ dependencies:
+ randombytes: ^2.1.0
+ checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93
+ languageName: node
+ linkType: hard
+
+"shebang-command@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "shebang-command@npm:2.0.0"
+ dependencies:
+ shebang-regex: ^3.0.0
+ checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa
+ languageName: node
+ linkType: hard
+
+"shebang-regex@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "shebang-regex@npm:3.0.0"
+ checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222
+ languageName: node
+ linkType: hard
+
+"signal-exit@npm:^3.0.2":
+ version: 3.0.7
+ resolution: "signal-exit@npm:3.0.7"
+ checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
+ languageName: node
+ linkType: hard
+
+"signal-exit@npm:^4.0.1":
+ version: 4.1.0
+ resolution: "signal-exit@npm:4.1.0"
+ checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549
+ languageName: node
+ linkType: hard
+
+"smart-buffer@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "smart-buffer@npm:4.2.0"
+ checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
+ languageName: node
+ linkType: hard
+
+"socks-proxy-agent@npm:^8.0.1":
+ version: 8.0.2
+ resolution: "socks-proxy-agent@npm:8.0.2"
+ dependencies:
+ agent-base: ^7.0.2
+ debug: ^4.3.4
+ socks: ^2.7.1
+ checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d
+ languageName: node
+ linkType: hard
+
+"socks@npm:^2.7.1":
+ version: 2.7.1
+ resolution: "socks@npm:2.7.1"
+ dependencies:
+ ip: ^2.0.0
+ smart-buffer: ^4.2.0
+ checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748
+ languageName: node
+ linkType: hard
+
+"source-map@npm:~0.6.0":
+ version: 0.6.1
+ resolution: "source-map@npm:0.6.1"
+ checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2
+ languageName: node
+ linkType: hard
+
+"sprintf-js@npm:^1.1.1":
+ version: 1.1.3
+ resolution: "sprintf-js@npm:1.1.3"
+ checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0
+ languageName: node
+ linkType: hard
+
+"ssri@npm:^10.0.0":
+ version: 10.0.5
+ resolution: "ssri@npm:10.0.5"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750
+ languageName: node
+ linkType: hard
+
+"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0":
+ version: 4.2.3
+ resolution: "string-width@npm:4.2.3"
+ dependencies:
+ emoji-regex: ^8.0.0
+ is-fullwidth-code-point: ^3.0.0
+ strip-ansi: ^6.0.1
+ checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
+ languageName: node
+ linkType: hard
+
+"string-width@npm:^2.1.0":
+ version: 2.1.1
+ resolution: "string-width@npm:2.1.1"
+ dependencies:
+ is-fullwidth-code-point: ^2.0.0
+ strip-ansi: ^4.0.0
+ checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a
+ languageName: node
+ linkType: hard
+
+"string-width@npm:^5.0.1, string-width@npm:^5.1.2":
+ version: 5.1.2
+ resolution: "string-width@npm:5.1.2"
+ dependencies:
+ eastasianwidth: ^0.2.0
+ emoji-regex: ^9.2.2
+ strip-ansi: ^7.0.1
+ checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193
+ languageName: node
+ linkType: hard
+
+"string_decoder@npm:^1.1.1":
+ version: 1.3.0
+ resolution: "string_decoder@npm:1.3.0"
+ dependencies:
+ safe-buffer: ~5.2.0
+ checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56
+ languageName: node
+ linkType: hard
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
+ version: 6.0.1
+ resolution: "strip-ansi@npm:6.0.1"
+ dependencies:
+ ansi-regex: ^5.0.1
+ checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
+ languageName: node
+ linkType: hard
+
+"strip-ansi@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "strip-ansi@npm:4.0.0"
+ dependencies:
+ ansi-regex: ^3.0.0
+ checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca
+ languageName: node
+ linkType: hard
+
+"strip-ansi@npm:^5.1.0":
+ version: 5.2.0
+ resolution: "strip-ansi@npm:5.2.0"
+ dependencies:
+ ansi-regex: ^4.1.0
+ checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46
+ languageName: node
+ linkType: hard
+
+"strip-ansi@npm:^7.0.1":
+ version: 7.1.0
+ resolution: "strip-ansi@npm:7.1.0"
+ dependencies:
+ ansi-regex: ^6.0.1
+ checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d
+ languageName: node
+ linkType: hard
+
+"strip-json-comments@npm:3.1.1":
+ version: 3.1.1
+ resolution: "strip-json-comments@npm:3.1.1"
+ checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:8.1.1":
+ version: 8.1.1
+ resolution: "supports-color@npm:8.1.1"
+ dependencies:
+ has-flag: ^4.0.0
+ checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^5.3.0":
+ version: 5.5.0
+ resolution: "supports-color@npm:5.5.0"
+ dependencies:
+ has-flag: ^3.0.0
+ checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^7.1.0":
+ version: 7.2.0
+ resolution: "supports-color@npm:7.2.0"
+ dependencies:
+ has-flag: ^4.0.0
+ checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a
+ languageName: node
+ linkType: hard
+
+"tar@npm:^6.1.11, tar@npm:^6.1.2":
+ version: 6.2.0
+ resolution: "tar@npm:6.2.0"
+ dependencies:
+ chownr: ^2.0.0
+ fs-minipass: ^2.0.0
+ minipass: ^5.0.0
+ minizlib: ^2.1.1
+ mkdirp: ^1.0.3
+ yallist: ^4.0.0
+ checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c
+ languageName: node
+ linkType: hard
+
+"through@npm:^2.3.6":
+ version: 2.3.8
+ resolution: "through@npm:2.3.8"
+ checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd
+ languageName: node
+ linkType: hard
+
+"tmp@npm:^0.0.33":
+ version: 0.0.33
+ resolution: "tmp@npm:0.0.33"
+ dependencies:
+ os-tmpdir: ~1.0.2
+ checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28
+ languageName: node
+ linkType: hard
+
+"to-fast-properties@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "to-fast-properties@npm:2.0.0"
+ checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168
+ languageName: node
+ linkType: hard
+
+"to-regex-range@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "to-regex-range@npm:5.0.1"
+ dependencies:
+ is-number: ^7.0.0
+ checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed
+ languageName: node
+ linkType: hard
+
+"ts-node@npm:^10.9.1":
+ version: 10.9.2
+ resolution: "ts-node@npm:10.9.2"
+ dependencies:
+ "@cspotcode/source-map-support": ^0.8.0
+ "@tsconfig/node10": ^1.0.7
+ "@tsconfig/node12": ^1.0.7
+ "@tsconfig/node14": ^1.0.0
+ "@tsconfig/node16": ^1.0.2
+ acorn: ^8.4.1
+ acorn-walk: ^8.1.1
+ arg: ^4.1.0
+ create-require: ^1.1.0
+ diff: ^4.0.1
+ make-error: ^1.1.1
+ v8-compile-cache-lib: ^3.0.1
+ yn: 3.1.1
+ peerDependencies:
+ "@swc/core": ">=1.2.50"
+ "@swc/wasm": ">=1.2.50"
+ "@types/node": "*"
+ typescript: ">=2.7"
+ peerDependenciesMeta:
+ "@swc/core":
+ optional: true
+ "@swc/wasm":
+ optional: true
+ bin:
+ ts-node: dist/bin.js
+ ts-node-cwd: dist/bin-cwd.js
+ ts-node-esm: dist/bin-esm.js
+ ts-node-script: dist/bin-script.js
+ ts-node-transpile-only: dist/bin-transpile.js
+ ts-script: dist/bin-script-deprecated.js
+ checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac
+ languageName: node
+ linkType: hard
+
+"tslib@npm:^1.9.0":
+ version: 1.14.1
+ resolution: "tslib@npm:1.14.1"
+ checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd
+ languageName: node
+ linkType: hard
+
+"type-detect@npm:^4.0.0, type-detect@npm:^4.0.8":
+ version: 4.0.8
+ resolution: "type-detect@npm:4.0.8"
+ checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15
+ languageName: node
+ linkType: hard
+
+"typescript@npm:^5.1.6":
+ version: 5.3.3
+ resolution: "typescript@npm:5.3.3"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2
+ languageName: node
+ linkType: hard
+
+"typescript@patch:typescript@^5.1.6#~builtin":
+ version: 5.3.3
+ resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=14eedb"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610
+ languageName: node
+ linkType: hard
+
+"uglify-js@npm:^3.5.1":
+ version: 3.17.4
+ resolution: "uglify-js@npm:3.17.4"
+ bin:
+ uglifyjs: bin/uglifyjs
+ checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924
+ languageName: node
+ linkType: hard
+
+"undici-types@npm:~5.26.4":
+ version: 5.26.5
+ resolution: "undici-types@npm:5.26.5"
+ checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487
+ languageName: node
+ linkType: hard
+
+"unique-filename@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "unique-filename@npm:3.0.0"
+ dependencies:
+ unique-slug: ^4.0.0
+ checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df
+ languageName: node
+ linkType: hard
+
+"unique-slug@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "unique-slug@npm:4.0.0"
+ dependencies:
+ imurmurhash: ^0.1.4
+ checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15
+ languageName: node
+ linkType: hard
+
+"universalify@npm:^0.1.0":
+ version: 0.1.2
+ resolution: "universalify@npm:0.1.2"
+ checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff
+ languageName: node
+ linkType: hard
+
+"upper-case@npm:^1.1.1":
+ version: 1.1.3
+ resolution: "upper-case@npm:1.1.3"
+ checksum: 991c845de75fa56e5ad983f15e58494dd77b77cadd79d273cc11e8da400067e9881ae1a52b312aed79b3d754496e2e0712e08d22eae799e35c7f9ba6f3d8a85d
+ languageName: node
+ linkType: hard
+
+"util-deprecate@npm:^1.0.1":
+ version: 1.0.2
+ resolution: "util-deprecate@npm:1.0.2"
+ checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2
+ languageName: node
+ linkType: hard
+
+"uuid@npm:9.0.0":
+ version: 9.0.0
+ resolution: "uuid@npm:9.0.0"
+ bin:
+ uuid: dist/bin/uuid
+ checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028
+ languageName: node
+ linkType: hard
+
+"uuid@npm:^9.0":
+ version: 9.0.1
+ resolution: "uuid@npm:9.0.1"
+ bin:
+ uuid: dist/bin/uuid
+ checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4
+ languageName: node
+ linkType: hard
+
+"v8-compile-cache-lib@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "v8-compile-cache-lib@npm:3.0.1"
+ checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0
+ languageName: node
+ linkType: hard
+
+"wcwidth@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "wcwidth@npm:1.0.1"
+ dependencies:
+ defaults: ^1.0.3
+ checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c
+ languageName: node
+ linkType: hard
+
+"which@npm:^2.0.1":
+ version: 2.0.2
+ resolution: "which@npm:2.0.2"
+ dependencies:
+ isexe: ^2.0.0
+ bin:
+ node-which: ./bin/node-which
+ checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1
+ languageName: node
+ linkType: hard
+
+"which@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "which@npm:4.0.0"
+ dependencies:
+ isexe: ^3.1.1
+ bin:
+ node-which: bin/which.js
+ checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651
+ languageName: node
+ linkType: hard
+
+"workerpool@npm:6.2.1":
+ version: 6.2.1
+ resolution: "workerpool@npm:6.2.1"
+ checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d
+ languageName: node
+ linkType: hard
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "wrap-ansi@npm:7.0.0"
+ dependencies:
+ ansi-styles: ^4.0.0
+ string-width: ^4.1.0
+ strip-ansi: ^6.0.0
+ checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b
+ languageName: node
+ linkType: hard
+
+"wrap-ansi@npm:^8.1.0":
+ version: 8.1.0
+ resolution: "wrap-ansi@npm:8.1.0"
+ dependencies:
+ ansi-styles: ^6.1.0
+ string-width: ^5.0.1
+ strip-ansi: ^7.0.1
+ checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238
+ languageName: node
+ linkType: hard
+
+"wrappy@npm:1":
+ version: 1.0.2
+ resolution: "wrappy@npm:1.0.2"
+ checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5
+ languageName: node
+ linkType: hard
+
+"xpath-builder@npm:0.0.7":
+ version: 0.0.7
+ resolution: "xpath-builder@npm:0.0.7"
+ checksum: 00df6ba4a06000685678bd458a3cd2394a83779c1f316c08146406ec0289620d3d2616885503b064359d37ea9e2cbdc3cbef3ef0c00be3c0d4b247dda90526fa
+ languageName: node
+ linkType: hard
+
+"y18n@npm:^5.0.5":
+ version: 5.0.8
+ resolution: "y18n@npm:5.0.8"
+ checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30
+ languageName: node
+ linkType: hard
+
+"yallist@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "yallist@npm:4.0.0"
+ checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
+ languageName: node
+ linkType: hard
+
+"yargs-parser@npm:20.2.4":
+ version: 20.2.4
+ resolution: "yargs-parser@npm:20.2.4"
+ checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924
+ languageName: node
+ linkType: hard
+
+"yargs-parser@npm:^20.2.2":
+ version: 20.2.9
+ resolution: "yargs-parser@npm:20.2.9"
+ checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3
+ languageName: node
+ linkType: hard
+
+"yargs-unparser@npm:2.0.0":
+ version: 2.0.0
+ resolution: "yargs-unparser@npm:2.0.0"
+ dependencies:
+ camelcase: ^6.0.0
+ decamelize: ^4.0.0
+ flat: ^5.0.2
+ is-plain-obj: ^2.1.0
+ checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3
+ languageName: node
+ linkType: hard
+
+"yargs@npm:16.2.0":
+ version: 16.2.0
+ resolution: "yargs@npm:16.2.0"
+ 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
+ checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59
+ languageName: node
+ linkType: hard
+
+"yn@npm:3.1.1":
+ version: 3.1.1
+ resolution: "yn@npm:3.1.1"
+ checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6
+ languageName: node
+ linkType: hard
+
+"yocto-queue@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "yocto-queue@npm:0.1.0"
+ checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700
+ languageName: node
+ linkType: hard
diff --git a/package.json b/package.json
index dc30394eea..f87812fa16 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,12 @@
"check:tailwind": "yarn workspace @serlo/frontend check:tailwind",
"codegen": "yarn workspace @serlo/frontend codegen",
"dev": "yarn workspace @serlo/frontend dev",
+ "e2e": "cd e2e-tests && yarn e2e",
+ "e2e-firefox": "cd e2e-tests && yarn e2e-firefox",
+ "e2e-firefox-localhost": "cd e2e-tests && yarn e2e-firefox-localhost",
+ "e2e-localapi": "cd e2e-tests && yarn e2e-localapi",
+ "e2e-localhost": "cd e2e-tests && yarn e2e-localhost",
+ "e2e-workers": "cd e2e-tests && yarn e2e-workers",
"format": "yarn workspace @serlo/frontend format",
"format:eslint": "yarn workspace @serlo/frontend format:eslint",
"format:prettier": "yarn workspace @serlo/frontend format:prettier",