diff --git a/.eslintrc.js b/.eslintrc.js index 5c135c9f..08f7d600 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -373,23 +373,13 @@ module.exports = { }, }, { - files: [ - 'rollup.config.mjs', - 'packages/core/**/*', - 'packages/webpack-plugin/**/*', - 'packages/esbuild-plugin/**/*', - ], + files: ['rollup.config.mjs', 'packages/core/**/*', 'packages/*-plugin/**/*'], rules: { 'import/no-extraneous-dependencies': 'off', }, }, { - files: [ - 'packages/core/**/*', - 'packages/esbuild-plugin/**/*', - 'packages/plugins/**/*', - 'packages/webpack-plugin/**/*', - ], + files: ['packages/core/**/*', 'packages/plugins/**/*', 'packages/*-plugin/**/*'], rules: { 'no-console': 'error', }, diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3a7f4cde..5eebde04 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,3 +6,7 @@ # Telemetry packages/plugins/telemetry @DataDog/frontend-devx @yoannmoinet packages/tests/src/plugins/telemetry @DataDog/frontend-devx @yoannmoinet + +# Rum +packages/plugins/rum @DataDog/rum @yoannmoinet +packages/tests/src/plugins/rum @DataDog/rum @yoannmoinet \ No newline at end of file diff --git a/.gitignore b/.gitignore index 439673b2..2053a1cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,10 @@ yarn-error.log .yarn/* !.yarn/cache +!.yarn/patches !.yarn/releases !.yarn/plugins !.vscode -webpack-profile-debug -esbuild-profile-debug node_modules/ dist/ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip deleted file mode 100644 index 05240c0a..00000000 Binary files a/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.21.5-62349c1520-10.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.21.5-62349c1520-10.zip new file mode 100644 index 00000000..cf67cd85 Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-arm64-npm-0.21.5-62349c1520-10.zip differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip deleted file mode 100644 index 69a15a39..00000000 Binary files a/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.21.5-491c2ae06c-10.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.21.5-491c2ae06c-10.zip new file mode 100644 index 00000000..c29febdf Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-x64-npm-0.21.5-491c2ae06c-10.zip differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip deleted file mode 100644 index 991a7f5b..00000000 Binary files a/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.21.5-c6a54cd648-10.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.21.5-c6a54cd648-10.zip new file mode 100644 index 00000000..4754b51a Binary files /dev/null and b/.yarn/cache/@esbuild-linux-arm64-npm-0.21.5-c6a54cd648-10.zip differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip deleted file mode 100644 index 5f4cc3e0..00000000 Binary files a/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.21.5-88079726c4-10.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.21.5-88079726c4-10.zip new file mode 100644 index 00000000..2a3a835a Binary files /dev/null and b/.yarn/cache/@esbuild-linux-x64-npm-0.21.5-88079726c4-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.17.1-add109e212-10.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.17.1-add109e212-10.zip deleted file mode 100644 index 2a817e22..00000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.17.1-add109e212-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.18.0-683829554f-10.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.18.0-683829554f-10.zip new file mode 100644 index 00000000..5e002537 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.18.0-683829554f-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.17.1-330855746a-10.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.17.1-330855746a-10.zip deleted file mode 100644 index c8148e58..00000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.17.1-330855746a-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.18.0-4f171ac978-10.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.18.0-4f171ac978-10.zip new file mode 100644 index 00000000..f4acb786 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.18.0-4f171ac978-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.17.1-5704467160-10.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.17.1-5704467160-10.zip deleted file mode 100644 index 4d0e3771..00000000 Binary files a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.17.1-5704467160-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.18.0-f633823e2b-10.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.18.0-f633823e2b-10.zip new file mode 100644 index 00000000..28d54104 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.18.0-f633823e2b-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.17.1-a2ec383d51-10.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.17.1-a2ec383d51-10.zip deleted file mode 100644 index 977bd833..00000000 Binary files a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.17.1-a2ec383d51-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.18.0-0aa51442a0-10.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.18.0-0aa51442a0-10.zip new file mode 100644 index 00000000..3f1bc91a Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.18.0-0aa51442a0-10.zip differ diff --git a/.yarn/cache/@types-async-retry-npm-1.4.8-50ec947b8f-5d4b0b786e.zip b/.yarn/cache/@types-async-retry-npm-1.4.8-50ec947b8f-5d4b0b786e.zip new file mode 100644 index 00000000..8f4a8c18 Binary files /dev/null and b/.yarn/cache/@types-async-retry-npm-1.4.8-50ec947b8f-5d4b0b786e.zip differ diff --git a/.yarn/cache/@types-eslint-scope-npm-3.7.0-7c68026d97-27f302625b.zip b/.yarn/cache/@types-eslint-scope-npm-3.7.0-7c68026d97-27f302625b.zip deleted file mode 100644 index 5a64e57f..00000000 Binary files a/.yarn/cache/@types-eslint-scope-npm-3.7.0-7c68026d97-27f302625b.zip and /dev/null differ diff --git a/.yarn/cache/@types-eslint-scope-npm-3.7.7-efa26592f6-e2889a124a.zip b/.yarn/cache/@types-eslint-scope-npm-3.7.7-efa26592f6-e2889a124a.zip new file mode 100644 index 00000000..6e1bed86 Binary files /dev/null and b/.yarn/cache/@types-eslint-scope-npm-3.7.7-efa26592f6-e2889a124a.zip differ diff --git a/.yarn/cache/@types-estree-npm-0.0.45-71d6bd2510-5a45a5fd92.zip b/.yarn/cache/@types-estree-npm-0.0.45-71d6bd2510-5a45a5fd92.zip deleted file mode 100644 index f7ea1b7a..00000000 Binary files a/.yarn/cache/@types-estree-npm-0.0.45-71d6bd2510-5a45a5fd92.zip and /dev/null differ diff --git a/.yarn/cache/@types-retry-npm-0.12.5-f1986a76a6-3fb6bf9183.zip b/.yarn/cache/@types-retry-npm-0.12.5-f1986a76a6-3fb6bf9183.zip new file mode 100644 index 00000000..abb504e2 Binary files /dev/null and b/.yarn/cache/@types-retry-npm-0.12.5-f1986a76a6-3fb6bf9183.zip differ diff --git a/.yarn/cache/@types-source-list-map-npm-0.1.6-2e7e79b68d-9cd294c121.zip b/.yarn/cache/@types-source-list-map-npm-0.1.6-2e7e79b68d-9cd294c121.zip new file mode 100644 index 00000000..6e98f86f Binary files /dev/null and b/.yarn/cache/@types-source-list-map-npm-0.1.6-2e7e79b68d-9cd294c121.zip differ diff --git a/.yarn/cache/@types-tapable-npm-1.0.12-fb0f138e72-adfb978a30.zip b/.yarn/cache/@types-tapable-npm-1.0.12-fb0f138e72-adfb978a30.zip new file mode 100644 index 00000000..fd94a024 Binary files /dev/null and b/.yarn/cache/@types-tapable-npm-1.0.12-fb0f138e72-adfb978a30.zip differ diff --git a/.yarn/cache/@types-uglify-js-npm-3.17.5-02532e521f-87368861a3.zip b/.yarn/cache/@types-uglify-js-npm-3.17.5-02532e521f-87368861a3.zip new file mode 100644 index 00000000..70304b6d Binary files /dev/null and b/.yarn/cache/@types-uglify-js-npm-3.17.5-02532e521f-87368861a3.zip differ diff --git a/.yarn/cache/@types-webpack-npm-4.41.38-3fdf86c5ec-63f2137371.zip b/.yarn/cache/@types-webpack-npm-4.41.38-3fdf86c5ec-63f2137371.zip new file mode 100644 index 00000000..50acff11 Binary files /dev/null and b/.yarn/cache/@types-webpack-npm-4.41.38-3fdf86c5ec-63f2137371.zip differ diff --git a/.yarn/cache/@types-webpack-sources-npm-3.2.3-dce1c60a50-7b557f242e.zip b/.yarn/cache/@types-webpack-sources-npm-3.2.3-dce1c60a50-7b557f242e.zip new file mode 100644 index 00000000..d060910d Binary files /dev/null and b/.yarn/cache/@types-webpack-sources-npm-3.2.3-dce1c60a50-7b557f242e.zip differ diff --git a/.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-28cc949e2e.zip b/.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-28cc949e2e.zip deleted file mode 100644 index 4099aaf6..00000000 Binary files a/.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-28cc949e2e.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-ast-npm-1.12.1-3ff9ea1c0e-a775b05594.zip b/.yarn/cache/@webassemblyjs-ast-npm-1.12.1-3ff9ea1c0e-a775b05594.zip new file mode 100644 index 00000000..b83e0cc8 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-ast-npm-1.12.1-3ff9ea1c0e-a775b05594.zip differ diff --git a/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip b/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip deleted file mode 100644 index 9b03be94..00000000 Binary files a/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.6-3a9928fc76-29b0875884.zip b/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.6-3a9928fc76-29b0875884.zip new file mode 100644 index 00000000..fd95d649 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.6-3a9928fc76-29b0875884.zip differ diff --git a/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip b/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip deleted file mode 100644 index 28665e75..00000000 Binary files a/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.6-75f6275ff4-e8563df851.zip b/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.6-75f6275ff4-e8563df851.zip new file mode 100644 index 00000000..d0697f28 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.6-75f6275ff4-e8563df851.zip differ diff --git a/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip b/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip deleted file mode 100644 index c4c06dd6..00000000 Binary files a/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.12.1-d025434a45-1d8705daa4.zip b/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.12.1-d025434a45-1d8705daa4.zip new file mode 100644 index 00000000..d7eccb73 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.12.1-d025434a45-1d8705daa4.zip differ diff --git a/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-cbe5b456fa.zip b/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-cbe5b456fa.zip deleted file mode 100644 index 704a9f3a..00000000 Binary files a/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-cbe5b456fa.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.6-819ddab1da-9ffd258ad8.zip b/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.6-819ddab1da-9ffd258ad8.zip new file mode 100644 index 00000000..bf882f93 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.6-819ddab1da-9ffd258ad8.zip differ diff --git a/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-009b494010.zip b/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-009b494010.zip deleted file mode 100644 index 5769ab32..00000000 Binary files a/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-009b494010.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.6-3bc23747de-4ebf03e9c1.zip b/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.6-3bc23747de-4ebf03e9c1.zip new file mode 100644 index 00000000..8f3fedc5 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.6-3bc23747de-4ebf03e9c1.zip differ diff --git a/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-dd6eee9f73.zip b/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-dd6eee9f73.zip deleted file mode 100644 index 744065f3..00000000 Binary files a/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-dd6eee9f73.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.12.1-cd0e2f1eab-e91e6b2811.zip b/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.12.1-cd0e2f1eab-e91e6b2811.zip new file mode 100644 index 00000000..a17936e5 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.12.1-cd0e2f1eab-e91e6b2811.zip differ diff --git a/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip b/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip deleted file mode 100644 index fd9e4c5e..00000000 Binary files a/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.6-95c92f446a-13574b8e41.zip b/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.6-95c92f446a-13574b8e41.zip new file mode 100644 index 00000000..bd1b9c09 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.6-95c92f446a-13574b8e41.zip differ diff --git a/.yarn/cache/@webassemblyjs-leb128-npm-1.11.1-fd9f27673d-85beb7156f.zip b/.yarn/cache/@webassemblyjs-leb128-npm-1.11.1-fd9f27673d-85beb7156f.zip deleted file mode 100644 index 2de90a27..00000000 Binary files a/.yarn/cache/@webassemblyjs-leb128-npm-1.11.1-fd9f27673d-85beb7156f.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-leb128-npm-1.11.6-697d62da2e-ec3b72db0e.zip b/.yarn/cache/@webassemblyjs-leb128-npm-1.11.6-697d62da2e-ec3b72db0e.zip new file mode 100644 index 00000000..34a35601 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-leb128-npm-1.11.6-697d62da2e-ec3b72db0e.zip differ diff --git a/.yarn/cache/@webassemblyjs-utf8-npm-1.11.1-583036e767-b93e57912d.zip b/.yarn/cache/@webassemblyjs-utf8-npm-1.11.1-583036e767-b93e57912d.zip deleted file mode 100644 index f1744da5..00000000 Binary files a/.yarn/cache/@webassemblyjs-utf8-npm-1.11.1-583036e767-b93e57912d.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-utf8-npm-1.11.6-102c4e5d68-361a537bd6.zip b/.yarn/cache/@webassemblyjs-utf8-npm-1.11.6-102c4e5d68-361a537bd6.zip new file mode 100644 index 00000000..0ef6c31a Binary files /dev/null and b/.yarn/cache/@webassemblyjs-utf8-npm-1.11.6-102c4e5d68-361a537bd6.zip differ diff --git a/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6a029ae21c.zip b/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6a029ae21c.zip deleted file mode 100644 index bf0c7b67..00000000 Binary files a/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6a029ae21c.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.12.1-727bec592a-5678ae02db.zip b/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.12.1-727bec592a-5678ae02db.zip new file mode 100644 index 00000000..3ed22347 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.12.1-727bec592a-5678ae02db.zip differ diff --git a/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-5da040e780.zip b/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-5da040e780.zip deleted file mode 100644 index 7ddbb1ee..00000000 Binary files a/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-5da040e780.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.12.1-bbe22ad265-ec45bd50e8.zip b/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.12.1-bbe22ad265-ec45bd50e8.zip new file mode 100644 index 00000000..f7fe6004 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.12.1-bbe22ad265-ec45bd50e8.zip differ diff --git a/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-00f85d1f76.zip b/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-00f85d1f76.zip deleted file mode 100644 index 63c068a0..00000000 Binary files a/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-00f85d1f76.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.12.1-450c932de6-21f25ae109.zip b/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.12.1-450c932de6-21f25ae109.zip new file mode 100644 index 00000000..2acb870f Binary files /dev/null and b/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.12.1-450c932de6-21f25ae109.zip differ diff --git a/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-cc6de8f4d9.zip b/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-cc6de8f4d9.zip deleted file mode 100644 index 7ed1ed71..00000000 Binary files a/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-cc6de8f4d9.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.12.1-54a7a19806-f7311685b7.zip b/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.12.1-54a7a19806-f7311685b7.zip new file mode 100644 index 00000000..bef03f21 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.12.1-54a7a19806-f7311685b7.zip differ diff --git a/.yarn/cache/@webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-bd1cf7a063.zip b/.yarn/cache/@webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-bd1cf7a063.zip deleted file mode 100644 index faf786d8..00000000 Binary files a/.yarn/cache/@webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-bd1cf7a063.zip and /dev/null differ diff --git a/.yarn/cache/@webassemblyjs-wast-printer-npm-1.12.1-e75655c7ff-1a6a4b6bc4.zip b/.yarn/cache/@webassemblyjs-wast-printer-npm-1.12.1-e75655c7ff-1a6a4b6bc4.zip new file mode 100644 index 00000000..a9fadd95 Binary files /dev/null and b/.yarn/cache/@webassemblyjs-wast-printer-npm-1.12.1-e75655c7ff-1a6a4b6bc4.zip differ diff --git a/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip b/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip deleted file mode 100644 index 64c90ae8..00000000 Binary files a/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip and /dev/null differ diff --git a/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-0b90c963a6.zip b/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-0b90c963a6.zip deleted file mode 100644 index 60df2531..00000000 Binary files a/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-0b90c963a6.zip and /dev/null differ diff --git a/.yarn/cache/acorn-import-assertions-npm-1.7.6-06125ebcd0-3df7728ff6.zip b/.yarn/cache/acorn-import-assertions-npm-1.7.6-06125ebcd0-3df7728ff6.zip deleted file mode 100644 index dd275d83..00000000 Binary files a/.yarn/cache/acorn-import-assertions-npm-1.7.6-06125ebcd0-3df7728ff6.zip and /dev/null differ diff --git a/.yarn/cache/acorn-import-attributes-npm-1.9.5-d1e666eb35-8bfbfbb6e2.zip b/.yarn/cache/acorn-import-attributes-npm-1.9.5-d1e666eb35-8bfbfbb6e2.zip new file mode 100644 index 00000000..9a210b13 Binary files /dev/null and b/.yarn/cache/acorn-import-attributes-npm-1.9.5-d1e666eb35-8bfbfbb6e2.zip differ diff --git a/.yarn/cache/acorn-npm-8.12.1-610871d57c-d08c2d122b.zip b/.yarn/cache/acorn-npm-8.12.1-610871d57c-d08c2d122b.zip new file mode 100644 index 00000000..2dddbcfd Binary files /dev/null and b/.yarn/cache/acorn-npm-8.12.1-610871d57c-d08c2d122b.zip differ diff --git a/.yarn/cache/array-back-npm-4.0.2-f735073f8f-f306032707.zip b/.yarn/cache/array-back-npm-4.0.2-f735073f8f-f306032707.zip deleted file mode 100644 index 6884e6ac..00000000 Binary files a/.yarn/cache/array-back-npm-4.0.2-f735073f8f-f306032707.zip and /dev/null differ diff --git a/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip b/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip new file mode 100644 index 00000000..e5252904 Binary files /dev/null and b/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip differ diff --git a/.yarn/cache/browserslist-npm-4.23.1-5d546adfd4-91da59f70a.zip b/.yarn/cache/browserslist-npm-4.23.1-5d546adfd4-91da59f70a.zip new file mode 100644 index 00000000..80f8f90b Binary files /dev/null and b/.yarn/cache/browserslist-npm-4.23.1-5d546adfd4-91da59f70a.zip differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001640-a1af8cecc3-14f0437945.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001640-a1af8cecc3-14f0437945.zip new file mode 100644 index 00000000..ecacfab7 Binary files /dev/null and b/.yarn/cache/caniuse-lite-npm-1.0.30001640-a1af8cecc3-14f0437945.zip differ diff --git a/.yarn/cache/colorette-npm-1.4.0-7e94b44dc3-c8d6c8c3ef.zip b/.yarn/cache/colorette-npm-1.4.0-7e94b44dc3-c8d6c8c3ef.zip deleted file mode 100644 index af41cf20..00000000 Binary files a/.yarn/cache/colorette-npm-1.4.0-7e94b44dc3-c8d6c8c3ef.zip and /dev/null differ diff --git a/.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-902901582a.zip b/.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-902901582a.zip deleted file mode 100644 index 520e1426..00000000 Binary files a/.yarn/cache/command-line-usage-npm-6.1.3-145c2dabe1-902901582a.zip and /dev/null differ diff --git a/.yarn/cache/commander-npm-6.2.1-d5b635f237-25b88c2efd.zip b/.yarn/cache/commander-npm-6.2.1-d5b635f237-25b88c2efd.zip deleted file mode 100644 index 02647693..00000000 Binary files a/.yarn/cache/commander-npm-6.2.1-d5b635f237-25b88c2efd.zip and /dev/null differ diff --git a/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip b/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip deleted file mode 100644 index 87f0270e..00000000 Binary files a/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip and /dev/null differ diff --git a/.yarn/cache/electron-to-chromium-npm-1.4.820-366c81a402-6f283fdb22.zip b/.yarn/cache/electron-to-chromium-npm-1.4.820-366c81a402-6f283fdb22.zip new file mode 100644 index 00000000..8d669a09 Binary files /dev/null and b/.yarn/cache/electron-to-chromium-npm-1.4.820-366c81a402-6f283fdb22.zip differ diff --git a/.yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip b/.yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip new file mode 100644 index 00000000..7c44fbfd Binary files /dev/null and b/.yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip differ diff --git a/.yarn/cache/envinfo-npm-7.11.1-4d6b740881-5a18ead059.zip b/.yarn/cache/envinfo-npm-7.11.1-4d6b740881-5a18ead059.zip deleted file mode 100644 index 5e587759..00000000 Binary files a/.yarn/cache/envinfo-npm-7.11.1-4d6b740881-5a18ead059.zip and /dev/null differ diff --git a/.yarn/cache/es-module-lexer-npm-0.7.1-ab2b333e55-f1edf7c242.zip b/.yarn/cache/es-module-lexer-npm-0.7.1-ab2b333e55-f1edf7c242.zip deleted file mode 100644 index ec92d6b8..00000000 Binary files a/.yarn/cache/es-module-lexer-npm-0.7.1-ab2b333e55-f1edf7c242.zip and /dev/null differ diff --git a/.yarn/cache/es-module-lexer-npm-1.5.4-b52b96b8fc-f29c7c97a5.zip b/.yarn/cache/es-module-lexer-npm-1.5.4-b52b96b8fc-f29c7c97a5.zip new file mode 100644 index 00000000..893d7007 Binary files /dev/null and b/.yarn/cache/es-module-lexer-npm-1.5.4-b52b96b8fc-f29c7c97a5.zip differ diff --git a/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip b/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip deleted file mode 100644 index b12369ad..00000000 Binary files a/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip and /dev/null differ diff --git a/.yarn/cache/esbuild-npm-0.21.5-d85dfbc965-d2ff2ca84d.zip b/.yarn/cache/esbuild-npm-0.21.5-d85dfbc965-d2ff2ca84d.zip new file mode 100644 index 00000000..d7f4807d Binary files /dev/null and b/.yarn/cache/esbuild-npm-0.21.5-d85dfbc965-d2ff2ca84d.zip differ diff --git a/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip b/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip new file mode 100644 index 00000000..c59ddcfc Binary files /dev/null and b/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip differ diff --git a/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-8030029382.zip b/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-8030029382.zip new file mode 100644 index 00000000..4bddb0e5 Binary files /dev/null and b/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-8030029382.zip differ diff --git a/.yarn/cache/interpret-npm-2.2.0-3603a544e1-a62d4de5c1.zip b/.yarn/cache/interpret-npm-2.2.0-3603a544e1-a62d4de5c1.zip deleted file mode 100644 index 83d484cc..00000000 Binary files a/.yarn/cache/interpret-npm-2.2.0-3603a544e1-a62d4de5c1.zip and /dev/null differ diff --git a/.yarn/cache/lodash-npm-4.17.21-6382451519-c08619c038.zip b/.yarn/cache/lodash-npm-4.17.21-6382451519-c08619c038.zip deleted file mode 100644 index 5c76f21a..00000000 Binary files a/.yarn/cache/lodash-npm-4.17.21-6382451519-c08619c038.zip and /dev/null differ diff --git a/.yarn/cache/nock-npm-14.0.0-beta.7-32f70a9823-c60c6df0c7.zip b/.yarn/cache/nock-npm-14.0.0-beta.7-32f70a9823-c60c6df0c7.zip new file mode 100644 index 00000000..956aec99 Binary files /dev/null and b/.yarn/cache/nock-npm-14.0.0-beta.7-32f70a9823-c60c6df0c7.zip differ diff --git a/.yarn/cache/p-finally-npm-1.0.0-35fbaa57c6-93a654c53d.zip b/.yarn/cache/p-finally-npm-1.0.0-35fbaa57c6-93a654c53d.zip new file mode 100644 index 00000000..091273a2 Binary files /dev/null and b/.yarn/cache/p-finally-npm-1.0.0-35fbaa57c6-93a654c53d.zip differ diff --git a/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-60fe227ffc.zip b/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-60fe227ffc.zip new file mode 100644 index 00000000..0dd8761b Binary files /dev/null and b/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-60fe227ffc.zip differ diff --git a/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip b/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip new file mode 100644 index 00000000..eaf8f71c Binary files /dev/null and b/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip differ diff --git a/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip b/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip new file mode 100644 index 00000000..21041b39 Binary files /dev/null and b/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip differ diff --git a/.yarn/cache/propagate-npm-2.0.1-2074bf76d3-8c761c16e8.zip b/.yarn/cache/propagate-npm-2.0.1-2074bf76d3-8c761c16e8.zip new file mode 100644 index 00000000..e3513a3b Binary files /dev/null and b/.yarn/cache/propagate-npm-2.0.1-2074bf76d3-8c761c16e8.zip differ diff --git a/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip b/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip deleted file mode 100644 index 24cb0af8..00000000 Binary files a/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip and /dev/null differ diff --git a/.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip b/.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip deleted file mode 100644 index 7ab0e947..00000000 Binary files a/.yarn/cache/reduce-flatten-npm-2.0.0-01bd4936fa-64393ef99a.zip and /dev/null differ diff --git a/.yarn/cache/retry-npm-0.13.1-89eb100ab6-6125ec2e06.zip b/.yarn/cache/retry-npm-0.13.1-89eb100ab6-6125ec2e06.zip new file mode 100644 index 00000000..2301fb71 Binary files /dev/null and b/.yarn/cache/retry-npm-0.13.1-89eb100ab6-6125ec2e06.zip differ diff --git a/.yarn/cache/rollup-npm-4.17.1-7b824476d8-4072609e24.zip b/.yarn/cache/rollup-npm-4.17.1-7b824476d8-4072609e24.zip deleted file mode 100644 index 774cd079..00000000 Binary files a/.yarn/cache/rollup-npm-4.17.1-7b824476d8-4072609e24.zip and /dev/null differ diff --git a/.yarn/cache/rollup-npm-4.18.0-9eadb97a09-2320fe653c.zip b/.yarn/cache/rollup-npm-4.18.0-9eadb97a09-2320fe653c.zip new file mode 100644 index 00000000..40a31b90 Binary files /dev/null and b/.yarn/cache/rollup-npm-4.18.0-9eadb97a09-2320fe653c.zip differ diff --git a/.yarn/cache/source-map-npm-0.7.4-bc8d018ab6-a0f7c9b797.zip b/.yarn/cache/source-map-npm-0.7.4-bc8d018ab6-a0f7c9b797.zip new file mode 100644 index 00000000..c2b79fcc Binary files /dev/null and b/.yarn/cache/source-map-npm-0.7.4-bc8d018ab6-a0f7c9b797.zip differ diff --git a/.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-5dd12bc64d.zip b/.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-5dd12bc64d.zip deleted file mode 100644 index f2b6ffcb..00000000 Binary files a/.yarn/cache/table-layout-npm-1.0.2-0b3fe79240-5dd12bc64d.zip and /dev/null differ diff --git a/.yarn/cache/typical-npm-5.2.0-d4de46c932-fd8e4197cb.zip b/.yarn/cache/typical-npm-5.2.0-d4de46c932-fd8e4197cb.zip deleted file mode 100644 index 7d66dc89..00000000 Binary files a/.yarn/cache/typical-npm-5.2.0-d4de46c932-fd8e4197cb.zip and /dev/null differ diff --git a/.yarn/cache/unplugin-npm-1.10.1-b23391b255-d9819fad8a.zip b/.yarn/cache/unplugin-npm-1.11.0-0b6b24a0d1-debe6223b0.zip similarity index 74% rename from .yarn/cache/unplugin-npm-1.10.1-b23391b255-d9819fad8a.zip rename to .yarn/cache/unplugin-npm-1.11.0-0b6b24a0d1-debe6223b0.zip index 8078c8db..de56e563 100644 Binary files a/.yarn/cache/unplugin-npm-1.10.1-b23391b255-d9819fad8a.zip and b/.yarn/cache/unplugin-npm-1.11.0-0b6b24a0d1-debe6223b0.zip differ diff --git a/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip b/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip new file mode 100644 index 00000000..068c0ccb Binary files /dev/null and b/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip differ diff --git a/.yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-49e726d7b2.zip b/.yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-49e726d7b2.zip deleted file mode 100644 index d33113fe..00000000 Binary files a/.yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-49e726d7b2.zip and /dev/null differ diff --git a/.yarn/cache/webpack-cli-npm-4.1.0-fcae536f7b-14a0bfc722.zip b/.yarn/cache/webpack-cli-npm-4.1.0-fcae536f7b-14a0bfc722.zip deleted file mode 100644 index 3c575bf2..00000000 Binary files a/.yarn/cache/webpack-cli-npm-4.1.0-fcae536f7b-14a0bfc722.zip and /dev/null differ diff --git a/.yarn/cache/webpack-merge-npm-4.2.2-f98139a8eb-93b59d623f.zip b/.yarn/cache/webpack-merge-npm-4.2.2-f98139a8eb-93b59d623f.zip deleted file mode 100644 index 220fd34b..00000000 Binary files a/.yarn/cache/webpack-merge-npm-4.2.2-f98139a8eb-93b59d623f.zip and /dev/null differ diff --git a/.yarn/cache/webpack-npm-4.44.2-eedc4b763e-1be2628244.zip b/.yarn/cache/webpack-npm-4.47.0-42e477a08c-d5763ee8d6.zip similarity index 85% rename from .yarn/cache/webpack-npm-4.44.2-eedc4b763e-1be2628244.zip rename to .yarn/cache/webpack-npm-4.47.0-42e477a08c-d5763ee8d6.zip index 0e5e888f..3b686f8e 100644 Binary files a/.yarn/cache/webpack-npm-4.44.2-eedc4b763e-1be2628244.zip and b/.yarn/cache/webpack-npm-4.47.0-42e477a08c-d5763ee8d6.zip differ diff --git a/.yarn/cache/webpack-npm-5.1.3-ee81460ee2-ab2c7b914b.zip b/.yarn/cache/webpack-npm-5.1.3-ee81460ee2-ab2c7b914b.zip deleted file mode 100644 index c82bc454..00000000 Binary files a/.yarn/cache/webpack-npm-5.1.3-ee81460ee2-ab2c7b914b.zip and /dev/null differ diff --git a/.yarn/cache/webpack-npm-5.49.0-286d81acb7-bcdba93435.zip b/.yarn/cache/webpack-npm-5.49.0-286d81acb7-bcdba93435.zip deleted file mode 100644 index f1db34d9..00000000 Binary files a/.yarn/cache/webpack-npm-5.49.0-286d81acb7-bcdba93435.zip and /dev/null differ diff --git a/.yarn/cache/webpack-npm-5.92.1-eba8a81d56-76fcfbebcc.zip b/.yarn/cache/webpack-npm-5.92.1-eba8a81d56-76fcfbebcc.zip new file mode 100644 index 00000000..90b4b6dd Binary files /dev/null and b/.yarn/cache/webpack-npm-5.92.1-eba8a81d56-76fcfbebcc.zip differ diff --git a/.yarn/cache/webpack-sources-npm-2.3.1-fac7f75ad9-0c4bb91f28.zip b/.yarn/cache/webpack-sources-npm-2.3.1-fac7f75ad9-0c4bb91f28.zip deleted file mode 100644 index 5e479f8c..00000000 Binary files a/.yarn/cache/webpack-sources-npm-2.3.1-fac7f75ad9-0c4bb91f28.zip and /dev/null differ diff --git a/.yarn/cache/webpack-sources-npm-3.2.0-07549b866c-351a50e4ee.zip b/.yarn/cache/webpack-sources-npm-3.2.0-07549b866c-351a50e4ee.zip deleted file mode 100644 index a7e2be70..00000000 Binary files a/.yarn/cache/webpack-sources-npm-3.2.0-07549b866c-351a50e4ee.zip and /dev/null differ diff --git a/.yarn/cache/wordwrapjs-npm-4.0.1-b6c3c84d76-4182c48c9d.zip b/.yarn/cache/wordwrapjs-npm-4.0.1-b6c3c84d76-4182c48c9d.zip deleted file mode 100644 index 936e2020..00000000 Binary files a/.yarn/cache/wordwrapjs-npm-4.0.1-b6c3c84d76-4182c48c9d.zip and /dev/null differ diff --git a/.yarn/patches/unplugin-npm-1.10.1-b23391b255.patch b/.yarn/patches/unplugin-npm-1.10.1-b23391b255.patch new file mode 100644 index 00000000..d6f1f27f --- /dev/null +++ b/.yarn/patches/unplugin-npm-1.10.1-b23391b255.patch @@ -0,0 +1,52 @@ +diff --git a/dist/index.js b/dist/index.js +index e20e787eb708d88135de6fbff72b0460ac7ae13b..b2a20f4adb99fb1b055d9fd661cf56e2e549926c 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1655,8 +1655,8 @@ function getRspackPlugin(factory) { + }); + } + if (plugin.writeBundle) { +- compiler.hooks.afterEmit.tap(plugin.name, () => { +- plugin.writeBundle(); ++ compiler.hooks.afterEmit.tapPromise(plugin.name, async () => { ++ await plugin.writeBundle(); + }); + } + } +@@ -1910,8 +1910,8 @@ function getWebpackPlugin(factory) { + }); + } + if (plugin.writeBundle) { +- compiler.hooks.afterEmit.tap(plugin.name, () => { +- plugin.writeBundle(); ++ compiler.hooks.afterEmit.tapPromise(plugin.name, async () => { ++ await plugin.writeBundle(); + }); + } + } +diff --git a/dist/index.mjs b/dist/index.mjs +index 7d9b930daf919a180caf2e33a6ed684d53dbc1c5..f4015052d77ae18ae5357fa670ef85e4c3c0007f 100644 +--- a/dist/index.mjs ++++ b/dist/index.mjs +@@ -1619,8 +1619,8 @@ function getRspackPlugin(factory) { + }); + } + if (plugin.writeBundle) { +- compiler.hooks.afterEmit.tap(plugin.name, () => { +- plugin.writeBundle(); ++ compiler.hooks.afterEmit.tapPromise(plugin.name, async () => { ++ await plugin.writeBundle(); + }); + } + } +@@ -1874,8 +1874,8 @@ function getWebpackPlugin(factory) { + }); + } + if (plugin.writeBundle) { +- compiler.hooks.afterEmit.tap(plugin.name, () => { +- plugin.writeBundle(); ++ compiler.hooks.afterEmit.tapPromise(plugin.name, async () => { ++ await plugin.writeBundle(); + }); + } + } diff --git a/LICENSES-3rdparty.csv b/LICENSES-3rdparty.csv index e50c16ef..72ed0cef 100644 --- a/LICENSES-3rdparty.csv +++ b/LICENSES-3rdparty.csv @@ -176,6 +176,7 @@ Component,Origin,Licence,Copyright @tsconfig/node12,npm,MIT,(https://www.npmjs.com/package/@tsconfig/node12) @tsconfig/node14,npm,MIT,(https://www.npmjs.com/package/@tsconfig/node14) @tsconfig/node16,npm,MIT,(https://www.npmjs.com/package/@tsconfig/node16) +@types/async-retry,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/async-retry) @types/babel__core,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel__core) @types/babel__generator,npm,MIT,(https://www.npmjs.com/package/@types/babel__generator) @types/babel__preset-env,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel__preset-env) @@ -184,7 +185,7 @@ Component,Origin,Licence,Copyright @types/chalk,npm,MIT,(https://www.npmjs.com/package/@types/chalk) @types/color-name,npm,MIT,(https://www.npmjs.com/package/@types/color-name) @types/eslint,npm,MIT,(https://www.npmjs.com/package/@types/eslint) -@types/eslint-scope,npm,MIT,(https://www.npmjs.com/package/@types/eslint-scope) +@types/eslint-scope,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/eslint-scope) @types/estree,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree) @types/fs-extra,npm,MIT,(https://www.npmjs.com/package/@types/fs-extra) @types/glob,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/glob) @@ -200,8 +201,14 @@ Component,Origin,Licence,Copyright @types/node,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) @types/parse-json,npm,MIT,(https://www.npmjs.com/package/@types/parse-json) @types/resolve,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/resolve) +@types/retry,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/retry) @types/semver,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/semver) +@types/source-list-map,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/source-list-map) @types/stack-utils,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/stack-utils) +@types/tapable,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/tapable) +@types/uglify-js,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/uglify-js) +@types/webpack,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/webpack) +@types/webpack-sources,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/webpack-sources) @types/wrap-ansi,npm,MIT,(https://www.npmjs.com/package/@types/wrap-ansi) @types/yargs,npm,MIT,(https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs) @types/yargs-parser,npm,MIT,(https://www.npmjs.com/package/@types/yargs-parser) @@ -233,13 +240,11 @@ Component,Origin,Licence,Copyright @webassemblyjs/wasm-parser,npm,MIT,Sven Sauleau (https://www.npmjs.com/package/@webassemblyjs/wasm-parser) @webassemblyjs/wast-parser,npm,MIT,Sven Sauleau (https://www.npmjs.com/package/@webassemblyjs/wast-parser) @webassemblyjs/wast-printer,npm,MIT,Sven Sauleau (https://www.npmjs.com/package/@webassemblyjs/wast-printer) -@webpack-cli/info,virtual,MIT,(https://github.com/webpack/webpack-cli/tree/master/packages/info) -@webpack-cli/serve,virtual,MIT,(https://github.com/webpack/webpack-cli/tree/master/packages/serve) @xtuc/ieee754,npm,BSD-3-Clause,Feross Aboukhadijeh (http://feross.org) @xtuc/long,npm,Apache-2.0,Daniel Wirtz (https://www.npmjs.com/package/@xtuc/long) abbrev,npm,ISC,Isaac Z. Schlueter (https://www.npmjs.com/package/abbrev) acorn,npm,MIT,(https://github.com/acornjs/acorn) -acorn-import-assertions,virtual,MIT,Sven Sauleau (https://www.npmjs.com/package/acorn-import-assertions) +acorn-import-attributes,virtual,MIT,Sven Sauleau (https://www.npmjs.com/package/acorn-import-attributes) acorn-jsx,virtual,MIT,(https://github.com/acornjs/acorn-jsx) acorn-walk,npm,MIT,(https://github.com/acornjs/acorn) aggregate-error,npm,MIT,Sindre Sorhus (sindresorhus.com) @@ -259,7 +264,6 @@ argparse,npm,MIT,(https://www.npmjs.com/package/argparse) arr-diff,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/arr-diff) arr-flatten,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/arr-flatten) arr-union,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/arr-union) -array-back,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/array-back) array-buffer-byte-length,npm,MIT,Jordan Harband (https://github.com/inspect-js/array-buffer-byte-length#readme) array-includes,npm,MIT,Jordan Harband (http://ljharb.codes) array-union,npm,MIT,Sindre Sorhus (sindresorhus.com) @@ -275,6 +279,7 @@ assert-plus,npm,MIT,Mark Cavage (https://www.npmjs.com/package/assert-plus) assign-symbols,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/assign-symbols) astral-regex,npm,MIT,Kevin Mårtensson (github.com/kevva) async-each,npm,MIT,Paul Miller (https://github.com/paulmillr/async-each/) +async-retry,npm,MIT,(https://www.npmjs.com/package/async-retry) asynckit,npm,MIT,Alex Indigo (https://github.com/alexindigo/asynckit#readme) atob,npm,(MIT OR Apache-2.0),AJ ONeal (https://git.coolaj86.com/coolaj86/atob.js.git) available-typed-arrays,npm,MIT,Jordan Harband (https://github.com/inspect-js/available-typed-arrays#readme) @@ -344,9 +349,7 @@ collect-v8-coverage,npm,MIT,(https://www.npmjs.com/package/collect-v8-coverage) collection-visit,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/collection-visit) color-convert,npm,MIT,Heather Arthur (https://www.npmjs.com/package/color-convert) color-name,npm,MIT,DY (https://github.com/dfcreative/color-name) -colorette,npm,MIT,Jorge Bucaran (https://www.npmjs.com/package/colorette) combined-stream,npm,MIT,Felix Geisendörfer (https://github.com/felixge/node-combined-stream) -command-line-usage,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/command-line-usage) commander,npm,MIT,TJ Holowaychuk (https://www.npmjs.com/package/commander) commondir,npm,MIT,James Halliday (http://substack.net) compare-versions,npm,MIT,Ole Michelsen (https://github.com/omichelsen/compare-versions#readme) @@ -377,7 +380,6 @@ data-view-byte-offset,npm,MIT,Jordan Harband (https://github.com/ljharb/data-vie debug,virtual,MIT,Josh Junon (https://www.npmjs.com/package/debug) decode-uri-component,npm,MIT,Sam Verschueren (github.com/SamVerschueren) dedent,virtual,MIT,Desmond Brand (https://github.com/dmnd/dedent) -deep-extend,npm,MIT,Viacheslav Lotsmanov (https://github.com/unclechu/node-deep-extend) deep-is,npm,MIT,Thorsten Lorenz (http://thlorenz.com) deepmerge,npm,MIT,(https://github.com/TehShrike/deepmerge) defaults,npm,MIT,Elijah Insua (https://www.npmjs.com/package/defaults) @@ -406,7 +408,6 @@ end-of-stream,npm,MIT,Mathias Buus (https://github.com/mafintosh/end-of-stream) enhanced-resolve,npm,MIT,Tobias Koppers @sokra (http://github.com/webpack/enhanced-resolve) enquirer,npm,MIT,Jon Schlinkert (https://github.com/enquirer/enquirer) env-paths,npm,MIT,Sindre Sorhus (sindresorhus.com) -envinfo,npm,MIT,tabrindle@gmail.com (https://www.npmjs.com/package/envinfo) errno,npm,MIT,(https://www.npmjs.com/package/errno) error-ex,npm,MIT,(https://www.npmjs.com/package/error-ex) es-abstract,npm,MIT,Jordan Harband (http://ljharb.codes) @@ -437,6 +438,7 @@ esrecurse,npm,BSD-2-Clause,(https://github.com/estools/esrecurse) estraverse,npm,BSD-2-Clause,(https://github.com/estools/estraverse) estree-walker,npm,MIT,Rich Harris (https://www.npmjs.com/package/estree-walker) esutils,npm,BSD-2-Clause,(https://github.com/estools/esutils) +eventemitter3,npm,MIT,Arnout Kazemier (https://www.npmjs.com/package/eventemitter3) events,npm,MIT,Irakli Gozalishvili (http://jeditoolkit.com) evp_bytestokey,npm,MIT,Calvin Metcalf (https://github.com/crypto-browserify/EVP_BytesToKey) execa,npm,MIT,Sindre Sorhus (sindresorhus.com) @@ -530,7 +532,6 @@ infer-owner,npm,ISC,Isaac Z. Schlueter (https://izs.me) inflight,npm,ISC,Isaac Z. Schlueter (https://github.com/isaacs/inflight) inherits,npm,ISC,(https://www.npmjs.com/package/inherits) internal-slot,npm,MIT,Jordan Harband (https://github.com/ljharb/internal-slot#readme) -interpret,npm,MIT,Gulp Team (http://gulpjs.com/) is-accessor-descriptor,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/is-accessor-descriptor) is-array-buffer,npm,MIT,Jordan Harband (https://github.com/inspect-js/is-array-buffer#readme) is-arrayish,npm,MIT,Qix (http://github.com/qix-) @@ -629,7 +630,6 @@ listr2,npm,MIT,Cenk Kilic (https://srcs.kilic.dev) loader-runner,npm,MIT,Tobias Koppers @sokra (https://github.com/webpack/loader-runner#readme) loader-utils,npm,MIT,Tobias Koppers @sokra (https://www.npmjs.com/package/loader-utils) locate-path,npm,MIT,Sindre Sorhus (sindresorhus.com) -lodash,npm,MIT,John-David Dalton (https://lodash.com/) lodash.debounce,npm,MIT,John-David Dalton (https://lodash.com/) lodash.memoize,npm,MIT,John-David Dalton (https://lodash.com/) lodash.merge,npm,MIT,John-David Dalton (https://lodash.com/) @@ -668,6 +668,7 @@ nan,npm,MIT,(https://www.npmjs.com/package/nan) nanomatch,npm,MIT,Jon Schlinkert (https://github.com/micromatch/nanomatch) natural-compare,npm,MIT,Lauri Rooden (https://github.com/litejs/natural-compare-lite) neo-async,npm,MIT,(https://github.com/suguru03/neo-async) +nock,npm,MIT,Pedro Teixeira (https://www.npmjs.com/package/nock) node-gyp,npm,MIT,Nathan Rajlich (http://tootallnate.net) node-int64,npm,MIT,Robert Kieffer (https://www.npmjs.com/package/node-int64) node-libs-browser,npm,MIT,Tobias Koppers @sokra (http://github.com/webpack/node-libs-browser) @@ -697,9 +698,12 @@ os-homedir,npm,MIT,Sindre Sorhus (sindresorhus.com) os-tmpdir,npm,MIT,Sindre Sorhus (sindresorhus.com) osenv,npm,ISC,Isaac Z. Schlueter (http://blog.izs.me/) outdent,npm,MIT,Andrew Bradley (https://github.com/cspotcode/outdent#readme) +p-finally,npm,MIT,Sindre Sorhus (sindresorhus.com) p-limit,npm,MIT,Sindre Sorhus (sindresorhus.com) p-locate,npm,MIT,Sindre Sorhus (sindresorhus.com) p-map,npm,MIT,Sindre Sorhus (https://sindresorhus.com) +p-queue,npm,MIT,(https://www.npmjs.com/package/p-queue) +p-timeout,npm,MIT,Sindre Sorhus (sindresorhus.com) p-try,npm,MIT,Sindre Sorhus (sindresorhus.com) pad,npm,BSD-3-Clause,David Worms (https://github.com/adaltas/node-pad) pako,npm,(MIT AND Zlib),(https://github.com/nodeca/pako) @@ -734,6 +738,7 @@ process,npm,MIT,Roman Shtylman (https://www.npmjs.com/package/process) process-nextick-args,npm,MIT,(https://github.com/calvinmetcalf/process-nextick-args) promise-inflight,virtual,ISC,Rebecca Turner (https://github.com/iarna/promise-inflight#readme) prompts,npm,MIT,Terkel Gjervig (https://terkel.com) +propagate,npm,MIT,Pedro Teixeira (http://github.com/nock/propagate#readme) prr,npm,MIT,Rod Vagg (https://github.com/rvagg/prr) psl,npm,MIT,Lupo Montero (https://lupomontero.com/) public-encrypt,npm,MIT,Calvin Metcalf (https://github.com/crypto-browserify/publicEncrypt) @@ -749,8 +754,6 @@ randomfill,npm,MIT,(https://github.com/crypto-browserify/randomfill) react-is,npm,MIT,(https://reactjs.org/) readable-stream,npm,MIT,(https://www.npmjs.com/package/readable-stream) readdirp,npm,MIT,Thorsten Lorenz (https://github.com/paulmillr/readdirp) -rechoir,npm,MIT,Gulp Team (http://gulpjs.com/) -reduce-flatten,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/reduce-flatten) regenerate,npm,MIT,Mathias Bynens (https://mths.be/regenerate) regenerate-unicode-properties,npm,MIT,Mathias Bynens (https://github.com/mathiasbynens/regenerate-unicode-properties) regenerator-runtime,npm,MIT,Ben Newman (https://www.npmjs.com/package/regenerator-runtime) @@ -771,6 +774,7 @@ resolve-url,npm,MIT,Simon Lydell (https://www.npmjs.com/package/resolve-url) resolve.exports,npm,MIT,Luke Edwards (https://lukeed.com) restore-cursor,npm,MIT,Sindre Sorhus (sindresorhus.com) ret,npm,MIT,Roly Fentanes (https://github.com/fent) +retry,npm,MIT,Tim Koschützki (https://github.com/tim-kos/node-retry) reusify,npm,MIT,Matteo Collina (https://github.com/mcollina/reusify#readme) rimraf,npm,ISC,Isaac Z. Schlueter (http://blog.izs.me/) ripemd160,npm,MIT,(https://www.npmjs.com/package/ripemd160) @@ -838,7 +842,6 @@ strip-json-comments,npm,MIT,Sindre Sorhus (https://sindresorhus.com) supports-color,npm,MIT,Sindre Sorhus (sindresorhus.com) supports-preserve-symlinks-flag,npm,MIT,Jordan Harband (https://github.com/inspect-js/node-supports-preserve-symlinks-flag#readme) synckit,npm,MIT,JounQin (https://www.1stG.me) -table-layout,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/table-layout) tapable,npm,MIT,Tobias Koppers @sokra (https://github.com/webpack/tapable) tar,npm,ISC,Isaac Z. Schlueter (http://blog.izs.me/) terser,npm,BSD-2-Clause,Mihai Bazon (https://terser.org) @@ -874,7 +877,6 @@ typed-array-byte-length,npm,MIT,Jordan Harband (https://github.com/inspect-js/ty typed-array-byte-offset,npm,MIT,Jordan Harband (https://github.com/inspect-js/typed-array-byte-offset#readme) typed-array-length,npm,MIT,Jordan Harband (https://github.com/inspect-js/typed-array-length#readme) typedarray,npm,MIT,James Halliday (https://github.com/substack/typedarray) -typical,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/typical) unbox-primitive,npm,MIT,Jordan Harband (https://github.com/ljharb/unbox-primitive#readme) undici-types,npm,MIT,(https://undici.nodejs.org) unicode-canonical-property-names-ecmascript,npm,MIT,Mathias Bynens (https://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript) @@ -896,7 +898,6 @@ use,npm,MIT,Jon Schlinkert (https://github.com/jonschlinkert/use) util,npm,MIT,Joyent (https://github.com/defunctzombie/node-util) util-deprecate,npm,MIT,Nathan Rajlich (https://github.com/TooTallNate/util-deprecate) uuid,npm,MIT,(https://www.npmjs.com/package/uuid) -v8-compile-cache,npm,MIT,Andres Suarez (https://www.npmjs.com/package/v8-compile-cache) v8-compile-cache-lib,npm,MIT,Andrew Bradley (https://www.npmjs.com/package/v8-compile-cache-lib) v8-to-istanbul,npm,ISC,Ben Coe (https://www.npmjs.com/package/v8-to-istanbul) verror,npm,MIT,(https://www.npmjs.com/package/verror) @@ -906,8 +907,6 @@ watchpack,npm,MIT,Tobias Koppers @sokra (https://github.com/webpack/watchpack) watchpack-chokidar2,npm,MIT,Tobias Koppers @sokra (https://github.com/webpack/watchpack) wcwidth,npm,MIT,Tim Oxley (https://github.com/timoxley/wcwidth#readme) webpack,virtual,MIT,Tobias Koppers @sokra (https://github.com/webpack/webpack) -webpack-cli,virtual,MIT,(https://www.npmjs.com/package/webpack-cli) -webpack-merge,npm,MIT,Juho Vepsalainen (https://github.com/survivejs/webpack-merge) webpack-sources,npm,MIT,Tobias Koppers @sokra (https://github.com/webpack/webpack-sources#readme) webpack-virtual-modules,npm,MIT,SysGears INC (https://github.com/sysgears/webpack-virtual-modules#readme) which,npm,ISC,Isaac Z. Schlueter (http://blog.izs.me) @@ -915,7 +914,6 @@ which-boxed-primitive,npm,MIT,Jordan Harband (https://github.com/inspect-js/whic which-pm-runs,npm,MIT,Zoltan Kochan (https://github.com/zkochan/which-pm-runs#readme) which-typed-array,npm,MIT,Jordan Harband (http://ljharb.codes) wide-align,npm,ISC,Rebecca Turner (http://re-becca.org/) -wordwrapjs,npm,MIT,Lloyd Brookes (https://www.npmjs.com/package/wordwrapjs) worker-farm,npm,MIT,(https://github.com/rvagg/node-worker-farm) wrap-ansi,npm,MIT,Sindre Sorhus (sindresorhus.com) wrappy,npm,ISC,Isaac Z. Schlueter (https://github.com/npm/wrappy) diff --git a/README.md b/README.md index 50414bd1..ee872cde 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ A set of plugins to interact with Datadog directly from your builds. - [Plugins](#plugins) + - [`rum` RUM Plugin](#rum-rum-plugin) - [`telemetry` Telemetry Plugin](#telemetry-telemetry-plugin) - [Configuration](#configuration) - [`auth.apiKey`](#authapikey) @@ -32,6 +33,12 @@ A set of plugins to interact with Datadog directly from your builds. ## Plugins +### `rum` RUM Plugin + +> Interact with our Real User Monitoring product (RUM) in Datadog directly from your build system. + +[📝 Full documentation ➡️](./packages/plugins/rum#readme) + ### `telemetry` Telemetry Plugin > Display and send telemetry data as metrics to Datadog. @@ -51,7 +58,18 @@ A set of plugins to interact with Datadog directly from your builds. apiKey?: string; endPoint?: string; }; - logLevel?: 'debug' | 'warn' | 'error' | 'none'; + logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'none'; + rum?: { + disabled?: boolean; + sourcemaps?: { + dryRun?: boolean; + intakeUrl?: string; + maxConcurrency?: number; + minifiedPathPrefix?: string; + releaseVersion: string; + service: string; + }; + }; telemetry?: { disabled?: boolean; output?: boolean diff --git a/package.json b/package.json index 539955b3..9d87d656 100644 --- a/package.json +++ b/package.json @@ -16,18 +16,18 @@ "yarn": "1.22.19" }, "scripts": { - "build:all": "yarn workspaces foreach -Apti --exclude \"project-*\" run build", - "build:tests": "yarn workspaces foreach -Apti --include \"project-*\" run build", + "build:all": "yarn workspaces foreach -Apti --exclude \"@dd/*\" run build", "cli": "yarn workspace @dd/tools cli", "format": "yarn lint --fix", "lint": "eslint ./packages/**/*.{ts,js} --quiet", + "loop": "yarn workspaces foreach -Apti --include \"@datadog/*\" --exclude \"@datadog/build-plugins\"", "oss": "yarn cli oss -d packages -l mit", - "publish:all": "yarn workspaces foreach -A --include \"@datadog/*\" --exclude \"@datadog/build-plugins\" --no-private npm publish", - "test": "yarn build:all && yarn build:tests && yarn test:only", - "test:only": "yarn workspace @dd/tests test", - "typecheck:all": "yarn workspaces foreach -Apti --exclude \"project-*\" run typecheck", - "version:all": "yarn workspaces foreach -Apti --include \"@datadog/*\" --exclude \"@datadog/build-plugins\" version --deferred ${0} && yarn version apply --all", - "watch:all": "yarn workspaces foreach -Apti --exclude \"project-*\" run watch" + "publish:all": "yarn loop --no-private npm publish", + "test": "yarn workspace @dd/tests test", + "test:noisy": "yarn workspace @dd/tests test:noisy", + "typecheck:all": "yarn workspaces foreach -Apti run typecheck", + "version:all": "yarn loop version --deferred ${0} && yarn version apply --all", + "watch:all": "yarn loop run watch" }, "husky": { "hooks": { diff --git a/packages/core/package.json b/packages/core/package.json index 53062ab1..50512315 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -25,7 +25,7 @@ "dependencies": { "chalk": "2.3.1", "simple-git": "3.25.0", - "unplugin": "1.10.1" + "unplugin": "1.11.0" }, "devDependencies": { "@types/chalk": "2.2.0", diff --git a/packages/core/src/log.ts b/packages/core/src/log.ts index 4dbff5cc..49675f63 100644 --- a/packages/core/src/log.ts +++ b/packages/core/src/log.ts @@ -9,7 +9,8 @@ import type { LogLevel } from './types'; export type Logger = (text: any, type?: LogLevel) => void; const log = (text: any, level: LogLevel, type: LogLevel = 'debug', name?: string) => { - let color = c; + // By default (debug) we print dimmed. + let color = c.dim; // eslint-disable-next-line no-console let logFn = console.log; @@ -21,17 +22,22 @@ const log = (text: any, level: LogLevel, type: LogLevel = 'debug', name?: string color = c.yellow; // eslint-disable-next-line no-console logFn = console.warn; + } else if (type === 'info') { + color = c.cyan; + // eslint-disable-next-line no-console + logFn = console.log; } - const prefix = name ? `[${c.bold(name)}] ` : ''; + const prefix = name ? `[${type}|${name}] ` : ''; if ( level === 'debug' || + (level === 'info' && ['info', 'error', 'warn'].includes(type)) || (level === 'warn' && ['error', 'warn'].includes(type)) || (level === 'error' && type === 'error') ) { const content = typeof text === 'string' ? text : JSON.stringify(text, null, 2); - logFn(`${prefix}${color(content)}`); + logFn(`${color(prefix)}${content}`); } }; diff --git a/packages/core/src/plugins/git/index.ts b/packages/core/src/plugins/git/index.ts index fc7320a0..ca35b53b 100644 --- a/packages/core/src/plugins/git/index.ts +++ b/packages/core/src/plugins/git/index.ts @@ -14,8 +14,8 @@ export const getGitPlugin = (options: Options, context: GlobalContext): Unplugin enforce: 'pre', async buildStart() { // Verify that we should get the git information based on the options. - // Only get git information if git is not disabled. - const shouldGetGitInfo = options.disableGit !== true; + // Only get git information if sourcemaps are enabled and git is not disabled. + const shouldGetGitInfo = options.rum?.sourcemaps && options.disableGit !== true; if (!shouldGetGitInfo) { return; diff --git a/packages/core/src/plugins/git/trackedFilesMatcher.ts b/packages/core/src/plugins/git/trackedFilesMatcher.ts index c8ab0163..1e424cec 100644 --- a/packages/core/src/plugins/git/trackedFilesMatcher.ts +++ b/packages/core/src/plugins/git/trackedFilesMatcher.ts @@ -27,20 +27,24 @@ export class TrackedFilesMatcher { } // Looks up the sources declared in the sourcemap and return a list of related tracked files. - public matchSourcemap(srcmapPath: string, onSourcesNotFound: () => void): string[] | undefined { + public matchSourcemap( + srcmapPath: string, + onSourcesNotFound: (reason: string) => void, + ): string[] | undefined { const buff = fs.readFileSync(srcmapPath, 'utf8'); const srcmapObj = JSON.parse(buff); if (!srcmapObj.sources) { + onSourcesNotFound(`Missing 'sources' field in sourcemap.`); return undefined; } const sources = srcmapObj.sources as string[]; - if (!sources || sources.length === 0) { + if (sources.length === 0) { + onSourcesNotFound(`Empty 'sources' field in sourcemap.`); return undefined; } const filtered = this.matchSources(sources); if (filtered.length === 0) { - onSourcesNotFound(); - + onSourcesNotFound(`Sources not in the tracked files.`); return undefined; } diff --git a/packages/core/src/plugins/global-context/index.ts b/packages/core/src/plugins/global-context/index.ts index 5a5d8ef6..fa325fca 100644 --- a/packages/core/src/plugins/global-context/index.ts +++ b/packages/core/src/plugins/global-context/index.ts @@ -2,30 +2,64 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. +import { getLogger } from '@dd/core/log'; +import type { File, GlobalContext, Meta, Options } from '@dd/core/types'; +import path from 'path'; import type { UnpluginOptions } from 'unplugin'; -import type { GlobalContext, Meta, Options } from '../../types'; +const PLUGIN_NAME = 'global-context-plugin'; export const getGlobalContextPlugin = (opts: Options, meta: Meta) => { + const log = getLogger(opts.logLevel, 'internal-global-context'); const globalContext: GlobalContext = { auth: opts.auth, cwd: process.cwd(), version: meta.version, + outputDir: process.cwd(), bundler: { name: meta.framework, }, }; const globalContextPlugin: UnpluginOptions = { - name: 'global-context-plugin', + name: PLUGIN_NAME, enforce: 'pre', esbuild: { setup(build) { globalContext.bundler.config = build.initialOptions; + if (build.initialOptions.outdir) { + globalContext.outputDir = build.initialOptions.outdir; + } + // We force esbuild to produce its metafile. + build.initialOptions.metafile = true; + build.onEnd((result) => { + if (!result.metafile) { + log('Missing metafile from build result.', 'warn'); + return; + } + + const files: File[] = []; + for (const [output] of Object.entries(result.metafile.outputs)) { + files.push({ filepath: path.join(globalContext.outputDir, output) }); + } + + globalContext.outputFiles = files; + }); }, }, webpack(compiler) { globalContext.bundler.config = compiler.options; + if (compiler.options.output?.path) { + globalContext.outputDir = compiler.options.output.path; + } + + compiler.hooks.emit.tap(PLUGIN_NAME, (compilation) => { + const files: File[] = []; + for (const filename of Object.keys(compilation.assets)) { + files.push({ filepath: path.join(globalContext.outputDir, filename) }); + } + globalContext.outputFiles = files; + }); }, vite: { options(options: any) { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 2ae2633b..db3bf2b4 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -7,6 +7,8 @@ // will be updated using the 'yarn cli integrity' command. // #imports-injection-marker +import type { RumOptions } from '@dd/rum-plugins/types'; +import type * as rum from '@dd/rum-plugins'; import type { TelemetryOptions } from '@dd/telemetry-plugins/types'; import type * as telemetry from '@dd/telemetry-plugins'; // #imports-injection-marker @@ -21,11 +23,15 @@ export interface RepositoryData { trackedFilesMatcher: TrackedFilesMatcher; } +export type File = { filepath: string }; + export type GlobalContext = { auth?: AuthOptions; cwd: string; version: string; git?: RepositoryData; + outputFiles?: File[]; + outputDir: string; bundler: { name: string; config?: any; @@ -36,9 +42,13 @@ export type Meta = UnpluginContextMeta & { version: string; }; -export type GetPlugins = (options: T, context: GlobalContext) => UnpluginOptions[]; +export type PluginOptions = UnpluginOptions & { + name: PluginName; +}; + +export type GetPlugins = (options: T, context: GlobalContext) => PluginOptions[]; -export type LogLevel = 'debug' | 'warn' | 'error' | 'none'; +export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none'; export type AuthOptions = { apiKey?: string; @@ -54,6 +64,7 @@ export interface GetPluginsOptions { export interface Options extends GetPluginsOptions { // Each product should have a unique entry. // #types-injection-marker + [rum.CONFIG_KEY]?: RumOptions; [telemetry.CONFIG_KEY]?: TelemetryOptions; // #types-injection-marker } diff --git a/packages/esbuild-plugin/package.json b/packages/esbuild-plugin/package.json index a4a8631c..6cb0fe60 100644 --- a/packages/esbuild-plugin/package.json +++ b/packages/esbuild-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@datadog/esbuild-plugin", "packageManager": "yarn@4.0.2", - "version": "2.0.1", + "version": "2.1.0", "license": "MIT", "author": "Datadog", "description": "Datadog ESBuild Plugin", @@ -57,8 +57,8 @@ "@rollup/plugin-node-resolve": "15.2.3", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", - "esbuild": "0.20.2", - "rollup": "4.17.1", + "esbuild": "0.21.5", + "rollup": "4.18.0", "rollup-plugin-dts": "6.1.0", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" diff --git a/packages/esbuild-plugin/src/index.ts b/packages/esbuild-plugin/src/index.ts index 26479e2c..a19d54d7 100644 --- a/packages/esbuild-plugin/src/index.ts +++ b/packages/esbuild-plugin/src/index.ts @@ -6,7 +6,7 @@ // Anything between #types-export-injection-marker // will be updated using the 'yarn cli integrity' command. -import { buildPluginFactory } from '@dd/factory'; +import { buildPluginFactory, helpers } from '@dd/factory'; import pkg from '../package.json'; @@ -20,6 +20,13 @@ export type { Options as EsbuildPluginOptions } from '@dd/core/types'; export type { // #types-export-injection-marker + RumTypes, TelemetryTypes, // #types-export-injection-marker } from '@dd/factory'; + +// This is to prevent overrides from other libraries in the final bundle. +module.exports = { + helpers, + datadogEsbuildPlugin, +}; diff --git a/packages/factory/package.json b/packages/factory/package.json index a41278a8..ba8c8713 100644 --- a/packages/factory/package.json +++ b/packages/factory/package.json @@ -17,7 +17,8 @@ }, "dependencies": { "@dd/core": "workspace:*", + "@dd/rum-plugins": "workspace:*", "@dd/telemetry-plugins": "workspace:*", - "unplugin": "1.10.1" + "unplugin": "1.11.0" } } diff --git a/packages/factory/src/index.ts b/packages/factory/src/index.ts index dee47e0d..14a7f128 100644 --- a/packages/factory/src/index.ts +++ b/packages/factory/src/index.ts @@ -11,6 +11,8 @@ import { getInternalPlugins } from '@dd/core/plugins/index'; import type { Options } from '@dd/core/types'; // #imports-injection-marker +import type { OptionsWithRum } from '@dd/rum-plugins/types'; +import * as rum from '@dd/rum-plugins'; import type { OptionsWithTelemetry } from '@dd/telemetry-plugins/types'; import * as telemetry from '@dd/telemetry-plugins'; // #imports-injection-marker @@ -19,12 +21,14 @@ import type { UnpluginContextMeta, UnpluginInstance, UnpluginOptions } from 'unp import { createUnplugin } from 'unplugin'; // #types-export-injection-marker +export type { types as RumTypes } from '@dd/rum-plugins'; export type { types as TelemetryTypes } from '@dd/telemetry-plugins'; // #types-export-injection-marker export const helpers = { // Each product should have a unique entry. // #helpers-injection-marker + [rum.CONFIG_KEY]: rum.helpers, [telemetry.CONFIG_KEY]: telemetry.helpers, // #helpers-injection-marker }; @@ -50,6 +54,9 @@ export const buildPluginFactory = ({ // Based on configuration add corresponding plugin. // #configs-injection-marker + if (options[rum.CONFIG_KEY] && options[rum.CONFIG_KEY].disabled !== true) { + plugins.push(...rum.getPlugins(options as OptionsWithRum, globalContext)); + } if (options[telemetry.CONFIG_KEY] && options[telemetry.CONFIG_KEY].disabled !== true) { plugins.push(...telemetry.getPlugins(options as OptionsWithTelemetry, globalContext)); } diff --git a/packages/plugins/rum/README.md b/packages/plugins/rum/README.md new file mode 100644 index 00000000..f226090d --- /dev/null +++ b/packages/plugins/rum/README.md @@ -0,0 +1,33 @@ +# RUM Plugin + +Interact with our Real User Monitoring product (RUM) in Datadog directly from your build system. + + + +## Table of content + + + + +- [Configuration](#configuration) + + +## Configuration + +```ts +rum?: { + disabled?: boolean; + sourcemaps?: { + dryRun?: boolean; + intakeUrl?: string; + maxConcurrency?: number; + minifiedPathPrefix?: string; + releaseVersion: string; + service: string; + }; +} +``` + +> [!NOTE] +> You can override the intake URL by setting the `DATADOG_SOURCEMAP_INTAKE_URL` environment variable (eg. `https://sourcemap-intake.datadoghq.com/v1/input`). +> Or only the domain with the `DATADOG_SITE` environment variable (eg. `datadoghq.com`). diff --git a/packages/plugins/rum/package.json b/packages/plugins/rum/package.json new file mode 100644 index 00000000..baa415fa --- /dev/null +++ b/packages/plugins/rum/package.json @@ -0,0 +1,33 @@ +{ + "name": "@dd/rum-plugins", + "packageManager": "yarn@4.0.2", + "license": "MIT", + "private": true, + "author": "Datadog", + "description": "Interact with our Real User Monitoring product (RUM) in Datadog directly from your build system.", + "homepage": "https://github.com/DataDog/build-plugins/tree/main/packages/plugins/rum#readme", + "repository": { + "type": "git", + "url": "https://github.com/DataDog/build-plugins", + "directory": "packages/plugins/rum" + }, + "exports": { + ".": "./src/index.ts", + "./sourcemaps/*": "./src/sourcemaps/*.ts", + "./*": "./src/*.ts" + }, + "scripts": { + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@dd/core": "workspace:*", + "async-retry": "1.3.3", + "chalk": "2.3.1", + "outdent": "0.8.0", + "p-queue": "6.6.2", + "unplugin": "1.11.0" + }, + "devDependencies": { + "@types/async-retry": "1.4.8" + } +} diff --git a/packages/plugins/rum/src/constants.ts b/packages/plugins/rum/src/constants.ts new file mode 100644 index 00000000..a27b7a17 --- /dev/null +++ b/packages/plugins/rum/src/constants.ts @@ -0,0 +1,8 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { PluginName } from '@dd/core/types'; + +export const CONFIG_KEY = 'rum' as const; +export const PLUGIN_NAME: PluginName = 'datadog-rum-plugin' as const; diff --git a/packages/plugins/rum/src/index.ts b/packages/plugins/rum/src/index.ts new file mode 100644 index 00000000..d41f8738 --- /dev/null +++ b/packages/plugins/rum/src/index.ts @@ -0,0 +1,47 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { getLogger } from '@dd/core/log'; +import type { GlobalContext, GetPlugins } from '@dd/core/types'; + +import { PLUGIN_NAME } from './constants'; +import { uploadSourcemaps } from './sourcemaps'; +import type { OptionsWithRum, RumOptions, RumOptionsWithSourcemaps } from './types'; +import { validateOptions } from './validate'; + +export { CONFIG_KEY, PLUGIN_NAME } from './constants'; + +export const helpers = { + // Add the helpers you'd like to expose here. +}; + +export type types = { + // Add the types you'd like to expose here. + RumOptions: RumOptions; + OptionsWithRum: OptionsWithRum; +}; + +export const getPlugins: GetPlugins = ( + opts: OptionsWithRum, + context: GlobalContext, +) => { + // Verify configuration. + const rumOptions = validateOptions(opts); + return [ + { + name: PLUGIN_NAME, + async writeBundle() { + if (rumOptions.disabled) { + return; + } + + const log = getLogger(opts.logLevel, PLUGIN_NAME); + if (rumOptions.sourcemaps) { + // Need the "as" because Typescript doesn't understand that we've already checked for sourcemaps. + await uploadSourcemaps(rumOptions as RumOptionsWithSourcemaps, context, log); + } + }, + }, + ]; +}; diff --git a/packages/plugins/rum/src/sourcemaps/files.ts b/packages/plugins/rum/src/sourcemaps/files.ts new file mode 100644 index 00000000..07ce88b8 --- /dev/null +++ b/packages/plugins/rum/src/sourcemaps/files.ts @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { GlobalContext } from '@dd/core/types'; +import chalk from 'chalk'; +import path from 'path'; + +import type { RumSourcemapsOptionsWithDefaults, Sourcemap } from '../types'; + +type PartialSourcemap = Pick; + +const decomposePath = ( + options: RumSourcemapsOptionsWithDefaults, + context: GlobalContext, + sourcemapFilePath: string, +): PartialSourcemap => { + if (path.extname(sourcemapFilePath) !== '.map') { + throw new Error(`The file ${chalk.green.bold(sourcemapFilePath)} is not a sourcemap.`); + } + + const minifiedFilePath = sourcemapFilePath.replace(/\.map$/, ''); + const relativePath = minifiedFilePath.replace(context.outputDir, ''); + const minifiedUrl = options.minifiedPathPrefix + ? path.join(options.minifiedPathPrefix, relativePath) + : relativePath; + + return { + minifiedFilePath, + minifiedUrl, + relativePath, + }; +}; + +export const getSourcemapsFiles = ( + options: RumSourcemapsOptionsWithDefaults, + context: GlobalContext, +): Sourcemap[] => { + if (!context.outputFiles || context.outputFiles.length === 0) { + throw new Error('No output files found.'); + } + + const sourcemapFilesList = context.outputFiles + .filter((file) => file.filepath.endsWith('.map')) + .map((file) => file.filepath); + + const sourcemapFiles = sourcemapFilesList.map((sourcemapFilePath) => { + return { + ...decomposePath(options, context, sourcemapFilePath), + sourcemapFilePath, + minifiedPathPrefix: options.minifiedPathPrefix, + }; + }); + + return sourcemapFiles; +}; diff --git a/packages/plugins/rum/src/sourcemaps/index.ts b/packages/plugins/rum/src/sourcemaps/index.ts new file mode 100644 index 00000000..eb00b94d --- /dev/null +++ b/packages/plugins/rum/src/sourcemaps/index.ts @@ -0,0 +1,38 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { Logger } from '@dd/core/log'; +import type { GlobalContext } from '@dd/core/types'; +import chalk from 'chalk'; +import { outdent } from 'outdent'; + +import type { RumOptionsWithSourcemaps } from '../types'; + +import { getSourcemapsFiles } from './files'; +import { sendSourcemaps } from './sender'; + +export const uploadSourcemaps = async ( + options: RumOptionsWithSourcemaps, + context: GlobalContext, + log: Logger, +) => { + // Show a pretty summary of the configuration. + const green = chalk.green.bold; + const configurationString = Object.entries(options.sourcemaps) + .map(([key, value]) => ` - ${key}: ${green(value.toString())}`) + .join('\n'); + + // Gather the sourcemaps files. + const sourcemaps = getSourcemapsFiles(options.sourcemaps, context); + + const summary = outdent` + Uploading ${green(sourcemaps.length.toString())} sourcemaps with configuration: + ${configurationString} + `; + + log(summary, 'info'); + + // Send everything. + await sendSourcemaps(sourcemaps, options.sourcemaps, context, log); +}; diff --git a/packages/plugins/rum/src/sourcemaps/payload.ts b/packages/plugins/rum/src/sourcemaps/payload.ts new file mode 100644 index 00000000..c765e382 --- /dev/null +++ b/packages/plugins/rum/src/sourcemaps/payload.ts @@ -0,0 +1,213 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { RepositoryData } from '@dd/core/types'; +import { promises as fs } from 'fs'; + +import type { Sourcemap } from '../types'; + +export type Payload = { + content: Map; + errors: string[]; + warnings: string[]; +}; + +export type Metadata = { + plugin_version: string; + project_path: string; + service: string; + type: string; + version: string; + git_repository_url?: string; + git_commit_sha?: string; +}; + +type FileValidity = { + empty: boolean; + exists: boolean; +}; + +type SourcemapValidity = { + file: FileValidity; + sourcemap: FileValidity; + repeatedPrefix: string; +}; + +export interface LocalAppendOptions { + contentType: string; + filename: string; +} + +export interface MultipartStringValue { + type: 'string'; + value: string; + options: LocalAppendOptions; +} + +export interface MultipartFileValue { + type: 'file'; + path: string; + options: LocalAppendOptions; +} + +export type MultipartValue = MultipartStringValue | MultipartFileValue; + +const SLASH_RX = /[/]+|[\\]+/g; +const SLASH_TRIM_RX = /^[/]+|^[\\]+|[/]+$|[\\]+$/g; + +// Verify any repeated pattern between the path and prefix. +export const prefixRepeat = (path: string, prefix: string): string => { + const pathParts = path.replace(SLASH_TRIM_RX, '').split(SLASH_RX); + const prefixParts = prefix.replace(SLASH_TRIM_RX, '').split(SLASH_RX); + const normalizedPath = pathParts.join('/'); + + let result = ''; + + for (let i = 0; i < prefixParts.length; i += 1) { + const partialPrefix = prefixParts.slice(-i).join('/'); + if (normalizedPath.startsWith(partialPrefix)) { + result = partialPrefix; + } + } + + return result; +}; + +// Verify that every files are available. +export const checkFile = async (path: string): Promise => { + const validity: FileValidity = { + empty: false, + exists: true, + }; + + try { + const stats = await fs.stat(path); + if (stats.size === 0) { + validity.empty = true; + } + } catch (error: any) { + if (error.code === 'ENOENT') { + validity.exists = false; + } else { + // Other kind of error + throw error; + } + } + + return validity; +}; + +const getSourcemapValidity = async ( + sourcemap: Sourcemap, + prefix: string, +): Promise => { + const [resultMinFile, resultSourcemap] = await Promise.all([ + checkFile(sourcemap.minifiedFilePath), + checkFile(sourcemap.sourcemapFilePath), + ]); + + return { + file: resultMinFile, + sourcemap: resultSourcemap, + repeatedPrefix: prefixRepeat(sourcemap.relativePath, prefix), + }; +}; + +export const getPayload = async ( + sourcemap: Sourcemap, + metadata: Metadata, + prefix: string, + git?: RepositoryData, +): Promise => { + const validity = await getSourcemapValidity(sourcemap, prefix); + const errors: string[] = []; + const warnings: string[] = []; + const content = new Map([ + [ + 'event', + { + type: 'string', + options: { + contentType: 'application/json', + filename: 'event', + }, + value: JSON.stringify({ + ...metadata, + minified_url: sourcemap.minifiedUrl, + }), + }, + ], + [ + 'source_map', + { + type: 'file', + path: sourcemap.sourcemapFilePath, + options: { filename: 'source_map', contentType: 'application/json' }, + }, + ], + [ + 'minified_file', + { + type: 'file', + path: sourcemap.minifiedFilePath, + options: { filename: 'minified_file', contentType: 'application/javascript' }, + }, + ], + ]); + + // Add git payload if available. + if (git) { + try { + content.set('repository', { + type: 'string', + options: { + contentType: 'application/json', + filename: 'repository', + }, + value: JSON.stringify({ + data: [ + { + files: git.trackedFilesMatcher.matchSourcemap( + sourcemap.sourcemapFilePath, + (reason) => { + warnings.push( + `No tracked files found for sources contained in ${sourcemap.sourcemapFilePath}: "${reason}"`, + ); + }, + ), + hash: git.hash, + repository_url: git.remote, + }, + ], + // NOTE: Make sure to update the version if the format of the JSON payloads changes in any way. + version: 1, + }), + }); + } catch (error: any) { + warnings.push( + `Could not attach git data for sourcemap ${sourcemap.sourcemapFilePath}: ${error.message}`, + ); + } + } + + if (validity.file.empty) { + errors.push(`Minified file is empty: ${sourcemap.minifiedFilePath}`); + } + if (!validity.file.exists) { + errors.push(`Minified file not found: ${sourcemap.minifiedFilePath}`); + } + if (validity.sourcemap.empty) { + errors.push(`Sourcemap file is empty: ${sourcemap.sourcemapFilePath}`); + } + if (!validity.sourcemap.exists) { + errors.push(`Sourcemap file not found: ${sourcemap.sourcemapFilePath}`); + } + if (validity.repeatedPrefix) { + warnings.push( + `The minified file path contains a repeated pattern with the minified path prefix: ${validity.repeatedPrefix}`, + ); + } + + return { content, errors, warnings }; +}; diff --git a/packages/plugins/rum/src/sourcemaps/sender.ts b/packages/plugins/rum/src/sourcemaps/sender.ts new file mode 100644 index 00000000..a73070a0 --- /dev/null +++ b/packages/plugins/rum/src/sourcemaps/sender.ts @@ -0,0 +1,226 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { Logger } from '@dd/core/log'; +import type { GlobalContext } from '@dd/core/types'; +import retry from 'async-retry'; +import { File } from 'buffer'; +import chalk from 'chalk'; +import fs from 'fs'; +import PQueue from 'p-queue'; +import { Readable } from 'stream'; +import type { Gzip } from 'zlib'; +import { createGzip } from 'zlib'; + +import type { RumSourcemapsOptionsWithDefaults, Sourcemap } from '../types'; + +import type { LocalAppendOptions, Metadata, MultipartFileValue, Payload } from './payload'; +import { getPayload } from './payload'; + +const errorCodesNoRetry = [400, 403, 413]; +const nbRetries = 5; + +type DataResponse = { data: Gzip; headers: Record }; + +const green = chalk.green.bold; + +export const doRequest = async ( + url: string, + // Need a function to get new streams for each retry. + getData: () => Promise | DataResponse, + onRetry?: (error: Error, attempt: number) => void, +) => { + return retry( + async (bail: (e: Error) => void, attempt: number) => { + let response: Response; + try { + const { data, headers } = await getData(); + + response = await fetch(url, { + method: 'POST', + body: data, + headers, + // This is needed for sending body in NodeJS' Fetch. + // https://github.com/nodejs/node/issues/46221 + duplex: 'half', + }); + } catch (error: any) { + // We don't want to retry if there is a non-fetch related error. + bail(new Error(error)); + return; + } + + if (!response.ok) { + // Not instantiating the error here, as it will make Jest throw in the tests. + const error = `HTTP ${response.status} ${response.statusText}`; + if (errorCodesNoRetry.includes(response.status)) { + bail(new Error(error)); + return; + } else { + // Trigger the retry. + throw new Error(error); + } + } + + try { + // Await it so we catch any parsing error and bail. + const result = await response.json(); + return result; + } catch (error: any) { + // We don't want to retry on parsing errors. + bail(new Error(error)); + } + }, + { + retries: nbRetries, + onRetry, + }, + ); +}; + +// From a path, returns a File to use with native FormData and fetch. +const getFile = async (path: string, options: LocalAppendOptions) => { + // @ts-expect-error openAsBlob is not in the NodeJS types until 19+ + if (typeof fs.openAsBlob === 'function') { + // Support NodeJS 19+ + // @ts-expect-error openAsBlob is not in the NodeJS types until 19+ + const blob = await fs.openAsBlob(path, { type: options.contentType }); + return new File([blob], options.filename); + } else { + // Support NodeJS 18- + const stream = Readable.toWeb(fs.createReadStream(path)); + const blob = await new Response(stream).blob(); + const file = new File([blob], options.filename, { type: options.contentType }); + return file; + } +}; + +// Use a function to get new streams for each retry. +export const getData = + (payload: Payload, defaultHeaders: Record = {}) => + async (): Promise => { + const form = new FormData(); + const gz = createGzip(); + + for (const [key, content] of payload.content) { + const value = + content.type === 'file' + ? // eslint-disable-next-line no-await-in-loop + await getFile(content.path, content.options) + : new Blob([content.value], { type: content.options.contentType }); + + form.append(key, value, content.options.filename); + } + + // GZip data, we use a Request to serialize the data and transform it into a stream. + const req = new Request('fake://url', { method: 'POST', body: form }); + const formStream = Readable.fromWeb(req.body!); + const data = formStream.pipe(gz); + + const headers = { + 'Content-Encoding': 'gzip', + ...defaultHeaders, + ...Object.fromEntries(req.headers.entries()), + }; + + return { data, headers }; + }; + +export const upload = async ( + payloads: Payload[], + options: RumSourcemapsOptionsWithDefaults, + context: GlobalContext, + log: Logger, +) => { + if (!context.auth?.apiKey) { + throw new Error('No authentication token provided'); + } + + if (payloads.length === 0) { + log('No sourcemaps to upload', 'warn'); + return; + } + + const queue = new PQueue({ concurrency: options.maxConcurrency }); + const defaultHeaders = { + 'DD-API-KEY': context.auth.apiKey, + 'DD-EVP-ORIGIN': `${context.bundler.name}-build-plugin_sourcemaps`, + 'DD-EVP-ORIGIN-VERSION': context.version, + }; + + for (const payload of payloads) { + const metadata = { + sourcemap: (payload.content.get('source_map') as MultipartFileValue)?.path.replace( + context.outputDir, + '.', + ), + file: (payload.content.get('minified_file') as MultipartFileValue)?.path.replace( + context.outputDir, + '.', + ), + }; + + log(`Queuing ${green(metadata.sourcemap)} | ${green(metadata.file)}`); + + // eslint-disable-next-line no-await-in-loop + queue.add(async () => { + await doRequest( + options.intakeUrl, + getData(payload, defaultHeaders), + (error: Error, attempt: number) => { + log( + `Failed to upload sourcemaps: ${error.message}\nRetrying ${attempt}/${nbRetries}`, + 'warn', + ); + }, + ); + log(`Sent ${green(metadata.sourcemap)} | ${green(metadata.file)}`); + }); + } + + return queue.onIdle(); +}; + +export const sendSourcemaps = async ( + sourcemaps: Sourcemap[], + options: RumSourcemapsOptionsWithDefaults, + context: GlobalContext, + log: Logger, +) => { + const prefix = options.minifiedPathPrefix; + + const metadata: Metadata = { + git_repository_url: context.git?.remote, + git_commit_sha: context.git?.hash, + plugin_version: context.version, + project_path: context.outputDir, + service: options.service, + type: 'js_sourcemap', + version: options.releaseVersion, + }; + + const payloads = await Promise.all( + sourcemaps.map((sourcemap) => getPayload(sourcemap, metadata, prefix, context.git)), + ); + + const errors = payloads.map((payload) => payload.errors).flat(); + const warnings = payloads.map((payload) => payload.warnings).flat(); + + if (errors.length > 0) { + const errorMsg = `Failed to upload sourcemaps:\n - ${errors.join('\n - ')}`; + log(errorMsg, 'error'); + throw new Error(errorMsg); + } + + if (warnings.length > 0) { + log(`Warnings while uploading sourcemaps:\n - ${warnings.join('\n - ')}`, 'warn'); + } + + try { + await upload(payloads, options, context, log); + } catch (error: any) { + log(`Failed to upload sourcemaps: ${error.message}`, 'error'); + throw error; + } +}; diff --git a/packages/plugins/rum/src/types.ts b/packages/plugins/rum/src/types.ts new file mode 100644 index 00000000..6e9a331f --- /dev/null +++ b/packages/plugins/rum/src/types.ts @@ -0,0 +1,47 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { GetPluginsOptions } from '@dd/core/types'; + +import type { CONFIG_KEY } from './constants'; + +export type MinifiedPathPrefix = `http://${string}` | `https://${string}` | `/${string}`; + +export type RumSourcemapsOptions = { + dryRun?: boolean; + intakeUrl?: string; + maxConcurrency?: number; + minifiedPathPrefix: MinifiedPathPrefix; + releaseVersion: string; + service: string; +}; + +export type RumOptions = { + disabled?: boolean; + sourcemaps?: RumSourcemapsOptions; +}; + +export type RumSourcemapsOptionsWithDefaults = Required; + +export type RumOptionsWithDefaults = { + disabled?: boolean; + sourcemaps?: RumSourcemapsOptionsWithDefaults; +}; + +export type RumOptionsWithSourcemaps = { + disabled?: boolean; + sourcemaps: RumSourcemapsOptionsWithDefaults; +}; + +export interface OptionsWithRum extends GetPluginsOptions { + [CONFIG_KEY]: RumOptions; +} + +export type Sourcemap = { + minifiedFilePath: string; + minifiedPathPrefix: MinifiedPathPrefix; + minifiedUrl: string; + relativePath: string; + sourcemapFilePath: string; +}; diff --git a/packages/plugins/rum/src/validate.ts b/packages/plugins/rum/src/validate.ts new file mode 100644 index 00000000..33a8f3ad --- /dev/null +++ b/packages/plugins/rum/src/validate.ts @@ -0,0 +1,111 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import chalk from 'chalk'; + +import { CONFIG_KEY, PLUGIN_NAME } from './constants'; +import type { + OptionsWithRum, + RumOptions, + RumOptionsWithDefaults, + RumSourcemapsOptionsWithDefaults, +} from './types'; + +export const defaultIntakeUrl = `https://sourcemap-intake.${process.env.DATADOG_SITE || 'datadoghq.com'}/api/v2/srcmap`; + +// Deal with validation and defaults here. +export const validateOptions = (config: Partial): RumOptionsWithDefaults => { + const errors: string[] = []; + + // Validate and add defaults sub-options. + const sourcemapsResults = validateSourcemapsOptions(config); + errors.push(...sourcemapsResults.errors); + + // Throw if there are any errors. + if (errors.length) { + throw new Error(`Invalid configuration for ${PLUGIN_NAME}:\n - ${errors.join('\n - ')}`); + } + + // Build the final configuration. + const toReturn: RumOptionsWithDefaults = { + ...config[CONFIG_KEY], + sourcemaps: undefined, + }; + + // Fill in the defaults. + if (sourcemapsResults.config) { + toReturn.sourcemaps = sourcemapsResults.config; + } + + return toReturn; +}; + +type ToReturn = { + errors: string[]; + config?: T; +}; + +const validateMinifiedPathPrefix = (minifiedPathPrefix: string): boolean => { + let host; + try { + const objUrl = new URL(minifiedPathPrefix!); + host = objUrl.host; + } catch { + // Do nothing. + } + + if (!host && !minifiedPathPrefix!.startsWith('/')) { + return false; + } + + return true; +}; + +export const validateSourcemapsOptions = ( + config: Partial, +): ToReturn => { + const red = chalk.bold.red; + const validatedOptions: RumOptions = config[CONFIG_KEY] || {}; + const toReturn: ToReturn> = { + errors: [], + }; + + if (validatedOptions.sourcemaps) { + // Validate the configuration. + if (!validatedOptions.sourcemaps.releaseVersion) { + toReturn.errors.push(`${red('sourcemaps.releaseVersion')} is required.`); + } + if (!validatedOptions.sourcemaps.service) { + toReturn.errors.push(`${red('sourcemaps.service')} is required.`); + } + if (!validatedOptions.sourcemaps.minifiedPathPrefix) { + toReturn.errors.push(`${red('sourcemaps.minifiedPathPrefix')} is required.`); + } + + // Validate the minifiedPathPrefix. + if (validatedOptions.sourcemaps.minifiedPathPrefix) { + if (!validateMinifiedPathPrefix(validatedOptions.sourcemaps.minifiedPathPrefix)) { + toReturn.errors.push( + `${red('sourcemaps.minifiedPathPrefix')} must be a valid URL or start with '/'.`, + ); + } + } + + // Add the defaults. + const sourcemapsWithDefaults: RumSourcemapsOptionsWithDefaults = { + dryRun: false, + maxConcurrency: 20, + intakeUrl: + process.env.DATADOG_SOURCEMAP_INTAKE_URL || + validatedOptions.sourcemaps.intakeUrl || + defaultIntakeUrl, + ...validatedOptions.sourcemaps, + }; + + // Save the config. + toReturn.config = sourcemapsWithDefaults; + } + + return toReturn; +}; diff --git a/packages/tests/tsconfig.json b/packages/plugins/rum/tsconfig.json similarity index 55% rename from packages/tests/tsconfig.json rename to packages/plugins/rum/tsconfig.json index 7d6eccaf..6c1d3065 100644 --- a/packages/tests/tsconfig.json +++ b/packages/plugins/rum/tsconfig.json @@ -1,13 +1,10 @@ { - "extends": "../../tsconfig.json", + "extends": "../../../tsconfig.json", "compilerOptions": { "baseUrl": "./", - "esModuleInterop": true, - "module": "Node16", - "moduleResolution": "node16", "rootDir": "./", "outDir": "./dist" }, "include": ["**/*"], "exclude": ["dist", "node_modules"] -} +} \ No newline at end of file diff --git a/packages/plugins/telemetry/package.json b/packages/plugins/telemetry/package.json index 4793ade1..7c5e3d13 100644 --- a/packages/plugins/telemetry/package.json +++ b/packages/plugins/telemetry/package.json @@ -26,11 +26,11 @@ "dependencies": { "@dd/core": "workspace:*", "chalk": "2.3.1", - "esbuild": "0.20.2", + "esbuild": "0.21.5", "fs-extra": "7.0.1", "pretty-bytes": "5.6.0", - "unplugin": "1.10.1", - "webpack": "5.49.0" + "unplugin": "1.11.0", + "webpack": "5.92.1" }, "devDependencies": { "@types/chalk": "2.2.0", diff --git a/packages/tests/jest.config.js b/packages/tests/jest.config.js index d92687c7..c845cc9b 100644 --- a/packages/tests/jest.config.js +++ b/packages/tests/jest.config.js @@ -5,18 +5,9 @@ module.exports = { // Automatically clear mock calls and instances between every test clearMocks: true, - preset: 'ts-jest', + preset: 'ts-jest/presets/js-with-ts', reporters: [['default', { summaryThreshold: 0 }]], testEnvironment: 'node', testMatch: ['**/*.test.*'], - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - tsconfig: 'tsconfig.json', - packageJson: 'package.json', - }, - ], - }, roots: ['./src/'], }; diff --git a/packages/tests/package.json b/packages/tests/package.json index 681bdeec..ef619668 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -11,20 +11,18 @@ "url": "https://github.com/DataDog/build-plugins", "directory": "packages/tests" }, - "workspaces": [ - "src/plugins/**/mocks/projects/*", - "src/plugins/**/mocks/projects/*/workspaces/*" - ], "exports": { "./*": "./src/*.ts", "./fixtures/*": "./src/fixtures/*", + "./helpers/*": "./src/helpers/*.ts", "./plugins/telemetry/*": "./src/plugins/telemetry/*.ts" }, "scripts": { "build": "yarn clean && tsc", "clean": "rm -rf dist", "typecheck": "tsc --noEmit", - "test": "NODE_OPTIONS=\"--openssl-legacy-provider ${NODE_OPTIONS:-}\" jest --verbose" + "test": "yarn test:noisy --silent", + "test:noisy": "NODE_OPTIONS=\"--openssl-legacy-provider ${NODE_OPTIONS:-}\" jest --verbose" }, "dependencies": { "@datadog/esbuild-plugin": "workspace:*", @@ -38,9 +36,12 @@ "devDependencies": { "@types/jest": "29.5.12", "@types/node": "^18", - "esbuild": "0.20.2", + "@types/webpack4": "npm:@types/webpack@4.41.38", + "esbuild": "0.21.5", "memfs": "4.9.2", + "nock": "14.0.0-beta.7", "typescript": "5.4.3", - "webpack": "5.49.0" + "webpack": "5.92.1", + "webpack4": "npm:webpack@4.47.0" } } diff --git a/packages/tests/src/core/plugins/git/index.test.ts b/packages/tests/src/core/plugins/git/index.test.ts index f1b79338..78a1c209 100644 --- a/packages/tests/src/core/plugins/git/index.test.ts +++ b/packages/tests/src/core/plugins/git/index.test.ts @@ -3,8 +3,12 @@ // Copyright 2019-Present Datadog, Inc. import { getRepositoryData } from '@dd/core/plugins/git/helpers'; -import { getPlugins } from '@dd/telemetry-plugins'; -import { defaultPluginOptions, getFetchMock, runBundlers } from '@dd/tests/helpers'; +import { getPlugins as getRumPlugins } from '@dd/rum-plugins'; +import { getPlugins as getTelemetryPlugins } from '@dd/telemetry-plugins'; +import { defaultPluginOptions } from '@dd/tests/helpers/mocks'; +import { runBundlers } from '@dd/tests/helpers/runBundlers'; +import { API_PATH, FAKE_URL, getSourcemapsConfiguration } from '@dd/tests/plugins/rum/testHelpers'; +import nock from 'nock'; jest.mock('@dd/telemetry-plugins', () => { const originalModule = jest.requireActual('@dd/telemetry-plugins'); @@ -14,10 +18,13 @@ jest.mock('@dd/telemetry-plugins', () => { }; }); -const getPluginsMocked = jest.mocked(getPlugins); -const mockGitData = { - data: 'data', -}; +jest.mock('@dd/rum-plugins', () => { + const originalModule = jest.requireActual('@dd/rum-plugins'); + return { + ...originalModule, + getPlugins: jest.fn(() => []), + }; +}); jest.mock('@dd/core/plugins/git/helpers', () => { const originalModule = jest.requireActual('@dd/core/plugins/git/helpers'); @@ -27,34 +34,76 @@ jest.mock('@dd/core/plugins/git/helpers', () => { }; }); -global.fetch = jest.fn(() => { - return getFetchMock(); -}); +const getTelemetryPluginsMocked = jest.mocked(getTelemetryPlugins); +const getRumPluginsMocked = jest.mocked(getRumPlugins); +const mockGitData = { + data: 'data', +}; const getRepositoryDataMocked = jest.mocked(getRepositoryData); describe('Git Plugin', () => { + beforeAll(() => { + // Mock requests. + nock(FAKE_URL).post(API_PATH).reply(200, {}).persist(); + }); + + afterAll(() => { + nock.cleanAll(); + }); + describe('It should run', () => { - test('by default and add the relevant data to the context.', async () => { + test('by default with sourcemaps.', async () => { + const pluginConfig = { + ...defaultPluginOptions, + rum: { + sourcemaps: getSourcemapsConfiguration(), + }, + }; + + await runBundlers(pluginConfig); + + // This will fail when we add new bundlers to support. + // It is intended so we keep an eye on it whenever we add a new bundler. + expect(getRepositoryDataMocked).toHaveBeenCalledTimes(3); + }); + + test('and add the relevant data to the context.', async () => { const pluginConfig = { ...defaultPluginOptions, telemetry: {}, + rum: { + sourcemaps: getSourcemapsConfiguration(), + }, }; - const results = await runBundlers(pluginConfig); - expect(getRepositoryDataMocked).toHaveBeenCalledTimes(results.length); + + await runBundlers(pluginConfig); // Confirm every call gets the git data in the context. - for (const call of getPluginsMocked.mock.calls) { - expect(call[1]).toMatchObject({ - git: mockGitData, - }); + for (const mock of [getTelemetryPluginsMocked.mock, getRumPluginsMocked.mock]) { + for (const call of mock.calls) { + expect(call[1]).toMatchObject({ + git: mockGitData, + }); + } } }); }); + describe('It should not run', () => { + test('by default without sourcemaps.', async () => { + const pluginConfig = { + ...defaultPluginOptions, + }; + await runBundlers(pluginConfig); + expect(getRepositoryDataMocked).not.toHaveBeenCalled(); + }); test('if we disable it from the configuration', async () => { const pluginConfig = { ...defaultPluginOptions, + rum: { + sourcemaps: getSourcemapsConfiguration(), + }, disableGit: true, }; await runBundlers(pluginConfig); diff --git a/packages/tests/src/core/plugins/global-context/index.test.ts b/packages/tests/src/core/plugins/global-context/index.test.ts index 712fec2c..741b854f 100644 --- a/packages/tests/src/core/plugins/global-context/index.test.ts +++ b/packages/tests/src/core/plugins/global-context/index.test.ts @@ -2,8 +2,11 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. +import type { GlobalContext, Options } from '@dd/core/types'; +import { uploadSourcemaps } from '@dd/rum-plugins/sourcemaps/index'; import { getPlugins } from '@dd/telemetry-plugins'; -import { defaultPluginOptions, runBundlers } from '@dd/tests/helpers'; +import { BUNDLERS, defaultDestination, defaultPluginOptions } from '@dd/tests/helpers/mocks'; +import { runBundlers } from '@dd/tests/helpers/runBundlers'; jest.mock('@dd/telemetry-plugins', () => { const originalModule = jest.requireActual('@dd/telemetry-plugins'); @@ -13,10 +16,27 @@ jest.mock('@dd/telemetry-plugins', () => { }; }); +jest.mock('@dd/rum-plugins/sourcemaps/index', () => { + const originalModule = jest.requireActual('@dd/rum-plugins/sourcemaps/index'); + return { + ...originalModule, + uploadSourcemaps: jest.fn(), + }; +}); + const getPluginsMocked = jest.mocked(getPlugins); +const uploadSourcemapsMocked = jest.mocked(uploadSourcemaps); describe('Global Context Plugin', () => { test('It should inject context in the other plugins.', async () => { + // Intercept context to verify it at the moment it's sent. + const contextResults: GlobalContext[] = []; + getPluginsMocked.mockImplementation((options, context) => { + // We remove git for better readability. + contextResults.push({ ...context, git: undefined }); + return []; + }); + const pluginConfig = { ...defaultPluginOptions, telemetry: {}, @@ -25,9 +45,9 @@ describe('Global Context Plugin', () => { await runBundlers(pluginConfig); // Confirm every call shares the options and the global context - for (const call of getPluginsMocked.mock.calls) { - expect(call[0]).toEqual(pluginConfig); - expect(call[1]).toEqual({ + expect(contextResults).toHaveLength(3); + for (const context of contextResults) { + expect(context).toEqual({ auth: expect.objectContaining({ apiKey: expect.any(String), }), @@ -36,9 +56,62 @@ describe('Global Context Plugin', () => { config: expect.any(Object), }, cwd: expect.any(String), - git: expect.any(Object), + outputDir: expect.any(String), version: expect.any(String), }); } }); + + test('It should give the list of files produced by the build', async () => { + // Intercept context to verify it at the moment it's sent. + const contextResults: GlobalContext[] = []; + uploadSourcemapsMocked.mockImplementation((options, context, log) => { + // We remove git for better readability. + contextResults.push({ ...context, git: undefined }); + return Promise.resolve(); + }); + + const pluginConfig: Options = { + ...defaultPluginOptions, + rum: { + sourcemaps: { + minifiedPathPrefix: 'http://path', + releaseVersion: '1.0.0', + service: 'service', + }, + }, + }; + + await runBundlers(pluginConfig); + + // This will fail when we add new bundlers to support. + // It is intended so we keep an eye on it whenever we add a new bundler. + expect(contextResults).toHaveLength(3); + for (const context of contextResults) { + expect(context.outputFiles).toBeDefined(); + expect(context.outputFiles).toHaveLength(2); + + let matchedFile = false; + let matchedSourcemap = false; + + for (const file of context.outputFiles!) { + if ( + file.filepath.match( + new RegExp(`^${defaultDestination}/(${BUNDLERS.join('|')})/main.js$`), + ) + ) { + matchedFile = true; + } else if ( + file.filepath.match( + new RegExp(`^${defaultDestination}/(${BUNDLERS.join('|')})/main.js.map$`), + ) + ) { + matchedSourcemap = true; + } + } + + expect(matchedFile).toBe(true); + expect(matchedSourcemap).toBe(true); + } + }); }); diff --git a/packages/tests/src/factory/index.test.ts b/packages/tests/src/factory/index.test.ts index 67bbf3c1..faa85c9c 100644 --- a/packages/tests/src/factory/index.test.ts +++ b/packages/tests/src/factory/index.test.ts @@ -3,8 +3,7 @@ // Copyright 2019-Present Datadog, Inc. import { getPlugins } from '@dd/telemetry-plugins'; - -import { runBundlers } from '../helpers'; +import { runBundlers } from '@dd/tests/helpers/runBundlers'; jest.mock('@dd/telemetry-plugins', () => { const originalModule = jest.requireActual('@dd/telemetry-plugins'); @@ -21,6 +20,7 @@ describe('Factory', () => { await runBundlers({ telemetry: { disabled: true } }); expect(getPluginsMocked).not.toHaveBeenCalled(); }); + test('It should call an enabled plugin', async () => { const results = await runBundlers({ telemetry: { disabled: false } }); expect(getPluginsMocked).toHaveBeenCalledTimes(results.length); diff --git a/packages/tests/src/fixtures/project/.gitignore b/packages/tests/src/fixtures/project/.gitignore new file mode 100644 index 00000000..9855bef7 --- /dev/null +++ b/packages/tests/src/fixtures/project/.gitignore @@ -0,0 +1,3 @@ +esbuild-output +webpack5-output +webpack4-output diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0000.js b/packages/tests/src/fixtures/project/src/file0000.js similarity index 99% rename from packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0000.js rename to packages/tests/src/fixtures/project/src/file0000.js index a52d4a77..adf46ea5 100644 --- a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0000.js +++ b/packages/tests/src/fixtures/project/src/file0000.js @@ -2,7 +2,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. -import fn2 from 'sub_app/file0001.js'; +import fn2 from '../workspaces/app/file0001.js'; import fn1 from './file0001.js'; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0001.js b/packages/tests/src/fixtures/project/src/file0001.js similarity index 97% rename from packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0001.js rename to packages/tests/src/fixtures/project/src/file0001.js index cdf4f0ae..8e784920 100644 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0001.js +++ b/packages/tests/src/fixtures/project/src/file0001.js @@ -2,7 +2,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. -import fn2 from 'webpack5_app/file0000.js'; +import fn2 from '../workspaces/app/file0000.js'; import fn1 from './file0000.js'; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/file0000.js b/packages/tests/src/fixtures/project/workspaces/app/file0000.js similarity index 100% rename from packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/file0000.js rename to packages/tests/src/fixtures/project/workspaces/app/file0000.js diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/file0001.js b/packages/tests/src/fixtures/project/workspaces/app/file0001.js similarity index 100% rename from packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/file0001.js rename to packages/tests/src/fixtures/project/workspaces/app/file0001.js diff --git a/packages/tests/src/helpers.ts b/packages/tests/src/helpers.ts deleted file mode 100644 index 0e34d157..00000000 --- a/packages/tests/src/helpers.ts +++ /dev/null @@ -1,127 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import { datadogEsbuildPlugin } from '@datadog/esbuild-plugin'; -import { datadogWebpackPlugin } from '@datadog/webpack-plugin'; -import type { GlobalContext, Options } from '@dd/core/types'; -import esbuild from 'esbuild'; -import path from 'path'; -import webpack from 'webpack'; - -type BundlerOptions = { - entry?: string; - destination?: string; -}; - -export const defaultPluginOptions: Options = { - auth: { - apiKey: '123', - }, - logLevel: 'debug', -}; - -export const getContextMock = (options: Partial = {}): GlobalContext => { - return { - auth: { apiKey: '123' }, - cwd: '/cwd/path', - version: '1.2.3', - bundler: { name: 'esbuild' }, - ...options, - }; -}; - -export const getFetchMock = (options: Partial = {}) => { - return Promise.resolve({ - ...new Response(), - ok: true, - status: 200, - statusText: 'OK', - json: () => Promise.resolve({}), - ...options, - }); -}; - -const getWebpackOptions = ( - pluginOptionOverrides: Options = {}, - bundlerOptions: BundlerOptions = {}, -): webpack.Configuration => { - const entry = bundlerOptions?.entry || defaultEntry; - const destination = bundlerOptions?.destination || defaultDestination; - - const newPluginOptions = { - ...defaultPluginOptions, - ...pluginOptionOverrides, - }; - - return { - entry, - output: { - path: path.join(destination, 'webpack'), - filename: `[name].js`, - }, - devtool: 'source-map', - plugins: [datadogWebpackPlugin(newPluginOptions)], - }; -}; - -const getEsbuildOptions = ( - pluginOptionOverrides: Options = {}, - bundlerOptions: BundlerOptions = {}, -): esbuild.BuildOptions => { - const entry = bundlerOptions?.entry || defaultEntry; - const destination = bundlerOptions?.destination || defaultDestination; - - const newPluginOptions = { - ...defaultPluginOptions, - ...pluginOptionOverrides, - }; - - return { - bundle: true, - sourcemap: true, - entryPoints: [entry], - outfile: path.join(destination, 'esbuild', 'index.js'), - plugins: [datadogEsbuildPlugin(newPluginOptions)], - }; -}; - -export const defaultEntry = '@dd/tests/fixtures/index.js'; -export const defaultDestination = path.resolve(__dirname, './dist'); - -export const runWebpack = async ( - pluginOptions: Options = {}, - bundlerOptions: BundlerOptions = {}, -) => { - const bundlerConfigs = getWebpackOptions(pluginOptions, bundlerOptions); - return new Promise((resolve) => { - webpack(bundlerConfigs, (err, stats) => { - if (err) { - console.log(err); - } - resolve(stats); - }); - }); -}; - -export const runEsbuild = async ( - pluginOptions: Options = {}, - bundlerOptions: BundlerOptions = {}, -) => { - const bundlerConfigs = getEsbuildOptions(pluginOptions, bundlerOptions); - return esbuild.build(bundlerConfigs); -}; - -export const runBundlers = async ( - pluginOptions: Options = {}, - bundlerOptions: BundlerOptions = {}, -) => { - const promises = []; - - promises.push(runWebpack(pluginOptions, bundlerOptions)); - promises.push(runEsbuild(pluginOptions, bundlerOptions)); - - const results = await Promise.all(promises); - - return results; -}; diff --git a/packages/tests/src/helpers/configBundlers.ts b/packages/tests/src/helpers/configBundlers.ts new file mode 100644 index 00000000..71802e95 --- /dev/null +++ b/packages/tests/src/helpers/configBundlers.ts @@ -0,0 +1,80 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { datadogEsbuildPlugin } from '@datadog/esbuild-plugin'; +import { datadogWebpackPlugin } from '@datadog/webpack-plugin'; +import type { Options } from '@dd/core/types'; +import type { BuildOptions } from 'esbuild'; +import path from 'path'; +import type { Configuration as Configuration4, Plugin } from 'webpack4'; +import type { Configuration } from 'webpack'; + +import { defaultDestination, defaultEntry, defaultPluginOptions } from './mocks'; + +export const getWebpackOptions = ( + pluginOptionOverrides: Options = {}, + bundlerOptions: Partial = {}, +): Configuration => { + const newPluginOptions = { + ...defaultPluginOptions, + ...pluginOptionOverrides, + }; + + return { + entry: defaultEntry, + mode: 'production', + output: { + path: path.join(defaultDestination, 'webpack'), + filename: `[name].js`, + }, + devtool: 'source-map', + plugins: [datadogWebpackPlugin(newPluginOptions)], + ...bundlerOptions, + }; +}; + +export const getWebpack4Options = ( + pluginOptionOverrides: Options = {}, + bundlerOptions: Partial = {}, +): Configuration4 => { + const newPluginOptions = { + ...defaultPluginOptions, + ...pluginOptionOverrides, + }; + + const plugin = datadogWebpackPlugin(newPluginOptions) as unknown; + + return { + // Somehow webpack4 doesn't find @dd/tests/fixtures/index.js + entry: './src/fixtures/index.js', + output: { + path: path.join(defaultDestination, 'webpack'), + filename: `[name].js`, + }, + devtool: 'source-map', + plugins: [plugin as Plugin], + ...bundlerOptions, + }; +}; + +export const getEsbuildOptions = ( + pluginOptionOverrides: Options = {}, + bundlerOptions: Partial = {}, +): BuildOptions => { + const newPluginOptions = { + ...defaultPluginOptions, + ...pluginOptionOverrides, + }; + + return { + bundle: true, + sourcemap: true, + entryPoints: [defaultEntry], + outfile: bundlerOptions.outdir + ? undefined + : path.join(defaultDestination, 'esbuild', 'main.js'), + plugins: [datadogEsbuildPlugin(newPluginOptions)], + ...bundlerOptions, + }; +}; diff --git a/packages/tests/src/helpers/mocks.ts b/packages/tests/src/helpers/mocks.ts new file mode 100644 index 00000000..ce0a50de --- /dev/null +++ b/packages/tests/src/helpers/mocks.ts @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { GlobalContext, Options } from '@dd/core/types'; +import { ROOT } from '@dd/tools/constants'; +import path from 'path'; + +export const PROJECT_ROOT = path.join(ROOT, 'packages/tests/src/fixtures/project'); +export const BUNDLERS = ['webpack', 'webpack4', 'esbuild']; + +export const defaultEntry = '@dd/tests/fixtures/index.js'; +export const defaultDestination = path.resolve(PROJECT_ROOT, '../dist'); + +export const defaultPluginOptions: Options = { + auth: { + apiKey: '123', + }, + logLevel: 'debug', +}; + +export const getContextMock = (options: Partial = {}): GlobalContext => { + return { + auth: { apiKey: '123' }, + cwd: '/cwd/path', + outputDir: '/cwd/path', + version: '1.2.3', + bundler: { name: 'esbuild' }, + ...options, + }; +}; diff --git a/packages/tests/src/helpers/runBundlers.ts b/packages/tests/src/helpers/runBundlers.ts new file mode 100644 index 00000000..697041e3 --- /dev/null +++ b/packages/tests/src/helpers/runBundlers.ts @@ -0,0 +1,73 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { Options } from '@dd/core/types'; +import type { BuildOptions } from 'esbuild'; +import esbuild from 'esbuild'; +import { rmSync } from 'fs'; +import type { Configuration as Configuration4 } from 'webpack4'; +import webpack4 from 'webpack4'; +import type { Configuration } from 'webpack'; +import webpack from 'webpack'; + +import { getEsbuildOptions, getWebpack4Options, getWebpackOptions } from './configBundlers'; +import { defaultDestination } from './mocks'; + +export const runWebpack = async ( + pluginOptions: Options = {}, + bundlerOptions: Partial = {}, +) => { + const bundlerConfigs = getWebpackOptions(pluginOptions, bundlerOptions); + return new Promise((resolve) => { + webpack(bundlerConfigs, (err, stats) => { + if (err) { + console.error(err); + } + resolve(stats); + }); + }); +}; + +export const runWebpack4 = async ( + pluginOptions: Options = {}, + bundlerOptions: Partial = {}, +) => { + const bundlerConfigs = getWebpack4Options(pluginOptions, bundlerOptions); + return new Promise((resolve) => { + webpack4(bundlerConfigs, (err, stats) => { + if (err) { + console.log(err); + } + + // Webpack is somehow not exiting gracefully. + setTimeout(() => { + process.nextTick(() => { + resolve(stats); + }); + }, 600); + }); + }); +}; + +export const runEsbuild = async ( + pluginOptions: Options = {}, + bundlerOptions: Partial = {}, +) => { + const bundlerConfigs = getEsbuildOptions(pluginOptions, bundlerOptions); + return esbuild.build(bundlerConfigs); +}; + +export const runBundlers = async (pluginOptions: Options = {}) => { + const promises = []; + + rmSync(defaultDestination, { recursive: true, force: true }); + + promises.push(runWebpack(pluginOptions)); + promises.push(runWebpack4(pluginOptions)); + promises.push(runEsbuild(pluginOptions)); + + const results = await Promise.all(promises); + + return results; +}; diff --git a/packages/tests/src/plugins/rum/index.test.ts b/packages/tests/src/plugins/rum/index.test.ts new file mode 100644 index 00000000..c91cb553 --- /dev/null +++ b/packages/tests/src/plugins/rum/index.test.ts @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { GlobalContext } from '@dd/core/types'; +import { uploadSourcemaps } from '@dd/rum-plugins/sourcemaps/index'; +import { runBundlers, runWebpack } from '@dd/tests/helpers/runBundlers'; + +import { getSourcemapsConfiguration } from './testHelpers'; + +jest.mock('@dd/rum-plugins/sourcemaps/index', () => { + return { + uploadSourcemaps: jest.fn(), + }; +}); + +const uploadSourcemapsMock = jest.mocked(uploadSourcemaps); + +describe('RUM Plugin', () => { + test('It should process the sourcemaps if enabled.', async () => { + await runWebpack({ + rum: { + sourcemaps: getSourcemapsConfiguration(), + }, + }); + expect(uploadSourcemapsMock).toHaveBeenCalled(); + }); + + test('It should process the sourcemaps with the right context.', async () => { + const contextResults: GlobalContext[] = []; + // Intercept context to verify it at the moment it's sent. + uploadSourcemapsMock.mockImplementation((options, context, log) => { + contextResults.push({ ...context }); + return Promise.resolve(); + }); + + await runBundlers({ + rum: { + sourcemaps: getSourcemapsConfiguration(), + }, + }); + + // Verify that the mock's expects didn't fail. + expect(contextResults).toHaveLength(3); + for (const context of contextResults) { + expect(context.outputFiles).toBeDefined(); + expect(context.outputFiles?.length).toBeGreaterThan(0); + } + }); + + test('It should not process the sourcemaps with no options.', async () => { + await runBundlers({ + rum: {}, + }); + + expect(uploadSourcemapsMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/tests/src/plugins/rum/sourcemaps/files.test.ts b/packages/tests/src/plugins/rum/sourcemaps/files.test.ts new file mode 100644 index 00000000..f4257e18 --- /dev/null +++ b/packages/tests/src/plugins/rum/sourcemaps/files.test.ts @@ -0,0 +1,63 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { getSourcemapsFiles } from '@dd/rum-plugins/sourcemaps/files'; +import { vol } from 'memfs'; +import path from 'path'; + +import { getContextMock } from '../../../helpers/mocks'; +import { getSourcemapsConfiguration } from '../testHelpers'; + +jest.mock('fs', () => require('memfs').fs); + +const FIXTURES = { + // Adding both .js and .mjs files. + 'fixtures/common.js': '', + 'fixtures/common.min.js.map': '', + 'fixtures/common.min.js': '', + 'fixtures/common.mjs': '', + 'fixtures/common.min.mjs': '', + 'fixtures/common.min.mjs.map': '', +}; + +describe('RUM Plugin Sourcemaps Files', () => { + beforeEach(() => { + // Emulate some fixtures. + vol.fromJSON(FIXTURES, __dirname); + }); + + afterEach(() => { + vol.reset(); + }); + + test('It should get sourcemap files.', async () => { + const sourcemaps = getSourcemapsFiles( + getSourcemapsConfiguration({ + minifiedPathPrefix: '/minified', + }), + getContextMock({ + outputDir: __dirname, + outputFiles: Object.keys(FIXTURES).map((filepath) => ({ + filepath: path.join(__dirname, filepath), + })), + }), + ); + + expect(sourcemaps.length).toBe(2); + + for (const sourcemap of sourcemaps) { + expect(sourcemap).toMatchObject({ + // Should end with ".min.js" or ".min.mjs". + minifiedFilePath: expect.stringMatching(/\.min\.(js|mjs)$/), + // Should start with "minified/" and end with ".min.js" or ".min.mjs". + minifiedUrl: expect.stringMatching(/^\/minified\/fixtures\/common\.min\.(js|mjs)$/), + // Should start with "/" and end with ".min.js" or ".min.mjs". + relativePath: expect.stringMatching(/^\/fixtures\/common\.min\.(js|mjs)$/), + // Should end with ".map". + sourcemapFilePath: expect.stringMatching(/\.map$/), + minifiedPathPrefix: '/minified', + }); + } + }); +}); diff --git a/packages/tests/src/plugins/rum/sourcemaps/payload.test.ts b/packages/tests/src/plugins/rum/sourcemaps/payload.test.ts new file mode 100644 index 00000000..951894b1 --- /dev/null +++ b/packages/tests/src/plugins/rum/sourcemaps/payload.test.ts @@ -0,0 +1,135 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { checkFile, getPayload, prefixRepeat } from '@dd/rum-plugins/sourcemaps/payload'; +import { vol } from 'memfs'; +import path from 'path'; + +import { getMetadataMock, getRepositoryDataMock, getSourcemapMock } from '../testHelpers'; + +jest.mock('fs', () => require('memfs').fs); + +describe('RUM Plugins Sourcemaps Payloads', () => { + describe('prefixRepeat', () => { + test.each([ + { prefix: '/testing/path/to', filePath: '/path/to/file.js', expected: 'path/to' }, + { prefix: '/path/to', filePath: '/to/file.js', expected: 'to' }, + { prefix: '/prefix/ok', filePath: '/path/to/file.js', expected: '' }, + { prefix: '/new/prefix/ok', filePath: '/prefix/to/file.js', expected: '' }, + { prefix: '/', filePath: '/path/to/file.js', expected: '' }, + ])( + 'It should return "$expected" for the prefix "$prefix" and path "$path"', + ({ prefix, filePath, expected }) => { + expect(prefixRepeat(filePath, prefix)).toBe(expected); + }, + ); + }); + + describe('checkFile', () => { + beforeEach(() => { + // Emulate some fixtures. + vol.fromJSON( + { + 'fixtures/empty.js': '', + 'fixtures/not-empty.js': 'Not empty file', + }, + __dirname, + ); + }); + + afterEach(() => { + vol.reset(); + }); + test.each([ + { filePath: 'fixtures/not-empty.js', expected: { exists: true, empty: false } }, + { filePath: 'fixtures/empty.js', expected: { exists: true, empty: true } }, + { filePath: 'fixtures/not-exist.js', expected: { exists: false, empty: false } }, + ])( + 'It should return "$expected" for the file "$filePath".', + async ({ filePath, expected }) => { + const validity = await checkFile(path.resolve(__dirname, filePath)); + expect(validity).toEqual(expected); + }, + ); + }); + + describe('getPayload', () => { + beforeEach(() => { + // Emulate some fixtures. + vol.fromJSON( + { + '/path/to/minified.min.js': 'Some JS File', + '/path/to/sourcemap.js.map': + '{"version":3,"sources":["/path/to/minified.min.js"]}', + '/path/to/empty.js': '', + }, + __dirname, + ); + }); + + afterEach(() => { + vol.reset(); + }); + + test('It should add git data if present', async () => { + const payload = await getPayload( + getSourcemapMock(), + getMetadataMock(), + '/prefix', + getRepositoryDataMock(), + ); + + expect(payload.content.get('repository')).toMatchObject({ + type: 'string', + options: { + contentType: 'application/json', + filename: 'repository', + }, + value: expect.any(String), + }); + + // No errors and no warnings. + expect(payload.warnings.length).toBe(0); + expect(payload.errors.length).toBe(0); + }); + test('It should transfer errors and warnings', async () => {}); + test('It should have content for the event, the source_map and the minified_file', async () => { + const payload = await getPayload( + getSourcemapMock({ + sourcemapFilePath: '/path/to/sourcemap.js.map', + minifiedFilePath: '/path/to/minified.min.js', + }), + getMetadataMock(), + '/prefix', + ); + expect(payload.content.size).toBe(3); + expect(payload.content.get('event')).toMatchObject({ + type: 'string', + options: { + contentType: 'application/json', + filename: 'event', + }, + value: expect.any(String), + }); + expect(payload.content.get('source_map')).toMatchObject({ + type: 'file', + options: { + filename: 'source_map', + }, + path: '/path/to/sourcemap.js.map', + }); + expect(payload.content.get('minified_file')).toMatchObject({ + type: 'file', + options: { + filename: 'minified_file', + }, + path: '/path/to/minified.min.js', + }); + + // No errors and no warnings. + expect(payload.warnings.length).toBe(0); + expect(payload.errors.length).toBe(0); + }); + }); +}); diff --git a/packages/tests/src/plugins/rum/sourcemaps/sender.test.ts b/packages/tests/src/plugins/rum/sourcemaps/sender.test.ts new file mode 100644 index 00000000..cf2ad616 --- /dev/null +++ b/packages/tests/src/plugins/rum/sourcemaps/sender.test.ts @@ -0,0 +1,240 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { MultipartValue } from '@dd/rum-plugins/sourcemaps/payload'; +import { doRequest, getData, sendSourcemaps } from '@dd/rum-plugins/sourcemaps/sender'; +import { getContextMock } from '@dd/tests/helpers/mocks'; +import { vol } from 'memfs'; +import nock from 'nock'; +import { Readable, type Stream } from 'stream'; +import { createGzip, unzipSync } from 'zlib'; + +import { + API_PATH, + FAKE_URL, + INTAKE_URL, + getSourcemapMock, + getSourcemapsConfiguration, +} from '../testHelpers'; + +jest.mock('fs', () => require('memfs').fs); + +// Reduce the retry timeout to speed up the tests. +jest.mock('async-retry', () => { + const original = jest.requireActual('async-retry'); + return jest.fn((callback, options) => { + return original(callback, { + ...options, + minTimeout: 0, + maxTimeout: 1, + }); + }); +}); + +function readFully(stream: Stream): Promise { + const chunks: any[] = []; + return new Promise((resolve, reject) => { + stream.on('data', (chunk) => chunks.push(chunk)); + + stream.on('end', () => { + resolve(Buffer.concat(chunks)); + }); + + stream.on('error', reject); + }); +} + +describe('RUM Plugin Sourcemaps', () => { + describe('getData', () => { + afterEach(() => { + vol.reset(); + }); + test('It should return the correct data and headers', async () => { + // Emulate some fixtures. + vol.fromJSON( + { + '/path/to/minified.min.js': 'Some JS File', + '/path/to/sourcemap.js.map': + '{"version":3,"sources":["/path/to/minified.min.js"]}', + }, + __dirname, + ); + + const payload = { + content: new Map([ + [ + 'source_map', + { + type: 'file', + path: '/path/to/sourcemap.js.map', + options: { filename: 'source_map', contentType: 'application/json' }, + }, + ], + [ + 'minified_file', + { + type: 'file', + path: '/path/to/minified.min.js', + options: { + filename: 'minified_file', + contentType: 'application/javascript', + }, + }, + ], + ]), + errors: [], + warnings: [], + }; + + const { data, headers } = await getData(payload)(); + const zippedData = await readFully(data); + const unzippedData = unzipSync(zippedData).toString('utf-8'); + const dataLines = unzippedData.split(/[\r\n]/g).filter(Boolean); + const boundary = headers['content-type'] + .split('boundary=') + .pop()! + .replace(/^(-)+/g, ''); + + expect(boundary).toBeTruthy(); + expect(dataLines[0]).toMatch(boundary); + expect(dataLines[dataLines.length - 1]).toMatch(boundary); + }); + }); + + describe('sendSourcemaps', () => { + afterEach(async () => { + nock.cleanAll(); + + // Using a setTimeout because it creates an error on the ReadStreams created for the payloads. + await new Promise((resolve) => { + setTimeout(() => { + vol.reset(); + resolve(true); + }, 100); + }); + }); + + test('It should upload sourcemaps.', async () => { + const scope = nock(FAKE_URL).post(API_PATH).reply(200, {}); + // Emulate some fixtures. + vol.fromJSON( + { + '/path/to/minified.min.js': 'Some JS File with some content.', + '/path/to/sourcemap.js.map': + '{"version":3,"sources":["/path/to/minified.min.js"]}', + }, + __dirname, + ); + + await sendSourcemaps( + [getSourcemapMock()], + getSourcemapsConfiguration(), + getContextMock(), + () => {}, + ); + + expect(scope.isDone()).toBe(true); + }); + + test('It should throw in case of payload issues', async () => { + const scope = nock(FAKE_URL).post(API_PATH).reply(200); + // Emulate some fixtures. + vol.fromJSON( + { + // Empty file. + '/path/to/minified.min.js': '', + }, + __dirname, + ); + + await expect(async () => { + await sendSourcemaps( + [getSourcemapMock()], + getSourcemapsConfiguration(), + getContextMock(), + () => {}, + ); + }).rejects.toThrow('Failed to upload sourcemaps:'); + + expect(scope.isDone()).toBe(false); + }); + }); + + describe('doRequest', () => { + const getDataStream = () => { + const gz = createGzip(); + const stream = new Readable(); + stream.push('Some data'); + stream.push(null); + return stream.pipe(gz); + }; + const getDataMock = () => ({ + data: getDataStream(), + headers: { + 'Content-Encoding': 'gzip', + }, + }); + + afterEach(() => { + nock.cleanAll(); + }); + + test('It should do a request', async () => { + const scope = nock(FAKE_URL).post(API_PATH).reply(200, {}); + + const response = await doRequest(INTAKE_URL, getDataMock); + + expect(scope.isDone()).toBe(true); + expect(response).toEqual({}); + }); + + test('It should retry on error', async () => { + // Success after 2 retries. + const scope = nock(FAKE_URL) + .post(API_PATH) + .times(2) + .reply(404) + .post(API_PATH) + .reply(200, {}); + + const response = await doRequest(INTAKE_URL, getDataMock); + + expect(scope.isDone()).toBe(true); + expect(response).toEqual({}); + }); + + test('It should throw on too many retries', async () => { + const scope = nock(FAKE_URL) + .post(API_PATH) + .times(6) + .reply(500, 'Internal Server Error'); + + await expect(async () => { + await doRequest(INTAKE_URL, getDataMock); + }).rejects.toThrow('HTTP 500 Internal Server Error'); + expect(scope.isDone()).toBe(true); + }); + + test('It should bail on specific status', async () => { + const scope = nock(FAKE_URL).post(API_PATH).reply(400, 'Bad Request'); + + await expect(async () => { + await doRequest(INTAKE_URL, getDataMock); + }).rejects.toThrow('HTTP 400 Bad Request'); + expect(scope.isDone()).toBe(true); + }); + + test('It should bail on unrelated errors', async () => { + const scope = nock(FAKE_URL).post(API_PATH).reply(404); + // Creating the data stream outside should make the fetch invocation fail + // on the second pass as it will try to read an already consumed stream. + const data = getDataStream(); + + await expect(async () => { + await doRequest(INTAKE_URL, () => ({ data, headers: {} })); + }).rejects.toThrow('TypeError: Response body object should not be disturbed or locked'); + expect(scope.isDone()).toBe(true); + }); + }); +}); diff --git a/packages/tests/src/plugins/rum/testHelpers.ts b/packages/tests/src/plugins/rum/testHelpers.ts new file mode 100644 index 00000000..c96984ab --- /dev/null +++ b/packages/tests/src/plugins/rum/testHelpers.ts @@ -0,0 +1,72 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { TrackedFilesMatcher } from '@dd/core/plugins/git/trackedFilesMatcher'; +import type { RepositoryData } from '@dd/core/types'; +import type { Metadata } from '@dd/rum-plugins/sourcemaps/payload'; +import type { + RumSourcemapsOptions, + RumSourcemapsOptionsWithDefaults, + Sourcemap, +} from '@dd/rum-plugins/types'; + +export const FAKE_URL = 'https://example.com'; +export const API_PATH = '/v2/srcmap'; +export const INTAKE_URL = `${FAKE_URL}${API_PATH}`; + +export const getMinimalSourcemapsConfiguration = ( + options: Partial = {}, +): RumSourcemapsOptions => { + return { + minifiedPathPrefix: '/prefix', + releaseVersion: '1.0.0', + service: 'rum-build-plugin-sourcemaps', + ...options, + }; +}; + +export const getSourcemapsConfiguration = ( + options: Partial = {}, +): RumSourcemapsOptionsWithDefaults => { + return { + dryRun: false, + maxConcurrency: 10, + intakeUrl: INTAKE_URL, + minifiedPathPrefix: '/prefix', + releaseVersion: '1.0.0', + service: 'rum-build-plugin-sourcemaps', + ...options, + }; +}; + +export const getSourcemapMock = (options: Partial = {}): Sourcemap => { + return { + minifiedFilePath: '/path/to/minified.min.js', + minifiedPathPrefix: '/prefix', + minifiedUrl: '/prefix/path/to/minified.js', + relativePath: '/path/to/minified.min.js', + sourcemapFilePath: '/path/to/sourcemap.js.map', + ...options, + }; +}; + +export const getMetadataMock = (options: Partial = {}): Metadata => { + return { + plugin_version: '1.0.0', + project_path: '/path/to/project', + service: 'rum-build-plugin-sourcemaps', + type: 'js_sourcemap', + version: '1.0.0', + ...options, + }; +}; + +export const getRepositoryDataMock = (options: Partial = {}): RepositoryData => { + return { + hash: 'hash', + remote: 'remote', + trackedFilesMatcher: new TrackedFilesMatcher(['/path/to/minified.min.js']), + ...options, + }; +}; diff --git a/packages/tests/src/plugins/rum/validate.test.ts b/packages/tests/src/plugins/rum/validate.test.ts new file mode 100644 index 00000000..29a45ddf --- /dev/null +++ b/packages/tests/src/plugins/rum/validate.test.ts @@ -0,0 +1,132 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import type { RumSourcemapsOptions } from '@dd/rum-plugins/types'; +import { validateOptions, validateSourcemapsOptions } from '@dd/rum-plugins/validate'; +import stripAnsi from 'strip-ansi'; + +import { getMinimalSourcemapsConfiguration } from './testHelpers'; + +describe('RUM Plugins validate', () => { + describe('validateOptions', () => { + test('It should return the validated configuration', () => { + const config = validateOptions({ + auth: { + apiKey: '123', + }, + rum: { + disabled: false, + }, + }); + + expect(config).toEqual({ + disabled: false, + }); + }); + + test('It should throw with an invalid configuration', () => { + expect(() => { + validateOptions({ + auth: { + apiKey: '123', + }, + rum: { + // Invalid configuration, missing required fields. + sourcemaps: {} as RumSourcemapsOptions, + }, + }); + }).toThrow(); + }); + }); + describe('validateSourcemapsOptions', () => { + test('It should return errors for each missing required field', () => { + const { errors } = validateSourcemapsOptions({ + rum: { + sourcemaps: {} as RumSourcemapsOptions, + }, + }); + + expect(errors.length).toBe(3); + const expectedErrors = [ + 'sourcemaps.releaseVersion is required.', + 'sourcemaps.service is required.', + 'sourcemaps.minifiedPathPrefix is required.', + ]; + expect(errors.map(stripAnsi)).toEqual(expectedErrors); + }); + + test('It should return the validated configuration with defaults', () => { + const configObject: RumSourcemapsOptions = { + minifiedPathPrefix: '/path/to/minified', + releaseVersion: '1.0.0', + service: 'service', + }; + + const { config, errors } = validateSourcemapsOptions({ + rum: { + sourcemaps: getMinimalSourcemapsConfiguration(configObject), + }, + }); + + expect(errors.length).toBe(0); + expect(config).toEqual({ + dryRun: false, + maxConcurrency: 20, + intakeUrl: 'https://sourcemap-intake.datadoghq.com/api/v2/srcmap', + ...configObject, + }); + }); + + test('It should return an error with a bad minifiedPathPrefix', () => { + const { errors } = validateSourcemapsOptions({ + rum: { + sourcemaps: getMinimalSourcemapsConfiguration({ + minifiedPathPrefix: + 'bad-prefix' as RumSourcemapsOptions['minifiedPathPrefix'], + }), + }, + }); + + expect(errors.length).toBe(1); + expect(stripAnsi(errors[0])).toBe( + "sourcemaps.minifiedPathPrefix must be a valid URL or start with '/'.", + ); + }); + + test('It should default to the expected intake url', () => { + const { config } = validateSourcemapsOptions({ + rum: { + sourcemaps: getMinimalSourcemapsConfiguration(), + }, + }); + + expect(config?.intakeUrl).toBe('https://sourcemap-intake.datadoghq.com/api/v2/srcmap'); + }); + + test('It should use the provided configuration as the intake url', () => { + const { config } = validateSourcemapsOptions({ + rum: { + sourcemaps: getMinimalSourcemapsConfiguration({ + intakeUrl: 'https://example.com', + }), + }, + }); + + expect(config?.intakeUrl).toBe('https://example.com'); + }); + + test('It should use the env var if provided as the intake url', () => { + const initialEnvValue = process.env.DATADOG_SOURCEMAP_INTAKE_URL; + process.env.DATADOG_SOURCEMAP_INTAKE_URL = 'https://example.com'; + const { config } = validateSourcemapsOptions({ + rum: { + sourcemaps: getMinimalSourcemapsConfiguration(), + }, + }); + + expect(config?.intakeUrl).toBe('https://example.com'); + process.env.DATADOG_SOURCEMAP_INTAKE_URL = initialEnvValue; + }); + }); +}); diff --git a/packages/tests/src/plugins/telemetry/README.md b/packages/tests/src/plugins/telemetry/README.md deleted file mode 100644 index caea6965..00000000 --- a/packages/tests/src/plugins/telemetry/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Telemetry Plugin Tests - -Right now we have mock projects for: - -- [ESBuild](./src/mocks/projects/esbuild) -- [Webpack 4](./src/mocks/projects/webpack4) -- [Webpack 5](./src/mocks/projects/webpack5) - -## Use a mock project - -You should build the project part of your test suite. - -```js -beforeAll(async () => { - const output = await exec(`yarn workspace project-{{bundler}} build`); - - // Setup what you need. -}, 20000); -``` diff --git a/packages/tests/src/plugins/telemetry/common/metrics/esbuild.test.ts b/packages/tests/src/plugins/telemetry/common/metrics/esbuild.test.ts index 0642715c..24e40013 100644 --- a/packages/tests/src/plugins/telemetry/common/metrics/esbuild.test.ts +++ b/packages/tests/src/plugins/telemetry/common/metrics/esbuild.test.ts @@ -10,30 +10,51 @@ import { getAssets, } from '@dd/telemetry-plugins/common/metrics/esbuild'; import type { Metric, EsbuildStats } from '@dd/telemetry-plugins/types'; -import { exec, PROJECTS_ROOT } from '@dd/tests/plugins/telemetry/testHelpers'; +import { PROJECT_ROOT } from '@dd/tests/helpers/mocks'; +import { runEsbuild } from '@dd/tests/helpers/runBundlers'; +import { prefixPath } from '@dd/tests/plugins/telemetry/testHelpers'; +import fs from 'fs'; import path from 'path'; describe('Telemetry ESBuild Metrics', () => { describe(`Esbuild`, () => { let statsJson: EsbuildStats; - const ESBUILD_ROOT = path.join(PROJECTS_ROOT, `./esbuild`); - const OUTPUT = path.join(ESBUILD_ROOT, `./esbuild-profile-debug/`); + const OUTPUT = path.resolve(PROJECT_ROOT, `./esbuild-output/`); - beforeAll(async () => { - const output = await exec(`yarn workspace project-esbuild build`); - - // eslint-disable-next-line no-console - console.log(`Build :`, output.stderr); + afterAll(async () => { + // Clean + fs.rmSync(OUTPUT, { force: true, recursive: true }); + }); - statsJson = require(path.join(OUTPUT, './bundler.json')); + beforeAll(async () => { + await runEsbuild( + { + auth: { + apiKey: '', + }, + telemetry: { + output: OUTPUT, + }, + }, + { + sourcemap: false, + entryPoints: { + yolo: prefixPath('./src/file0001.js'), + cheesecake: prefixPath('./src/file0000.js'), + }, + outdir: prefixPath('./esbuild-output/dist'), + }, + ); + + statsJson = require(path.resolve(OUTPUT, './bundler.json')); }, 20000); describe('Modules', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, ESBUILD_ROOT); - metrics = getModules(statsJson, indexed, ESBUILD_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); + metrics = getModules(statsJson, indexed, PROJECT_ROOT); }); test('It should give module metrics.', () => { @@ -49,10 +70,10 @@ describe('Telemetry ESBuild Metrics', () => { test('It should have 1 metric per module.', () => { const modules = [ - './src/file0000.js', - './src/file0001.js', - './workspaces/app/file0000.js', - './workspaces/app/file0001.js', + prefixPath('./src/file0000.js'), + prefixPath('./src/file0001.js'), + prefixPath('./workspaces/app/file0000.js'), + prefixPath('./workspaces/app/file0001.js'), ]; for (const module of modules) { @@ -68,8 +89,8 @@ describe('Telemetry ESBuild Metrics', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, ESBUILD_ROOT); - metrics = getEntries(statsJson, indexed, ESBUILD_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); + metrics = getEntries(statsJson, indexed, PROJECT_ROOT); }); test('It should give entries metrics.', () => { @@ -92,8 +113,8 @@ describe('Telemetry ESBuild Metrics', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, ESBUILD_ROOT); - metrics = getAssets(statsJson, indexed, ESBUILD_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); + metrics = getAssets(statsJson, indexed, PROJECT_ROOT); }); test('It should give assets metrics.', () => { diff --git a/packages/tests/src/plugins/telemetry/common/metrics/webpack.test.ts b/packages/tests/src/plugins/telemetry/common/metrics/webpack.test.ts index a422ad8c..86c834d3 100644 --- a/packages/tests/src/plugins/telemetry/common/metrics/webpack.test.ts +++ b/packages/tests/src/plugins/telemetry/common/metrics/webpack.test.ts @@ -11,31 +11,57 @@ import { getAssets, } from '@dd/telemetry-plugins/common/metrics/webpack'; import type { StatsJson, Metric } from '@dd/telemetry-plugins/types'; -import { exec, PROJECTS_ROOT } from '@dd/tests/plugins/telemetry/testHelpers'; +import { PROJECT_ROOT } from '@dd/tests/helpers/mocks'; +import { runWebpack, runWebpack4 } from '@dd/tests/helpers/runBundlers'; +import fs from 'fs'; import path from 'path'; describe('Telemetry Webpack Metrics', () => { for (const version of [4, 5]) { describe(`Webpack ${version}`, () => { let statsJson: StatsJson; - const WEBPACK_ROOT = path.join(PROJECTS_ROOT, `./webpack${version}`); - const OUTPUT = path.join(WEBPACK_ROOT, `./webpack-profile-debug/`); + const OUTPUT = path.resolve(PROJECT_ROOT, `./webpack${version}-output/`); - beforeAll(async () => { - const output = await exec(`yarn workspace project-webpack${version} build`); - - // eslint-disable-next-line no-console - console.log(`Build ${version} :`, output.stderr); + afterAll(async () => { + // Clean + fs.rmSync(OUTPUT, { force: true, recursive: true }); + }); - statsJson = require(path.join(OUTPUT, './bundler.json')); + beforeAll(async () => { + const runFn = version === 5 ? runWebpack : runWebpack4; + await runFn( + { + auth: { + apiKey: '', + }, + telemetry: { + output: OUTPUT, + }, + }, + { + context: PROJECT_ROOT, + devtool: false, + entry: { + cheesecake: './src/file0000.js', + yolo: './src/file0001.js', + }, + output: { + path: path.resolve(PROJECT_ROOT, `./webpack${version}-output/`), + filename: '[name].js', + chunkFilename: '[name].[contenthash].js', + }, + }, + ); + + statsJson = require(path.resolve(OUTPUT, './bundler.json')); }, 20000); describe('Modules', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, WEBPACK_ROOT); - metrics = getModules(statsJson, indexed, WEBPACK_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); + metrics = getModules(statsJson, indexed, PROJECT_ROOT); }); test('It should give module metrics.', () => { @@ -80,7 +106,7 @@ describe('Telemetry Webpack Metrics', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, WEBPACK_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); metrics = getEntries(statsJson, indexed); }); @@ -104,7 +130,7 @@ describe('Telemetry Webpack Metrics', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, WEBPACK_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); metrics = getChunks(statsJson, indexed); }); @@ -134,7 +160,7 @@ describe('Telemetry Webpack Metrics', () => { let metrics: Metric[]; beforeAll(() => { - const indexed = getIndexed(statsJson, WEBPACK_ROOT); + const indexed = getIndexed(statsJson, PROJECT_ROOT); metrics = getAssets(statsJson, indexed); }); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/esbuild.js b/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/esbuild.js deleted file mode 100644 index 342059d0..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/esbuild.js +++ /dev/null @@ -1,28 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -const { datadogEsbuildPlugin } = require('@datadog/esbuild-plugin'); - -require('esbuild') - .build({ - bundle: true, - entryPoints: { - yolo: './src/file0001.js', - cheesecake: './src/file0000.js', - }, - outdir: './dist', - plugins: [ - datadogEsbuildPlugin({ - auth: { - apiKey: '', - }, - telemetry: { - output: './esbuild-profile-debug', - }, - }), - ], - }) - .catch(() => { - process.exitCode = 1; - }); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/package.json deleted file mode 100644 index 39aea16c..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "project-esbuild", - "scripts": { - "build": "yarn clean && ts-node -T ./esbuild.js", - "clean": "rm -rf ./dist ./esbuild-profile-debug" - }, - "devDependencies": { - "@types/node": "^18", - "esbuild": "0.20.2", - "ts-node": "10.9.2", - "typescript": "5.4.3" - }, - "dependencies": { - "@datadog/esbuild-plugin": "workspace:*", - "sub_app": "workspace:*" - } -} diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0001.js b/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0001.js deleted file mode 100644 index 32fb5034..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/src/file0001.js +++ /dev/null @@ -1,16 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn2 from 'sub_app/file0000.js'; - -import fn1 from './file0000.js'; - -const fn = async function () { - await fn1(); - await fn2(); - await (await import('./file0000.js')).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/package.json deleted file mode 100644 index 6c764e93..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "sub_app" -} diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/package.json deleted file mode 100644 index 1b93c5fb..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "project-webpack4", - "scripts": { - "build": "yarn clean && NODE_OPTIONS=--openssl-legacy-provider webpack", - "clean": "rm -rf ./dist ./webpack-profile-debug" - }, - "devDependencies": { - "webpack": "4.44.2", - "webpack-cli": "4.1.0" - }, - "dependencies": { - "@datadog/webpack-plugin": "workspace:*", - "webpack4_app": "workspace:*" - } -} diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0000.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0000.js deleted file mode 100644 index d5a9f90d..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0000.js +++ /dev/null @@ -1,23 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn2 from 'webpack4_app/file0001.js'; - -import fn1 from './file0001.js'; - -const fn = async function () { - await fn1(); - await fn2(); - await ( - await import( - /* webpackChunkName: "app0001Chunk" */ - /* webpackMode: "lazy" */ - './file0001.js' - ) - ).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; -fn(); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0001.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0001.js deleted file mode 100644 index 55e198aa..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/src/file0001.js +++ /dev/null @@ -1,16 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn2 from 'webpack4_app/file0000.js'; - -import fn1 from './file0000.js'; - -const fn = async function () { - await fn1(); - await fn2(); - await (await import('./file0000.js')).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/webpack.config.ts b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/webpack.config.ts deleted file mode 100644 index 138477d8..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/webpack.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import { datadogWebpackPlugin } from '@datadog/webpack-plugin'; -import path from 'path'; - -// TODO type the config object. -const config = { - context: __dirname, - entry: { - cheesecake: './src/file0000.js', - yolo: './src/file0001.js', - }, - plugins: [ - datadogWebpackPlugin({ - auth: { - apiKey: '', - }, - telemetry: { - output: './webpack-profile-debug', - }, - }), - ], - output: { - path: path.join(__dirname, '/dist'), - filename: '[name].js', - chunkFilename: '[name].[contenthash].js', - }, -}; - -export default config; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0000.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0000.js deleted file mode 100644 index c99ca34c..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0000.js +++ /dev/null @@ -1,20 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn1 from './file0001.js'; - -const fn = async function () { - await fn1(); - await ( - await import( - /* webpackChunkName: "0001Chunk" */ - /* webpackMode: "lazy" */ - './file0001.js' - ) - ).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; -fn(); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0001.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0001.js deleted file mode 100644 index c3fa035f..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/file0001.js +++ /dev/null @@ -1,13 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn1 from './file0000.js'; - -const fn = async function () { - await fn1(); - await (await import('./file0000.js')).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/package.json deleted file mode 100644 index b923f55b..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "webpack4_app" -} diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/package.json deleted file mode 100644 index 41188285..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "project-webpack5", - "scripts": { - "build": "yarn clean && NODE_OPTIONS=--openssl-legacy-provider webpack", - "clean": "rm -rf ./dist ./webpack-profile-debug" - }, - "devDependencies": { - "webpack": "5.1.3", - "webpack-cli": "4.1.0" - }, - "dependencies": { - "@datadog/webpack-plugin": "workspace:*", - "webpack5_app": "workspace:*" - } -} diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0000.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0000.js deleted file mode 100644 index c31c5d1f..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/src/file0000.js +++ /dev/null @@ -1,23 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn2 from 'webpack5_app/file0001.js'; - -import fn1 from './file0001.js'; - -const fn = async function () { - await fn1(); - await fn2(); - await ( - await import( - /* webpackChunkName: "app0001Chunk" */ - /* webpackMode: "lazy" */ - './file0001.js' - ) - ).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; -fn(); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/webpack.config.ts b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/webpack.config.ts deleted file mode 100644 index 138477d8..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/webpack.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import { datadogWebpackPlugin } from '@datadog/webpack-plugin'; -import path from 'path'; - -// TODO type the config object. -const config = { - context: __dirname, - entry: { - cheesecake: './src/file0000.js', - yolo: './src/file0001.js', - }, - plugins: [ - datadogWebpackPlugin({ - auth: { - apiKey: '', - }, - telemetry: { - output: './webpack-profile-debug', - }, - }), - ], - output: { - path: path.join(__dirname, '/dist'), - filename: '[name].js', - chunkFilename: '[name].[contenthash].js', - }, -}; - -export default config; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0000.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0000.js deleted file mode 100644 index c99ca34c..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0000.js +++ /dev/null @@ -1,20 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn1 from './file0001.js'; - -const fn = async function () { - await fn1(); - await ( - await import( - /* webpackChunkName: "0001Chunk" */ - /* webpackMode: "lazy" */ - './file0001.js' - ) - ).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; -fn(); diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0001.js b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0001.js deleted file mode 100644 index c3fa035f..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/file0001.js +++ /dev/null @@ -1,13 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. - -import fn1 from './file0000.js'; - -const fn = async function () { - await fn1(); - await (await import('./file0000.js')).default(); - ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); -}; - -export default fn; diff --git a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/package.json b/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/package.json deleted file mode 100644 index c32e640d..00000000 --- a/packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "webpack5_app" -} diff --git a/packages/tests/src/plugins/telemetry/testHelpers.ts b/packages/tests/src/plugins/telemetry/testHelpers.ts index 4818d2d5..05d737d1 100644 --- a/packages/tests/src/plugins/telemetry/testHelpers.ts +++ b/packages/tests/src/plugins/telemetry/testHelpers.ts @@ -16,13 +16,14 @@ import type { TelemetryOptions, Module, } from '@dd/telemetry-plugins/types'; -import { ROOT } from '@dd/tools/constants.ts'; import type { PluginBuild, Metafile } from 'esbuild'; import esbuild from 'esbuild'; import path from 'path'; -export const PROJECTS_ROOT = path.join(ROOT, 'packages/tests/src/plugins/telemetry/mocks/projects'); -export const exec = require('util').promisify(require('child_process').exec); +// Have a path prefixed with the cwd. +export const prefixPath = (modulePath: string) => { + return path.join('src/fixtures/project', modulePath); +}; export const getMockBuild = (overrides: Partial): PluginBuild => { return { diff --git a/packages/tools/package.json b/packages/tools/package.json index 536dc338..7146b13d 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -12,7 +12,8 @@ }, "packageManager": "yarn@4.0.2", "exports": { - "./*": "./src/*" + "./rollupConfig.mjs": "./src/rollupConfig.mjs", + "./*": "./src/*.ts" }, "scripts": { "cli": "ts-node -T --project ./tsconfig.json ./src/index.ts" diff --git a/packages/tools/src/commands/integrity/readme.ts b/packages/tools/src/commands/integrity/readme.ts index 6e66e501..cca71f39 100644 --- a/packages/tools/src/commands/integrity/readme.ts +++ b/packages/tools/src/commands/integrity/readme.ts @@ -127,7 +127,7 @@ export const updateReadmes = async (plugins: Workspace[]) => { apiKey?: string; endPoint?: string; }; - logLevel?: 'debug' | 'warn' | 'error' | 'none'; + logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'none'; `; const errors: string[] = []; const error = red('Error'); diff --git a/packages/tools/tsconfig.json b/packages/tools/tsconfig.json index e2675269..3274ba92 100644 --- a/packages/tools/tsconfig.json +++ b/packages/tools/tsconfig.json @@ -4,6 +4,7 @@ "baseUrl": "./", "esModuleInterop": true, "module": "CommonJS", + "moduleResolution": "Node", "rootDir": "./", "outDir": "./dist" }, diff --git a/packages/webpack-plugin/package.json b/packages/webpack-plugin/package.json index 2f653e7c..9871e56d 100644 --- a/packages/webpack-plugin/package.json +++ b/packages/webpack-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@datadog/webpack-plugin", "packageManager": "yarn@4.0.2", - "version": "2.0.1", + "version": "2.1.0", "license": "MIT", "author": "Datadog", "description": "Datadog Webpack Plugin", @@ -57,8 +57,8 @@ "@rollup/plugin-node-resolve": "15.2.3", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", - "esbuild": "0.20.2", - "rollup": "4.17.1", + "esbuild": "0.21.5", + "rollup": "4.18.0", "rollup-plugin-dts": "6.1.0", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" diff --git a/packages/webpack-plugin/src/index.ts b/packages/webpack-plugin/src/index.ts index 022c15f9..c906fff9 100644 --- a/packages/webpack-plugin/src/index.ts +++ b/packages/webpack-plugin/src/index.ts @@ -6,7 +6,7 @@ // Anything between #types-export-injection-marker // will be updated using the 'yarn cli integrity' command. -import { buildPluginFactory } from '@dd/factory'; +import { buildPluginFactory, helpers } from '@dd/factory'; import pkg from '../package.json'; @@ -16,10 +16,17 @@ export const datadogWebpackPlugin = buildPluginFactory({ export { helpers } from '@dd/factory'; -export type { Options as EsbuildPluginOptions } from '@dd/core/types'; +export type { Options as WebpackPluginOptions } from '@dd/core/types'; export type { // #types-export-injection-marker + RumTypes, TelemetryTypes, // #types-export-injection-marker } from '@dd/factory'; + +// This is to prevent overrides from other libraries in the final bundle. +module.exports = { + helpers, + datadogWebpackPlugin, +}; diff --git a/tsconfig.json b/tsconfig.json index debad5b1..e489e1b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,14 @@ { "compilerOptions": { + "allowImportingTsExtensions": true, "allowSyntheticDefaultImports": true, "baseUrl": "./", "declaration": true, + "esModuleInterop": true, "lib": ["es2022"], "module": "preserve", + "moduleResolution": "bundler", + "noEmit": true, "noImplicitAny": true, "resolveJsonModule": true, "rootDir": "./", diff --git a/yarn.lock b/yarn.lock index e258a39e..3168fe52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1691,8 +1691,8 @@ __metadata: "@rollup/plugin-node-resolve": "npm:15.2.3" "@types/babel__core": "npm:^7" "@types/babel__preset-env": "npm:^7" - esbuild: "npm:0.20.2" - rollup: "npm:4.17.1" + esbuild: "npm:0.21.5" + rollup: "npm:4.18.0" rollup-plugin-dts: "npm:6.1.0" rollup-plugin-esbuild: "npm:6.1.1" typescript: "npm:5.4.3" @@ -1716,8 +1716,8 @@ __metadata: "@rollup/plugin-node-resolve": "npm:15.2.3" "@types/babel__core": "npm:^7" "@types/babel__preset-env": "npm:^7" - esbuild: "npm:0.20.2" - rollup: "npm:4.17.1" + esbuild: "npm:0.21.5" + rollup: "npm:4.18.0" rollup-plugin-dts: "npm:6.1.0" rollup-plugin-esbuild: "npm:6.1.1" typescript: "npm:5.4.3" @@ -1741,7 +1741,7 @@ __metadata: chalk: "npm:2.3.1" simple-git: "npm:3.25.0" typescript: "npm:5.4.3" - unplugin: "npm:1.10.1" + unplugin: "npm:1.11.0" languageName: unknown linkType: soft @@ -1750,8 +1750,23 @@ __metadata: resolution: "@dd/factory@workspace:packages/factory" dependencies: "@dd/core": "workspace:*" + "@dd/rum-plugins": "workspace:*" "@dd/telemetry-plugins": "workspace:*" - unplugin: "npm:1.10.1" + unplugin: "npm:1.11.0" + languageName: unknown + linkType: soft + +"@dd/rum-plugins@workspace:*, @dd/rum-plugins@workspace:packages/plugins/rum": + version: 0.0.0-use.local + resolution: "@dd/rum-plugins@workspace:packages/plugins/rum" + dependencies: + "@dd/core": "workspace:*" + "@types/async-retry": "npm:1.4.8" + async-retry: "npm:1.3.3" + chalk: "npm:2.3.1" + outdent: "npm:0.8.0" + p-queue: "npm:6.6.2" + unplugin: "npm:1.11.0" languageName: unknown linkType: soft @@ -1763,11 +1778,11 @@ __metadata: "@types/chalk": "npm:2.2.0" "@types/fs-extra": "npm:8.1.0" chalk: "npm:2.3.1" - esbuild: "npm:0.20.2" + esbuild: "npm:0.21.5" fs-extra: "npm:7.0.1" pretty-bytes: "npm:5.6.0" - unplugin: "npm:1.10.1" - webpack: "npm:5.49.0" + unplugin: "npm:1.11.0" + webpack: "npm:5.92.1" peerDependencies: esbuild: ">=0.x" webpack: ">= 4.x < 6.x" @@ -1785,12 +1800,15 @@ __metadata: "@dd/tools": "workspace:*" "@types/jest": "npm:29.5.12" "@types/node": "npm:^18" - esbuild: "npm:0.20.2" + "@types/webpack4": "npm:@types/webpack@4.41.38" + esbuild: "npm:0.21.5" jest: "npm:29.7.0" memfs: "npm:4.9.2" + nock: "npm:14.0.0-beta.7" ts-jest: "npm:29.1.2" typescript: "npm:5.4.3" - webpack: "npm:5.49.0" + webpack: "npm:5.92.1" + webpack4: "npm:webpack@4.47.0" languageName: unknown linkType: soft @@ -1816,163 +1834,163 @@ __metadata: languageName: unknown linkType: soft -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2603,114 +2621,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.17.1" +"@rollup/rollup-android-arm-eabi@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.18.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-android-arm64@npm:4.17.1" +"@rollup/rollup-android-arm64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-android-arm64@npm:4.18.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.17.1" +"@rollup/rollup-darwin-arm64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.18.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.17.1" +"@rollup/rollup-darwin-x64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.18.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.17.1" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.17.1" +"@rollup/rollup-linux-arm-musleabihf@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.18.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.17.1" +"@rollup/rollup-linux-arm64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.18.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.17.1" +"@rollup/rollup-linux-arm64-musl@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.18.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.1" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.17.1" +"@rollup/rollup-linux-riscv64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.18.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.17.1" +"@rollup/rollup-linux-s390x-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.18.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.17.1" +"@rollup/rollup-linux-x64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.18.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.17.1" +"@rollup/rollup-linux-x64-musl@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.18.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.17.1" +"@rollup/rollup-win32-arm64-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.18.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.17.1" +"@rollup/rollup-win32-ia32-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.18.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.17.1": - version: 4.17.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.17.1" +"@rollup/rollup-win32-x64-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.18.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2777,6 +2795,15 @@ __metadata: languageName: node linkType: hard +"@types/async-retry@npm:1.4.8": + version: 1.4.8 + resolution: "@types/async-retry@npm:1.4.8" + dependencies: + "@types/retry": "npm:*" + checksum: 10/5d4b0b786e2506ab690c311d55a8000c3675cf1036290ad3b83af11ad791c62c9e16e7ff5a6dac3fae557404127451e72c297d711701015b027227586368eaf5 + languageName: node + linkType: hard + "@types/babel__core@npm:^7, @types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -2841,13 +2868,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.0": - version: 3.7.0 - resolution: "@types/eslint-scope@npm:3.7.0" +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: "@types/eslint": "npm:*" "@types/estree": "npm:*" - checksum: 10/27f302625bb970b95135aedd882935875ccd2c1a2ecd5c7108b96b4e35a6035ed62b47b491a7679804d4a0146406c7847ab352fbe3fe499af15059bb774cb966 + checksum: 10/e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e languageName: node linkType: hard @@ -2861,27 +2888,20 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.50": +"@types/estree@npm:*": version: 0.0.50 resolution: "@types/estree@npm:0.0.50" checksum: 10/188e022eec2da0e1bcf5f569314d1fd16fc28fb3758fed9843b9581ba131b78443b08d6e9ea9daed36c04e493234f47e98cdef8f081c9e9eb0845b2d80f5f8da languageName: node linkType: hard -"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 languageName: node linkType: hard -"@types/estree@npm:^0.0.45": - version: 0.0.45 - resolution: "@types/estree@npm:0.0.45" - checksum: 10/5a45a5fd92b65985b579cbc4ed77d4ce1cabc94a9f92aef1208f7e19796cac7ca85e5d5fa2df4833e555d2c61c2a2fbac3919f98ce9f29eb727aeb9627b14409 - languageName: node - linkType: hard - "@types/fs-extra@npm:8.1.0": version: 8.1.0 resolution: "@types/fs-extra@npm:8.1.0" @@ -3014,6 +3034,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:*": + version: 0.12.5 + resolution: "@types/retry@npm:0.12.5" + checksum: 10/3fb6bf91835ca0eb2987567d6977585235a7567f8aeb38b34a8bb7bbee57ac050ed6f04b9998cda29701b8c893f5dfe315869bc54ac17e536c9235637fe351a2 + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" @@ -3021,6 +3048,13 @@ __metadata: languageName: node linkType: hard +"@types/source-list-map@npm:*": + version: 0.1.6 + resolution: "@types/source-list-map@npm:0.1.6" + checksum: 10/9cd294c121f1562062de5d241fe4d10780b1131b01c57434845fe50968e9dcf67ede444591c2b1ad6d3f9b6bc646ac02cc8f51a3577c795f9c64cf4573dcc6b1 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -3028,6 +3062,47 @@ __metadata: languageName: node linkType: hard +"@types/tapable@npm:^1": + version: 1.0.12 + resolution: "@types/tapable@npm:1.0.12" + checksum: 10/adfb978a3097154be92c4a92184bb17f86a84473bd871a9a862f81676532ebec86ea61acdce999186447832e32a4d45d591d64b64131dd977ca41508165011d7 + languageName: node + linkType: hard + +"@types/uglify-js@npm:*": + version: 3.17.5 + resolution: "@types/uglify-js@npm:3.17.5" + dependencies: + source-map: "npm:^0.6.1" + checksum: 10/87368861a3f2df071905d698c9f7a4b825e2f69dd29530283594ccddd155d4a8ff7795021af28a97d938c9557a6ea23bc3d77e076a6cf3e02f6401849e067f61 + languageName: node + linkType: hard + +"@types/webpack-sources@npm:*": + version: 3.2.3 + resolution: "@types/webpack-sources@npm:3.2.3" + dependencies: + "@types/node": "npm:*" + "@types/source-list-map": "npm:*" + source-map: "npm:^0.7.3" + checksum: 10/7b557f242efaa10e4e3e18cc4171a0c98e22898570caefdd4f7b076fe8534b5abfac92c953c6604658dcb7218507f970230352511840fe9fdea31a9af3b9a906 + languageName: node + linkType: hard + +"@types/webpack4@npm:@types/webpack@4.41.38": + version: 4.41.38 + resolution: "@types/webpack@npm:4.41.38" + dependencies: + "@types/node": "npm:*" + "@types/tapable": "npm:^1" + "@types/uglify-js": "npm:*" + "@types/webpack-sources": "npm:*" + anymatch: "npm:^3.0.0" + source-map: "npm:^0.6.0" + checksum: 10/63f2137371e9fd99242c95ae5a115e8da470e61344b6b10b3778c91bbe0ab173d4ad879b53a57e4950b3124b3f8627480bf14f70a11c730d3e66195d8e0c7d8c + languageName: node + linkType: hard + "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -3181,13 +3256,13 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.1" - checksum: 10/28cc949e2e68eb103fc416b30880cf57bc37b452e1e6fe05c73c64bc6d90d68176013fb5101bf80a2eb4961299dd4d7cffeecd32d189a17951da7ead90c2f35f + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10/a775b0559437ae122d14fec0cfe59fdcaf5ca2d8ff48254014fd05d6797e20401e0f1518e628f9b06819aa085834a2534234977f9608b3f2e51f94b6e8b0bc43 languageName: node linkType: hard @@ -3202,10 +3277,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: 10/b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 10/29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 languageName: node linkType: hard @@ -3216,10 +3291,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 10/0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: 10/e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f languageName: node linkType: hard @@ -3230,10 +3305,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: 10/a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10/1d8705daa41f4d22ef7c6d422af4c530b84d69d0c253c6db5adec44d511d7caa66837803db5b1addcea611a1498fd5a67d2cf318b057a916283ae41ffb85ba8a languageName: node linkType: hard @@ -3269,21 +3344,21 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.1" - "@webassemblyjs/helper-api-error": "npm:1.11.1" + "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" + "@webassemblyjs/helper-api-error": "npm:1.11.6" "@xtuc/long": "npm:4.2.2" - checksum: 10/cbe5b456fa074d11a5acf80860df2899a160011943d7e26e60b6eda1c1dbe594e717e0c9f2b50ba2323f75f333bc5ec949acd992a63f2207df754a474167e424 + checksum: 10/9ffd258ad809402688a490fdef1fd02222f20cdfe191c895ac215a331343292164e5033dbc0347f0f76f2447865c0b5c2d2e3304ee948d44f7aa27857028fd08 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: 10/009b494010907a52c1c6c6fcb42db8606cf2443e2e767c7ff3029acf31f9a206108285609d735ee77bcbcbd3f1a1f8920b365e7a9466ef35a7932b74c743c816 +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 10/4ebf03e9c1941288c10e94e0f813f413f972bfaa1f09be2cc2e5577f300430906b61aa24d52f5ef2f894e8e24e61c6f7c39871d7e3d98bc69460e1b8e00bb20b languageName: node linkType: hard @@ -3294,15 +3369,15 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" dependencies: - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/helper-buffer": "npm:1.11.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.1" - "@webassemblyjs/wasm-gen": "npm:1.11.1" - checksum: 10/dd6eee9f73346b14d31e95074a8dced21d59269e86e47ad01b6578d86ae6008b411fb989bbd400102c355ea0ba3d070eb9949a64f822abc8f65cf0162704834a + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10/e91e6b28114e35321934070a2db8973a08a5cd9c30500b817214c683bbf5269ed4324366dd93ad83bf2fba0d671ac8f39df1c142bf58f70c57a827eeba4a3d2f languageName: node linkType: hard @@ -3318,12 +3393,12 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10/23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + checksum: 10/13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de languageName: node linkType: hard @@ -3336,12 +3411,12 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": "npm:4.2.2" - checksum: 10/85beb7156f131c29e9a7f1a05e7fc131849152dd7b0c198d4f21b8e965d96dbfeaca3ac53e4bfbedfeef88b0ada0ff0bd0b7ad5c7dfb8c3d3fed0f922084a557 + checksum: 10/ec3b72db0e7ce7908fe08ec24395bfc97db486063824c0edc580f0973a4cfbadf30529569d9c7db663a56513e45b94299cca03be9e1992ea3308bb0744164f3d languageName: node linkType: hard @@ -3354,10 +3429,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: 10/b93e57912dfb91df4a76162abd6fb5e491110e113101ec136cea0ea8b8bd43708e94f919ea0e8762657994da6a5fcb63d34b6da392e5dd4e189169da4c75c149 +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 10/361a537bd604101b320a5604c3c96d1038d83166f1b9fb86cedadc7e81bae54c3785ae5d90bf5b1842f7da08194ccaf0f44a64fcca0cbbd6afe1a166196986d6 languageName: node linkType: hard @@ -3368,22 +3443,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/helper-buffer": "npm:1.11.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.1" - "@webassemblyjs/helper-wasm-section": "npm:1.11.1" - "@webassemblyjs/wasm-gen": "npm:1.11.1" - "@webassemblyjs/wasm-opt": "npm:1.11.1" - "@webassemblyjs/wasm-parser": "npm:1.11.1" - "@webassemblyjs/wast-printer": "npm:1.11.1" - checksum: 10/6a029ae21c3c0890a55e3d6fb20071434ed5ef024d7d9ca79a754555ccbbc595052e936f6e547b6823922e3f41d3350027a21e65a04032c5fce29d0e4301513d - languageName: node - linkType: hard - "@webassemblyjs/wasm-edit@npm:1.9.0": version: 1.9.0 resolution: "@webassemblyjs/wasm-edit@npm:1.9.0" @@ -3400,16 +3459,32 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10/5678ae02dbebba2f3a344e25928ea5a26a0df777166c9be77a467bfde7aca7f4b57ef95587e4bd768a402cdf2fddc4c56f0a599d164cdd9fe313520e39e18137 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" dependencies: - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.1" - "@webassemblyjs/ieee754": "npm:1.11.1" - "@webassemblyjs/leb128": "npm:1.11.1" - "@webassemblyjs/utf8": "npm:1.11.1" - checksum: 10/5da040e78045f5499a99435ce0b1878d77f4fbfecb854841367cfc8ac16cc169a7f04187aac5da794b8d08a84ba25324f276f9128c5597ee6666cabd6b954ec1 + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/ec45bd50e86bc9856f80fe9af4bc1ae5c98fb85f57023d11dff2b670da240c47a7b1b9b6c89755890314212bd167cf3adae7f1157216ddffb739a4ce589fc338 languageName: node linkType: hard @@ -3426,15 +3501,15 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" dependencies: - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/helper-buffer": "npm:1.11.1" - "@webassemblyjs/wasm-gen": "npm:1.11.1" - "@webassemblyjs/wasm-parser": "npm:1.11.1" - checksum: 10/00f85d1f762ca2574ea6b5e85b3e9c50720886cca86ef192c80a1af484d98353500667af91416c407cdaeac3176bcd2b0f0641f4299a915b21b03a7f2ff84f3a + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10/21f25ae109012c49bb084e09f3b67679510429adc3e2408ad3621b2b505379d9cce337799a7919ef44db64e0d136833216914aea16b0d4856f353b9778e0cdb7 languageName: node linkType: hard @@ -3450,17 +3525,17 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" dependencies: - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/helper-api-error": "npm:1.11.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.1" - "@webassemblyjs/ieee754": "npm:1.11.1" - "@webassemblyjs/leb128": "npm:1.11.1" - "@webassemblyjs/utf8": "npm:1.11.1" - checksum: 10/cc6de8f4d9c56b370c2151dd9daacbdabe4aa20ba55b278e322de949dcbdc33b615773ce1756b69580cd2d68273d72ddf8ba68c3bb8715a462e64cf02de9a7c3 + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/f7311685b76c3e1def2abea3488be1e77f06ecd8633143a6c5c943ca289660952b73785231bb76a010055ca64645227a4bc79705c26ab7536216891b6bb36320 languageName: node linkType: hard @@ -3492,13 +3567,13 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" dependencies: - "@webassemblyjs/ast": "npm:1.11.1" + "@webassemblyjs/ast": "npm:1.12.1" "@xtuc/long": "npm:4.2.2" - checksum: 10/bd1cf7a0630bf2d003d9df004fca97f53026b39560d0629dc8019aed7e7cc38000d1cb78f7e70ea52fc0561a822bcc7683d48f839363a9d0cf16574f9cbd8c32 + checksum: 10/1a6a4b6bc4234f2b5adbab0cb11a24911b03380eb1cab6fb27a2250174a279fdc6aa2f5a9cf62dd1f6d4eb39f778f488e8ff15b9deb0670dee5c5077d46cf572 languageName: node linkType: hard @@ -3513,29 +3588,6 @@ __metadata: languageName: node linkType: hard -"@webpack-cli/info@npm:^1.0.2": - version: 1.5.0 - resolution: "@webpack-cli/info@npm:1.5.0" - dependencies: - envinfo: "npm:^7.7.3" - peerDependencies: - webpack-cli: 4.x.x - checksum: 10/7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 - languageName: node - linkType: hard - -"@webpack-cli/serve@npm:^1.0.1": - version: 1.7.0 - resolution: "@webpack-cli/serve@npm:1.7.0" - peerDependencies: - webpack-cli: 4.x.x - peerDependenciesMeta: - webpack-dev-server: - optional: true - checksum: 10/0b90c963a6b8424a914a85532e3a7dfe2f7eea1c98acea1c6c1a368bf349733f0d6cb2e83ce9ced7c8208f58d518cced767d1e1d0ab26126d8a9bad3b3f5352e - languageName: node - linkType: hard - "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -3557,12 +3609,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.7.6": - version: 1.7.6 - resolution: "acorn-import-assertions@npm:1.7.6" +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: acorn: ^8 - checksum: 10/3df7728ff652aae2b0e780c5af23f1793fabcaaef15ede744e015918795aa8cbe53ad17df049840aaac545fb1c5c1cac21cab5a272c8b51a9dcdb954af5ddefc + checksum: 10/8bfbfbb6e2467b9b47abb4d095df717ab64fce2525da65eabee073e85e7975fb3a176b6c8bba17c99a7d8ede283a10a590272304eb54a93c4aa1af9790d47a8b languageName: node linkType: hard @@ -3591,7 +3643,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.3, acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -3600,6 +3652,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.7.1": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" + bin: + acorn: bin/acorn + checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.0.1 resolution: "aggregate-error@npm:3.0.1" @@ -3647,7 +3708,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -3713,7 +3774,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.0, anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -3784,13 +3845,6 @@ __metadata: languageName: node linkType: hard -"array-back@npm:^4.0.1, array-back@npm:^4.0.2": - version: 4.0.2 - resolution: "array-back@npm:4.0.2" - checksum: 10/f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 - languageName: node - linkType: hard - "array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -3941,6 +3995,15 @@ __metadata: languageName: node linkType: hard +"async-retry@npm:1.3.3": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: "npm:0.13.1" + checksum: 10/38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -4308,7 +4371,21 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.3, browserslist@npm:^4.14.5, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": +"browserslist@npm:^4.21.10": + version: 4.23.1 + resolution: "browserslist@npm:4.23.1" + dependencies: + caniuse-lite: "npm:^1.0.30001629" + electron-to-chromium: "npm:^1.4.796" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.0.16" + bin: + browserslist: cli.js + checksum: 10/91da59f70a8e01ece97133670f9857d6d7e96be78e1b7ffa54b869f97d01d01c237612471b595cee41c1ab212e26e536ce0b6716ad1d6c4368a40c222698cac1 + languageName: node + linkType: hard + +"browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -4460,6 +4537,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001629": + version: 1.0.30001640 + resolution: "caniuse-lite@npm:1.0.30001640" + checksum: 10/14f04379452d4302185400db14b286115d25ce96fd09536590233a09908273990deeb1c081a7ea8bc091d86cb4d1665260de8f150e84dc240e17bf7d6af0aca7 + languageName: node + linkType: hard + "caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -4756,13 +4840,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^1.2.1": - version: 1.4.0 - resolution: "colorette@npm:1.4.0" - checksum: 10/c8d6c8c3ef5a99acfc3dd9a68f48019f1479ec347551387e4a1762e40f69e98ce19d4dc321ffb4919d1f28a7bdc90c39d4e9a901f4c474fd2124ad93a00c0454 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -4772,18 +4849,6 @@ __metadata: languageName: node linkType: hard -"command-line-usage@npm:^6.1.0": - version: 6.1.3 - resolution: "command-line-usage@npm:6.1.3" - dependencies: - array-back: "npm:^4.0.2" - chalk: "npm:^2.4.2" - table-layout: "npm:^1.0.2" - typical: "npm:^5.2.0" - checksum: 10/902901582a543b26f55f90fc0f266c08a603a92bfadd8d07c66679f3d9eea2c074a039404126b0c4b65ff8452153c5f2010ea2f4ec14b70be0c77241f6d5bd53 - languageName: node - linkType: hard - "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -4798,13 +4863,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.0.0": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: 10/25b88c2efd0380c84f7844b39cf18510da7bfc5013692d68cdc65f764a1c34e6c8a36ea6d72b6620e3710a930cf8fab2695bdec2bf7107a0f4fa30a3ef3b7d0e - languageName: node - linkType: hard - "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -5151,13 +5209,6 @@ __metadata: languageName: node linkType: hard -"deep-extend@npm:~0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 10/7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -5350,6 +5401,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.796": + version: 1.4.820 + resolution: "electron-to-chromium@npm:1.4.820" + checksum: 10/6f283fdb22da8b18a071ffce49a181a98b68dca92b46d465026b325593bb1b49acad8926d9274fbe464f1d90006a762b3b83a71d8f1f5df4b334e2b9bd41c040 + languageName: node + linkType: hard + "elegant-spinner@npm:^2.0.0": version: 2.0.0 resolution: "elegant-spinner@npm:2.0.0" @@ -5402,7 +5460,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^4.3.0": +"enhanced-resolve@npm:^4.5.0": version: 4.5.0 resolution: "enhanced-resolve@npm:4.5.0" dependencies: @@ -5413,7 +5471,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.12.0, enhanced-resolve@npm:^5.2.0, enhanced-resolve@npm:^5.8.0": +"enhanced-resolve@npm:^5.12.0": version: 5.16.0 resolution: "enhanced-resolve@npm:5.16.0" dependencies: @@ -5423,6 +5481,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.0": + version: 5.17.0 + resolution: "enhanced-resolve@npm:5.17.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/8f7bf71537d78e7d20a27363793f2c9e13ec44800c7c7830364a448f80a44994aa19d64beecefa1ab49e4de6f7fbe18cc0931dc449c115f02918ff5fcbe7705f + languageName: node + linkType: hard + "enquirer@npm:^2.3.4": version: 2.3.5 resolution: "enquirer@npm:2.3.5" @@ -5439,15 +5507,6 @@ __metadata: languageName: node linkType: hard -"envinfo@npm:^7.7.3": - version: 7.11.1 - resolution: "envinfo@npm:7.11.1" - bin: - envinfo: dist/cli.js - checksum: 10/5a18ead05954ac1643350170fefce2436a9cb758dc402e36fe4616553ee46469f766fcb6df72379d1741a2e5b55918949b343ff6174502c31c524a5cf75f05cd - languageName: node - linkType: hard - "errno@npm:^0.1.3, errno@npm:~0.1.7": version: 0.1.8 resolution: "errno@npm:0.1.8" @@ -5538,10 +5597,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^0.7.1": - version: 0.7.1 - resolution: "es-module-lexer@npm:0.7.1" - checksum: 10/f1edf7c2426fb0d833e2f01dd8ff3eb4221e285dda3e1e9a5e8b3830499593df56df8427f879a99ee65500a8e7ccefff2c1c2936f85e800dc24d7c14f67c1905 +"es-module-lexer@npm:^1.2.1": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: 10/f29c7c97a58eb17640dcbd71bd6ef754ad4f58f95c3073894573d29dae2cad43ecd2060d97ed5b866dfb7804d5590fb7de1d2c5339a5fceae8bd60b580387fc5 languageName: node linkType: hard @@ -5592,33 +5651,33 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.20.2": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" +"esbuild@npm:0.21.5": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -5668,7 +5727,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/663215ab7e599651e00d61b528a63136e1f1d397db8b9c3712540af928c9476d61da95aefa81b7a8dfc7a9fdd7616fcf08395c27be68be8c99953fb461863ce4 + checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b languageName: node linkType: hard @@ -5679,6 +5738,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 + languageName: node + linkType: hard + "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -5806,7 +5872,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.0": +"eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -5958,6 +6024,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^4.0.4": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 + languageName: node + linkType: hard + "events@npm:^3.0.0, events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -6667,7 +6740,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -7024,13 +7097,6 @@ __metadata: languageName: node linkType: hard -"interpret@npm:^2.0.0": - version: 2.2.0 - resolution: "interpret@npm:2.2.0" - checksum: 10/a62d4de5c1f8ab1fd0ccc8a1a8cca8dc31e14928b70364f0787576fe4639c0c463bd79cfe58c9bd9f54db9b7e53d3e646e68fb7627c6b65e3b0e3893156c5126 - languageName: node - linkType: hard - "is-accessor-descriptor@npm:^0.1.6": version: 0.1.6 resolution: "is-accessor-descriptor@npm:0.1.6" @@ -8074,7 +8140,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0": +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 10/5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf @@ -8102,7 +8168,7 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": +"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c @@ -8277,7 +8343,7 @@ __metadata: languageName: node linkType: hard -"loader-runner@npm:^4.1.0, loader-runner@npm:^4.2.0": +"loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" checksum: 10/555ae002869c1e8942a0efd29a99b50a0ce6c3296efea95caf48f00d7f6f7f659203ed6613688b6181aa81dc76de3e65ece43094c6dffef3127fe1a84d973cd3 @@ -8344,13 +8410,6 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 - languageName: node - linkType: hard - "log-symbols@npm:^3.0.0": version: 3.0.0 resolution: "log-symbols@npm:3.0.0" @@ -8784,6 +8843,16 @@ __metadata: languageName: node linkType: hard +"nock@npm:14.0.0-beta.7": + version: 14.0.0-beta.7 + resolution: "nock@npm:14.0.0-beta.7" + dependencies: + json-stringify-safe: "npm:^5.0.1" + propagate: "npm:^2.0.0" + checksum: 10/c60c6df0c75bbec032bfc7140eed1fdb92bfed193263b2a2bc49acad255d127472c1641a29a691236882103502e39fe40fbe3d52fd0ed4a63e96dd350fc00526 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 7.0.0 resolution: "node-gyp@npm:7.0.0" @@ -9096,6 +9165,13 @@ __metadata: languageName: node linkType: hard +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10/93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 + languageName: node + linkType: hard + "p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -9150,6 +9226,25 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10/60fe227ffce59fbc5b1b081305b61a2f283ff145005853702b7d4d3f99a0176bd21bb126c99a962e51fe1e01cb8aa10f0488b7bbe73b5dc2e84b5cc650b8ffd2 + languageName: node + linkType: hard + +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c + languageName: node + linkType: hard + "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -9321,6 +9416,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.0.5, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -9440,41 +9542,6 @@ __metadata: languageName: node linkType: hard -"project-esbuild@workspace:packages/tests/src/plugins/telemetry/mocks/projects/esbuild": - version: 0.0.0-use.local - resolution: "project-esbuild@workspace:packages/tests/src/plugins/telemetry/mocks/projects/esbuild" - dependencies: - "@datadog/esbuild-plugin": "workspace:*" - "@types/node": "npm:^18" - esbuild: "npm:0.20.2" - sub_app: "workspace:*" - ts-node: "npm:10.9.2" - typescript: "npm:5.4.3" - languageName: unknown - linkType: soft - -"project-webpack4@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack4": - version: 0.0.0-use.local - resolution: "project-webpack4@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack4" - dependencies: - "@datadog/webpack-plugin": "workspace:*" - webpack: "npm:4.44.2" - webpack-cli: "npm:4.1.0" - webpack4_app: "workspace:*" - languageName: unknown - linkType: soft - -"project-webpack5@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack5": - version: 0.0.0-use.local - resolution: "project-webpack5@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack5" - dependencies: - "@datadog/webpack-plugin": "workspace:*" - webpack: "npm:5.1.3" - webpack-cli: "npm:4.1.0" - webpack5_app: "workspace:*" - languageName: unknown - linkType: soft - "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -9492,6 +9559,13 @@ __metadata: languageName: node linkType: hard +"propagate@npm:^2.0.0": + version: 2.0.1 + resolution: "propagate@npm:2.0.1" + checksum: 10/8c761c16e8232f82f6d015d3e01e8bd4109f47ad804f904d950f6fe319813b448ca112246b6bfdc182b400424b155b0b7c4525a9bb009e6fa950200157569c14 + languageName: node + linkType: hard + "prr@npm:~1.0.1": version: 1.0.1 resolution: "prr@npm:1.0.1" @@ -9674,22 +9748,6 @@ __metadata: languageName: node linkType: hard -"rechoir@npm:^0.7.0": - version: 0.7.1 - resolution: "rechoir@npm:0.7.1" - dependencies: - resolve: "npm:^1.9.0" - checksum: 10/2a04aab4e28c05fcd6ee6768446bc8b859d8f108e71fc7f5bcbc5ef25e53330ce2c11d10f82a24591a2df4c49c4f61feabe1fd11f844c66feedd4cd7bb61146a - languageName: node - linkType: hard - -"reduce-flatten@npm:^2.0.0": - version: 2.0.0 - resolution: "reduce-flatten@npm:2.0.0" - checksum: 10/64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 - languageName: node - linkType: hard - "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.1 resolution: "regenerate-unicode-properties@npm:10.1.1" @@ -9869,7 +9927,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.9.0": +"resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -9882,7 +9940,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -9912,6 +9970,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -9982,26 +10047,26 @@ __metadata: languageName: node linkType: hard -"rollup@npm:4.17.1": - version: 4.17.1 - resolution: "rollup@npm:4.17.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.17.1" - "@rollup/rollup-android-arm64": "npm:4.17.1" - "@rollup/rollup-darwin-arm64": "npm:4.17.1" - "@rollup/rollup-darwin-x64": "npm:4.17.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.17.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.17.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.17.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.17.1" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.17.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.17.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.17.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.17.1" - "@rollup/rollup-linux-x64-musl": "npm:4.17.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.17.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.17.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.17.1" +"rollup@npm:4.18.0": + version: 4.18.0 + resolution: "rollup@npm:4.18.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.18.0" + "@rollup/rollup-android-arm64": "npm:4.18.0" + "@rollup/rollup-darwin-arm64": "npm:4.18.0" + "@rollup/rollup-darwin-x64": "npm:4.18.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.18.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.18.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.18.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.18.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.18.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.18.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.18.0" + "@rollup/rollup-linux-x64-musl": "npm:4.18.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.18.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.18.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.18.0" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -10041,7 +10106,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/4072609e246c9f481a924d053bf593d02b92ebd1e69cc2092ff202cbd6eeadf558f5e1434dd2406597b36f0dd9e3b547810748fad7727a38ea35798a553bcca5 + checksum: 10/2320fe653cfd5e3d72ecab2f1d52d47e7b624a6ab02919f53c1ad1c5efa3b66e277c3ecfef03bb97651e79cef04bfefd34ad1f6e648f496572bf76c834f19599 languageName: node linkType: hard @@ -10136,7 +10201,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -10433,7 +10498,7 @@ __metadata: languageName: node linkType: hard -"source-list-map@npm:^2.0.0, source-list-map@npm:^2.0.1": +"source-list-map@npm:^2.0.0": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" checksum: 10/3918ffba5fe8447bc816800026fe707aab233d9d05a3487225d880e23b7e37ed455b4e1b844e05644f6ecc7c9b837c0cc32da54dd37f77c993370ebcdb049246 @@ -10494,6 +10559,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:^0.7.3": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10/a0f7c9b797eda93139842fd28648e868a9a03ea0ad0d9fa6602a0c1f17b7fb6a7dcca00c144476cccaeaae5042e99a285723b1a201e844ad67221bf5d428f1dc + languageName: node + linkType: hard + "split-string@npm:^3.0.1, split-string@npm:^3.0.2": version: 3.1.0 resolution: "split-string@npm:3.1.0" @@ -10747,12 +10819,6 @@ __metadata: languageName: node linkType: hard -"sub_app@workspace:*, sub_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app": - version: 0.0.0-use.local - resolution: "sub_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/esbuild/workspaces/app" - languageName: unknown - linkType: soft - "supports-color@npm:^5.2.0, supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -10797,18 +10863,6 @@ __metadata: languageName: node linkType: hard -"table-layout@npm:^1.0.2": - version: 1.0.2 - resolution: "table-layout@npm:1.0.2" - dependencies: - array-back: "npm:^4.0.1" - deep-extend: "npm:~0.6.0" - typical: "npm:^5.2.0" - wordwrapjs: "npm:^4.0.0" - checksum: 10/5dd12bc64ddf246f774fc51b45398dd8da900b7bb246595c84007ea292c15936264701660b80704be17da5d4066a9a250549418c40a2b635a0916c9294b103af - languageName: node - linkType: hard - "tapable@npm:^1.0.0, tapable@npm:^1.1.3": version: 1.1.3 resolution: "tapable@npm:1.1.3" @@ -10816,7 +10870,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a @@ -10856,7 +10910,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.0.0, terser-webpack-plugin@npm:^5.1.3": +"terser-webpack-plugin@npm:^5.3.10": version: 5.3.10 resolution: "terser-webpack-plugin@npm:5.3.10" dependencies: @@ -11290,13 +11344,6 @@ __metadata: languageName: node linkType: hard -"typical@npm:^5.2.0": - version: 5.2.0 - resolution: "typical@npm:5.2.0" - checksum: 10/fd8e4197cb2e021ca6d11fea0018ee219c29bf4160ab613492f74c0e21806003d1cd92a15088b111778a7b5c6432e4e28321899785a86980b390b87c4010efe5 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -11384,15 +11431,15 @@ __metadata: languageName: node linkType: hard -"unplugin@npm:1.10.1": - version: 1.10.1 - resolution: "unplugin@npm:1.10.1" +"unplugin@npm:1.11.0": + version: 1.11.0 + resolution: "unplugin@npm:1.11.0" dependencies: acorn: "npm:^8.11.3" chokidar: "npm:^3.6.0" webpack-sources: "npm:^3.2.3" webpack-virtual-modules: "npm:^0.6.1" - checksum: 10/d9819fad8a177c080f7f2b80744d633101935a8a6cc26b42e6a46648cccc1c5de83b7763233d56e11af53f34e6c5074816262897c9048a31e5d697bef5bb57e7 + checksum: 10/debe6223b0ece5f54e9a243525da8c4473e30a86d9440d90a03a9b05e3d1ddb7f12820bf5466dd50d1c3f00219e46fefc94205669cff9d63d12024e4013a5318 languageName: node linkType: hard @@ -11427,6 +11474,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.0.16": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" + dependencies: + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.2.2 resolution: "uri-js@npm:4.2.2" @@ -11510,13 +11571,6 @@ __metadata: languageName: node linkType: hard -"v8-compile-cache@npm:^2.1.0": - version: 2.4.0 - resolution: "v8-compile-cache@npm:2.4.0" - checksum: 10/49e726d7b2825ef7bc92187ecd57c59525957badbddb18fa529b0458b9280c59a1607ad3da4abe7808e9f9a00ec99b0fc07e485ffb7358cd5c11b2ef68d2145f - languageName: node - linkType: hard - "v8-to-istanbul@npm:^9.0.1": version: 9.2.0 resolution: "v8-to-istanbul@npm:9.2.0" @@ -11581,7 +11635,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.0.0, watchpack@npm:^2.2.0": +"watchpack@npm:^2.4.1": version: 2.4.1 resolution: "watchpack@npm:2.4.1" dependencies: @@ -11600,53 +11654,6 @@ __metadata: languageName: node linkType: hard -"webpack-cli@npm:4.1.0": - version: 4.1.0 - resolution: "webpack-cli@npm:4.1.0" - dependencies: - "@webpack-cli/info": "npm:^1.0.2" - "@webpack-cli/serve": "npm:^1.0.1" - ansi-escapes: "npm:^4.3.1" - colorette: "npm:^1.2.1" - command-line-usage: "npm:^6.1.0" - commander: "npm:^6.0.0" - enquirer: "npm:^2.3.4" - execa: "npm:^4.0.0" - import-local: "npm:^3.0.2" - interpret: "npm:^2.0.0" - rechoir: "npm:^0.7.0" - v8-compile-cache: "npm:^2.1.0" - webpack-merge: "npm:^4.2.2" - peerDependencies: - webpack: 4.x.x || 5.x.x - peerDependenciesMeta: - "@webpack-cli/generate-loader": - optional: true - "@webpack-cli/generate-plugin": - optional: true - "@webpack-cli/init": - optional: true - "@webpack-cli/migrate": - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - bin: - webpack-cli: bin/cli.js - checksum: 10/14a0bfc722bbfeabd1f15f9c0bfd02045f1af51ee34d78dd012cb0dc3827eab5b7125047a130d29b75ef266a40b102e29b6f67ca904f35c524e27144b5bfe5e1 - languageName: node - linkType: hard - -"webpack-merge@npm:^4.2.2": - version: 4.2.2 - resolution: "webpack-merge@npm:4.2.2" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10/93b59d623f7badca46af265162495278ef79c254f8b31bfcc740f25dda11712383f59b2d25c9c309bbe4ad7688e6871c80e6b2ed9035f0fc8d5a1c150f667b03 - languageName: node - linkType: hard - "webpack-sources@npm:^1.4.0, webpack-sources@npm:^1.4.1": version: 1.4.3 resolution: "webpack-sources@npm:1.4.3" @@ -11657,23 +11664,6 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^2.0.1": - version: 2.3.1 - resolution: "webpack-sources@npm:2.3.1" - dependencies: - source-list-map: "npm:^2.0.1" - source-map: "npm:^0.6.1" - checksum: 10/0c4bb91f2899205648da25b68edf4495a360692af2c426cde98b188367478c93d5e33e2b08665e070ac0ece59ade8d52175da656a212b44701ce4a271ca66695 - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.0": - version: 3.2.0 - resolution: "webpack-sources@npm:3.2.0" - checksum: 10/351a50e4ee857e0affe0ce813623855f96b8660ec9456579078668b01a1f9c5cb8305f85bc720a03172ff45dfbb0e9627534c842c4293456f53eb3f9d574f84e - languageName: node - linkType: hard - "webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" @@ -11688,21 +11678,9 @@ __metadata: languageName: node linkType: hard -"webpack4_app@workspace:*, webpack4_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app": - version: 0.0.0-use.local - resolution: "webpack4_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack4/workspaces/app" - languageName: unknown - linkType: soft - -"webpack5_app@workspace:*, webpack5_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app": - version: 0.0.0-use.local - resolution: "webpack5_app@workspace:packages/tests/src/plugins/telemetry/mocks/projects/webpack5/workspaces/app" - languageName: unknown - linkType: soft - -"webpack@npm:4.44.2": - version: 4.44.2 - resolution: "webpack@npm:4.44.2" +"webpack4@npm:webpack@4.47.0": + version: 4.47.0 + resolution: "webpack@npm:4.47.0" dependencies: "@webassemblyjs/ast": "npm:1.9.0" "@webassemblyjs/helper-module-context": "npm:1.9.0" @@ -11712,7 +11690,7 @@ __metadata: ajv: "npm:^6.10.2" ajv-keywords: "npm:^3.4.1" chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^4.3.0" + enhanced-resolve: "npm:^4.5.0" eslint-scope: "npm:^4.0.3" json-parse-better-errors: "npm:^1.0.2" loader-runner: "npm:^2.4.0" @@ -11734,81 +11712,44 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/1be262824498edae949931ed3efb674c27202edcf38eda0419014ba062b7690dbebc442b04e7f1c5822209a0a5ef7c4e33f1b1f9427986dd23cb76e25d05ac3a - languageName: node - linkType: hard - -"webpack@npm:5.1.3": - version: 5.1.3 - resolution: "webpack@npm:5.1.3" - dependencies: - "@types/eslint-scope": "npm:^3.7.0" - "@types/estree": "npm:^0.0.45" - "@webassemblyjs/ast": "npm:1.9.0" - "@webassemblyjs/helper-module-context": "npm:1.9.0" - "@webassemblyjs/wasm-edit": "npm:1.9.0" - "@webassemblyjs/wasm-parser": "npm:1.9.0" - acorn: "npm:^8.0.3" - browserslist: "npm:^4.14.3" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.2.0" - eslint-scope: "npm:^5.1.0" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.4" - json-parse-better-errors: "npm:^1.0.2" - loader-runner: "npm:^4.1.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - pkg-dir: "npm:^4.2.0" - schema-utils: "npm:^3.0.0" - tapable: "npm:^2.0.0" - terser-webpack-plugin: "npm:^5.0.0" - watchpack: "npm:^2.0.0" - webpack-sources: "npm:^2.0.1" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10/ab2c7b914baba2e5e8ff12f6e0a284403fa43a82a1b7e5ebc28f209b8f166f1498fe2cd725cfa73bb3fca97be7f023ca0292e806eff01ea735d697af0f168cc9 + checksum: 10/d5763ee8d63a3c6712159e19e9439156b00ef3e33f728384a7a7ebe070be80322bf5b3fe4b131afd7b6da5053869270a9aee68e2822ec40461a1ce9d92076931 languageName: node linkType: hard -"webpack@npm:5.49.0": - version: 5.49.0 - resolution: "webpack@npm:5.49.0" +"webpack@npm:5.92.1": + version: 5.92.1 + resolution: "webpack@npm:5.92.1" dependencies: - "@types/eslint-scope": "npm:^3.7.0" - "@types/estree": "npm:^0.0.50" - "@webassemblyjs/ast": "npm:1.11.1" - "@webassemblyjs/wasm-edit": "npm:1.11.1" - "@webassemblyjs/wasm-parser": "npm:1.11.1" - acorn: "npm:^8.4.1" - acorn-import-assertions: "npm:^1.7.6" - browserslist: "npm:^4.14.5" + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-attributes: "npm:^1.9.5" + browserslist: "npm:^4.21.10" chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.8.0" - es-module-lexer: "npm:^0.7.1" + enhanced-resolve: "npm:^5.17.0" + es-module-lexer: "npm:^1.2.1" eslint-scope: "npm:5.1.1" events: "npm:^3.2.0" glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.4" - json-parse-better-errors: "npm:^1.0.2" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" loader-runner: "npm:^4.2.0" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.1.0" + schema-utils: "npm:^3.2.0" tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.1.3" - watchpack: "npm:^2.2.0" - webpack-sources: "npm:^3.2.0" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10/bcdba9343529b2e2da82af4d94ba385d130050c6608275c0e94796a034a11aca61c5d07afab2b343971a1511bcb9a85721a457fad5fd92931a17f367c7e24495 + checksum: 10/76fcfbebcc0719c4734c65a01dcef7a0f18f3f2647484e8a7e8606adbd128ac42756bb3a8b7e2d486fe97f6286ebdc7b937ccdf3cf1d21b4684134bb89bbed89 languageName: node linkType: hard @@ -11865,16 +11806,6 @@ __metadata: languageName: node linkType: hard -"wordwrapjs@npm:^4.0.0": - version: 4.0.1 - resolution: "wordwrapjs@npm:4.0.1" - dependencies: - reduce-flatten: "npm:^2.0.0" - typical: "npm:^5.2.0" - checksum: 10/4182c48c9d3eab0932fb9f9f202e3f1d4d28ff6db3fd2e1654ec8606677d8e0ab80110f0f8e2e236ee2b52631cbc5fccf3097e9287e3ace20cbc1613a784befc - languageName: node - linkType: hard - "worker-farm@npm:^1.7.0": version: 1.7.0 resolution: "worker-farm@npm:1.7.0"