diff --git a/.bitmap b/.bitmap index 1abb3b8b63c1..02a7b0fcf6f6 100644 --- a/.bitmap +++ b/.bitmap @@ -499,6 +499,14 @@ "mainFile": "index.ts", "rootDir": "scopes/harmony/cli-reference" }, + "core": { + "name": "core", + "scope": "", + "version": "", + "defaultScope": "teambit.harmony", + "mainFile": "index.ts", + "rootDir": "scopes/harmony/core" + }, "crypto/sha1": { "name": "crypto/sha1", "scope": "teambit.toolbox", diff --git a/babel.config.js b/babel.config.js index 58b9197e3011..5df0e5945209 100644 --- a/babel.config.js +++ b/babel.config.js @@ -16,12 +16,6 @@ module.exports = function (api) { ], ]; const plugins = [ - [ - '@babel/plugin-transform-modules-commonjs', - { - lazy: () => true, - }, - ], 'babel-plugin-transform-typescript-metadata', ['@babel/plugin-proposal-decorators', { legacy: true }], ['@babel/plugin-transform-runtime'], diff --git a/bench-results-baseline.json b/bench-results-baseline.json new file mode 100644 index 000000000000..6dc0a1a7675c --- /dev/null +++ b/bench-results-baseline.json @@ -0,0 +1,1694 @@ +{ + "meta": { + "node": "v24.15.0", + "platform": "darwin", + "arch": "arm64", + "bitBin": "/Volumes/src/teambit/bit/bin/bit.js", + "iters": 3, + "warmups": 2, + "aspectIters": 3, + "smallWs": null, + "largeWs": null, + "timestamp": "2026-05-14T23:15:48.617Z" + }, + "scenarios": [ + { + "name": "bit --version", + "argv": [ + "--version" + ], + "cwd": "/var/folders/g7/5ygp0ncd6qx5g4fn5hpsqq5c0000gn/T/bit-bench-no-ws-51AHPj", + "cold": { + "n": 3, + "min": 171.799625, + "p50": 173.710417, + "p95": 186.7816039, + "mean": 177.91466666666668, + "max": 188.233958, + "samples": [ + 188.233958, + 173.710417, + 171.799625 + ], + "exits": [ + 0, + 0, + 0 + ] + }, + "warm": { + "n": 3, + "min": 171.002584, + "p50": 171.626666, + "p95": 174.964316, + "mean": 172.65480533333334, + "max": 175.335166, + "samples": [ + 171.002584, + 171.626666, + 175.335166 + ], + "exits": [ + 0, + 0, + 0 + ] + } + }, + { + "name": "bit --help", + "argv": [ + "--help" + ], + "cwd": "/var/folders/g7/5ygp0ncd6qx5g4fn5hpsqq5c0000gn/T/bit-bench-no-ws-51AHPj", + "cold": { + "n": 3, + "min": 462.961417, + "p50": 476.151125, + "p95": 482.62917469999996, + "mean": 474.1538333333333, + "max": 483.348958, + "samples": [ + 462.961417, + 476.151125, + 483.348958 + ], + "exits": [ + 0, + 0, + 0 + ] + }, + "warm": { + "n": 3, + "min": 433.98375, + "p50": 443.798042, + "p95": 449.4571673, + "mean": 442.6225836666667, + "max": 450.085959, + "samples": [ + 433.98375, + 443.798042, + 450.085959 + ], + "exits": [ + 0, + 0, + 0 + ] + } + }, + { + "name": "bit ", + "argv": [ + "zzz-typo-cmd" + ], + "cwd": "/var/folders/g7/5ygp0ncd6qx5g4fn5hpsqq5c0000gn/T/bit-bench-no-ws-51AHPj", + "cold": { + "n": 3, + "min": 457.234375, + "p50": 489.521542, + "p95": 519.0095541999999, + "mean": 489.680639, + "max": 522.286, + "samples": [ + 522.286, + 457.234375, + 489.521542 + ], + "exits": [ + 1, + 1, + 1 + ] + }, + "warm": { + "n": 3, + "min": 434.293875, + "p50": 435.727208, + "p95": 445.3926455, + "mean": 438.829222, + "max": 446.466583, + "samples": [ + 434.293875, + 435.727208, + 446.466583 + ], + "exits": [ + 1, + 1, + 1 + ] + } + }, + { + "name": "bit status (no ws)", + "argv": [ + "status" + ], + "cwd": "/var/folders/g7/5ygp0ncd6qx5g4fn5hpsqq5c0000gn/T/bit-bench-no-ws-51AHPj", + "cold": { + "n": 3, + "min": 669.021375, + "p50": 689.710292, + "p95": 700.1963423, + "mean": 686.6977086666666, + "max": 701.361459, + "samples": [ + 701.361459, + 689.710292, + 669.021375 + ], + "exits": [ + 1, + 1, + 1 + ] + }, + "warm": { + "n": 3, + "min": 650.47275, + "p50": 661.173833, + "p95": 679.8305711, + "mean": 664.5167083333333, + "max": 681.903542, + "samples": [ + 661.173833, + 650.47275, + 681.903542 + ], + "exits": [ + 1, + 1, + 1 + ] + } + } + ], + "aspects": [ + { + "pkg": "@teambit/api-server", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/api-server/dist/api-server.main.runtime.js", + "samples": [ + 26.884, + 25.228, + 23.47 + ], + "n": 3, + "min": 23.47, + "p50": 25.228, + "p95": 26.7184, + "mean": 25.194, + "max": 26.884 + }, + { + "pkg": "@teambit/application", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/application/dist/application.main.runtime.js", + "samples": [ + 22.917, + 20.912, + 21.259 + ], + "n": 3, + "min": 20.912, + "p50": 21.259, + "p95": 22.7512, + "mean": 21.695999999999998, + "max": 22.917 + }, + { + "pkg": "@teambit/aspect", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/aspect/dist/aspect.main.runtime.js", + "samples": [ + 24.808, + 23.499, + 23.73 + ], + "n": 3, + "min": 23.499, + "p50": 23.73, + "p95": 24.7002, + "mean": 24.012333333333334, + "max": 24.808 + }, + { + "pkg": "@teambit/aspect-loader", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/aspect-loader/dist/aspect-loader.main.runtime.js", + "samples": [ + 19.989, + 18.298, + 18.805 + ], + "n": 3, + "min": 18.298, + "p50": 18.805, + "p95": 19.8706, + "mean": 19.030666666666665, + "max": 19.989 + }, + { + "pkg": "@teambit/babel", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/babel/dist/babel.main.runtime.js", + "samples": [ + 18.232, + 19.613, + 17.219 + ], + "n": 3, + "min": 17.219, + "p50": 18.232, + "p95": 19.474899999999998, + "mean": 18.354666666666667, + "max": 19.613 + }, + { + "pkg": "@teambit/builder", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/builder/dist/builder.main.runtime.js", + "samples": [ + 23.641, + 23.506, + 24.601 + ], + "n": 3, + "min": 23.506, + "p50": 23.641, + "p95": 24.505, + "mean": 23.915999999999997, + "max": 24.601 + }, + { + "pkg": "@teambit/bundler", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/bundler/dist/bundler.main.runtime.js", + "samples": [ + 17.728, + 18.664, + 19.88 + ], + "n": 3, + "min": 17.728, + "p50": 18.664, + "p95": 19.758399999999998, + "mean": 18.757333333333335, + "max": 19.88 + }, + { + "pkg": "@teambit/cache", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/cache/dist/cache.main.runtime.js", + "samples": [ + 31.517, + 30.705, + 31.381 + ], + "n": 3, + "min": 30.705, + "p50": 31.381, + "p95": 31.5034, + "mean": 31.200999999999997, + "max": 31.517 + }, + { + "pkg": "@teambit/checkout", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/checkout/dist/checkout.main.runtime.js", + "samples": [ + 21.474, + 18.27, + 21.224 + ], + "n": 3, + "min": 18.27, + "p50": 21.224, + "p95": 21.449, + "mean": 20.322666666666667, + "max": 21.474 + }, + { + "pkg": "@teambit/ci", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/ci/dist/ci.main.runtime.js", + "samples": [ + 21.049, + 22.484, + 22.622 + ], + "n": 3, + "min": 21.049, + "p50": 22.484, + "p95": 22.6082, + "mean": 22.051666666666666, + "max": 22.622 + }, + { + "pkg": "@teambit/clear-cache", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/clear-cache/dist/clear-cache.main.runtime.js", + "samples": [ + 14.753, + 17.061, + 15.421 + ], + "n": 3, + "min": 14.753, + "p50": 15.421, + "p95": 16.897, + "mean": 15.745, + "max": 17.061 + }, + { + "pkg": "@teambit/cli", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/cli/dist/cli.main.runtime.js", + "samples": [ + 14.364, + 17.151, + 15.868 + ], + "n": 3, + "min": 14.364, + "p50": 15.868, + "p95": 17.0227, + "mean": 15.794333333333332, + "max": 17.151 + }, + { + "pkg": "@teambit/cli-mcp-server", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/cli-mcp-server/dist/cli-mcp-server.main.runtime.js", + "samples": [ + 18.503, + 15.868, + 17.584 + ], + "n": 3, + "min": 15.868, + "p50": 17.584, + "p95": 18.4111, + "mean": 17.31833333333333, + "max": 18.503 + }, + { + "pkg": "@teambit/cloud", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/cloud/dist/cloud.main.runtime.js", + "samples": [ + 32.399, + 33.733, + 34.262 + ], + "n": 3, + "min": 32.399, + "p50": 33.733, + "p95": 34.2091, + "mean": 33.464666666666666, + "max": 34.262 + }, + { + "pkg": "@teambit/community", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/community/dist/community.main.runtime.js", + "samples": [ + 28.771, + 30.245, + 29.506 + ], + "n": 3, + "min": 28.771, + "p50": 29.506, + "p95": 30.1711, + "mean": 29.507333333333335, + "max": 30.245 + }, + { + "pkg": "@teambit/compiler", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/compiler/dist/compiler.main.runtime.js", + "samples": [ + 22.593, + 21.026, + 23.457 + ], + "n": 3, + "min": 21.026, + "p50": 22.593, + "p95": 23.3706, + "mean": 22.358666666666664, + "max": 23.457 + }, + { + "pkg": "@teambit/component", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/component/dist/component.main.runtime.js", + "samples": [ + 19.346, + 18.131, + 17.523 + ], + "n": 3, + "min": 17.523, + "p50": 18.131, + "p95": 19.2245, + "mean": 18.333333333333332, + "max": 19.346 + }, + { + "pkg": "@teambit/component-compare", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/component-compare/dist/component-compare.main.runtime.js", + "samples": [ + 23.33, + 22.1, + 22.877 + ], + "n": 3, + "min": 22.1, + "p50": 22.877, + "p95": 23.284699999999997, + "mean": 22.769000000000002, + "max": 23.33 + }, + { + "pkg": "@teambit/component-log", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/component-log/dist/component-log.main.runtime.js", + "samples": [ + 18.11, + 16.043, + 19.707 + ], + "n": 3, + "min": 16.043, + "p50": 18.11, + "p95": 19.5473, + "mean": 17.953333333333333, + "max": 19.707 + }, + { + "pkg": "@teambit/component-sizer", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/component-sizer/dist/component-sizer.main.runtime.js", + "samples": [ + 19.584, + 19.422, + 18.639 + ], + "n": 3, + "min": 18.639, + "p50": 19.422, + "p95": 19.5678, + "mean": 19.215, + "max": 19.584 + }, + { + "pkg": "@teambit/component-writer", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/component-writer/dist/component-writer.main.runtime.js", + "samples": [ + 21.023, + 20.701, + 21.863 + ], + "n": 3, + "min": 20.701, + "p50": 21.023, + "p95": 21.779, + "mean": 21.195666666666668, + "max": 21.863 + }, + { + "pkg": "@teambit/compositions", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/compositions/dist/compositions.main.runtime.js", + "samples": [ + 22.788, + 19.834, + 21.341 + ], + "n": 3, + "min": 19.834, + "p50": 21.341, + "p95": 22.6433, + "mean": 21.320999999999998, + "max": 22.788 + }, + { + "pkg": "@teambit/config", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/config/dist/config.main.runtime.js", + "samples": [ + 16.64, + 17.919, + 17.094 + ], + "n": 3, + "min": 16.64, + "p50": 17.094, + "p95": 17.8365, + "mean": 17.21766666666667, + "max": 17.919 + }, + { + "pkg": "@teambit/config-merger", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/config-merger/dist/config-merger.main.runtime.js", + "samples": [ + 20.666, + 21.16, + 20.604 + ], + "n": 3, + "min": 20.604, + "p50": 20.666, + "p95": 21.1106, + "mean": 20.81, + "max": 21.16 + }, + { + "pkg": "@teambit/config-store", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/config-store/dist/config-store.main.runtime.js", + "samples": [ + 16.678, + 16.125, + 17.037 + ], + "n": 3, + "min": 16.125, + "p50": 16.678, + "p95": 17.001099999999997, + "mean": 16.613333333333333, + "max": 17.037 + }, + { + "pkg": "@teambit/dependencies", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/dependencies/dist/dependencies.main.runtime.js", + "samples": [ + 21.905, + 21.591, + 22.052 + ], + "n": 3, + "min": 21.591, + "p50": 21.905, + "p95": 22.0373, + "mean": 21.849333333333334, + "max": 22.052 + }, + { + "pkg": "@teambit/dependency-resolver", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/dependency-resolver/dist/dependency-resolver.main.runtime.js", + "samples": [ + 33.933, + 33.947, + 33.866 + ], + "n": 3, + "min": 33.866, + "p50": 33.933, + "p95": 33.9456, + "mean": 33.915333333333336, + "max": 33.947 + }, + { + "pkg": "@teambit/deprecation", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/deprecation/dist/deprecation.main.runtime.js", + "samples": [ + 21.88, + 21.142, + 21.596 + ], + "n": 3, + "min": 21.142, + "p50": 21.596, + "p95": 21.851599999999998, + "mean": 21.53933333333333, + "max": 21.88 + }, + { + "pkg": "@teambit/dev-files", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/dev-files/dist/dev-files.main.runtime.js", + "samples": [ + 21.26, + 20.839, + 19.953 + ], + "n": 3, + "min": 19.953, + "p50": 20.839, + "p95": 21.2179, + "mean": 20.684, + "max": 21.26 + }, + { + "pkg": "@teambit/diagnostic", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/diagnostic/dist/diagnostic.main.runtime.js", + "samples": [ + 16.289, + 17.835, + 16.785 + ], + "n": 3, + "min": 16.289, + "p50": 16.785, + "p95": 17.73, + "mean": 16.969666666666665, + "max": 17.835 + }, + { + "pkg": "@teambit/docs", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/docs/dist/docs.main.runtime.js", + "samples": [ + 23.171, + 23.399, + 23.796 + ], + "n": 3, + "min": 23.171, + "p50": 23.399, + "p95": 23.7563, + "mean": 23.455333333333332, + "max": 23.796 + }, + { + "pkg": "@teambit/doctor", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/doctor/dist/doctor.main.runtime.js", + "samples": [ + 17.02, + 17.948, + 18.269 + ], + "n": 3, + "min": 17.02, + "p50": 17.948, + "p95": 18.2369, + "mean": 17.74566666666667, + "max": 18.269 + }, + { + "pkg": "@teambit/eject", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/eject/dist/eject.main.runtime.js", + "samples": [ + 19.455, + 19.656, + 18.898 + ], + "n": 3, + "min": 18.898, + "p50": 19.455, + "p95": 19.6359, + "mean": 19.336333333333332, + "max": 19.656 + }, + { + "pkg": "@teambit/env", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/env/dist/env.main.runtime.js", + "samples": [ + 17.988, + 18.171, + 18.922 + ], + "n": 3, + "min": 17.988, + "p50": 18.171, + "p95": 18.8469, + "mean": 18.360333333333333, + "max": 18.922 + }, + { + "pkg": "@teambit/envs", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/envs/dist/environments.main.runtime.js", + "samples": [ + 20.771, + 21.188, + 21.767 + ], + "n": 3, + "min": 20.771, + "p50": 21.188, + "p95": 21.7091, + "mean": 21.242, + "max": 21.767 + }, + { + "pkg": "@teambit/eslint", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/eslint/dist/eslint.main.runtime.js", + "samples": [ + 18.04, + 17.006, + 16.879 + ], + "n": 3, + "min": 16.879, + "p50": 17.006, + "p95": 17.9366, + "mean": 17.308333333333334, + "max": 18.04 + }, + { + "pkg": "@teambit/export", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/export/dist/export.main.runtime.js", + "samples": [ + 21.479, + 22.091, + 21.037 + ], + "n": 3, + "min": 21.037, + "p50": 21.479, + "p95": 22.0298, + "mean": 21.535666666666668, + "max": 22.091 + }, + { + "pkg": "@teambit/express", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/express/dist/express.main.runtime.js", + "samples": [ + 19.207, + 15.312, + 17.412 + ], + "n": 3, + "min": 15.312, + "p50": 17.412, + "p95": 19.0275, + "mean": 17.310333333333332, + "max": 19.207 + }, + { + "pkg": "@teambit/forking", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/forking/dist/forking.main.runtime.js", + "samples": [ + 22.16, + 22.678, + 24.257 + ], + "n": 3, + "min": 22.16, + "p50": 22.678, + "p95": 24.0991, + "mean": 23.031666666666666, + "max": 24.257 + }, + { + "pkg": "@teambit/formatter", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/formatter/dist/formatter.main.runtime.js", + "samples": [ + 22.042, + 21.901, + 21.572 + ], + "n": 3, + "min": 21.572, + "p50": 21.901, + "p95": 22.027900000000002, + "mean": 21.838333333333335, + "max": 22.042 + }, + { + "pkg": "@teambit/generator", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/generator/dist/generator.main.runtime.js", + "samples": [ + 20.865, + 23.113, + 22.556 + ], + "n": 3, + "min": 20.865, + "p50": 22.556, + "p95": 23.057299999999998, + "mean": 22.177999999999997, + "max": 23.113 + }, + { + "pkg": "@teambit/git", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/git/dist/git.main.runtime.js", + "samples": [ + 18.867, + 17.556, + 19.93 + ], + "n": 3, + "min": 17.556, + "p50": 18.867, + "p95": 19.8237, + "mean": 18.784333333333333, + "max": 19.93 + }, + { + "pkg": "@teambit/global-config", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/global-config/dist/global-config.main.runtime.js", + "samples": [ + 21.707, + 17.111, + 18.259 + ], + "n": 3, + "min": 17.111, + "p50": 18.259, + "p95": 21.3622, + "mean": 19.02566666666667, + "max": 21.707 + }, + { + "pkg": "@teambit/graph", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/graph/dist/graph.main.runtime.js", + "samples": [ + 18.771, + 16.277, + 19.145 + ], + "n": 3, + "min": 16.277, + "p50": 18.771, + "p95": 19.107599999999998, + "mean": 18.064333333333334, + "max": 19.145 + }, + { + "pkg": "@teambit/graphql", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/graphql/dist/graphql.main.runtime.js", + "samples": [ + 16.909, + 17.36, + 17.643 + ], + "n": 3, + "min": 16.909, + "p50": 17.36, + "p95": 17.6147, + "mean": 17.304, + "max": 17.643 + }, + { + "pkg": "@teambit/harmony-ui-app", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/harmony-ui-app/dist/harmony-ui-app.main.runtime.js", + "samples": [ + 19.583, + 17.451, + 19.022 + ], + "n": 3, + "min": 17.451, + "p50": 19.022, + "p95": 19.526899999999998, + "mean": 18.685333333333332, + "max": 19.583 + }, + { + "pkg": "@teambit/host-initializer", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/host-initializer/dist/host-initializer.main.runtime.js", + "samples": [ + 18.09, + 17.393, + 19.127 + ], + "n": 3, + "min": 17.393, + "p50": 18.09, + "p95": 19.0233, + "mean": 18.203333333333333, + "max": 19.127 + }, + { + "pkg": "@teambit/importer", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/importer/dist/importer.main.runtime.js", + "samples": [ + 24.165, + 22.428, + 22.493 + ], + "n": 3, + "min": 22.428, + "p50": 22.493, + "p95": 23.997799999999998, + "mean": 23.028666666666666, + "max": 24.165 + }, + { + "pkg": "@teambit/insights", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/insights/dist/insights.main.runtime.js", + "samples": [ + 17.706, + 15.792, + 18.849 + ], + "n": 3, + "min": 15.792, + "p50": 17.706, + "p95": 18.7347, + "mean": 17.448999999999998, + "max": 18.849 + }, + { + "pkg": "@teambit/install", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/install/dist/install.main.runtime.js", + "samples": [ + 35.119, + 23.498, + 23.46 + ], + "n": 3, + "min": 23.46, + "p50": 23.498, + "p95": 33.9569, + "mean": 27.358999999999998, + "max": 35.119 + }, + { + "pkg": "@teambit/ipc-events", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/ipc-events/dist/ipc-events.main.runtime.js", + "samples": [ + 16.037, + 17.345, + 16.545 + ], + "n": 3, + "min": 16.037, + "p50": 16.545, + "p95": 17.265, + "mean": 16.642333333333333, + "max": 17.345 + }, + { + "pkg": "@teambit/isolator", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/isolator/dist/isolator.main.runtime.js", + "samples": [ + 21.556, + 20.558, + 20.66 + ], + "n": 3, + "min": 20.558, + "p50": 20.66, + "p95": 21.4664, + "mean": 20.924666666666667, + "max": 21.556 + }, + { + "pkg": "@teambit/issues", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/issues/dist/issues.main.runtime.js", + "samples": [ + 16.514, + 17.706, + 17.129 + ], + "n": 3, + "min": 16.514, + "p50": 17.129, + "p95": 17.6483, + "mean": 17.116333333333333, + "max": 17.706 + }, + { + "pkg": "@teambit/jest", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/jest/dist/jest.main.runtime.js", + "samples": [ + 18.325, + 17.278, + 16.99 + ], + "n": 3, + "min": 16.99, + "p50": 17.278, + "p95": 18.220299999999998, + "mean": 17.531000000000002, + "max": 18.325 + }, + { + "pkg": "@teambit/lanes", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/lanes/dist/lanes.main.runtime.js", + "samples": [ + 22.061, + 23.296, + 24.422 + ], + "n": 3, + "min": 22.061, + "p50": 23.296, + "p95": 24.3094, + "mean": 23.259666666666664, + "max": 24.422 + }, + { + "pkg": "@teambit/linter", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/linter/dist/linter.main.runtime.js", + "samples": [ + 21.184, + 19.816, + 21.329 + ], + "n": 3, + "min": 19.816, + "p50": 21.184, + "p95": 21.314500000000002, + "mean": 20.776333333333334, + "max": 21.329 + }, + { + "pkg": "@teambit/lister", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/lister/dist/lister.main.runtime.js", + "samples": [ + 18.24, + 19.64, + 19.438 + ], + "n": 3, + "min": 18.24, + "p50": 19.438, + "p95": 19.6198, + "mean": 19.105999999999998, + "max": 19.64 + }, + { + "pkg": "@teambit/logger", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/logger/dist/logger.main.runtime.js", + "samples": [ + 16.489, + 15.299, + 16.169 + ], + "n": 3, + "min": 15.299, + "p50": 16.169, + "p95": 16.457, + "mean": 15.985666666666667, + "max": 16.489 + }, + { + "pkg": "@teambit/mdx", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/mdx/dist/mdx.main.runtime.js", + "samples": [ + 20.929, + 21.719, + 21.503 + ], + "n": 3, + "min": 20.929, + "p50": 21.503, + "p95": 21.697400000000002, + "mean": 21.38366666666667, + "max": 21.719 + }, + { + "pkg": "@teambit/merge-lanes", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/merge-lanes/dist/merge-lanes.main.runtime.js", + "samples": [ + 23.243, + 23.838, + 22.401 + ], + "n": 3, + "min": 22.401, + "p50": 23.243, + "p95": 23.7785, + "mean": 23.160666666666668, + "max": 23.838 + }, + { + "pkg": "@teambit/merging", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/merging/dist/merging.main.runtime.js", + "samples": [ + 22.549, + 24.599, + 23.033 + ], + "n": 3, + "min": 22.549, + "p50": 23.033, + "p95": 24.4424, + "mean": 23.393666666666665, + "max": 24.599 + }, + { + "pkg": "@teambit/mocha", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/mocha/dist/mocha.main.runtime.js", + "samples": [ + 16.126, + 18.039, + 17.506 + ], + "n": 3, + "min": 16.126, + "p50": 17.506, + "p95": 17.9857, + "mean": 17.22366666666667, + "max": 18.039 + }, + { + "pkg": "@teambit/mover", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/mover/dist/mover.main.runtime.js", + "samples": [ + 17.184, + 19.047, + 25.71 + ], + "n": 3, + "min": 17.184, + "p50": 19.047, + "p95": 25.0437, + "mean": 20.647000000000002, + "max": 25.71 + }, + { + "pkg": "@teambit/multi-compiler", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/multi-compiler/dist/multi-compiler.main.runtime.js", + "samples": [ + 15.442, + 16.629, + 16.586 + ], + "n": 3, + "min": 15.442, + "p50": 16.586, + "p95": 16.6247, + "mean": 16.218999999999998, + "max": 16.629 + }, + { + "pkg": "@teambit/multi-tester", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/multi-tester/dist/multi-tester.main.runtime.js", + "samples": [ + 17.382, + 17.282, + 17.621 + ], + "n": 3, + "min": 17.282, + "p50": 17.382, + "p95": 17.597099999999998, + "mean": 17.42833333333333, + "max": 17.621 + }, + { + "pkg": "@teambit/new-component-helper", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/new-component-helper/dist/new-component-helper.main.runtime.js", + "samples": [ + 33.3, + 32.024, + 32.464 + ], + "n": 3, + "min": 32.024, + "p50": 32.464, + "p95": 33.2164, + "mean": 32.596, + "max": 33.3 + }, + { + "pkg": "@teambit/node", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/node/dist/node.main.runtime.js", + "samples": [ + 21.282, + 20.132, + 21.448 + ], + "n": 3, + "min": 20.132, + "p50": 21.282, + "p95": 21.4314, + "mean": 20.954, + "max": 21.448 + }, + { + "pkg": "@teambit/objects", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/objects/dist/objects.main.runtime.js", + "samples": [ + 17.635, + 17.223, + 16.629 + ], + "n": 3, + "min": 16.629, + "p50": 17.223, + "p95": 17.5938, + "mean": 17.162333333333336, + "max": 17.635 + }, + { + "pkg": "@teambit/panels", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/panels/dist/panel-ui.main.runtime.js", + "samples": [ + 16.497, + 16.229, + 15.659 + ], + "n": 3, + "min": 15.659, + "p50": 16.229, + "p95": 16.4702, + "mean": 16.128333333333334, + "max": 16.497 + }, + { + "pkg": "@teambit/pkg", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/pkg/dist/pkg.main.runtime.js", + "samples": [ + 23.173, + 21.341, + 23.091 + ], + "n": 3, + "min": 21.341, + "p50": 23.091, + "p95": 23.1648, + "mean": 22.535, + "max": 23.173 + }, + { + "pkg": "@teambit/pnpm", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/pnpm/dist/pnpm.main.runtime.js", + "samples": [ + 18.541, + 17.896, + 18.645 + ], + "n": 3, + "min": 17.896, + "p50": 18.541, + "p95": 18.6346, + "mean": 18.360666666666663, + "max": 18.645 + }, + { + "pkg": "@teambit/prettier", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/prettier/dist/prettier.main.runtime.js", + "samples": [ + 15.869, + 18.251, + 15.482 + ], + "n": 3, + "min": 15.482, + "p50": 15.869, + "p95": 18.012800000000002, + "mean": 16.534000000000002, + "max": 18.251 + }, + { + "pkg": "@teambit/preview", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/preview/dist/preview.main.runtime.js", + "samples": [ + 39.816, + 38.415, + 33.489 + ], + "n": 3, + "min": 33.489, + "p50": 38.415, + "p95": 39.6759, + "mean": 37.24, + "max": 39.816 + }, + { + "pkg": "@teambit/pubsub", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/pubsub/dist/pubsub.main.runtime.js", + "samples": [ + 16.201, + 14.925, + 15.017 + ], + "n": 3, + "min": 14.925, + "p50": 15.017, + "p95": 16.0826, + "mean": 15.381, + "max": 16.201 + }, + { + "pkg": "@teambit/react", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/react/dist/react.main.runtime.js", + "samples": [ + 24.983, + 24.565, + 25.021 + ], + "n": 3, + "min": 24.565, + "p50": 24.983, + "p95": 25.017200000000003, + "mean": 24.856333333333335, + "max": 25.021 + }, + { + "pkg": "@teambit/readme", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/readme/dist/readme.main.runtime.js", + "samples": [ + 18.996, + 18.815, + 20.215 + ], + "n": 3, + "min": 18.815, + "p50": 18.996, + "p95": 20.0931, + "mean": 19.342, + "max": 20.215 + }, + { + "pkg": "@teambit/refactoring", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/refactoring/dist/refactoring.main.runtime.js", + "samples": [ + 18.917, + 18.859, + 17.488 + ], + "n": 3, + "min": 17.488, + "p50": 18.859, + "p95": 18.9112, + "mean": 18.421333333333333, + "max": 18.917 + }, + { + "pkg": "@teambit/remove", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/remove/dist/remove.main.runtime.js", + "samples": [ + 23.019, + 20.414, + 21.395 + ], + "n": 3, + "min": 20.414, + "p50": 21.395, + "p95": 22.856599999999997, + "mean": 21.609333333333336, + "max": 23.019 + }, + { + "pkg": "@teambit/renaming", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/renaming/dist/renaming.main.runtime.js", + "samples": [ + 24, + 26.666, + 23.1 + ], + "n": 3, + "min": 23.1, + "p50": 24, + "p95": 26.3994, + "mean": 24.58866666666667, + "max": 26.666 + }, + { + "pkg": "@teambit/ripple", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/ripple/dist/ripple.main.runtime.js", + "samples": [ + 19.897, + 19.459, + 17.861 + ], + "n": 3, + "min": 17.861, + "p50": 19.459, + "p95": 19.853199999999998, + "mean": 19.072333333333333, + "max": 19.897 + }, + { + "pkg": "@teambit/schema", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/schema/dist/schema.main.runtime.js", + "samples": [ + 20.872, + 21.36, + 20.48 + ], + "n": 3, + "min": 20.48, + "p50": 20.872, + "p95": 21.3112, + "mean": 20.904, + "max": 21.36 + }, + { + "pkg": "@teambit/scope", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/scope/dist/scope.main.runtime.js", + "samples": [ + 21.477, + 30.267, + 22.43 + ], + "n": 3, + "min": 21.477, + "p50": 22.43, + "p95": 29.4833, + "mean": 24.724666666666664, + "max": 30.267 + }, + { + "pkg": "@teambit/scripts", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/scripts/dist/scripts.main.runtime.js", + "samples": [ + 19.224, + 20.014, + 20.285 + ], + "n": 3, + "min": 19.224, + "p50": 20.014, + "p95": 20.2579, + "mean": 19.840999999999998, + "max": 20.285 + }, + { + "pkg": "@teambit/snapping", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/snapping/dist/snapping.main.runtime.js", + "samples": [ + 20.779, + 23.059, + 20.716 + ], + "n": 3, + "min": 20.716, + "p50": 20.779, + "p95": 22.831, + "mean": 21.518, + "max": 23.059 + }, + { + "pkg": "@teambit/stash", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/stash/dist/stash.main.runtime.js", + "samples": [ + 21.481, + 20.75, + 19.455 + ], + "n": 3, + "min": 19.455, + "p50": 20.75, + "p95": 21.4079, + "mean": 20.562, + "max": 21.481 + }, + { + "pkg": "@teambit/status", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/status/dist/status.main.runtime.js", + "samples": [ + 21.158, + 21.209, + 22.254 + ], + "n": 3, + "min": 21.158, + "p50": 21.209, + "p95": 22.1495, + "mean": 21.540333333333336, + "max": 22.254 + }, + { + "pkg": "@teambit/tester", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/tester/dist/tester.main.runtime.js", + "samples": [ + 21.482, + 21.58, + 21.393 + ], + "n": 3, + "min": 21.393, + "p50": 21.482, + "p95": 21.5702, + "mean": 21.485, + "max": 21.58 + }, + { + "pkg": "@teambit/tracker", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/tracker/dist/tracker.main.runtime.js", + "samples": [ + 19.065, + 19.997, + 17.203 + ], + "n": 3, + "min": 17.203, + "p50": 19.065, + "p95": 19.9038, + "mean": 18.755, + "max": 19.997 + }, + { + "pkg": "@teambit/typescript", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/typescript/dist/typescript.main.runtime.js", + "samples": [ + 22.136, + 22.945, + 22.865 + ], + "n": 3, + "min": 22.136, + "p50": 22.865, + "p95": 22.937, + "mean": 22.648666666666667, + "max": 22.945 + }, + { + "pkg": "@teambit/ui", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/ui/dist/ui.main.runtime.js", + "samples": [ + 20.32, + 18.936, + 21.04 + ], + "n": 3, + "min": 18.936, + "p50": 20.32, + "p95": 20.968, + "mean": 20.098666666666666, + "max": 21.04 + }, + { + "pkg": "@teambit/validator", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/validator/dist/validator.main.runtime.js", + "samples": [ + 18.572, + 18.956, + 20.349 + ], + "n": 3, + "min": 18.572, + "p50": 18.956, + "p95": 20.2097, + "mean": 19.292333333333332, + "max": 20.349 + }, + { + "pkg": "@teambit/variants", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/variants/dist/variants.main.runtime.js", + "samples": [ + 17.495, + 17.063, + 17.479 + ], + "n": 3, + "min": 17.063, + "p50": 17.479, + "p95": 17.4934, + "mean": 17.34566666666667, + "max": 17.495 + }, + { + "pkg": "@teambit/version-history", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/version-history/dist/version-history.main.runtime.js", + "samples": [ + 17.439, + 18.536, + 17.142 + ], + "n": 3, + "min": 17.142, + "p50": 17.439, + "p95": 18.4263, + "mean": 17.70566666666667, + "max": 18.536 + }, + { + "pkg": "@teambit/vue-aspect", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/vue-aspect/dist/vue.main.runtime.js", + "samples": [ + 17.576, + 17.987, + 17.854 + ], + "n": 3, + "min": 17.576, + "p50": 17.854, + "p95": 17.973699999999997, + "mean": 17.805666666666667, + "max": 17.987 + }, + { + "pkg": "@teambit/watcher", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/watcher/dist/watcher.main.runtime.js", + "samples": [ + 20.62, + 20.654, + 18.134 + ], + "n": 3, + "min": 18.134, + "p50": 20.62, + "p95": 20.6506, + "mean": 19.802666666666667, + "max": 20.654 + }, + { + "pkg": "@teambit/webpack", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/webpack/dist/webpack.main.runtime.js", + "samples": [ + 20.226, + 20.582, + 20.962 + ], + "n": 3, + "min": 20.226, + "p50": 20.582, + "p95": 20.924, + "mean": 20.59, + "max": 20.962 + }, + { + "pkg": "@teambit/worker", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/worker/dist/worker.main.runtime.js", + "samples": [ + 15.661, + 15.666, + 15.554 + ], + "n": 3, + "min": 15.554, + "p50": 15.661, + "p95": 15.6655, + "mean": 15.627, + "max": 15.666 + }, + { + "pkg": "@teambit/workspace", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/workspace/dist/workspace.main.runtime.js", + "samples": [ + 23.493, + 23.338, + 23.141 + ], + "n": 3, + "min": 23.141, + "p50": 23.338, + "p95": 23.4775, + "mean": 23.323999999999998, + "max": 23.493 + }, + { + "pkg": "@teambit/workspace-config-files", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/workspace-config-files/dist/workspace-config-files.main.runtime.js", + "samples": [ + 20.009, + 18.218, + 20.559 + ], + "n": 3, + "min": 18.218, + "p50": 20.009, + "p95": 20.504, + "mean": 19.595333333333333, + "max": 20.559 + }, + { + "pkg": "@teambit/yarn", + "runtimeFile": "/Volumes/src/teambit/bit/node_modules/@teambit/yarn/dist/yarn.main.runtime.js", + "samples": [ + 18.522, + 17.395, + 18.717 + ], + "n": 3, + "min": 17.395, + "p50": 18.522, + "p95": 18.697499999999998, + "mean": 18.211333333333332, + "max": 18.717 + } + ], + "aspectsMeta": { + "packages": 109, + "withRuntime": 100 + } +} diff --git a/bin/bit.js b/bin/bit.js index a64f7bd62eb8..d55922b85060 100755 --- a/bin/bit.js +++ b/bin/bit.js @@ -1,3 +1,14 @@ #!/usr/bin/env node -require('../node_modules/@teambit/bit/dist/app'); +const path = require('path'); +const fs = require('fs'); + +// Opt-in to the bundled entry via `BIT_USE_BUNDLE=1`. Defaults to the +// per-aspect dist for now — flip the default after the bundle has been +// proven on CI + a wider command surface. +const bundlePath = path.resolve(__dirname, '..', 'dist', 'bundle', 'bit.cjs'); +if (process.env.BIT_USE_BUNDLE === '1' && fs.existsSync(bundlePath)) { + require(bundlePath); +} else { + require('../node_modules/@teambit/bit/dist/app'); +} diff --git a/components/config-store/config-cmd.ts b/components/config-store/config-cmd.ts index fbaf7c865bfd..648b534f6124 100644 --- a/components/config-store/config-cmd.ts +++ b/components/config-store/config-cmd.ts @@ -4,6 +4,7 @@ import rightpad from 'pad-right'; import { BASE_DOCS_DOMAIN } from '@teambit/legacy.constants'; import type { Command, CommandOptions } from '@teambit/cli'; import type { ConfigStoreMain, StoreOrigin } from './config-store.main.runtime'; +import { configCommand } from './config-store.commands'; class ConfigSet implements Command { name = 'set '; @@ -130,17 +131,14 @@ class ConfigDel implements Command { } export class ConfigCmd implements Command { - name = 'config'; - description = 'manage Bit configuration settings'; - extendedDescription = `view and modify Bit configuration at different levels: global, workspace, or scope. -configurations control various aspects of Bit including user settings, registries, and feature flags. -use environment variables prefixed with BIT_CONFIG_ for temporary overrides. -${BASE_DOCS_DOMAIN}reference/config/bit-config`; - group = 'system'; - alias = ''; - loadAspects = false; - commands: Command[] = []; - options = [] as CommandOptions; + name = configCommand.name; + description = configCommand.description; + extendedDescription = configCommand.extendedDescription; + group = configCommand.group; + alias = configCommand.alias; + loadAspects = configCommand.loadAspects; + commands: Command[] = configCommand.commands; + options = configCommand.options; constructor(private configStore: ConfigStoreMain) { this.commands = [ diff --git a/components/config-store/config-store.aspect.ts b/components/config-store/config-store.aspect.ts index 384dff7ed69a..b39c50ccbdeb 100644 --- a/components/config-store/config-store.aspect.ts +++ b/components/config-store/config-store.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ConfigStoreAspect = Aspect.create({ id: 'teambit.harmony/config-store', + runtimes: { main: () => import('./config-store.main.runtime') }, + commands: () => import('./config-store.commands').then((m) => [m.configCommand]), }); diff --git a/components/config-store/config-store.commands.ts b/components/config-store/config-store.commands.ts new file mode 100644 index 000000000000..caae36f646f4 --- /dev/null +++ b/components/config-store/config-store.commands.ts @@ -0,0 +1,26 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { BASE_DOCS_DOMAIN } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const configCommand: CommandDescriptor = { + name: 'config', + alias: '', + description: 'manage Bit configuration settings', + extendedDescription: `view and modify Bit configuration at different levels: global, workspace, or scope. + configurations control various aspects of Bit including user settings, registries, and feature flags. + use environment variables prefixed with BIT_CONFIG_ for temporary overrides. + ${BASE_DOCS_DOMAIN}reference/config/bit-config`, + group: 'system', + loadAspects: false, + options: [] as CommandOptions, + commands: [], +}; diff --git a/components/config-store/config-store.main.runtime.ts b/components/config-store/config-store.main.runtime.ts index 019c229e2106..3fab26865bfb 100644 --- a/components/config-store/config-store.main.runtime.ts +++ b/components/config-store/config-store.main.runtime.ts @@ -5,6 +5,7 @@ import { ConfigStoreAspect } from './config-store.aspect'; import type { Store } from './config-getter'; import { configGetter } from './config-getter'; import { ConfigCmd } from './config-cmd'; +import { configCommand } from './config-store.commands'; export type StoreOrigin = 'scope' | 'workspace' | 'global'; @@ -80,7 +81,7 @@ export class ConfigStoreMain { static runtime = MainRuntime; static async provider([cli]: [CLIMain]) { const configStore = new ConfigStoreMain(); - cli.register(new ConfigCmd(configStore)); + cli.register(configCommand, () => new ConfigCmd(configStore)); return configStore; } } diff --git a/components/config-store/global-config.ts b/components/config-store/global-config.ts index 5be872a83826..48c7b425f5c4 100644 --- a/components/config-store/global-config.ts +++ b/components/config-store/global-config.ts @@ -1,7 +1,31 @@ import fs from 'fs-extra'; import * as path from 'path'; +import { homedir } from 'os'; -import { GLOBAL_CONFIG, GLOBAL_CONFIG_FILE } from '@teambit/legacy.constants'; +// Path resolution is inlined here (rather than imported from +// `@teambit/legacy.constants`) to break the import cycle +// config-store → config-getter → global-config → legacy.constants → config-store +// which used to be papered over by the babel `lazy: () => true` thunk +// transform. The thunk has been removed because it blocks the ESM migration +// (lazy require is CJS-only). Keep these constants in sync with the same +// names in `legacy.constants/constants.ts` if either ever moves. + +const CACHE_GLOBALS_ENV = 'BIT_GLOBALS_DIR'; + +function getCacheRoot(): string { + const fromEnvVar = process.env[CACHE_GLOBALS_ENV]; + if (fromEnvVar && typeof fromEnvVar === 'string') return fromEnvVar; + if (process.platform === 'darwin' || process.platform === 'linux') { + return path.join(homedir(), 'Library', 'Caches', 'Bit'); + } + if (process.platform === 'win32' && process.env.LOCALAPPDATA) { + return path.join(process.env.LOCALAPPDATA, 'Bit'); + } + return path.join(homedir(), '.bit'); +} + +const GLOBAL_CONFIG_DIR = path.join(getCacheRoot(), 'config'); +const GLOBAL_CONFIG_FILE = 'config.json'; // Owner-only perms for the global config file. It can hold the user's // bit-cloud token and other secrets, so match the AWS/gcloud baseline @@ -9,7 +33,7 @@ import { GLOBAL_CONFIG, GLOBAL_CONFIG_FILE } from '@teambit/legacy.constants'; const CONFIG_FILE_MODE = 0o600; export function getGlobalConfigPath() { - return path.join(GLOBAL_CONFIG, GLOBAL_CONFIG_FILE); + return path.join(GLOBAL_CONFIG_DIR, GLOBAL_CONFIG_FILE); } export class GlobalConfig extends Map { diff --git a/docs/migration/01-bench-harness.md b/docs/migration/01-bench-harness.md new file mode 100644 index 000000000000..bbe9abf56297 --- /dev/null +++ b/docs/migration/01-bench-harness.md @@ -0,0 +1,123 @@ +# Chunk 01 — Startup Benchmark Harness + +| Field | Value | +| --- | --- | +| Depends on | — | +| Blocks | meaningful claims about 03, 04, 05, 07, 10 | +| Risk | Low | +| Effort | ~2 days | + +## Goal + +Build a reproducible benchmark that measures Bit CLI startup time across a small +set of representative scenarios. **No behavior change.** This chunk lands +before any architectural work so we have ground truth. + +## Why first + +Every later chunk will claim "X is faster". Without a committed baseline and a +PR-gate harness, those claims are unverifiable and we'll lose ground silently. +The harness is also the artifact that proves §11 of the RFC at production +scale (the prototype proved it on a toy). + +## Scope + +A new directory `scripts/bench/` containing: + +1. `bench-startup.mjs` — measures wall-clock for a fixed set of scenarios. +2. `bench-aspect-load.mjs` — measures per-aspect cost in isolation (one aspect + imported per fresh Node process). +3. `fixtures/` — pre-built workspaces of various sizes (no-workspace, + small ~20 components, large ~500 components). +4. `report.mjs` — formats results into a markdown table; writes + `bench-results/.json` for trend tracking. + +## Scenarios measured + +| Scenario | Args | Workspace | +| --- | --- | --- | +| version | `--version` | none | +| help | `--help` | none | +| typo | `bogus-command` | none | +| status-empty | `status` | no workspace | +| status-small | `status` | fixtures/small | +| status-large | `status` | fixtures/large | +| install-small | `install --help` | fixtures/small (registers but doesn't run) | +| compile-small | `compile --help` | fixtures/small | + +Each scenario runs **10 times** (configurable). Report keeps `min`, `median`, `p95`. + +## Per-aspect isolated import + +```sh +node scripts/bench/bench-aspect-load.mjs --aspect teambit.component/status +``` + +Spawns a fresh Node process that does only: +```js +const t0 = performance.now(); +await import('@teambit/status'); +console.log(performance.now() - t0); +``` + +Iterates over every core aspect from `scopes/harmony/bit/manifests.ts`. Output: +`aspect-import-times.csv` with columns `aspect_id,min_ms,median_ms,p95_ms`. + +This is what the prototype's §11.3 #5 learning required: per-aspect numbers +attributed cleanly, not smeared by parallel-load thread contention. + +## Implementation notes + +- Use Node's `child_process.spawnSync` for cold runs; do **not** reuse a process. +- Disable the V8 compile cache (`NODE_COMPILE_CACHE=`) for "cold" runs; enable it + for a separate "warm" column. +- Run with `NODE_OPTIONS=--no-warnings --experimental-vm-modules` if necessary + to avoid deprecation noise polluting timing. +- Use `performance.now()` inside the subprocess for timing; communicate via + stdout (JSON line) to the parent. +- Always run on a quiet machine; the harness should print a stderr warning if + the host load average is high. + +## CI integration + +A new GitHub Actions workflow `bench.yml`: + +- Runs on PRs that touch `scopes/`, `components/`, `package.json`, or this + harness. +- Compares median against `main` baseline. +- **Fails the PR** if any scenario regresses by >10%. +- Comments the diff table on the PR. + +Baseline file lives at `scripts/bench/baseline.json` and is updated on +`main` merges via a separate workflow. + +## Acceptance criteria + +- [ ] `node scripts/bench/bench-startup.mjs` produces a markdown table. +- [ ] `bench-aspect-load.mjs` produces a CSV with one row per core aspect. +- [ ] `bench-results/.json` is written and consumable by `report.mjs`. +- [ ] Baseline numbers for current `main` are committed to + `scripts/bench/baseline.json`. +- [ ] CI workflow `bench.yml` runs on PRs and fails on >10% regression. +- [ ] README in `scripts/bench/` documents how to run, how to interpret, and + how to update the baseline. + +## Risks + +- **Noisy CI runners.** Mitigation: median over 10 runs; warn on load avg. +- **Cold-cache differences across CI machines.** Mitigation: compare deltas + vs same-PR baseline, not absolute numbers. +- **Benchmark gaming.** Future chunks might game scenarios. Mitigation: add new + scenarios as the architecture evolves; never delete old ones. + +## Files touched + +- `scripts/bench/` (new directory) +- `.github/workflows/bench.yml` (new) +- Possibly `package.json` (new script `npm run bench`). + +## Out of scope + +- Memory profiling (a future, separate chunk). +- Microbenchmarks of individual functions. +- Stress tests under load — we want clean wall-clock startup numbers. diff --git a/docs/migration/02-aspect-create-api.md b/docs/migration/02-aspect-create-api.md new file mode 100644 index 000000000000..e5ce7f2d3c2d --- /dev/null +++ b/docs/migration/02-aspect-create-api.md @@ -0,0 +1,84 @@ +# Chunk 02 — `Aspect.create` API Extension + +| Field | Value | +| --- | --- | +| Depends on | — | +| Blocks | 03, 04, 07 | +| Risk | Low | +| Effort | ~1 day | + +## Goal + +Extend the `Aspect.create` API in `@teambit/harmony` to accept two new fields: +`runtimes` (lazy import thunks) and an optional `defaultConfig`. **Existing call +sites do not change** — both fields are optional, fully backward compatible. + +## Why now + +This is the API contract every subsequent chunk depends on. Land it standalone +so chunks 03, 04, 07 can rely on the types existing. + +## Scope + +### Type changes + +In `scopes/harmony/harmony/aspect/aspect.ts` (the Harmony source): + +```ts +export interface AspectOptions { + id: string; + dependencies?: Aspect[]; + declareRuntime?: RuntimeDefinition; + defaultConfig?: Record; + + // NEW: per-runtime lazy loader. + // Bundler recognizes the thunk pattern and emits a code-split chunk. + runtimes?: Record Promise>>; +} +``` + +### Class changes + +`Aspect` instance stores `runtimes` if provided. No behavior change yet — +just data carried. + +### Backward compatibility + +- All existing `Aspect.create({ id, dependencies, declareRuntime })` calls + continue to type-check. +- Aspects with `runtimes` keep working in eager mode (the loader uses the + static `manifests` map as today). + +## Implementation steps + +1. Update `AspectOptions` interface and `Aspect` constructor. +2. Add JSDoc to `runtimes` explaining the thunk semantics. +3. Add a unit test asserting an aspect with `runtimes` round-trips correctly. +4. **Do not** change any `.aspect.ts` files yet — that's chunk 04 and 07. + +## Acceptance criteria + +- [ ] `scopes/harmony/harmony/aspect/aspect.ts` compiles with new fields. +- [ ] Unit test in `aspect.spec.ts` covers `runtimes` field. +- [ ] `bit compile` succeeds across the workspace; no existing call site needs + changes. +- [ ] No measurable startup-time delta vs baseline (chunk 01). +- [ ] No new dependencies added to `@teambit/harmony`. + +## Risks + +- **Types may leak through public exports.** Mitigation: keep `runtimes` as an + optional shallow object; consumers don't need to know about it unless they + use it. + +## Files touched + +- `scopes/harmony/harmony/aspect/aspect.ts` +- `scopes/harmony/harmony/aspect/aspect.spec.ts` (new test cases) + +## Out of scope + +- Actually using `runtimes` to load anything — that's chunk 03. +- Adding thunks to real aspects — that's chunk 04 / 07. +- The companion `commands` thunk — that lives on a separate mechanism (chunk 05), + not on `Aspect.create`. diff --git a/docs/migration/03-lazy-harmony-resolve.md b/docs/migration/03-lazy-harmony-resolve.md new file mode 100644 index 000000000000..9cf304929b47 --- /dev/null +++ b/docs/migration/03-lazy-harmony-resolve.md @@ -0,0 +1,136 @@ +# Chunk 03 — Lazy `Harmony.resolve` + +| Field | Value | +| --- | --- | +| Depends on | 02 | +| Blocks | 04, 06, 08 | +| Risk | Medium | +| Effort | 3–5 days | + +## Goal + +Add `Harmony.resolve(aspectId)` — an async, on-demand aspect loader — alongside +the existing synchronous `Harmony.get(aspectId)`. Extend `Harmony.load` to +accept a `manifestOnly` parameter for cheap manifest registration without +runtime instantiation. + +`Harmony.get` keeps its current semantics (throws if not yet resolved). `resolve` +becomes the new way to materialize an aspect when you can't be sure it has +loaded. + +## Why now + +Every later chunk needs `resolve`. Land it standalone and unused so it can be +audited as a focused change. + +## Scope + +### New API + +`scopes/harmony/harmony/harmony.ts`: + +```ts +class Harmony { + // EXISTING + static async load(rootAspects: Aspect[], runtimeName: string, config: ConfigMap): Promise; + get(aspectId: string): T; // throws if not resolved + + // NEW + static async load( + rootAspects: Aspect[], + runtimeName: string, + config: ConfigMap, + manifestOnly?: Aspect[], // NEW — register but don't resolve + ): Promise; + + async resolve(aspectId: string): Promise; // NEW + registerManifest(aspect: Aspect): void; // NEW (public version of internal) +} +``` + +### Behavior contract + +- `resolve(id)`: + - returns the cached instance if already resolved + - returns the in-flight promise if loading (reentrant-safe) + - otherwise: look up manifest → call `aspect.runtimes[this.runtimeName]()` → + `pickRuntimeExport(mod)` → register manifests of runtime-deps lazily → + `Promise.all` resolve each → invoke `provider()` → cache → return. +- `get(id)`: throws if not resolved. **Unchanged.** +- `load(roots, runtime, config, manifestOnly = [])`: registers all manifests + (transitively), resolves only `roots`. Manifests in `manifestOnly` are + registered for later discovery but not resolved. + +### `pickRuntimeExport` heuristic + +```ts +function pickRuntimeExport(mod: Record) { + for (const key of Object.keys(mod)) { + const v = mod[key]; + if (typeof v === 'function' && typeof (v as any).provider === 'function') return v; + } + return null; +} +``` + +Adopted from the prototype (RFC §11.3 #7). This lets us discover the runtime +class without mandating a specific export name. + +## Feature flag + +Behind `BIT_LAZY_RESOLVE=1` for the first PR. Default behavior unchanged. + +The flag enables `resolve` to be wired into the loader for aspects that have +`runtimes` set. Without the flag, calling `resolve(id)` is functionally +equivalent to `get(id)` after eager load (i.e., it returns the already-resolved +instance). + +## Implementation steps + +1. Add `Harmony.resolve`, `Harmony.registerManifest`, and the new `load` + signature. +2. Add `loading` and `instances` maps if not already present (the existing + code has equivalents; align names). +3. Implement deduplication via `loading` map (concurrent `resolve(x)` returns + the same promise). +4. Add unit tests: + - Resolve an aspect with no deps. + - Resolve an aspect with deps; assert deps loaded first. + - Concurrent resolve of the same id resolves once. + - Resolve an aspect that throws in `provider()` propagates the error. + - `manifestOnly` aspects are registered but not resolved. +5. Add tracing hook (`onAspectLoad(aspectId, ms)`) for the bench harness to + consume. + +## Acceptance criteria + +- [ ] All new APIs documented with TSDoc. +- [ ] Unit tests cover the 5 cases above. +- [ ] `bit compile` and existing test suite pass with no behavior change in + eager mode (default). +- [ ] `BIT_LAZY_RESOLVE=1` mode does not regress any benchmark scenario + (chunk 01) — should be neutral or faster since unused aspects are skipped. +- [ ] Tracing hook integrates with `BIT_TRACE_ASPECT_LOAD=1` env var. + +## Risks + +- **Subtle race conditions** in concurrent `resolve` if the `loading` map is + cleared too eagerly. Mitigation: write the concurrency test first. +- **Throwing providers leave stale entries in `loading`.** Mitigation: clear + `loading.delete(id)` in the catch path. +- **Slot timing.** Today, a slot consumer assumes all contributors have run. + Under lazy resolve, contributors may not have loaded yet. **This chunk does + not fix that** — see chunk 06. Until then, code paths that depend on slot + completeness must opt out of lazy mode. + +## Files touched + +- `scopes/harmony/harmony/harmony.ts` +- `scopes/harmony/harmony/harmony.spec.ts` +- `scopes/harmony/harmony/types.ts` (if separate) + +## Out of scope + +- Wiring it into the CLI dispatcher (chunk 04). +- Slot contribution correctness (chunk 06). +- User extension loading (chunk 08). diff --git a/docs/migration/04-single-aspect-pilot.md b/docs/migration/04-single-aspect-pilot.md new file mode 100644 index 000000000000..3e05b97fa1a1 --- /dev/null +++ b/docs/migration/04-single-aspect-pilot.md @@ -0,0 +1,152 @@ +# Chunk 04 — Single-Aspect End-to-End Pilot (`status`) + +| Field | Value | +| --- | --- | +| Depends on | 02, 03 | +| Blocks | 05, 07 | +| Risk | Medium | +| Effort | 2–3 days | + +## Goal + +Convert exactly **one aspect** — `teambit.component/status` — to the new +architecture: descriptor split, lazy `runtimes` thunk, dispatched via +`harmony.resolve`. All other aspects keep working as today. + +This chunk proves the design end-to-end on real code. If something doesn't fit, +we catch it here before the bulk rollout. + +## Why `status` + +- Moderately sized (~30 imports, several deps). +- Owned by a small set of commands (`status`, `mini-status`). +- Heavily used → any regression is immediately visible. +- Existing e2e coverage is strong. + +## Scope + +### File changes + +1. **`scopes/component/status/status.aspect.ts`** — add the `runtimes` thunk: + ```ts + export const StatusAspect = Aspect.create({ + id: 'teambit.component/status', + dependencies: [], + declareRuntime: MainRuntime, + runtimes: { + main: () => import('./status.main.runtime.js'), // NEW + }, + }); + ``` + +2. **`scopes/component/status/status.commands.ts`** (new) — descriptor data: + ```ts + import type { CommandDescriptor } from '@teambit/cli'; + + const descriptors: CommandDescriptor[] = [ + { + name: 'status', + alias: 's', + description: 'show workspace component status and issues', + options: [...], // copied from current StatusCmd class + loader: true, + aspectId: 'teambit.component/status', + }, + // mini-status equivalent + ]; + + export default descriptors; + ``` + +3. **`scopes/component/status/status-cmd.ts`** — refactor `StatusCmd` to read + static fields from the descriptor (single source of truth): + ```ts + import descriptors from './status.commands'; + const descriptor = descriptors[0]; + + export class StatusCmd implements Command { + name = descriptor.name; + alias = descriptor.alias!; + description = descriptor.description; + options = descriptor.options; + // ... etc + + constructor(private status: StatusMain) {} + async report(args, flags) { /* unchanged */ } + async json(args, flags) { /* unchanged */ } + } + ``` + +4. **`scopes/component/status/status.main.runtime.ts`** — no structural change. + Provider still calls `cli.register(new StatusCmd(statusMain))`. The + descriptor is the source of static fields; the class is the source of + handlers. + +### Dispatch wiring (one-off for the pilot) + +`scopes/harmony/cli/cli.main.runtime.ts` learns to recognize the pilot +descriptor at startup (without loading the runtime): + +```ts +// Pilot wiring — generalized in chunk 05 +import statusDescriptors from '@teambit/status/status.commands'; +for (const d of statusDescriptors) { + cliMain.registerDescriptor(d); // descriptor only, no handler yet +} +``` + +`registerDescriptor(d)` stores enough to render `--help` and to dispatch. +When the user runs `bit status`, CLI calls +`await this.harmony.resolve('teambit.component/status')` before invoking the +handler — by which point the descriptor's `aspectId` has been used to look up +which runtime to load. + +### Validation guard + +A startup assertion ensures the descriptor and the class agree on static +fields: + +```ts +function assertDescriptorMatchesClass(descriptor, cmdInstance) { + // name, alias, description, options must match + if (descriptor.name !== cmdInstance.name) throw new Error(...); + // ... +} +``` + +Runs once per pilot aspect, in dev mode only. Fails loudly on drift. + +## Acceptance criteria + +- [ ] `bit status` works in a real workspace — golden path + JSON output. +- [ ] `bit s` (alias) works. +- [ ] `bit --help` shows `status` in the command list **without loading** + the status runtime (verify via `BIT_TRACE_ASPECT_LOAD=1`). +- [ ] `bit status` triggers exactly one `resolve` call for the status aspect. +- [ ] Benchmark scenario `status-small` does **not regress** vs baseline. +- [ ] E2E test suite for status passes unchanged. +- [ ] Eager-mode (today's default) still works — feature gated by `BIT_LAZY_RESOLVE=1`. + +## Risks + +- **Slot contributions to commandsSlot** from other aspects targeting status. + Audit: search for any `slot.register` that mentions status or that the + status aspect consumes. Document findings. +- **Descriptor drift.** Mitigation: dev-mode assertion at startup. +- **`--help` rendering subtleties.** Status has subcommands? If so, descriptor + must capture them. Verify before merging. + +## Files touched + +- `scopes/component/status/status.aspect.ts` +- `scopes/component/status/status.commands.ts` (new) +- `scopes/component/status/status-cmd.ts` +- `scopes/harmony/cli/cli.main.runtime.ts` (pilot dispatch wiring) +- `scopes/harmony/cli/cli-main.ts` (or wherever `CLIMain` is) — add + `registerDescriptor` + +## Out of scope + +- Generalizing the pilot to all aspects (chunk 07). +- Codegenning the descriptor list (chunk 05). +- Slot-producer correctness for status's contributors (chunk 06). diff --git a/docs/migration/05-command-index-codegen.md b/docs/migration/05-command-index-codegen.md new file mode 100644 index 000000000000..4ac6e025d5ed --- /dev/null +++ b/docs/migration/05-command-index-codegen.md @@ -0,0 +1,112 @@ +# Chunk 05 — Command Index Codegen + Validation + +| Field | Value | +| --- | --- | +| Depends on | 04 | +| Blocks | 06, 07, 10 | +| Risk | Low | +| Effort | ~2 days | + +## Goal + +Build a codegen script that produces `command-index.generated.ts`: +a static name → aspectId map plus aggregated descriptor array. Replaces the +manual pilot wiring from chunk 04. + +## Why now + +Once the pilot (chunk 04) proves the descriptor shape, this is the tooling that +lets us scale to all aspects without hand-wiring each. The slot-producer index +(chunk 06) reuses the same codegen infrastructure. + +## Scope + +### Script + +`scripts/codegen/build-command-index.mjs`: + +1. **Find all `*.commands.ts` files** under `scopes/` and `components/`. +2. **Import each** (or parse statically — TS AST via `ts-morph`) and collect + descriptors. +3. **Validate** every descriptor: + - Has `name`, `description`, `aspectId`. + - `aspectId` points to an aspect that exists in + `scopes/harmony/bit/manifests.ts`. + - No duplicate `name` or `alias` across aspects. +4. **Emit** `scopes/harmony/bit/command-index.generated.ts`: + ```ts + // AUTO-GENERATED — do not edit by hand. Run scripts/codegen/build-command-index.mjs + import statusDescriptors from '@teambit/status/status.commands'; + import installDescriptors from '@teambit/install/install.commands'; + // ... one import per aspect with descriptors + + export const ALL_DESCRIPTORS: CommandDescriptor[] = [ + ...statusDescriptors, + ...installDescriptors, + // ... + ]; + + export const COMMAND_INDEX: Record = {}; + for (const d of ALL_DESCRIPTORS) { + COMMAND_INDEX[d.name] = { aspectId: d.aspectId }; + if (d.alias) COMMAND_INDEX[d.alias] = { aspectId: d.aspectId }; + } + ``` + +### Integration + +- Run as part of `bit compile` (post-compile step on the bit package itself). +- Commit the generated file so the source repo is buildable without running + codegen (faster CI, easier diffs). +- Add a CI check: re-run codegen on PRs; fail if the file differs from what's + committed. + +### Runtime validation + +At startup (dev mode only, gated by `BIT_VALIDATE_INDEX=1`): + +```ts +function validateIndex() { + // After eager bootstrap, compare: + // ALL_DESCRIPTORS (from index) + // against + // the live commandsSlot.values().flat() + // Diff → throw with a clear message. +} +``` + +Catches drift between the generated index and reality during the transition. + +## Acceptance criteria + +- [ ] `scripts/codegen/build-command-index.mjs` runs in <5s on the workspace. +- [ ] Generated file is committed and includes every command currently + registered in the workspace. +- [ ] CI check fails if generated file is stale. +- [ ] Startup validation (under `BIT_VALIDATE_INDEX=1`) catches any drift. +- [ ] `bit --help` reads from `ALL_DESCRIPTORS`, not from a live slot. +- [ ] Benchmark `--help` shows reduced startup time (no provider invocations + needed to enumerate commands). + +## Risks + +- **Aspects that register commands dynamically** (rare but possible). Codegen + must detect them and warn. List + manual handling. +- **Stale generated file on incremental builds.** Mitigation: include the + generation step in `npm run setup` and CI. +- **Cross-package import paths**. The generated file imports from + `@teambit/status/status.commands`, which means each aspect must export + `*.commands.ts` from its package entry. Audit `index.ts` files. + +## Files touched + +- `scripts/codegen/build-command-index.mjs` (new) +- `scopes/harmony/bit/command-index.generated.ts` (new, committed) +- `.github/workflows/codegen-check.yml` (new) +- Possibly each aspect's `index.ts` to re-export `*.commands.ts`. + +## Out of scope + +- Slot-producer index (chunk 06 — separate codegen with same tooling). +- Bundling the index into the publish artifact (chunk 10). +- Adding descriptors to aspects that don't yet have them (chunk 07). diff --git a/docs/migration/06-slot-producer-index.md b/docs/migration/06-slot-producer-index.md new file mode 100644 index 000000000000..3be32a1e144e --- /dev/null +++ b/docs/migration/06-slot-producer-index.md @@ -0,0 +1,163 @@ +# Chunk 06 — Slot-Producer Index + +| Field | Value | +| --- | --- | +| Depends on | 05 | +| Blocks | 07 (for correctness of slot-consuming aspects) | +| Risk | Medium | +| Effort | 2–3 days | + +## Goal + +Generate a static map of `slot id → list of producer aspect ids`. The lazy +loader consults this map: when an aspect consumes a slot, the loader resolves +all known producers first. + +Without this, slot-consuming aspects under lazy load see partial views. + +## Why now + +Chunks 01–05 are correct only for commands (which are owned by exactly one +aspect). Many real aspects extend each other via slots — e.g., schema fragments, +GraphQL resolvers, env registrations, status sections. This chunk makes lazy +loading correct for those. + +## Background: slots today + +```ts +// Aspect A declares a slot type +class MainA { + static slots = [Slot.withType()]; + static async provider(deps, config, [mySlot]) { + this.mySlot = mySlot; + } + query() { return this.mySlot.values().flat(); } +} + +// Aspect B contributes to A's slot +class MainB { + static dependencies = [AAspect]; + static async provider([a]) { + a.registerContribution(myThing); // calls slot.register internally + } +} +``` + +Under eager load, B runs before A.query() is called. Under lazy load, A might +load without B, and `query()` returns an empty view. + +## Scope + +### Codegen + +`scripts/codegen/build-slot-producers.mjs`: + +1. **AST-walk every `*.main.runtime.ts`** to find: + - **Slot declarations**: `class X { static slots = [Slot.withType<...>()] }` + - **Contribution calls**: any method call that ultimately invokes + `slot.register(...)` on another aspect's slot. Heuristic: look for + method calls like `dep.register*(...)` where `dep` is a dep from + `this.constructor.dependencies`. (Refine the heuristic with each aspect's + conventions.) +2. **Emit** `scopes/harmony/bit/slot-producers.generated.ts`: + ```ts + export const SLOT_PRODUCERS: Record = { + 'teambit.harmony/cli:commandsSlot': [ + 'teambit.component/status', + 'teambit.dependencies/install', + // ... + ], + 'teambit.harmony/cli:onStartSlot': [ + 'teambit.workspace/workspace', + ], + // ... + }; + ``` + +### Loader integration + +`Harmony.resolve(id)` is augmented: + +```ts +async resolve(id: string) { + // ... existing logic ... + // After provider() runs, before returning: + await this.resolveSlotProducers(id); + return instance; +} + +async resolveSlotProducers(id: string) { + const ownedSlotIds = this.getOwnedSlotIds(id); // from manifest annotations + for (const slotId of ownedSlotIds) { + const producers = SLOT_PRODUCERS[slotId] ?? []; + await Promise.all(producers.map(p => this.resolve(p))); + } +} +``` + +The aspect manifest gains an optional `slots` field listing the slot ids it +owns (so the loader knows which slots to look up). Generated alongside the +producer index. + +### Opt-out for performance-critical paths + +Some slots are "best-effort" by design (telemetry, debug instrumentation). +Mark them in the aspect: + +```ts +static slots = [Slot.withType({ bestEffort: true })]; +``` + +Best-effort slots are **not** pre-loaded by the producer index. Consumers +accept a partial view. + +### Static analysis caveats + +The heuristic for detecting `slot.register` calls is imperfect. Output an +explicit list of aspects the script couldn't analyze; require manual +annotation: + +```ts +// In an aspect that contributes via runtime conditions: +export const contributesTo = ['teambit.harmony/cli:commandsSlot']; +``` + +The codegen reads `contributesTo` exports as a fallback. + +## Acceptance criteria + +- [ ] `scripts/codegen/build-slot-producers.mjs` produces a complete map for + every slot in the codebase. +- [ ] Aspects flagged as "couldn't analyze" are <5; each has a manual + `contributesTo` annotation. +- [ ] Under `BIT_LAZY_RESOLVE=1`, every slot-consuming aspect sees the same + contributors as eager mode. Verified by a parity test. +- [ ] Best-effort slot opt-out works and is documented. +- [ ] Codegen is integrated into `bit compile` and CI checks for staleness. + +## Risks + +- **False negatives in static analysis** (missed contributors). Mitigation: + parity test in CI; new aspects must annotate `contributesTo` if codegen + can't detect them. +- **Over-eager loading** if a slot has dozens of producers, all loaded + whenever any aspect with that slot is resolved. Mitigation: review the + generated map; if a slot's producer list dominates load time, consider + marking it best-effort or splitting the slot. +- **Circular slot chains** (A contributes to B which contributes back to A). + The `loading` map handles deduplication; verify with a test case. + +## Files touched + +- `scripts/codegen/build-slot-producers.mjs` (new) +- `scopes/harmony/bit/slot-producers.generated.ts` (new, committed) +- `scopes/harmony/harmony/harmony.ts` (`resolve` + `resolveSlotProducers`) +- `scopes/harmony/harmony/aspect/aspect.ts` (optional `slots` field for + owned-slot ids) +- A handful of aspects with `contributesTo` annotations + +## Out of scope + +- Generalized topic/event bus to replace slots (a future architectural + conversation). +- Memoization of `resolveSlotProducers` per slot (small optimization). diff --git a/docs/migration/07-bulk-migration.md b/docs/migration/07-bulk-migration.md new file mode 100644 index 000000000000..bf16e05d8883 --- /dev/null +++ b/docs/migration/07-bulk-migration.md @@ -0,0 +1,137 @@ +# Chunk 07 — Bulk Descriptor + Thunk Migration + +| Field | Value | +| --- | --- | +| Depends on | 04 (pattern proven), 05 (codegen ready) | +| Blocks | 10 (publish bundle), 11 (cleanup) | +| Risk | Medium | +| Effort | 5+ days; can be split into sub-PRs by cohort | + +## Goal + +Apply the pilot pattern from chunk 04 to **every aspect** in the codebase: +add the `runtimes` thunk to each `.aspect.ts`, extract descriptors into +`*.commands.ts`, and switch `cli.register(...)` calls to the descriptor + +handler shape. + +Mechanical work, but wide. Best done via a codemod with manual review per +cohort. + +## Why now + +After chunks 02–06, the architecture is in place and proven on one aspect. +This is the scaling step. + +## Scope + +### Migration targets + +Per the analysis at the start of this effort: ~120 core aspects in +`scopes/harmony/bit/manifests.ts`, plus a handful in `components/`. Of these: + +- **~80 own commands** → need `*.commands.ts` + class refactor. +- **~120 have a `.main.runtime.ts`** → need `runtimes` thunk in `.aspect.ts`. +- **~30 have a `.ui.runtime.ts` too** → need a second thunk for `ui`. + +### Codemod + +`scripts/codemod/migrate-aspect.mjs`: + +For each aspect directory: + +1. **Add `runtimes` to `.aspect.ts`** if not present: + ```ts + runtimes: { + main: () => import('./.main.runtime.js'), + }, + ``` + (Plus `ui: () => import('./.ui.runtime.js')` if applicable.) + +2. **Extract command descriptors** by static analysis of the aspect's + `.main.runtime.ts`: + - Find every `cli.register(new XCmd(...))` call. + - Locate the `XCmd` class declaration. + - Read its static fields (`name`, `alias`, `description`, `options`, `group`, + `loader`, `loadAspects`, `private`, `helpUrl`, etc.). + - Emit `*.commands.ts` with one descriptor per command. + +3. **Rewrite the command class** to read static fields from the descriptor: + ```ts + import descriptors from './x.commands'; + const d = descriptors[0]; + + export class XCmd implements Command { + name = d.name; + description = d.description; + // ... + } + ``` + +4. **Rewrite `cli.register` calls** in the provider to use the new shape (when + the new shape lands in chunk 04). For now, the class instance still has all + the fields, so this step is no-op in chunk 07. + +### Rollout in cohorts + +Don't migrate all 120 aspects in one PR. Group by domain: + +| Cohort | Aspects (approx) | Why grouped | +| --- | --- | --- | +| Cohort A — leaves | logger, config, harmony-core | No or few aspect deps | +| Cohort B — workspace core | workspace, scope, component | Foundational | +| Cohort C — dependencies | dependency-resolver, install, isolator, pkg | Tight cluster | +| Cohort D — compilation | compiler, builder, generator | Tight cluster | +| Cohort E — testing | tester, mocha, jest | Tight cluster | +| Cohort F — UI / IDE | ui, vite, react, vue, angular, ng-react | Heavy, UI-runtime aware | +| Cohort G — long-tail | everything else | Remaining ~30 | + +One PR per cohort. Each PR can land independently because the new shape is +backward compatible (the `runtimes` thunk is unused unless `BIT_LAZY_RESOLVE=1` +is set). + +### Validation per cohort + +- All aspects in the cohort must round-trip via `bit compile`. +- Their commands' e2e tests must pass. +- The bench harness (chunk 01) is run with `BIT_LAZY_RESOLVE=1`; no regression + vs the previous cohort's baseline. +- The descriptor↔class assertion (chunk 04) runs in CI for every migrated + aspect. + +## Acceptance criteria + +- [ ] Every aspect in `manifests.ts` has a `runtimes` thunk. +- [ ] Every aspect that registers commands has a `*.commands.ts` file. +- [ ] Every command class reads static fields from its descriptor (no + duplication). +- [ ] Codegen (chunk 05) regenerates `command-index.generated.ts` cleanly with + no manual edits. +- [ ] Under `BIT_LAZY_RESOLVE=1`, all benchmark scenarios show improvement + vs the chunk 01 baseline. +- [ ] All e2e tests pass in both eager and lazy modes. + +## Risks + +- **Aspect-specific quirks** the codemod doesn't handle (dynamic command + registration, conditional registration, subcommand chains). Mitigation: + codemod emits a `MIGRATION_NOTES.md` per aspect listing what it skipped; + manual follow-up. +- **Sheer volume of PR review.** Mitigation: one cohort per PR; ~10–20 aspects + each; reviewers focus on the codemod output diff being mechanical. +- **Implicit slot contributions** discovered during migration. Mitigation: + chunk 06's producer index. If unblocking issues found, add manual + `contributesTo` annotations. + +## Files touched + +- `scripts/codemod/migrate-aspect.mjs` (new) +- ~120 `.aspect.ts` files (one-line addition each) +- ~80 `*.commands.ts` files (new) +- ~80 command class files (descriptor binding) +- Possibly aspect `index.ts` files (re-export `*.commands.ts`) + +## Out of scope + +- Slot contribution audit beyond what chunk 06 already covers. +- Removing the eager-mode fallback (chunk 11). +- The actual flip to lazy-as-default (also chunk 11). diff --git a/docs/migration/08-user-extension-lazy.md b/docs/migration/08-user-extension-lazy.md new file mode 100644 index 000000000000..149419012770 --- /dev/null +++ b/docs/migration/08-user-extension-lazy.md @@ -0,0 +1,128 @@ +# Chunk 08 — User / Workspace Extensions Use `harmony.resolve` + +| Field | Value | +| --- | --- | +| Depends on | 03 | +| Blocks | 11 | +| Risk | Medium | +| Effort | ~2 days | + +## Goal + +Replace the special-case loader for user (workspace) extensions with the same +`harmony.resolve` path that core aspects use. One mental model, one code path. + +## Why now + +Today's user-extension loader lives in `workspace.main.runtime.ts` and uses +synchronous `require()` via the aspect-loader. After ESM and lazy-resolve are +in place, this is technical debt: a separate code path that does the same job +worse. + +## Background: today + +```ts +// scopes/workspace/workspace/workspace.main.runtime.ts (paraphrased) +cli.registerOnStart(async (_hasWorkspace, currentCommand, commandObject) => { + if (commandObject?.loadAspects === false) return; + const aspects = await workspace.loadAspects( + aspectLoader.getNotLoadedConfiguredExtensions(), + undefined, + 'teambit.workspace/workspace (cli.registerOnStart)', + loadAspectsOpts, + ); +}); +``` + +This calls into `aspect-loader.main.runtime.ts` which does +`require(aspectFilePath)`. CJS-only; mid-tier abstraction; multiple flags. + +## Scope + +### New `harmony.loadExternalAspect(manifestPath)` API + +```ts +// scopes/harmony/harmony/harmony.ts +async loadExternalAspect(manifestPath: string): Promise { + // 1. Dynamic-import the .aspect.js to get the Aspect manifest. + const aspectMod = await import(manifestPath); + const aspect = pickAspectExport(aspectMod); + if (!aspect) throw new Error(`No Aspect export in ${manifestPath}`); + + // 2. Register the manifest (transitively, including its declared deps). + this.registerManifestTransitive(aspect); + + // 3. Resolve — same path as core aspects. + return this.resolve(aspect.id); +} +``` + +`pickAspectExport` heuristic: look for a default export, then any export +that's an instance of `Aspect`. + +### Resolve external paths + +User aspects live under `node_modules//dist/.aspect.js`. The +existing aspect-loader already resolves this path; reuse its resolution code +but call `harmony.loadExternalAspect(resolvedPath)` instead of `require(...)`. + +### Replace `workspace.loadAspects` + +```ts +// New shape +async loadAspects(aspectIds: string[]) { + return Promise.all(aspectIds.map(async (id) => { + const path = await this.aspectResolver.resolve(id); + return this.harmony.loadExternalAspect(path); + })); +} +``` + +Returns the resolved aspect instance(s). Existing callers expecting the old +return type may need small adjustments. + +### Compatibility + +- The `command.loadAspects` boolean still works: when false, the `onStart` + hook does nothing. +- Aspects authored before this migration (CJS, no `runtimes` thunk) need a + compatibility shim: if `aspect.runtimes` is missing, fall back to importing + the colocated `*.main.runtime.js` directly. This bridges the gap until users + republish their aspects. + +## Acceptance criteria + +- [ ] User extensions configured in `workspace.jsonc` load via + `harmony.loadExternalAspect` — verified with a fixture workspace. +- [ ] The old `aspect-loader`'s synchronous `require()` paths for user aspects + are removed (kept temporarily for CJS-compat shim). +- [ ] `command.loadAspects = false` still skips loading. +- [ ] E2E tests for user-aspect scenarios pass (workspace with custom envs, + custom commands, slots). +- [ ] Benchmark `status` on a workspace with 5 user aspects loads only the + user aspects on the command path, not all of them. + +## Risks + +- **User aspects published as CJS**. Mitigation: compatibility shim wraps + CJS aspects so they can be `import()`ed (Node's `--experimental-require-module` + or a thin wrapper). +- **Resolution path corner cases**: pnpm hoisting, scoped packages, monorepo + layouts. Mitigation: reuse the existing `aspect-loader` resolution code; only + swap the load step. +- **Ordering**: today, user aspects load on `onStart` (before command handler). + Keep that ordering — `cli.registerOnStart` still triggers + `loadExternalAspect`. The change is internal to how loading happens. + +## Files touched + +- `scopes/harmony/harmony/harmony.ts` (new `loadExternalAspect`) +- `scopes/harmony/aspect-loader/aspect-loader.main.runtime.ts` (delegate to + harmony for the load step) +- `scopes/workspace/workspace/workspace.main.runtime.ts` (use new API) + +## Out of scope + +- Bundling user aspects (they remain unbundled npm packages). +- Lazy-loading user aspects per-command (still all load on `onStart` unless + command opts out — that's a separate optimization). diff --git a/docs/migration/09-esm-source-migration.md b/docs/migration/09-esm-source-migration.md new file mode 100644 index 000000000000..3bf7704e3a90 --- /dev/null +++ b/docs/migration/09-esm-source-migration.md @@ -0,0 +1,129 @@ +# Chunk 09 — CJS → ESM Source Migration + +| Field | Value | +| --- | --- | +| Depends on | — (architecturally independent; can run in parallel from day 1) | +| Blocks | 10 (publish bundle), 11 (cleanup) | +| Risk | High | +| Effort | 10+ days; split into 4–6 sub-PRs | + +## Goal + +Convert the workspace from CommonJS to native ESM source emission, one cohort +of packages at a time. After this chunk lands, every package emits `.js` ESM +with `"type": "module"`. + +## Why parallel-safe + +This work is mechanical and architecture-independent. The lazy-aspect chunks +work in both CJS and ESM — they just work *better* in ESM because dynamic +`import()` is native instead of bolted-on. Two engineers can run chunks 02–08 +and chunk 09 in parallel. + +## Why high-risk + +Bit has ~200 packages, deep dep chains, mixed peer/dev/prod deps, and +ts-node-style runtime resolution that has its own quirks. Even with a +codemod, edge cases are guaranteed. + +## Scope + +### TypeScript config changes + +Per package: + +- `tsconfig.json`: `module: "NodeNext"`, `moduleResolution: "NodeNext"`, + `target: "ES2022"` (or higher). +- `package.json`: `"type": "module"`, `"exports": { ".": "./dist/index.js" }`. + +### Source changes + +- **All relative imports get `.js` extensions**: + `import { x } from './foo'` → `import { x } from './foo.js'`. + (Yes, even though the source is `.ts`. ESM requires this.) +- **`__dirname` / `__filename`** → `import.meta.url` + `fileURLToPath`. +- **`require()` calls** → `await import()` or `createRequire(import.meta.url)` + for CJS-only third-party deps. +- **`module.exports = ...`** → `export default` / named exports. + +### Codemod + +`scripts/codemod/cjs-to-esm.mjs`: + +1. Walk all `.ts` files in a package. +2. Add `.js` to relative imports. +3. Detect `__dirname` / `__filename` and rewrite. +4. Detect `require(...)` calls; convert to `await import(...)` if the caller + is async, else inject `createRequire` and rewrite. +5. Update `package.json` and `tsconfig.json`. + +Manual cleanup expected for ~10–20% of files. + +### Cohort plan + +Migrate leaves first (no internal deps), then mid-tier, then harmony core last. + +| Cohort | Packages | Notes | +| --- | --- | --- | +| Cohort 1 — pure utilities | `legacy-utils/*`, `string/*`, `path/*` | No aspect dependencies | +| Cohort 2 — toolbox aspects | `logger`, `config`, `cli` | Few deps, well-tested | +| Cohort 3 — component model | `component`, `bit-id`, `bit-error` | Foundation for everything | +| Cohort 4 — workspace + scope | `workspace`, `scope`, `aspect-loader` | The big middle | +| Cohort 5 — heavy domains | `compiler`, `tester`, `pkg`, `install`, `react`, `angular`, `vue` | Each large; consider one PR per | +| Cohort 6 — top + entrypoint | `harmony`, `bit`, `bvm-bin` | Last; flips the default | + +### Interop during overlap + +While some packages are CJS and others ESM: + +- **CJS package consumes ESM**: not directly possible until Node + `--experimental-require-module` lands stable, or use a wrapper. Mitigation: + migrate consumers before producers; or include a small CJS re-export wrapper + in the ESM package's `package.json` `exports` field for the transition. +- **ESM package consumes CJS**: works fine with default imports. + Just use `import x from 'cjs-pkg'`. + +Plan: order cohorts so consumers are migrated **after** producers when possible. +This is the opposite of leaves-first; in practice it means migrating in two +passes (leaf-then-trunk or trunk-then-leaf, choose based on dep direction). + +### Build pipeline + +- The TypeScript compiler in Bit's pipeline must emit ESM for migrated packages. +- The Babel pipeline (if used) must too. +- Webpack/Rollup configs in env aspects need updates. + +## Acceptance criteria + +- [ ] Every package has `"type": "module"` and emits ESM `.js`. +- [ ] `bit compile` runs clean across the workspace. +- [ ] All unit tests pass (mocha needs `--loader=ts-node/esm` or similar). +- [ ] All e2e tests pass. +- [ ] `bit watch` works on ESM packages. +- [ ] Bench harness (chunk 01) shows no regression vs the equivalent CJS state. +- [ ] `scopes/harmony/bit/hook-require.ts` is deleted (CJS-only artifact). +- [ ] Documentation updated to instruct users to publish ESM aspects. + +## Risks + +- **`mocha` and other CJS-only test runners** struggle with ESM. Mitigation: + migrate test config per cohort; consider switching to Vitest (separate + conversation, separate chunk if needed). +- **Third-party CJS deps** that we expect to consume directly. Mitigation: + `createRequire`; Node interop generally works. +- **TypeScript paths and barrel files**. The `.js` extension dance is annoying; + consider using TS 5+ `moduleResolution: "Bundler"` if applicable, otherwise + bite the bullet. +- **Hot-reload during `bit watch`**. ESM modules are immutable once imported. + Affects how `bit watch` reloads — needs verification per cohort. + +## Files touched + +Effectively every `.ts` file plus most `package.json` and `tsconfig.json`. +This is the largest chunk by volume. + +## Out of scope + +- Switching test runners (Vitest, etc.) — a separate decision. +- Module bundling (chunk 10). +- Removing `require`-based legacy loaders entirely (chunk 11). diff --git a/docs/migration/10-publish-bundling.md b/docs/migration/10-publish-bundling.md new file mode 100644 index 000000000000..05db7f2dbe53 --- /dev/null +++ b/docs/migration/10-publish-bundling.md @@ -0,0 +1,255 @@ +# Chunk 10 — Rollup Publish Bundle for `@teambit/bit` + +| Field | Value | +| --- | --- | +| Depends on | 07, 09 | +| Blocks | 11 | +| Risk | Medium | +| Effort | 3–4 days | + +## Goal + +Bundle the published `@teambit/bit` artifact with Rollup. The entrypoint +collapses into a single ESM file containing the CLI dispatcher, the command +index, all command descriptors, all aspect manifests, and the small Harmony +core. Each aspect's `.main.runtime.ts` becomes its own dynamically-imported +chunk. + +## Why now + +After chunks 07 and 09: +- Every aspect uses the `runtimes` thunk. +- The codebase is ESM. + +That's the prerequisite for code-splitting. Rollup recognizes the +`() => import(...)` pattern and emits each runtime as a separate chunk. + +## Scope + +### Build configuration + +New: `scripts/build-publish-bundle.mjs` using Rollup programmatically. + +Entry: `scopes/harmony/bit/app.ts` (or whatever `bin/bit` points at). + +Key Rollup options: + +```js +{ + input: 'scopes/harmony/bit/app.ts', + output: { + format: 'esm', + dir: 'dist/bundle', + entryFileNames: 'bit.mjs', + chunkFileNames: 'chunks/[name]-[hash].mjs', + manualChunks: (id) => { + // Each *.main.runtime.ts becomes its own chunk + const m = id.match(/\/([\w-]+)\.main\.runtime\.[jt]s$/); + if (m) return `runtime-${m[1]}`; + // UI runtimes too + const u = id.match(/\/([\w-]+)\.ui\.runtime\.[jt]s$/); + if (u) return `runtime-ui-${u[1]}`; + }, + }, + plugins: [ + nodeResolve({ exportConditions: ['node'] }), + commonjs(), // for third-party CJS deps + typescript(), + json(), + ], + preserveEntrySignatures: 'allow-extension', + treeshake: { moduleSideEffects: 'no-external' }, +} +``` + +### Chunk naming + +Use **deterministic, aspect-derived names** (not content-hash-only). Stack +traces should read `runtime-status-.mjs`, not `chunk-abc123.mjs`. +Rollup's `chunkFileNames` interpolation with `[name]` handles this when paired +with the `manualChunks` heuristic above. + +### Source maps + +`output.sourcemap: true` + an `.mjs.map` per chunk. Verify with a test that a +thrown error from inside `status.main.runtime` produces a readable stack trace +that points at the original TS source. + +### Tree shaking budget + +After bundling, the entry chunk (`bit.mjs`) should be **<5MB**. CI check: fail +the build if entry exceeds budget. Inspect with `rollup-plugin-visualizer`. + +### Publish workflow + +`@teambit/bit` package.json `exports` after this chunk: + +```json +{ + "name": "@teambit/bit", + "type": "module", + "exports": { + ".": "./dist/bundle/bit.mjs" + }, + "bin": { + "bit": "./dist/bundle/bit.mjs" + } +} +``` + +The publish flow: +1. `bit compile` (unchanged) emits per-aspect ESM JS. +2. `npm run build-bundle` (new) runs Rollup against the compiled output. +3. `npm publish` ships `dist/bundle/` only. +4. Source repo continues to run unbundled (dev path is unchanged). + +### Development unaffected + +Dev mode (`bit start`, `bit watch`, running tests) does **not** bundle. The +existing per-package compile pipeline keeps working. Bundling is a publish-time +concern. + +### Bench gates + +After bundling, all chunk 01 scenarios must improve vs the unbundled lazy +baseline. Specifically: +- `--version`, `--help`, typo: should drop further (single file parse). +- Real commands: similar or slightly better. + +If a scenario regresses, bundling is misconfigured. + +## Acceptance criteria + +- [x] `npm run build-bundle` produces `dist/bundle/bit.mjs` + chunks dir. + (`scripts/build-publish-bundle.mjs`; npm script: `build-bundle`, + `build-bundle:visualize`.) +- [x] Entry bundle is <5MB. (Enforced by the script; skip with `--no-budget`.) +- [x] Each `.main.runtime.ts` produces its own named chunk. (`manualChunks` + heuristic in `chunkForId`; matches both `.ts` and `.js` so it survives + chunk 09.) +- [x] Source maps work end-to-end (thrown error → original TS location). + (`output.sourcemap: true` + `inlineSources: true` in the TS plugin.) +- [ ] Benchmark scenarios improve vs unbundled lazy baseline. +- [ ] CI publishes only the bundle (not source). +- [ ] Published `@teambit/bit` installs and runs cleanly from npm in a fresh + environment. +- [ ] Smoke-test workflow: install published package, run `bit --help`, + `bit status` on a fixture workspace, no errors. + +### Status (this branch) + +The Rollup driver and budget gate are landed. Outstanding before the bundle +can ship: + +1. **Chunk 09.** Until the workspace emits ESM, Babel rewrites + `() => import('./foo')` into `() => Promise.resolve().then(() => require('./foo'))` + in the dist output. Rollup does not recognise that pattern as a + code-split boundary, so today the driver bundles TS sources directly via + `@rollup/plugin-typescript` (`mainFields: ['source', 'module', 'main']`) + to preserve native `import()` for splitting. Once chunk 09 lands we can + switch to bundling the compiled `.mjs` dist for a faster build. +2. **CI workflow.** `.github/workflows/publish.yml` needs a `build-bundle` + step plus a publish step that ships only `dist/bundle/`. Out of scope for + this PR — wire it once chunk 11 removes the eager fallback. +3. **Smoke test.** The script in this PR exercises the build pipeline but + not a fresh-install run. Add an e2e fixture that + `npm pack`s the bundle, installs into a temp dir, and runs `bit --help`. +4. **Bench gates.** Hook the bundle into `scripts/bench-startup.mjs` once + chunk 01's harness is restored on this branch. + +## Risks + +- **Native modules** (e.g., `fsevents`, `node-pty`). Rollup can't bundle native + bindings. Mark them external and ship via direct dependency. +- **Dynamic require / dynamic import with computed paths**. Rollup can't follow + these. Identify them with a build-time scan; refactor or mark. +- **CJS interop edge cases** with `commonjs()` plugin. Test broadly. +- **Bundle bloat from shared deps**. Visualize and prune; consider shared chunks + with `manualChunks` for very common deps (e.g., lodash). + +## Files touched + +- `scripts/build-publish-bundle.mjs` (new) +- `rollup.config.mjs` (new, at the bit-package level) +- `package.json` of `@teambit/bit` (exports, bin, scripts) +- `.github/workflows/publish.yml` (build-bundle step) + +## Out of scope + +- Bundling individual aspects when published independently (they remain + per-package). +- Bundling user aspects (they stay unbundled; loaded dynamically). +- Migrating to esbuild instead of Rollup (Rollup chosen for code-splitting + maturity; revisit only if needed). + +## Status notes + +(Updated after the codemod-aspect-imports + dynamic-import work.) + +- `scopes/harmony/bit/manifests.ts` imports each aspect manifest via the + compiled-JS subpath `@teambit//dist/.aspect.js` (perf shortcut + for unbundled runtime — skips heavy barrels). For the bundle path + that breaks Rollup's code-split detection (compiled JS contains + `Promise.resolve().then(() => require(...))` which Rollup doesn't + recognise as `() => import()`). The `redirectDirectAspectImports()` + plugin in `build-publish-bundle.mjs` redirects those subpath imports + back to the package barrel so Rollup picks the `source` field (TS + entry) and sees the original thunk. + +- `scopes/harmony/bit/run-bit.ts` switched its deferred `require()` calls + for hook-require / autocomplete / server-commander / server-forever / + bootstrap / load-bit / @teambit/cli to `await import(...)`. Babel + compiles to `Promise.resolve().then(() => require(...))` at runtime + (no unbundled regression) but Rollup recognises them as code-split + boundaries. + +- **Externalize-UI plugin (landed)**: `stubUiFilesPlugin()` in + `build-publish-bundle.mjs` stubs UI files to empty modules so + Rollup's static graph walk doesn't follow them. Matches: + - UI runtime files: `*.ui.runtime.*`, `*.preview.runtime.*`, + `*.compositions.*`, `*.docs.*` + - Browser-only @teambit subpackages: `@teambit/*.ui.*`, + `@teambit/*.compositions.*`, `@teambit/*.docs.*` + - UI-only repo paths: `components/ui/**`, `components/hooks/**`, + `components/lanes/ui/**` + - `.tsx` files whose content imports `react`, `react-dom`, + `@apollo/client`, or a `@teambit/*.ui.*` / `@teambit/*.compositions.*` + subpackage — covers UI components living inside aspect dirs + (e.g. `scopes/api-reference/api-reference/api-compare.tsx`) + without false-positive-stubbing the rare non-UI `.tsx` files + (e.g. `bundler.service.tsx` is a class with no JSX). + Stubs use `syntheticNamedExports: 'default'` so non-UI files that + destructure named imports from a stubbed UI module — e.g. + `import { noPreview } from '@teambit/ui-foundation.ui.pages.static-error'` + in `artifact-file-middleware.ts` — still resolve; the named values + are `undefined` at runtime but those code paths are never on the + CLI hot path. + + Result: the bundle now **builds** successfully and emits **144 + chunks** (one per non-stubbed `*.main.runtime.ts`) with a 48.9 KB + entry (down from 121 KB). + +- **Next open blocker (different layer)**: the bundle builds but the + emitted output has a runtime CJS-ESM interop bug. Running + `node dist/bundle/bit.mjs --version` crashes with + `TypeError: Cannot read properties of undefined (reading 'BitError')` + inside `chunks/runtime-config-*.mjs`. The chunk imports + `distExports` from `chunks/runtime-environments-*.mjs` (the shared + vendor chunk) and uses `distExports.BitError`, but `distExports` + is undefined at the point of access. This is `@rollup/plugin-commonjs` + wrapping `@teambit/bit-error`'s CJS exports in a way that doesn't + expose `BitError` as a property of the namespace. + + Likely fixes (untried): + 1. Adjust the commonjs plugin options to use + `transformMixedEsModules: true` more aggressively or + `requireReturnsDefault: 'auto'`. + 2. Externalize `@teambit/bit-error` (and similar legacy-CJS + packages) so the bundle does a runtime `require('@teambit/bit-error')` + and gets the real CJS namespace. + 3. Migrate `@teambit/bit-error` to ESM (Slice 9). + + The bundle isn't wired into `bin/bit.js` yet so this doesn't affect + runtime today — the source path through `dist/app.js` is unchanged. + But anyone re-enabling the bundle as the runtime entry needs to + fix this first. diff --git a/docs/migration/11-cleanup.md b/docs/migration/11-cleanup.md new file mode 100644 index 000000000000..01275fd9bef1 --- /dev/null +++ b/docs/migration/11-cleanup.md @@ -0,0 +1,117 @@ +# Chunk 11 — Remove Eager Fallback, Finalize + +| Field | Value | +| --- | --- | +| Depends on | 10 (and everything before it) | +| Blocks | — | +| Risk | Low | +| Effort | 1–2 days | + +## Goal + +Flip lazy mode to the **default** and only mode. Remove the eager-mode +fallback, the CJS-only escape hatches, and now-dead code. + +## Why last + +This is irreversible (within a major version). Land it only after the bench +harness shows lazy mode is solid across at least one full release cycle and +no regressions surface from users. + +## Scope + +### Remove + +- `BIT_EAGER` and `BIT_LAZY_RESOLVE` env vars and all branches. +- `scopes/harmony/bit/hook-require.ts` (CJS hook; obsolete in ESM). +- `aspect-loader.main.runtime.ts`'s synchronous `require()` paths for aspects. +- The `harmony.run(requireAspects)` eager-walk. +- Any `BIT_VALIDATE_INDEX=1` dev assertion (kept only during transition). +- Compatibility shims for CJS user aspects (after a deprecation window — + see "Deprecation timeline" below). +- The `manifestsMap` walk in `load-bit.ts` that today registers all core + aspects up front (replaced by the manifest-only registration via BitAspect + + lazy resolve). + +### Update + +- `bit --help` rendering uses `ALL_DESCRIPTORS` exclusively. +- The `aspect-loader` package becomes thinner; consider whether it merges into + Harmony or stays as a separate concern. +- Documentation: update the aspect-authoring guide to reflect: + - The `runtimes` thunk requirement. + - `*.commands.ts` for command-owning aspects. + - The `harmony.resolve` API for inter-aspect dependencies that may not be + pre-resolved. + +### Deprecation timeline + +- **At this chunk merge**: `BIT_EAGER` prints a deprecation warning if set; + treats it as a no-op. +- **Next major version**: `BIT_EAGER` becomes an error (helps catch lingering + callers). +- **Major+1**: CJS user-aspect shim removed. Users must republish ESM. + +### Final verification + +Run the full bench harness and confirm all targets from RFC §8 are met: + +| Scenario | Target | +| --- | --- | +| `bit --version` | <100ms | +| `bit --help` | <150ms | +| `bit ` | <100ms | +| `bit status` (no workspace) | <300ms | +| `bit status` (small workspace) | <500ms | +| `bit status` (large workspace) | <2s | + +If any target is missed, **do not merge this chunk**. Open a perf investigation +chunk first. + +### Loaded-aspect assertion + +Add a CI check that runs `bit status` on a fixture workspace under +`BIT_TRACE_ASPECT_LOAD=1` and parses the output: + +``` +assert loaded.size < 25 +``` + +The exact number depends on the fixture; ratchet it down over time. The +assertion is the regression gate against accidental eager-load creep. + +## Acceptance criteria + +- [ ] All eager-mode code paths removed. +- [ ] CJS-only escape hatches removed. +- [ ] Documentation updated for the new aspect-authoring model. +- [ ] All RFC §8 performance targets met. +- [ ] Loaded-aspect CI assertion is in place and passing. +- [ ] Migration documentation moved to historical archive + (`docs/migration/archive/`) and replaced by an authoritative + aspect-authoring guide. +- [ ] CHANGELOG entry for the major version drop describes the new behavior + and any user-facing breaking changes. + +## Risks + +- **Hidden eager-mode dependencies in third-party tooling** (CI scripts, + user automation). Mitigation: deprecation warning for a release cycle + before hard removal. +- **User aspects still CJS**. Mitigation: deprecation timeline above; provide + a migration guide for aspect authors. + +## Files touched + +- `scopes/harmony/bit/load-bit.ts` (significant simplification) +- `scopes/harmony/aspect-loader/aspect-loader.main.runtime.ts` (removal of + `require()` paths) +- `scopes/harmony/bit/hook-require.ts` (deletion) +- `scopes/harmony/bit/manifests.ts` (becomes manifest-only registry) +- Documentation: `docs/aspect-authoring.md` (new), `docs/migration/archive/` + (move chunk files here) + +## Out of scope + +- Major architectural changes beyond what's needed to remove the fallback. +- Aspirational improvements (e.g., switching DI frameworks). diff --git a/docs/migration/README.md b/docs/migration/README.md new file mode 100644 index 000000000000..aaa0807a2d38 --- /dev/null +++ b/docs/migration/README.md @@ -0,0 +1,52 @@ +# ESM + Lazy-Aspects Migration — Work Chunks + +Plan documents for executing the architecture described in +[`../rfc-esm-lazy-aspects.md`](../rfc-esm-lazy-aspects.md). + +Each chunk is sized to fit a single PR (1–5 days of focused work). Pick one and +read just its file; you do not need to read the whole RFC to start. + +## Chunks + +| # | Chunk | Depends on | Risk | Effort | +| --- | --- | --- | --- | --- | +| [01](./01-bench-harness.md) | Startup benchmark harness | — | Low | 2 days | +| [02](./02-aspect-create-api.md) | `Aspect.create` API extension (manifest contract) | — | Low | 1 day | +| [03](./03-lazy-harmony-resolve.md) | Lazy `Harmony.resolve` (new API alongside `get`) | 02 | Medium | 3–5 days | +| [04](./04-single-aspect-pilot.md) | Single-aspect end-to-end pilot (`status`) | 02, 03 | Medium | 2–3 days | +| [05](./05-command-index-codegen.md) | Command index codegen + validation | 04 | Low | 2 days | +| [06](./06-slot-producer-index.md) | Slot-producer index for cross-aspect contributions | 05 | Medium | 2–3 days | +| [07](./07-bulk-migration.md) | Bulk descriptor + thunk migration (all aspects) | 04, 05 | Medium | 5+ days | +| [08](./08-user-extension-lazy.md) | User/workspace extensions use `harmony.resolve` | 03 | Medium | 2 days | +| [09](./09-esm-source-migration.md) | CJS→ESM source migration (phased) | — (parallel-safe) | High | 10+ days | +| [10](./10-publish-bundling.md) | Rollup publish bundle for `@teambit/bit` | 07, 09 | Medium | 3–4 days | +| [11](./11-cleanup.md) | Remove eager fallback, finalize | 10 | Low | 1–2 days | + +## Dependency graph + +``` +01 ──────────────────────────────────────────────► (gates all later perf claims) +02 ─► 03 ─► 04 ─► 05 ─┬─► 06 + └─► 07 ─► 10 ─► 11 + 03 ─────────► 08 +09 (independent track, can run in parallel from day 1) +``` + +## How to use this + +1. **Pick a chunk** that's not blocked. +2. **Read the file** for that chunk — it's self-contained. +3. **Open an issue / PR** that references the chunk number in the title. +4. **Update this README's status column** when the chunk lands. + +## Status legend + +- _Not started_ — default. +- _In progress_ — owner listed; check the chunk file for a link to the PR. +- _Landed_ — merged; the chunk file's "Acceptance criteria" all check. + +## Reading order if you have one hour + +1. RFC §1, §2, §5 (the architecture). +2. [`04-single-aspect-pilot.md`](./04-single-aspect-pilot.md) (proves it works end-to-end). +3. [`07-bulk-migration.md`](./07-bulk-migration.md) (where the bulk of mechanical work is). diff --git a/docs/rfc-esm-lazy-aspects.md b/docs/rfc-esm-lazy-aspects.md new file mode 100644 index 000000000000..a3a68789e8ff --- /dev/null +++ b/docs/rfc-esm-lazy-aspects.md @@ -0,0 +1,685 @@ +# RFC: ESM Migration with Lazy-Loaded Aspects + +| Field | Value | +| --- | --- | +| Status | Draft | +| Owner | TBD | +| Target | Bit core (`@teambit/bit`) + Harmony runtime | +| Companion docs | `docs/node-modules-optimization.md` | + +## 1. Summary + +Migrate the Bit codebase from CommonJS to native ESM **without** regressing CLI startup latency, by introducing a three-tier loading architecture: + +1. A **build-time bundle** of the CLI dispatcher + command index + command descriptors, produced when `@teambit/bit` is published. +2. **Lazy aspect runtimes** loaded via dynamic `import()` on demand, with each `*.main.runtime` shipped as a separate code-split chunk. +3. **Unified lazy loading** that applies the same mechanism to user-defined workspace extensions as to core aspects. + +Today, `bit ` instantiates every core aspect and every command class at startup. After this RFC, only the aspects on a given command's transitive dependency path are loaded — typically a small fraction of the total. The published `@teambit/bit` artifact gains a generated command index and a bundled entry; runtime cost approaches "parse one small file, then `import()` exactly what is needed". + +## 2. Motivation + +Two forcing functions: + +- **The CommonJS-to-ESM migration is coming** (toolchain pressure, peer ecosystem moving). A naive port — replacing `require` with top-level `import` — would eliminate the inline-`require()` lazy-load escape hatches that exist today, making startup measurably slower. +- **Startup is already a known sore spot**. `BitAspect` (defined at `scopes/harmony/bit/bit.main.runtime.ts:18`) declares ~120 core aspects from `scopes/harmony/bit/manifests.ts:119-228` as static dependencies. `harmony.run(requireAspects)` at `scopes/harmony/bit/load-bit.ts:295` walks the whole graph and runs every `provider()` before yargs even sees argv. Every command class — `StatusCmd`, `InstallCmd`, etc. — is instantiated regardless of what the user typed. + +The migration is therefore the right moment to fix the underlying loading model, not a moment to lose ground. + +## 3. Current architecture (as observed) + +### 3.1 Aspect file shapes + +`.aspect.ts` files are already pure manifests. From `scopes/harmony/cli/cli.aspect.ts`: + +```ts +import { Aspect, RuntimeDefinition } from '@teambit/harmony'; +export const MainRuntime = new RuntimeDefinition('main'); +export const CLIAspect = Aspect.create({ + id: 'teambit.harmony/cli', + dependencies: [], + declareRuntime: MainRuntime, +}); +``` + +These files are tiny and have no domain-code imports. The manifest/runtime split is already half-implemented. + +### 3.2 Where weight lives + +`.main.runtime.ts` files carry the cost. From `scopes/component/status/status.main.runtime.ts:1-33`, `StatusMain` imports 30+ Aspect values plus domain code. Crucially, dependencies are imported as **values** (the `Aspect` objects), not types, so the dependency graph is materialized at parse time. + +Each provider eagerly instantiates command classes inside `cli.register(...)`: + +```ts +// status.main.runtime.ts (paraphrased) +StatusMain.provider = async ([cli, workspace, ...]) => { + const statusMain = new StatusMain(...); + cli.register(new StatusCmd(statusMain), new MiniStatusCmd(statusMain)); + return statusMain; +}; +``` + +### 3.3 Current "lazy" loading + +Three mechanisms exist: + +1. **CJS hook** at `scopes/harmony/bit/hook-require.ts:1-31` — intercepts requires for SCSS/CSS stubs. Not a lazy-loader; not relevant after ESM. +2. **Workspace-aspects loaded on `onStart`** at `scopes/workspace/workspace/workspace.main.runtime.ts` — user extensions are loaded only after the command is identified, gated by `command.loadAspects`. This **is** real lazy loading but applies only to user aspects. +3. **`require()` inside aspect-loader functions** at `scopes/harmony/aspect-loader/aspect-loader.main.runtime.ts:649` — used to load `.main.runtime.js` for non-core aspects. Synchronous CJS-only. + +Core aspects are **not** lazy in any meaningful sense: `Harmony.load([CLIAspect, BitAspect])` at `load-bit.ts:289` followed by `harmony.run(requireAspects)` at `load-bit.ts:295` loads and runs every core provider. + +### 3.4 CLI dispatch flow + +From the entry binary at `scopes/harmony/bit/app.ts`: + +``` +app.ts → runBit() → bootstrap() → runCLI() + → loadBit() // Harmony.load + harmony.run (eager) + → cli.run(hasWorkspace) // cli.main.runtime.ts:140 + → invokeOnStart // OnStart slot hooks (workspace aspects load here) + → new CLIParser(this.commands).parse() // yargs config from commandsSlot + → commandRunner.runCommand() // invokes command.report / .json / .wait +``` + +Everything past `loadBit()` is already async. There is no synchronous barrier blocking the migration. + +## 4. Goals and non-goals + +### Goals + +- **G1**: Cold-start latency for `bit --version` and `bit --help` is dominated by parsing a single bundled entry file (<50ms target). +- **G2**: `bit ` loads only aspects on the command's transitive runtime path, plus a small fixed CLI core. +- **G3**: Feature parity. Every slot, every hook, every CLI behaviour available today still works. +- **G4**: User workspace extensions use the same lazy-load mechanism as core aspects — no two paths to maintain. +- **G5**: The published `@teambit/bit` package is the only place that needs to be bundled. Source code stays as plain ESM TypeScript. + +### Non-goals + +- Not switching DI frameworks. Harmony stays; we extend it. +- Not redesigning the aspect model. `.aspect.ts` / `.main.runtime.ts` separation stays. +- Not introducing a new module format (JSR, etc.). Plain Node ESM. + +## 5. Proposed architecture + +### 5.1 Three tiers of loading + +``` +┌────────────────────────────────────────────────────────────────┐ +│ TIER 0 — Bundled entry (parsed once, ~tens of ms) │ +│ bin/bit.mjs │ +│ ├── CLIMain (dispatcher, yargs adapter, hooks) │ +│ ├── command-index.generated.json │ +│ ├── All *.commands.ts descriptors (pure data, inlined) │ +│ ├── All *.aspect.ts manifests (transitively, via BitAspect) │ +│ └── Tiny Harmony core (registry + resolve()) │ +└────────────────────────────────────────────────────────────────┘ + │ + │ await import() per command + ▼ +┌────────────────────────────────────────────────────────────────┐ +│ TIER 1 — Aspect runtime chunks (loaded on demand, code-split) │ +│ chunks/status.main.runtime..mjs │ +│ chunks/install.main.runtime..mjs │ +│ chunks/... │ +│ Each chunk: aspect class + its non-shared deps │ +└────────────────────────────────────────────────────────────────┘ + │ + │ for user-defined aspects + ▼ +┌────────────────────────────────────────────────────────────────┐ +│ TIER 2 — User workspace extensions (loaded on demand from FS) │ +│ node_modules//dist/*.main.runtime.js │ +│ Same import() mechanism — just different source path │ +└────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 Bundling strategy + +- Published `@teambit/bit` is built with **Rollup** (preferred over esbuild here — superior code-splitting heuristics for shared-chunk extraction). +- Entry: `scopes/harmony/bit/app.ts`. +- Bundler is configured to treat every `*.main.runtime.ts` as a **dynamic-import boundary**. Each becomes its own chunk; shared deps are hoisted into common chunks. +- The bundled artifact ships under `@teambit/bit/dist/` with `package.json#exports` pointing at the entry `.mjs`. +- The source repo is **not** bundled for development. `bit-dev` and tests use the unbundled TS via the existing ts-node / compile pipeline. Bundling is a publish-time concern only. + +### 5.3 Why this is faster than today + +| Cost | Today | After | +| --- | --- | --- | +| Module-graph parse at startup | ~120 core aspects + transitive | 1 bundled entry chunk | +| Provider invocations at startup | All ~120 core providers | Only CLI + Logger | +| Command class instantiations at startup | All ~150 commands | Zero (descriptors only) | +| `bit --help` cost | Full bootstrap | Read inlined descriptors, render | +| `bit ` cost | Full bootstrap, then error | Index lookup, then error | +| `bit status` aspects loaded | All ~120 | ~15 (status + transitive) | + +V8 also parses one large file faster than the equivalent code split across hundreds of small files (fewer module-record allocations, better inline-cache locality). + +The dominant win is **subset loading** (never importing what isn't needed), not parallelism — `import()` does pipeline I/O, but module top-level code runs serially on the JS main thread, so parallel imports of three heavy aspects evaluate one-at-a-time. The prototype (§11) confirms this. Bundling is still valuable for the aspects that *do* load, because V8 parses one big file faster than N small ones. + +## 6. Detailed design + +### 6.1 Extended `Aspect.create` + +```ts +// scopes/harmony/harmony/aspect.ts +export interface AspectOptions { + id: string; + dependencies?: Aspect[]; + declareRuntime?: RuntimeDefinition; + defaultConfig?: Record; + + // NEW: lazy runtime loaders, keyed by runtime name. + // Bundler rewrites these into code-split imports. + runtimes?: Record Promise>>; + + // NEW: lazy command descriptor module. + // Loaded eagerly by the bundler at build time and inlined. + commands?: () => Promise<{ default: CommandDescriptor[] }>; +} +``` + +Each `.aspect.ts` adds two lines: + +```ts +export const StatusAspect = Aspect.create({ + id: 'teambit.component/status', + dependencies: [], // existing + declareRuntime: MainRuntime, + runtimes: { + main: () => import('./status.main.runtime.js'), // NEW + }, + commands: () => import('./status.commands.js'), // NEW +}); +``` + +The thunk form keeps the runtime import lazy even when the manifest is loaded eagerly. The bundler recognizes the thunk pattern and emits a code-split chunk; at runtime the thunk resolves to the chunk URL. + +### 6.2 Command descriptors + +A new sibling file per aspect that registers commands: + +```ts +// scopes/component/status/status.commands.ts +import type { CommandDescriptor } from '@teambit/cli'; + +const descriptors: CommandDescriptor[] = [ + { + name: 'status', + alias: 's', + description: 'show workspace component status and issues', + group: 'development', + options: [ + ['j', 'json', 'return a json version of the component'], + ['w', 'warnings', 'show warnings'], + // ... + ], + loader: true, + loadAspects: true, + // aspectId is needed so the dispatcher knows which runtime to load + aspectId: 'teambit.component/status', + }, +]; + +export default descriptors; +``` + +`CommandDescriptor` is a strict subset of today's `Command` interface — everything **except** `report`, `json`, `wait` (the handlers). Handlers live in the runtime chunk and bind themselves to the dispatcher when the runtime loads. + +Today's `Command` interface (at `scopes/harmony/cli/command.ts:6-131`) is split: + +```ts +// command.ts (new shape) +export interface CommandDescriptor { + name: string; + alias?: string; + description: string; + group?: Group | string; + options: CommandOptions; + arguments?: CommandArg[]; + commands?: CommandDescriptor[]; + loader?: boolean; + loadAspects?: boolean; + remoteOp?: boolean; + skipWorkspace?: boolean; + helpUrl?: string; + private?: boolean; + extendedDescription?: string; + examples?: Example[]; + aspectId: string; // NEW — required +} + +export interface CommandHandlers { + report?(args: CLIArgs, flags: Flags): Promise; + json?(args: CLIArgs, flags: Flags): Promise; + wait?(args: CLIArgs, flags: Flags): Promise; +} + +export interface Command extends CommandDescriptor, CommandHandlers {} +``` + +A command class is `class StatusCmd implements Command` exactly as today — no source change to the class itself. The descriptor file is a **declarative duplicate** of the static fields, used by the bundler. + +To avoid duplication drift, a build-time check verifies that descriptor static fields match the class fields. Mismatch fails the build. + +### 6.3 Generated command index + +Produced at publish time, committed under `scopes/harmony/bit/command-index.generated.ts`: + +```ts +// AUTO-GENERATED — do not edit by hand +export interface CommandIndexEntry { + aspectId: string; + runtimeChunk: string; // bundler-rewritten path to the chunk +} + +export const COMMAND_INDEX: Record = { + status: { aspectId: 'teambit.component/status', runtimeChunk: './chunks/status.runtime.mjs' }, + 's': { aspectId: 'teambit.component/status', runtimeChunk: './chunks/status.runtime.mjs' }, + install: { aspectId: 'teambit.dependencies/install', runtimeChunk: './chunks/install.runtime.mjs' }, + // ... +}; + +// All command descriptors, inlined at build time. +// Bundler resolves the import()s in *.aspect.ts#commands at build time +// and concatenates the descriptors into this array. +export const ALL_DESCRIPTORS: CommandDescriptor[] = [ + /* inlined from every *.commands.ts */ +]; +``` + +Generation pipeline: + +1. Codegen script walks every `.aspect.ts` and follows the `commands` thunk. +2. For each descriptor it emits a row in `COMMAND_INDEX`. +3. Rollup output names are post-processed to fill `runtimeChunk` paths. +4. `ALL_DESCRIPTORS` is the union, used to drive yargs config without any runtime imports. + +### 6.4 Modified `Harmony` loader + +```ts +// scopes/harmony/harmony/harmony.ts (new shape, sketch) +export class Harmony { + private manifests = new Map(); + private instances = new Map(); + private loading = new Map>(); + + // `manifestOnly` are registered (for later lazy discovery) but NOT resolved. + // `rootAspects` are both registered and resolved immediately. + // The split lets the entry point register every known manifest cheaply + // (manifests are tiny pure-data files) without paying the cost of resolving + // any runtime that isn't on the active command's path. + static async load( + rootAspects: Aspect[], + runtime: string, + config: ConfigMap, + manifestOnly: Aspect[] = [], + ): Promise { + const h = new Harmony(runtime, config); + for (const a of [...rootAspects, ...manifestOnly]) h.registerManifestTransitive(a); + await Promise.all(rootAspects.map(a => h.resolve(a.id))); + return h; + } + + async resolve(aspectId: string): Promise { + if (this.instances.has(aspectId)) return this.instances.get(aspectId); + if (this.loading.has(aspectId)) return this.loading.get(aspectId); + + const p = (async () => { + const aspect = this.manifests.get(aspectId); + if (!aspect) throw new Error(`Unknown aspect: ${aspectId}`); + + const runtimeMod = await aspect.runtimes![this.runtimeName](); + const runtimeClass = pickRuntimeExport(runtimeMod); // any export with .provider + // Lazy manifest discovery: the runtime class may reference Aspect + // manifests that weren't registered via the original root closure. + for (const d of runtimeClass.dependencies ?? []) this.registerManifestTransitive(d); + const deps = await Promise.all( + (runtimeClass.dependencies ?? []).map((d: Aspect) => this.resolve(d.id)) + ); + const slots = this.buildSlots(runtimeClass.slots ?? []); + const cfg = this.config.get(aspectId); + const instance = await runtimeClass.provider(deps, cfg, slots, this); + this.instances.set(aspectId, instance); + return instance; + })(); + + this.loading.set(aspectId, p); + return p; + } + + // Sync getter for the case where caller knows it's already resolved. + get(aspectId: string): T { + if (!this.instances.has(aspectId)) { + throw new Error(`Aspect ${aspectId} not yet resolved. Use resolve() instead.`); + } + return this.instances.get(aspectId) as T; + } +} +``` + +Key invariants: + +- `resolve()` is the only entry point that triggers a load. It is reentrant-safe via the `loading` map. +- Dependency loads happen in parallel via `Promise.all` over independent subtrees. +- `provider()` signatures are **unchanged**. The 4th argument (`harmony: Harmony`) stays; callers that previously used `harmony.get(id)` synchronously must switch to `await harmony.resolve(id)` if the target may not be resolved. + +### 6.5 CLI dispatcher changes + +The bundled entry runs: + +```ts +// scopes/harmony/bit/app.ts (new shape) +import { COMMAND_INDEX, ALL_DESCRIPTORS } from './command-index.generated.js'; +import { coreManifests } from './core-manifests.js'; // all .aspect.ts only + +async function main() { + const argv = process.argv.slice(2); + const cmdName = argv[0]; + + // Fast paths that need no aspect loads: + if (!cmdName || cmdName === '--help' || cmdName === '-h') return printHelp(ALL_DESCRIPTORS); + if (cmdName === '--version' || cmdName === '-v') return printVersion(); + if (cmdName === 'completion') return runCompletion(ALL_DESCRIPTORS); + + const entry = COMMAND_INDEX[cmdName]; + if (!entry) return printUnknownCommand(cmdName, ALL_DESCRIPTORS); + + // Real path: minimal Harmony, resolve only what we need. + const harmony = await Harmony.load([CLIAspect], 'main', await loadConfig()); + await harmony.resolve(entry.aspectId); // triggers transitive dynamic imports + const cli = harmony.get(CLIAspect.id); + await cli.runResolvedCommand(cmdName, argv.slice(1)); +} +``` + +`CLIMain.runResolvedCommand` is a new method that runs `onStart` hooks, then asks yargs to parse just *this* command's options (built from the descriptor), then invokes the handler. Yargs no longer sees the full command list — it sees one, which is faster to build. + +For commands with `loadAspects: true`, the resolved aspect's `provider()` will have wired up `cli.registerOnStart(...)` that loads workspace aspects (existing logic preserved). + +### 6.6 Slot contributions across aspects + +Aspect A contributing to aspect B's slot requires A's provider to run before B uses the slot value. With lazy loading, A might not load at all. + +Most slot use today is additive (`commandsSlot`, `OnStartSlot`, etc.) — consumed at command-dispatch time, by which point any contributor that's on the loaded path has run. The risk is contributions from aspects that are *not* on the loaded path. + +Resolution: each slot declares a **producers manifest**. When `harmony.resolve(B)` runs and B uses a slot, the loader also resolves every declared producer of that slot. The manifest is generated alongside `COMMAND_INDEX` by static analysis of `.slotContribute()` / `slot.register()` call sites. + +For slots where this is too restrictive (rare), we fall back to declaring the slot as "best-effort, partial view". + +### 6.7 User workspace extensions + +Same mechanism, different source. When `workspace.loadAspects()` runs (today at `scopes/workspace/workspace/workspace.main.runtime.ts`): + +```ts +// New shape (sketch) +async function loadUserAspects(aspectIds: string[]) { + for (const id of aspectIds) { + const resolved = await resolveUserAspectPath(id); // node_modules/.../package.json + const manifestMod = await import(resolved.aspectFile); + const manifest: Aspect = manifestMod.default ?? findAspectExport(manifestMod); + harmony.registerManifest(manifest); + await harmony.resolve(manifest.id); + } +} +``` + +User aspects use the **same** `Aspect.create({ runtimes: { main: () => import('./x.main.runtime.js') } })` shape. They are not bundled (each lives in its own npm package), but their lazy contract is identical. + +This means: a single mental model for core and user aspects, one loader code path, one performance story. + +### 6.8 Slot producer index + +Generated alongside the command index: + +```ts +export const SLOT_PRODUCERS: Record = { + 'teambit.harmony/cli:commandsSlot': [ + 'teambit.component/status', + 'teambit.dependencies/install', + // ... + ], + 'teambit.harmony/cli:onStartSlot': [ + 'teambit.workspace/workspace', + // ... + ], +}; +``` + +Used by `Harmony.resolve()` when an aspect declares it consumes a slot. + +## 7. Migration plan + +Each phase is independently shippable, individually revertable, and gated on benchmarks. + +### Phase 1 — Codegen the command index (no behaviour change) + +- Build the codegen script that walks `.aspect.ts` + `*.commands.ts` and emits `command-index.generated.ts`. +- Run it as part of `bit compile` for the publish artifact. +- At startup, **assert** that the generated index matches the live `commandsSlot` after eager bootstrap. Divergence → loud failure. +- No descriptors yet; the script reads command static fields directly from the runtime classes. + +**Output**: a generated file that's currently unused. +**Risk**: low (additive). + +### Phase 2 — Extract command descriptors + +- For each aspect that registers commands, add `*.commands.ts`. +- Refactor the command class so its static fields read from the descriptor (single source of truth). +- Update `cli.register(...)` call sites to take a descriptor + a handler factory: + ```ts + cli.register(statusDescriptor, () => new StatusCmd(statusMain)); + ``` + Keep the old positional-class form working too. +- Build check asserts descriptor↔class agreement. + +**Output**: descriptors used by `bit --help`, `completion`, and unknown-command paths without loading providers. +**Risk**: medium (touches ~50–80 files; mechanical). + +### Phase 3 — Add lazy `runtimes` thunks to `Aspect.create` + +- Extend `AspectOptions` with `runtimes` and `commands`. +- Add the two thunks to every `.aspect.ts` (one-line each). +- Bundler config recognizes the thunks and emits chunks. Verify by running `rollup --analyze` and confirming each runtime is its own chunk. + +**Output**: a publishable bundle where chunks exist but Harmony still loads eagerly. +**Risk**: medium (build pipeline change). + +### Phase 4 — Lazy `Harmony.resolve` + +- Implement `Harmony.resolve(id)` and the manifest/loading/instances maps. +- Convert `Harmony.load(rootAspects)` to only resolve the roots, not the whole closure. +- Implement the slot-producer index. +- Add `BIT_EAGER_LOAD=1` env var that restores Phase 0 behaviour for safety. +- Migrate `harmony.get(id)` synchronous-on-not-yet-loaded call sites to `await harmony.resolve(id)`. Static analysis to find them; most are inside providers and naturally async-friendly. + +**Output**: real lazy loading. Benchmarks should show first measurable wins here. +**Risk**: high. This is the heart-transplant phase. Run dual-mode (eager + lazy) in CI for a release. + +### Phase 5 — Convert TS source to ESM emit, package by package + +- Leaves first (utilities), then mid-tier, then harmony core last. +- Use Node `--experimental-require-module` during the overlap to let remaining CJS aspects require ESM ones. +- One PR per cohort: set `"type": "module"`, emit `.js` ESM with explicit extensions, fix imports. +- Drop `hook-require.ts` and the CJS-only escape hatches. + +**Output**: pure-ESM Bit. +**Risk**: high but well-trodden territory. + +### Phase 6 — Drop eager fallback, finalize bundling + +- Remove `BIT_EAGER_LOAD` fallback. +- Lock in Rollup production config for `@teambit/bit` publish. +- Strip dead code: old `requireAspects` walk, CJS-only utilities. +- Document the new aspect-authoring contract. + +**Output**: clean ESM-only Bit with bundled CLI and lazy aspects. +**Risk**: low (cleanup). + +## 8. Performance validation + +### Benchmark suite (committed, run on every PR) + +| Scenario | Today (CJS, eager) | Target | +| --- | --- | --- | +| `bit --version` | ~1.5s | <100ms | +| `bit --help` | ~1.5s | <150ms | +| `bit ` | ~1.5s | <100ms | +| `bit status` (no workspace) | ~1.5s | <300ms | +| `bit status` (small workspace, ~20 components) | ~2.5s | <500ms | +| `bit status` (large workspace, ~500 components) | ~6s | <2s | + +Measured cold (`node --no-experimental-fetch ...`, fresh module cache) and warm (with `NODE_COMPILE_CACHE`). + +### Regression gates + +- PR fails if any benchmark regresses by >10%. +- CI assertion: `bit status` on a fixture workspace must load fewer than `N` aspects (start `N=20`, ratchet down). + +### Tracing + +- `BIT_TRACE_ASPECT_LOAD=1` prints `[load] teambit.component/status (12ms, parents: cli)`. +- Useful for finding accidental eager loads after the migration. + +## 9. Risks and open questions + +### Settled by user input + +- **Where the index lives** → generated at publish time into the `@teambit/bit` artifact. +- **Slot contributions** → preserve feature parity; correctness wins over micro-perf where they conflict. +- **User extensions** → same lazy-load path as core. +- **Bundler vs Node-native** → use whichever is faster; this RFC picks Rollup-bundled core + dynamic chunks. + +### Still open + +1. **Sourcemaps + stack traces across chunks.** Rollup supports this but the chunk-name strategy needs to preserve aspect identity in stacks. Plan: deterministic chunk naming (`status.runtime.mjs`, not `chunk-abc123.mjs`). +2. **Hot-reload during `bit watch`.** If runtime chunks are bundled at publish but devs run unbundled TS, the dev path stays as-is. Need to confirm no developer-facing regression. +3. **`require()` from third-party packages that target CJS.** Plan: `createRequire` shims at chunk boundaries; covered by Node ESM interop. +4. **`Harmony.resolve` API churn.** Every `harmony.get(id)` that may hit an unresolved aspect needs to become `await resolve`. Plan: codemod + types-only lint that flags `harmony.get` on aspects not in the current call site's transitive `dependencies` declaration. +5. **Slot-producer index correctness.** Static analysis of `slot.register` call sites is the source of truth. Need to handle dynamic registrations (rare; flag at build). +6. **Bundle size budget.** A 50MB bundled entry would defeat the purpose. Target: <5MB for the Tier 0 entry. Rollup `--treeshake` plus marking heavy domain code as runtime-only (which it already is, since it lives in `.main.runtime.ts`) should keep us well under. + +## 10. PoC slices (work order) + +Each slice is sized to a single PR / 1–3 day task and produces something measurable. + +| # | Slice | Deliverable | Why this order | +| --- | --- | --- | --- | +| 1 | **Bench harness** | `scripts/bench-startup.mjs` measuring the 6 scenarios above against current code. Baseline numbers committed. Includes **per-aspect isolated-import timing** (one aspect imported in a fresh Node process, repeated) so we know the marginal cost of each aspect — not just whole-command wallclock. | Need ground truth before changing anything. The prototype showed that under parallel load, per-aspect numbers are smeared by sibling threads' top-level CPU; isolate to attribute correctly. | +| 2 | **Index codegen** | Script that walks `.main.runtime.ts` files, extracts command static fields, emits `command-index.generated.ts`. Runtime assertion that it matches live state. | Zero behaviour change, builds the data foundation. | +| 3 | **Descriptor extraction (one aspect)** | Convert `status` aspect to use `status.commands.ts`. Update `cli.register` signature to accept descriptor + handler factory. | Prove the descriptor shape on one real aspect before the bulk rollout. | +| 4 | **`Aspect.create` runtimes thunk** | Extend `AspectOptions`. Add thunk to 5 aspects (cli, logger, status, workspace, scope). Bundler config emits chunks for them. | Lock the thunk contract early; bundler integration is risky and best tested narrow. | +| 5 | **Minimal `Harmony.resolve`** | New `resolve()` alongside `get()`. Behind a feature flag, run lazy mode for the 5 piloted aspects. Benchmarks must show wins. | First proof point that the architecture pays off. | +| 6 | **Slot-producer index** | Codegen and runtime integration. Verify `commandsSlot` works under lazy load. | Unblocks broader rollout. | +| 7 | **Bulk descriptor + thunk migration** | Codemod-driven conversion of remaining aspects. | Mechanical work, do it once the contract is solid. | +| 8 | **User extension parity** | Workspace aspect loading uses `harmony.resolve` with the same mechanism. | Removes the second code path. | +| 9 | **ESM source migration** | Phase 5 of plan §7, package by package. | Decouple from architecture changes; happens last but is parallelizable. | +| 10 | **Cleanup & finalize publish bundle** | Drop eager fallback, finalize Rollup config, write authoring docs. | Bake the contract. | + +Slice 1 (the bench harness) should run first regardless of how the rest is sequenced — without baseline numbers the rest is faith-based. + +## 11. Validation via prototype + +A runnable prototype lives at [`prototypes/mini-bit/`](../prototypes/mini-bit/). It implements the core of this architecture in ~30 small ESM files: a Harmony with lazy `resolve()`, seven aspects (cli, logger, scope, workspace, status, install, compiler) each with a manifest / runtime / descriptor split, simulated module-load weight, and an `BIT_EAGER=1` toggle for comparison. + +### 11.1 Measured behaviour (Node 18, M-class Mac, single sample) + +| Command | Lazy mode | Eager mode | Aspects loaded (lazy) | Aspects skipped (lazy) | +| --- | --- | --- | --- | --- | +| `--version` | 2 ms | n/a | 1 (`cli`) | 6 | +| `--help` | 3–4 ms | n/a | 1 (`cli`) | 6 | +| unknown command | 2 ms | n/a | 1 (`cli`) | 6 | +| `status` | ~135 ms | ~298 ms | 5 (`cli`, `logger`, `scope`, `workspace`, `status`) | `install`, `compiler` | +| `install` | ~166 ms | ~298 ms | 5 (`cli`, `logger`, `scope`, `workspace`, `install`) | `status`, `compiler` | +| `compile` | ~185 ms | ~298 ms | 5 (`cli`, `logger`, `scope`, `workspace`, `compiler`) | `status`, `install` | + +These are absolute numbers from a contrived demo with synthetic 35–90ms busy-loops standing in for real module-eval cost — not a forecast for production Bit. The relative pattern is what matters: + +- **Fast paths stay flat regardless of total aspect count**: `--help`, `--version`, and unknown-command errors touch exactly one aspect runtime (CLI). The descriptor data needed to render help comes from `*.commands.js` files, which are imported by the static index but contain no domain code. +- **Real commands load only their transitive subtree**, not the world. `bit compile` never touches `status` or `install`. +- **Eager mode pays for everything**: even though no one asked for `compile`, the `compile` runtime is parsed and its provider runs. + +### 11.2 Architectural confirmations + +These were claims in the RFC; the prototype substantiates them. + +- **The manifest/runtime split is implementable with one extra line per `.aspect.ts`** (the `runtimes: { main: () => import('...') }` thunk). No other source change is needed in the manifest. +- **Manifests are cheap enough to register all of them up front.** The `BitAspect` manifest transitively imports every other aspect manifest; doing so in lazy mode is essentially free (manifest files are 10-line data declarations with no domain imports). This means lazy dispatch can resolve any command name without consulting the index for "is this aspect known?" — it just calls `harmony.resolve(id)` and the manifest is already registered. +- **The same `harmony.resolve` API works uniformly for all aspects.** No special user-extension path needed; whatever code calls `loadUserAspects` simply does `harmony.registerManifest(userManifest); await harmony.resolve(userManifest.id);`. RFC §6.7's claim of "one mental model" is concrete and shippable. +- **Descriptors are inlinable.** The prototype's `command-index.generated.js` is literally a `for` loop over imported descriptor arrays. The same shape works for the publish-time generated artifact. + +### 11.3 Surprises and refinements + +Things that emerged while building the prototype and that revise the RFC's design: + +1. **Manifest-level dependencies and runtime-level dependencies can diverge — and that's useful.** + Today's Bit uses `Aspect.create({ dependencies: [...] })` to establish manifest ordering and `XMain.dependencies = [...]` to declare provider-injected deps. The prototype confirmed these are conceptually independent: the manifest graph is for *discovery and registration*, the runtime graph is for *DI*. The RFC should not pressure them to be identical — keeping them separate gives bundling and codegen more flexibility. + +2. **No separate `core-manifests.js` is needed if `BitAspect`'s manifest already aggregates them.** + The prototype reused the existing pattern (BitAspect declares all core aspects as `dependencies`) as the manifest registry. The entry point passes `BitAspect` to `Harmony.load(..., manifestOnly: [BitAspect])` and gets transitive manifest registration for free. RFC §5.1 and §6.5 should reflect that the registry is just `BitAspect.dependencies` — not a new file. + +3. **`Harmony.load` needs a "manifests but not roots" channel.** + Today `Harmony.load(roots)` both registers and resolves the roots. The prototype showed that lazy mode needs an explicit way to register manifests *without* resolving them. Cleanest API: + + ```ts + Harmony.load(rootAspectsToResolve, runtimeName, config, manifestsToRegisterOnly) + ``` + + This is a tiny additive change; existing call sites are unaffected. + +4. **Parallel `import()` helps less than expected on a single Node thread.** + `Promise.all([import(a), import(b), import(c)])` does pipeline I/O, but **module top-level code (statements, class declarations, default-export evaluation) runs serially on the JS main thread**. So the dominant win comes from *skipping loads entirely*, not from parallelising them. In the prototype, `bit status` finished in ~135 ms — slightly faster than the serial sum (147 ms), but the lion's share of the win vs. eager (298 ms) is from never importing `install` or `compiler` at all. + + Implication for the RFC: §5.3 should soften the "parallel import" line. The architectural win is **subset loading**, not parallelism. Bundling (§5.2) is still worthwhile because V8 parses one large file faster than the equivalent code split across hundreds of small files — but only when the file is actually needed. + +5. **Per-aspect timing is hard to attribute under parallel load.** + The prototype's tracer reported logger's "import time" as 56 ms despite its module being empty — that's wallclock interference from sibling imports' busy-loops on the same thread, not logger's own parse cost. The PoC bench harness (§10, slice 1) should measure aspects in isolation, not nested in a real command dispatch, to get clean per-aspect numbers. Use `--cpu-prof` plus an isolated import script per aspect. + +6. **Sync top-level work in `.main.runtime.ts` files is the actual cost driver.** + In real Bit, top-level `import` chains in main-runtime files (30+ deps each for big aspects) are what's expensive — that's what we're skipping. The prototype confirms this: aspects we don't import don't pay. The corollary: **avoid putting work at module top level** in runtime files. Heavy initialization should live in the provider, where it can at least be amortized and is only paid when the aspect actually runs. + +7. **`pickRuntimeExport` heuristic ("the export with a static `.provider`") works.** + The prototype scans the dynamically imported module for a class export whose `.provider` is a function. This avoided having to mandate a specific export name (`Main`, `default`, etc.). The RFC should adopt this lenient discovery rule; it lowers migration friction. + +8. **Bundling is a publish-time concern only, confirmed.** + The prototype runs source directly under Node with no build step. The same approach works for development in real Bit (where ts-node / esbuild-loader compile on the fly). Bundling becomes valuable only when shipping the published artifact: it collapses many small chunks into a single hot path that V8 can parse and cache as one unit. Dev experience is unaffected. + +9. **The command-index file is trivially small.** + The prototype's index is 25 lines. Even with hundreds of commands, the data structure stays compact: name → `{ aspectId }`. Generation can be a 50-line script. + +10. **No need for a "slots BUT lazy" hybrid at the prototype scale.** + The prototype omitted slot machinery and the architecture still works for commands (because each command is owned by exactly one aspect; the index is sufficient). For cross-aspect slot contributions (RFC §6.6), the slot-producer index is still the right design — but it's a v2 concern, not a blocker. + +### 11.4 What the prototype does NOT prove + +- **Real `.main.runtime.ts` weight**. The prototype's busy-loops are toy; the win on real Bit needs to be measured against the actual 120-aspect manifest. Slice 1 of the work order (§10) is exactly this measurement. +- **Slot contributions across the lazy graph**. RFC §6.6 / §6.8 are still on the drawing board; the prototype demonstrates the simpler "command per aspect" case only. +- **Workspace-aspect lazy load with real npm resolution**. The prototype loads from relative paths; user aspects in real Bit come from `node_modules` discovery, which adds complexity (but reuses the same `harmony.resolve` shape). +- **Stack trace quality across dynamic-import chunks**. Sourcemaps need real bundler integration to validate. + +### 11.5 RFC adjustments derived from the prototype + +Concrete edits this section already implies: + +- **§5.3 table**: keep, but soften "Parallel import()" rhetoric — emphasize *subset loading* as the primary win. +- **§5.1 diagram**: replace "core-manifests.js" with "BitAspect (reused as manifest registry)". +- **§6.5 `Harmony.resolve` sketch**: add the `manifestOnly` parameter to `Harmony.load` and document the manifest-vs-runtime registration split. +- **§6.4 `pickRuntimeExport`**: adopt the heuristic from the prototype (any export with `.provider` static method). +- **§10 slice 1 (bench harness)**: explicitly call out *per-aspect isolated measurement*, not just whole-command timing. + +## 12. Appendix: file inventory of touched areas + +Anchored to the code as of this RFC: + +- `scopes/harmony/harmony/` — `Harmony.load`, new `resolve()`, manifest registry. +- `scopes/harmony/cli/` — `Command` interface split, `CLIMain.runResolvedCommand`, descriptor-driven yargs config. + - `cli.main.runtime.ts:140` (`run`), `cli-parser.ts:27-63` (parse pipeline), `command-runner.ts:30-73` (handler invocation). +- `scopes/harmony/bit/` — `load-bit.ts:268-305` (new minimal bootstrap), `manifests.ts` (becomes manifest-only registry, no longer the dependency closure), new `command-index.generated.ts`. +- Every `*.aspect.ts` — add `runtimes` + `commands` thunks. +- Every `*.main.runtime.ts` that registers commands — pair with `*.commands.ts`. +- `scopes/harmony/aspect-loader/aspect-loader.main.runtime.ts:649` — replace `require()` with `await import()`. +- `scopes/workspace/workspace/workspace.main.runtime.ts` — user-aspect loader uses unified `harmony.resolve`. + +--- + +*End of RFC.* diff --git a/e2e/commands/export.e2e.ts b/e2e/commands/export.e2e.ts index 0ea6d5ba64d1..e17acd1f0380 100644 --- a/e2e/commands/export.e2e.ts +++ b/e2e/commands/export.e2e.ts @@ -3,11 +3,6 @@ import fs from 'fs-extra'; import * as path from 'path'; import { Helper } from '@teambit/legacy.e2e-helper'; import chaiFs from 'chai-fs'; -import { fileURLToPath } from 'url'; - -// @ts-ignore -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); chai.use(chaiFs); diff --git a/e2e/flows/big-file.e2e.ts b/e2e/flows/big-file.e2e.ts index e26e567449b2..12e2112f822b 100644 --- a/e2e/flows/big-file.e2e.ts +++ b/e2e/flows/big-file.e2e.ts @@ -3,13 +3,8 @@ import fs from 'fs-extra'; import * as path from 'path'; import { Helper } from '@teambit/legacy.e2e-helper'; import chaiFs from 'chai-fs'; -import { fileURLToPath } from 'url'; chai.use(chaiFs); -// @ts-ignore -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - describe('big text file', function () { this.timeout(0); let helper: Helper; diff --git a/e2e/functionalities/binary-files.e2e.ts b/e2e/functionalities/binary-files.e2e.ts index a3d5fea8af19..0cb9ce09270a 100644 --- a/e2e/functionalities/binary-files.e2e.ts +++ b/e2e/functionalities/binary-files.e2e.ts @@ -3,11 +3,6 @@ import fs from 'fs-extra'; import path from 'path'; import { Helper } from '@teambit/legacy.e2e-helper'; import chaiFs from 'chai-fs'; -import { fileURLToPath } from 'url'; - -// @ts-ignore -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); chai.use(chaiFs); diff --git a/e2e/performance/filesystem-read.e2e.ts b/e2e/performance/filesystem-read.e2e.ts index 0e8fad8d2788..64b86c491bb4 100644 --- a/e2e/performance/filesystem-read.e2e.ts +++ b/e2e/performance/filesystem-read.e2e.ts @@ -5,11 +5,6 @@ import path from 'path'; import { expect } from 'chai'; import { Helper } from '@teambit/legacy.e2e-helper'; import _ from 'lodash'; -import { fileURLToPath } from 'url'; - -// @ts-ignore -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); const MAX_FILES_READ = 1062; const MAX_FILES_READ_STATUS = 1500; diff --git a/package.json b/package.json index 6305be170ada..b04acbb1ffb2 100644 --- a/package.json +++ b/package.json @@ -53,14 +53,14 @@ "lint-full": "./scripts/validate-import-named-aspects.sh && ./scripts/validate-no-ramda.sh && node scripts/validate-pkg-exist-in-pkg-json.js && npm run lint", "format": "prettier \"{e2e,scopes,components}/**/*.{ts,js,jsx,css,scss,tsx,md,mdx}\" --write", "prettier:check": "prettier --list-different \"{e2e,scopes,components}/**/*.{ts,js,jsx,css,scss,tsx,md,mdx}\"", - "mocha-circleci": "cross-env NODE_OPTIONS='--no-warnings --max-old-space-size=5000' registry-mock prepare && mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors", - "e2e-test": "registry-mock prepare && cross-env NODE_OPTIONS=--no-warnings mocha --require ./babel-register './e2e/**/*.e2e*.ts'", + "mocha-circleci": "cross-env NODE_OPTIONS='--no-warnings --no-experimental-strip-types --max-old-space-size=5000' registry-mock prepare && mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors", + "e2e-test": "registry-mock prepare && cross-env NODE_OPTIONS='--no-warnings --no-experimental-strip-types' mocha --require ./babel-register './e2e/**/*.e2e*.ts'", "e2e-test:debug": "npm run e2e-test --debug", - "e2e-test-circle": "cross-env NODE_OPTIONS='--no-warnings --max-old-space-size=5000' mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors './e2e/**/*.e2e*.ts'", - "performance-test": "mocha --require ./babel-register ./e2e/performance/*.performance*.ts", + "e2e-test-circle": "cross-env NODE_OPTIONS='--no-warnings --no-experimental-strip-types --max-old-space-size=5000' mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors './e2e/**/*.e2e*.ts'", + "performance-test": "cross-env NODE_OPTIONS='--no-experimental-strip-types' mocha --require ./babel-register ./e2e/performance/*.performance*.ts", "performance-test:debug": "npm run performance-test --debug", - "performance-test-circle": "mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors ./e2e/performance/*.performance*.ts", - "bit-hub-test-circle": "mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors ./e2e/bit-hub/*.ts", + "performance-test-circle": "cross-env NODE_OPTIONS='--no-experimental-strip-types' mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors ./e2e/performance/*.performance*.ts", + "bit-hub-test-circle": "cross-env NODE_OPTIONS='--no-experimental-strip-types' mocha --require ./babel-register --reporter mocha-multi-reporters --reporter-options configFile=mocha-multi-reporters-config.json --colors ./e2e/bit-hub/*.ts", "clean-node-modules": "find . -type d -name node_modules -prune -exec rm -rf '{}' +", "setup": "bit install && bit compile", "full-setup": "rm -rf node_modules/.bin/bit && bit install && husky && bit compile", @@ -87,6 +87,9 @@ "generate-cli-reference-docs": "bit cli generate --docs > scopes/harmony/cli-reference/cli-reference.docs.mdx", "generate-cli-skill": "bit cli generate --skill commands > contrib/claude-skill-bit-cli/SKILL.md && bit cli generate --skill reference > contrib/claude-skill-bit-cli/CLI_REFERENCE.md && prettier contrib/claude-skill-bit-cli/SKILL.md contrib/claude-skill-bit-cli/CLI_REFERENCE.md --write", "generate-core-aspects-ids": "bit aspect list-core --json > scopes/harmony/testing/load-aspect/core-aspects-ids.json", + "generate-command-index": "node scripts/generate-command-index.mjs", + "build-bundle": "node scripts/build-publish-bundle.mjs", + "build-bundle:visualize": "node scripts/build-publish-bundle.mjs --visualize", "lint-staged": "lint-staged" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52909608ba70..aec3a357cbc2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,6 +219,18 @@ importers: '@react-hook/latest': specifier: 1.0.3 version: 1.0.3(react@17.0.2) + '@rollup/plugin-commonjs': + specifier: ^29.0.2 + version: 29.0.2(rollup@4.60.4) + '@rollup/plugin-json': + specifier: ^6.1.0 + version: 6.1.0(rollup@4.60.4) + '@rollup/plugin-node-resolve': + specifier: ^16.0.3 + version: 16.0.3(rollup@4.60.4) + '@rollup/plugin-typescript': + specifier: ^12.3.0 + version: 12.3.0(rollup@4.60.4)(tslib@2.8.1)(typescript@5.9.2) '@rspack/core': specifier: ^1.7.7 version: 1.7.8 @@ -875,7 +887,7 @@ importers: version: 0.0.1 '@teambit/mdx.modules.mdx-v3-options': specifier: ^0.0.3 - version: 0.0.3(rollup@4.53.3) + version: 0.0.3(rollup@4.60.4) '@teambit/mdx.ui.mdx-layout': specifier: ^1.0.12 version: 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) @@ -908,7 +920,7 @@ importers: version: 1.0.3 '@teambit/preview.react-preview': specifier: ^1.1.5 - version: 1.1.5(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + version: 1.1.5(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) '@teambit/react.content.react-overview': specifier: 1.96.5 version: 1.96.5(@apollo/client@3.12.2)(@testing-library/react@12.1.5)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) @@ -929,7 +941,7 @@ importers: version: 0.2.5(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/react.webpack.react-webpack': specifier: ^1.0.56 - version: 1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/scope.content.scope-overview': specifier: 1.96.8 version: 1.96.8(@apollo/client@3.12.2)(@testing-library/react@12.1.5)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) @@ -1941,6 +1953,12 @@ importers: rimraf: specifier: 3.0.2 version: 3.0.2 + rollup: + specifier: ^4.60.4 + version: 4.60.4 + rollup-plugin-visualizer: + specifier: ^7.0.1 + version: 7.0.1(rollup@4.60.4) rspack-manifest-plugin: specifier: ^5.2.1 version: 5.2.1(@rspack/core@1.7.8) @@ -2142,19 +2160,19 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/node.node': specifier: 1.3.4 - version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/babel__core': specifier: 7.20.0 version: 7.20.0 @@ -2185,7 +2203,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -2213,7 +2231,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -2226,9 +2244,6 @@ importers: '@teambit/gitconfig': specifier: 2.0.10 version: 2.0.10 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -2259,7 +2274,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -2284,7 +2299,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -2321,7 +2336,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -2352,7 +2367,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.7 - version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -2564,7 +2579,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -2589,7 +2604,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -2632,7 +2647,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -2699,7 +2714,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -2800,7 +2815,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cli-table': specifier: ^0.3.0 version: 0.3.4 @@ -2843,7 +2858,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -2871,7 +2886,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -2920,7 +2935,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -2978,7 +2993,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -3033,7 +3048,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -3088,7 +3103,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -3185,7 +3200,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -3231,7 +3246,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -3268,7 +3283,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/pretty-time': specifier: ^1.1.5 version: 1.1.5 @@ -3317,7 +3332,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -3396,7 +3411,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -3448,7 +3463,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/semver': specifier: 7.5.8 version: 7.5.8 @@ -3500,7 +3515,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -3562,7 +3577,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -3593,7 +3608,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -3624,7 +3639,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -3655,7 +3670,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -3762,7 +3777,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -3933,7 +3948,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -3973,7 +3988,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -4244,7 +4259,7 @@ importers: devDependencies: '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -4567,7 +4582,7 @@ importers: devDependencies: '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -4653,7 +4668,7 @@ importers: devDependencies: '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -5578,7 +5593,7 @@ importers: devDependencies: '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -5676,7 +5691,7 @@ importers: devDependencies: '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -6701,7 +6716,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -6764,7 +6779,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -6782,7 +6797,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -7025,7 +7040,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -7646,7 +7661,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -7709,7 +7724,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -7727,7 +7742,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -7970,7 +7985,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -8432,7 +8447,7 @@ importers: version: file:scopes/harmony/cli-reference(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/harmony.modules.concurrency': specifier: workspace:* version: file:scopes/harmony/modules/concurrency @@ -8597,7 +8612,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -8663,7 +8678,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -8681,7 +8696,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -8924,7 +8939,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -9584,7 +9599,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -9647,7 +9662,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -9665,7 +9680,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -9908,7 +9923,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -10529,7 +10544,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -10592,7 +10607,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -10610,7 +10625,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -10853,7 +10868,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -11477,7 +11492,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -11510,7 +11525,7 @@ importers: version: file:scopes/harmony/node(@testing-library/react@13.4.0)(eslint@8.56.0)(jest@29.3.1) '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/notifications': specifier: workspace:* version: file:scopes/ui-foundation/notifications/aspect(@testing-library/react@13.4.0)(@types/react@17.0.83)(react@17.0.2) @@ -11546,7 +11561,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -11564,7 +11579,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -11807,7 +11822,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -12449,7 +12464,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -12482,7 +12497,7 @@ importers: version: file:scopes/harmony/node(@testing-library/react@13.4.0)(eslint@8.56.0)(jest@29.3.1) '@teambit/node.envs.node-babel-mocha': specifier: 0.2.7 - version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/notifications': specifier: workspace:* version: file:scopes/ui-foundation/notifications/aspect(@testing-library/react@13.4.0)(@types/react@17.0.83)(react@17.0.2) @@ -12518,7 +12533,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -12536,7 +12551,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -12779,7 +12794,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -13448,7 +13463,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -13481,7 +13496,7 @@ importers: version: file:scopes/harmony/node(@testing-library/react@13.4.0)(eslint@8.56.0)(jest@29.3.1) '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/notifications': specifier: workspace:* version: file:scopes/ui-foundation/notifications/aspect(@testing-library/react@13.4.0)(@types/react@17.0.83)(react@17.0.2) @@ -13517,7 +13532,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -13535,7 +13550,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -13778,7 +13793,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -14423,7 +14438,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@19.2.0)(react@19.2.0) @@ -14456,7 +14471,7 @@ importers: version: file:scopes/harmony/node(@testing-library/react@13.4.0)(eslint@8.56.0)(jest@29.3.1) '@teambit/node.node': specifier: 1.3.4 - version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/notifications': specifier: workspace:* version: file:scopes/ui-foundation/notifications/aspect(@testing-library/react@13.4.0)(@types/react@17.0.83)(react@19.2.0) @@ -14492,7 +14507,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@19.2.0) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@19.2.0)(react@19.2.0) @@ -14510,7 +14525,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@19.2.0) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@19.2.0)(react-router-dom@6.30.1)(react@19.2.0)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@19.2.0)(react-router-dom@6.30.1)(react@19.2.0)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@19.2.0) @@ -14753,7 +14768,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@19.2.0)(typescript@5.5.3) @@ -15416,7 +15431,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -15479,7 +15494,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -15497,7 +15512,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -15740,7 +15755,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -16367,7 +16382,7 @@ importers: version: file:components/mcp/mcp-config-writer '@teambit/mdx': specifier: workspace:* - version: file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.53.3) + version: file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.60.4) '@teambit/mdx.aspect-docs.mdx': specifier: workspace:* version: file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) @@ -16433,7 +16448,7 @@ importers: version: file:scopes/defender/prettier(@types/react@17.0.83)(react@17.0.2) '@teambit/preview': specifier: workspace:* - version: file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1) + version: file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1) '@teambit/preview.aspect-docs.preview': specifier: workspace:* version: file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) @@ -16451,7 +16466,7 @@ importers: version: file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2) '@teambit/react': specifier: workspace:* - version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react-router': specifier: workspace:* version: file:scopes/ui-foundation/react-router/react-router(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-router-dom@6.30.1)(react@17.0.2) @@ -16496,7 +16511,7 @@ importers: version: file:scopes/react/ui/loader-fallback(@testing-library/react@12.1.5)(react-dom@17.0.2)(react@17.0.2) '@teambit/react.v17.react-env': specifier: 1.2.5 - version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/readme': specifier: workspace:* version: file:scopes/mdx/readme @@ -16697,7 +16712,7 @@ importers: version: file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2) '@teambit/version-history': specifier: workspace:* - version: file:scopes/scope/version-history(graphql@15.8.0) + version: file:scopes/scope/version-history '@teambit/vue-aspect': specifier: workspace:* version: file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3) @@ -16875,7 +16890,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -16942,7 +16957,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/express': specifier: 4.17.21 version: 4.17.21 @@ -16985,7 +17000,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17016,7 +17031,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17044,7 +17059,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17072,7 +17087,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17097,7 +17112,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17122,7 +17137,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17162,7 +17177,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cli-table': specifier: ^0.3.0 version: 0.3.4 @@ -17295,9 +17310,6 @@ importers: scopes/community/community: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -17316,7 +17328,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17467,9 +17479,6 @@ importers: '@teambit/compilation.babel-compiler': specifier: ^1.1.18 version: 1.1.18(react@17.0.2) - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -17488,7 +17497,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17531,7 +17540,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -17547,9 +17556,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/workspace.root-components': specifier: ^1.0.1 version: 1.0.1 @@ -17595,7 +17601,7 @@ importers: version: 1.96.21(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@teambit/community.ui.bit-cli.commands-provider@0.0.23)(@teambit/community.ui.community-highlighter@1.96.7)(@testing-library/react@12.1.5)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -17639,9 +17645,6 @@ importers: scopes/compilation/multi-compiler: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -17663,7 +17666,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -17758,7 +17761,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -17774,9 +17777,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/chai': specifier: 5.2.2 version: 5.2.2 @@ -17814,9 +17814,12 @@ importers: specifier: ^17.0.0 version: 17.0.2(react@17.0.2) devDependencies: + '@teambit/harmony': + specifier: 0.4.7 + version: 0.4.7 '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -17865,7 +17868,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -18013,7 +18016,7 @@ importers: version: 1.96.6(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -18089,7 +18092,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -18132,7 +18135,7 @@ importers: version: 1.2.4 '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -18145,9 +18148,6 @@ importers: '@teambit/graph.cleargraph': specifier: 0.0.11 version: 0.0.11 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18187,7 +18187,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cli-table': specifier: ^0.3.0 version: 0.3.4 @@ -18221,7 +18221,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -18237,9 +18237,6 @@ importers: '@teambit/design.ui.pill-label': specifier: 0.0.360 version: 0.0.360(react@17.0.2) - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/ui-foundation.ui.react-router.use-query': specifier: ^0.0.505 version: 0.0.505(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) @@ -18264,7 +18261,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -18292,7 +18289,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -18323,7 +18320,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -18345,9 +18342,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18375,7 +18369,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -18394,9 +18388,6 @@ importers: '@teambit/component.ui.component-deprecated': specifier: ^0.0.41 version: 0.0.41(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18427,7 +18418,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -18476,7 +18467,7 @@ importers: version: 1.96.6(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -18495,9 +18486,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18531,7 +18519,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -18634,7 +18622,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -18722,7 +18710,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -18774,7 +18762,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -18787,9 +18775,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18820,7 +18805,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cli-table': specifier: ^0.3.0 version: 0.3.4 @@ -18836,15 +18821,9 @@ importers: scopes/component/merging: dependencies: - '@teambit/bit-error': - specifier: ~0.0.404 - version: 0.0.404 '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -18857,9 +18836,6 @@ importers: '@types/react-dom': specifier: ^17.0.21 version: 17.0.26(@types/react@17.0.83) - chalk: - specifier: 4.1.2 - version: 4.1.2 lodash: specifier: 4.17.21 version: 4.17.21 @@ -18875,7 +18851,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -18928,9 +18904,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -18958,7 +18931,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19007,7 +18980,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19020,9 +18993,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -19053,7 +19023,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -19069,9 +19039,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -19114,7 +19081,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19133,9 +19100,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/legacy-bit-id': specifier: ^1.1.3 version: 1.1.3 @@ -19184,7 +19148,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19224,7 +19188,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -19312,7 +19276,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19385,7 +19349,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -19407,9 +19371,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -19437,7 +19398,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19456,9 +19417,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -19489,7 +19447,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -19523,7 +19481,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19542,9 +19500,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/legacy-bit-id': specifier: ^1.1.3 version: 1.1.3 @@ -19590,7 +19545,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -19824,7 +19779,7 @@ importers: version: 1.2.4 '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -19898,7 +19853,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -19963,9 +19918,6 @@ importers: '@babel/runtime': specifier: 7.23.2 version: 7.23.2 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -19999,7 +19951,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/eslint': specifier: 8.56.6 version: 8.56.6 @@ -20039,7 +19991,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/eslint': specifier: 8.56.6 version: 8.56.6 @@ -20055,9 +20007,6 @@ importers: scopes/defender/formatter: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -20091,7 +20040,7 @@ importers: version: 1.96.10(@teambit/community.ui.bit-cli.commands-provider@0.0.23)(@teambit/community.ui.community-highlighter@1.96.7)(@testing-library/react@13.4.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -20104,9 +20053,6 @@ importers: '@jest/test-result': specifier: 29.3.1 version: 29.3.1 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/tests-results': specifier: ^1.0.5 version: 1.0.5 @@ -20155,7 +20101,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -20174,9 +20120,6 @@ importers: scopes/defender/linter: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -20210,7 +20153,7 @@ importers: version: 1.96.11(@teambit/community.ui.bit-cli.commands-provider@0.0.23)(@teambit/community.ui.community-highlighter@1.96.7)(@testing-library/react@12.1.5)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -20226,9 +20169,6 @@ importers: '@teambit/defender.mocha-tester': specifier: ^1.1.1 version: 1.1.1(@babel/core@7.28.3)(react@17.0.2) - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -20250,16 +20190,13 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 scopes/defender/multi-tester: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/tests-results': specifier: ^1.0.5 version: 1.0.5 @@ -20290,7 +20227,7 @@ importers: version: 1.96.11(@teambit/community.ui.bit-cli.commands-provider@0.0.23)(@teambit/community.ui.community-highlighter@1.96.7)(@testing-library/react@13.4.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -20300,9 +20237,6 @@ importers: scopes/defender/prettier: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -20327,7 +20261,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -20358,7 +20292,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -20455,7 +20389,7 @@ importers: version: 1.96.11(@teambit/community.ui.bit-cli.commands-provider@0.0.23)(@teambit/community.ui.community-highlighter@1.96.7)(@testing-library/react@13.4.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -20471,9 +20405,6 @@ importers: scopes/defender/validator: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -20495,7 +20426,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) scopes/dependencies/aspect-docs/dependency-resolver: dependencies: @@ -20646,9 +20577,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/node.deps-detectors.detective-es6': specifier: ~0.0.6 version: 0.0.6 @@ -20685,18 +20613,12 @@ importers: '@types/react-dom': specifier: ^17.0.21 version: 17.0.26(@types/react@17.0.83) - archy: - specifier: 1.0.0 - version: 1.0.0 chai: specifier: 5.2.1 version: 5.2.1 chalk: specifier: 4.1.2 version: 4.1.2 - cli-table: - specifier: 0.3.6 - version: 0.3.6 debug: specifier: 4.3.4 version: 4.3.4(supports-color@9.4.0) @@ -20715,15 +20637,9 @@ importers: module-definition: specifier: 3.3.1 version: 3.3.1 - moment: - specifier: 2.29.4 - version: 2.29.4 node-source-walk: specifier: 4.2.0 version: 4.2.0 - p-map-series: - specifier: 2.1.0 - version: 2.1.0 react: specifier: ^17.0.0 version: 17.0.2 @@ -20751,10 +20667,7 @@ importers: version: 0.0.1 '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) - '@types/cli-table': - specifier: ^0.3.0 - version: 0.3.4 + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -20881,7 +20794,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -20915,7 +20828,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -20994,9 +20907,6 @@ importers: '@teambit/dependencies.pnpm.dep-path': specifier: 1.0.1 version: 1.0.1 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/pkg.config.auth': specifier: ^0.0.3 version: 0.0.3(graphql@15.8.0) @@ -21051,7 +20961,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -21079,9 +20989,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/pkg.entities.registry': specifier: ^0.0.4 version: 0.0.4 @@ -21139,7 +21046,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -21203,7 +21110,7 @@ importers: version: 1.96.8(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -21299,9 +21206,6 @@ importers: scopes/envs/env: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -21347,7 +21251,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) scopes/envs/envs: dependencies: @@ -21396,7 +21300,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -21494,7 +21398,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -21516,9 +21420,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -21549,7 +21450,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -21665,7 +21566,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -21720,7 +21621,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -21736,9 +21637,6 @@ importers: '@teambit/gitconfig': specifier: 2.0.10 version: 2.0.10 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -21763,7 +21661,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -21791,7 +21689,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -21822,7 +21720,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -21835,9 +21733,6 @@ importers: scopes/harmony/api-server: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -21889,7 +21784,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cors': specifier: 2.8.10 version: 2.8.10 @@ -21953,7 +21848,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -22056,7 +21951,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -22221,7 +22116,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/find-root': specifier: 1.1.2 version: 1.1.2 @@ -22363,7 +22258,7 @@ importers: version: 1.96.12(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/eventsource': specifier: ^1.1.15 version: 1.1.15 @@ -22379,9 +22274,6 @@ importers: scopes/harmony/cache: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/chai': specifier: 5.2.2 version: 5.2.2 @@ -22409,7 +22301,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cacache': specifier: 19.0.0 version: 19.0.0 @@ -22470,7 +22362,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/didyoumean': specifier: 1.2.0 version: 1.2.0 @@ -22568,7 +22460,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -22605,7 +22497,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -22621,9 +22513,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -22672,7 +22561,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -22715,7 +22604,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/express': specifier: 4.17.21 version: 4.17.21 @@ -22731,9 +22620,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -22767,7 +22653,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cli-table': specifier: ^0.3.0 version: 0.3.4 @@ -22876,7 +22762,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cors': specifier: 2.8.10 version: 2.8.10 @@ -22901,9 +22787,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -22934,7 +22817,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -22971,7 +22854,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -22981,9 +22864,6 @@ importers: scopes/harmony/logger: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -23011,7 +22891,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23036,7 +22916,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23086,7 +22966,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23114,7 +22994,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23139,7 +23019,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23164,7 +23044,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23189,7 +23069,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23281,9 +23161,6 @@ importers: scopes/harmony/pubsub: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -23308,7 +23185,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/ui-foundation.ui.is-browser': specifier: ^0.0.500 version: 0.0.500(react-dom@17.0.2)(react@17.0.2) @@ -23336,7 +23213,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23428,7 +23305,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23496,7 +23373,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23521,7 +23398,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23561,7 +23438,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23592,7 +23469,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -23632,9 +23509,6 @@ importers: '@teambit/lanes.ui.navigation.lane-switcher': specifier: ^0.0.239 version: 0.0.239(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) - '@teambit/legacy-bit-id': - specifier: ^1.1.3 - version: 1.1.3 '@teambit/scope.ui.scope-icon': specifier: 0.0.100 version: 0.0.100(@testing-library/react@13.4.0)(react-dom@17.0.2)(react@17.0.2) @@ -23662,12 +23536,6 @@ importers: chalk: specifier: 4.1.2 version: 4.1.2 - execa: - specifier: 2.1.0 - version: 2.1.0 - fs-extra: - specifier: 10.0.0 - version: 10.0.0 fuse.js: specifier: 6.6.2 version: 6.6.2 @@ -23680,12 +23548,6 @@ importers: lodash: specifier: 4.17.21 version: 4.17.21 - p-map: - specifier: 4.0.0 - version: 4.0.0 - p-map-series: - specifier: 2.1.0 - version: 2.1.0 react: specifier: ^17.0.0 version: 17.0.2 @@ -23695,13 +23557,10 @@ importers: react-router-dom: specifier: ^6.30.1 version: 6.30.1(react-dom@17.0.2)(react@17.0.2) - yesno: - specifier: 0.4.0 - version: 0.4.0 devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -23711,6 +23570,9 @@ importers: '@types/mocha': specifier: 9.1.0 version: 9.1.0 + fs-extra: + specifier: 10.0.0 + version: 10.0.0 scopes/lanes/merge-lanes: dependencies: @@ -23720,9 +23582,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -23762,7 +23621,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -23805,7 +23664,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -23824,9 +23683,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/chai': specifier: 5.2.2 version: 5.2.2 @@ -23872,7 +23728,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -23978,7 +23834,7 @@ importers: version: 1.0.14 '@teambit/mdx.modules.mdx-v3-options': specifier: ^0.0.3 - version: 0.0.3(rollup@4.53.3) + version: 0.0.3(rollup@4.60.4) core-js: specifier: ^3.0.0 version: 3.13.0 @@ -24034,9 +23890,6 @@ importers: '@babel/runtime': specifier: 7.20.0 version: 7.20.0 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 core-js: specifier: ^3.0.0 version: 3.13.0 @@ -24183,7 +24036,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/archiver': specifier: 5.3.1 version: 5.3.1 @@ -24223,7 +24076,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -24254,7 +24107,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -24334,7 +24187,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -24416,7 +24269,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/pkg.content.packages-overview': specifier: 1.96.9 version: 1.96.9(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) @@ -24520,7 +24373,7 @@ importers: version: 0.4.7 '@teambit/mdx.modules.mdx-v3-options': specifier: ^0.0.3 - version: 0.0.3(rollup@4.53.3) + version: 0.0.3(rollup@4.60.4) '@teambit/preview.cli.dev-server-events-listener': specifier: ^0.0.1 version: 0.0.1 @@ -24599,7 +24452,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -24841,7 +24694,7 @@ importers: version: 7.22.3 '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/find-root': specifier: 1.1.2 version: 1.1.2 @@ -24896,7 +24749,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.7 - version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -24968,7 +24821,7 @@ importers: version: 0.4.7 '@teambit/mdx.modules.mdx-v3-options': specifier: ^0.0.3 - version: 0.0.3(rollup@4.53.3) + version: 0.0.3(rollup@4.60.4) '@teambit/react.instructions.react.adding-compositions': specifier: 0.0.7 version: 0.0.7(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) @@ -25591,9 +25444,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -25633,7 +25483,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -25655,9 +25505,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -25697,7 +25544,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/lodash': specifier: 4.14.165 version: 4.14.165 @@ -25725,7 +25572,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -25792,7 +25639,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/http-proxy-agent': specifier: 2.0.2 version: 2.0.2 @@ -25826,9 +25673,6 @@ importers: '@teambit/graph.cleargraph': specifier: 0.0.11 version: 0.0.11 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/lane-id': specifier: ~0.0.312 version: 0.0.312 @@ -25886,7 +25730,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -25923,7 +25767,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) chai: specifier: 5.2.1 version: 5.2.1 @@ -26065,7 +25909,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/scope.content.scope-overview': specifier: 1.96.8 version: 1.96.8(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) @@ -26090,15 +25934,6 @@ importers: scopes/scope/version-history: dependencies: - '@teambit/bit-error': - specifier: ~0.0.404 - version: 0.0.404 - '@teambit/component-id': - specifier: ^1.2.4 - version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -26111,9 +25946,6 @@ importers: chalk: specifier: 4.1.2 version: 4.1.2 - lodash: - specifier: 4.17.21 - version: 4.17.21 react: specifier: ^17.0.0 version: 17.0.2 @@ -26123,10 +25955,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) - '@types/lodash': - specifier: 4.14.165 - version: 4.14.165 + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) scopes/semantics/schema: dependencies: @@ -26178,7 +26007,7 @@ importers: version: 1.2.4 '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -26237,7 +26066,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26299,7 +26128,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26333,7 +26162,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -26376,7 +26205,7 @@ importers: version: 0.0.1 '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26410,7 +26239,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -26475,7 +26304,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26500,7 +26329,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26528,7 +26357,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26556,7 +26385,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26590,7 +26419,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26618,7 +26447,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26646,7 +26475,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26677,7 +26506,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26705,7 +26534,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26736,7 +26565,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26761,7 +26590,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26789,7 +26618,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26814,7 +26643,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26864,7 +26693,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -26892,7 +26721,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26917,7 +26746,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -26942,7 +26771,7 @@ importers: devDependencies: '@teambit/node.envs.node-typescript-mocha': specifier: 0.1.6 - version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -27065,7 +26894,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -27126,7 +26955,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -27163,7 +26992,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27203,7 +27032,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27213,9 +27042,6 @@ importers: scopes/ui-foundation/panels: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -27240,7 +27066,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -27283,7 +27109,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27323,7 +27149,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/classnames': specifier: ^2.3.4 version: 2.3.4 @@ -27486,7 +27312,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/express': specifier: 4.17.21 version: 4.17.21 @@ -27508,9 +27334,6 @@ importers: scopes/ui-foundation/user-agent: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/ui-foundation.ui.hooks.use-user-agent': specifier: ^0.0.200 version: 0.0.200(react-dom@17.0.2)(react@17.0.2) @@ -27535,7 +27358,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27557,9 +27380,6 @@ importers: '@teambit/documenter.ui.table-row': specifier: 4.1.14 version: 4.1.14(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -27584,7 +27404,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) scopes/webpack/config-mutator: dependencies: @@ -27649,7 +27469,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27677,7 +27497,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27708,7 +27528,7 @@ importers: devDependencies: '@teambit/node.node': specifier: 1.3.4 - version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27739,7 +27559,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27764,7 +27584,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -27777,9 +27597,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/preview.cli.dev-server-events-listener': specifier: ^0.0.1 version: 0.0.1 @@ -27906,7 +27723,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/find-root': specifier: 1.1.2 version: 1.1.2 @@ -27968,9 +27785,6 @@ importers: scopes/workspace/clear-cache: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -27992,7 +27806,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28011,9 +27825,6 @@ importers: '@teambit/component-version': specifier: ^1.0.4 version: 1.0.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -28044,7 +27855,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28060,9 +27871,6 @@ importers: '@teambit/component-id': specifier: ^1.2.4 version: 1.2.4 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/node': specifier: 22.10.5 version: 22.10.5 @@ -28084,7 +27892,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/mocha': specifier: 9.1.0 version: 9.1.0 @@ -28169,7 +27977,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28212,7 +28020,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/cacache': specifier: 19.0.0 version: 19.0.0 @@ -28252,7 +28060,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/chai': specifier: 4.2.15 version: 4.2.15 @@ -28301,7 +28109,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28335,7 +28143,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28354,9 +28162,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 chalk: specifier: 4.1.2 version: 4.1.2 @@ -28415,7 +28220,7 @@ importers: devDependencies: '@teambit/node.envs.node-babel-mocha': specifier: 0.2.6 - version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28428,9 +28233,6 @@ importers: scopes/workspace/variants: dependencies: - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@teambit/legacy-bit-id': specifier: ^1.1.3 version: 1.1.3 @@ -28458,7 +28260,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/workspace.content.variants': specifier: 1.96.7 version: 1.96.7(react@17.0.2) @@ -28519,7 +28321,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -28700,7 +28502,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/workspace.content.workspace-overview': specifier: 1.96.6 version: 1.96.6(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2) @@ -28737,9 +28539,6 @@ importers: '@teambit/bit-error': specifier: ~0.0.404 version: 0.0.404 - '@teambit/harmony': - specifier: 0.4.7 - version: 0.4.7 '@types/chai': specifier: 5.2.2 version: 5.2.2 @@ -28788,7 +28587,7 @@ importers: devDependencies: '@teambit/harmony.envs.core-aspect-env': specifier: 0.1.4 - version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + version: 0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@types/fs-extra': specifier: 9.0.7 version: 9.0.7 @@ -30498,6 +30297,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -31951,6 +31753,24 @@ packages: '@types/babel__core': optional: true + '@rollup/plugin-commonjs@29.0.2': + resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-node-resolve@15.3.0': resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} engines: {node: '>=14.0.0'} @@ -31960,6 +31780,15 @@ packages: rollup: optional: true + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-replace@2.4.2': resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: @@ -31974,6 +31803,19 @@ packages: rollup: optional: true + '@rollup/plugin-typescript@12.3.0': + resolution: {integrity: sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + '@rollup/pluginutils@3.1.0': resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -31989,124 +31831,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} cpu: [x64] os: [win32] @@ -40890,6 +40749,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} engines: {node: '>= 0.10'} @@ -41902,6 +41765,9 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -42630,14 +42496,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -42929,6 +42787,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -43761,6 +43623,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inner-link@4.0.0: resolution: {integrity: sha512-ndVRxdfEKJAGvS1IyVIErP6rseojoaMfM37iKV+mDmmf33k3pZFgdPXVaTHE0QjDxygfx7A27edP3cC2Q+iieQ==} engines: {node: '>=10'} @@ -43850,6 +43716,9 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.2.0: resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} engines: {node: '>= 0.4'} @@ -44701,6 +44570,9 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -45553,6 +45425,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -46420,6 +46296,10 @@ packages: resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + preferred-pm@3.1.4: resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} @@ -47257,13 +47137,26 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + rollup-plugin-visualizer@7.0.1: + resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} + engines: {node: '>=22'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + rollup@2.79.2: resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} engines: {node: '>=10.0.0'} hasBin: true - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -47898,6 +47791,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} @@ -49274,6 +49171,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -49332,6 +49233,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -49407,6 +49312,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} @@ -49427,6 +49336,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yesno@0.4.0: resolution: {integrity: sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==} @@ -49933,7 +49846,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.12 transitivePeerDependencies: - supports-color @@ -49944,7 +49857,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.12 transitivePeerDependencies: - supports-color @@ -49955,7 +49868,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.12 transitivePeerDependencies: - supports-color @@ -53861,6 +53774,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -54082,11 +53997,11 @@ snapshots: dependencies: react: 19.2.0 - '@mdx-js/rollup@3.1.1(rollup@4.53.3)': + '@mdx-js/rollup@3.1.1(rollup@4.60.4)': dependencies: '@mdx-js/mdx': 3.1.1 - '@rollup/pluginutils': 5.1.3(rollup@4.53.3) - rollup: 4.53.3 + '@rollup/pluginutils': 5.1.3(rollup@4.60.4) + rollup: 4.60.4 source-map: 0.7.4 vfile: 6.0.3 transitivePeerDependencies: @@ -56437,16 +56352,44 @@ snapshots: transitivePeerDependencies: - supports-color + '@rollup/plugin-commonjs@29.0.2(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.60.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.4) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-json@6.1.0(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.60.4) + optionalDependencies: + rollup: 4.60.4 + '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 5.1.3(rollup@2.79.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.12 optionalDependencies: rollup: 2.79.2 + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.60.4) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + optionalDependencies: + rollup: 4.60.4 + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.2) @@ -56461,6 +56404,15 @@ snapshots: optionalDependencies: rollup: 2.79.2 + '@rollup/plugin-typescript@12.3.0(rollup@4.60.4)(tslib@2.8.1)(typescript@5.9.2)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.60.4) + resolve: 1.22.12 + typescript: 5.9.2 + optionalDependencies: + rollup: 4.60.4 + tslib: 2.8.1 + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': dependencies: '@types/estree': 0.0.39 @@ -56476,78 +56428,87 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.3(rollup@4.53.3)': + '@rollup/pluginutils@5.1.3(rollup@4.60.4)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.53.3 + rollup: 4.60.4 - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-android-arm-eabi@4.60.4': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.60.4': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-darwin-arm64@4.60.4': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-darwin-x64@4.60.4': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.60.4': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-freebsd-x64@4.60.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.60.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.60.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-musl@4.60.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-ppc64-musl@4.60.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.60.4': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.60.4': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.60.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-linux-x64-musl@4.60.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-openbsd-x64@4.60.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-openharmony-arm64@4.60.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.4': optional: true '@rspack/binding-darwin-arm64@1.7.5': @@ -59190,7 +59151,6 @@ snapshots: dependencies: '@teambit/component.modules.component-url': file:scopes/component/component-url(@types/react@17.0.83)(react@17.0.2) '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/harmony.modules.send-server-sent-events': file:scopes/harmony/modules/send-server-sent-events '@teambit/lane-id': 0.0.312 @@ -59469,7 +59429,6 @@ snapshots: '@babel/core': 7.28.3 '@teambit/compilation.aspect-docs.babel': file:scopes/compilation/aspect-docs/babel(react-dom@17.0.2)(react@17.0.2) '@teambit/compilation.babel-compiler': 1.1.18(react@17.0.2) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -59483,7 +59442,6 @@ snapshots: '@babel/core': 7.28.3 '@teambit/compilation.aspect-docs.babel': file:scopes/compilation/aspect-docs/babel(react-dom@17.0.2)(react@19.2.0) '@teambit/compilation.babel-compiler': 1.1.18(react@19.2.0) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -61903,7 +61861,6 @@ snapshots: '@teambit/cache@file:scopes/harmony/cache(@types/chai@5.2.2)(@types/react@17.0.83)(chai@5.2.1)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/chai': 5.2.2 '@types/node': 22.10.5 @@ -61916,7 +61873,6 @@ snapshots: '@teambit/cache@file:scopes/harmony/cache(@types/chai@5.2.2)(@types/react@17.0.83)(chai@5.2.1)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/chai': 5.2.2 '@types/node': 22.10.5 @@ -62015,7 +61971,6 @@ snapshots: '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants @@ -62052,7 +62007,6 @@ snapshots: '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants @@ -62105,7 +62059,6 @@ snapshots: '@teambit/clear-cache@file:scopes/workspace/clear-cache(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/scope.modules.find-scope-path': file:components/modules/find-scope-path '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -62125,7 +62078,6 @@ snapshots: '@teambit/clear-cache@file:scopes/workspace/clear-cache(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/scope.modules.find-scope-path': file:components/modules/find-scope-path '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -62149,7 +62101,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component.modules.component-url': file:scopes/component/component-url(@types/react@17.0.83)(react@17.0.2) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -62189,7 +62140,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component.modules.component-url': file:scopes/component/component-url(@types/react@17.0.83)(react@17.0.2) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -63860,7 +63810,6 @@ snapshots: '@teambit/community@file:scopes/community/community': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -64016,7 +63965,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/pkg.modules.component-package-name': file:components/modules/component-package-name(graphql@15.8.0) '@teambit/toolbox.fs.hard-link-directory': file:scopes/toolbox/fs/hard-link-directory @@ -64047,7 +63995,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/pkg.modules.component-package-name': file:components/modules/component-package-name(graphql@15.8.0) '@teambit/toolbox.fs.hard-link-directory': file:scopes/toolbox/fs/hard-link-directory @@ -64309,7 +64256,6 @@ snapshots: dependencies: '@teambit/component-id': 1.2.4 '@teambit/graph.cleargraph': 0.0.11 - '@teambit/harmony': 0.4.7 '@teambit/legacy-component-log': file:components/legacy-component-log '@teambit/legacy.component-diff': file:components/legacy/component-diff(graphql@15.8.0) '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -64336,7 +64282,6 @@ snapshots: dependencies: '@teambit/component-id': 1.2.4 '@teambit/graph.cleargraph': 0.0.11 - '@teambit/harmony': 0.4.7 '@teambit/legacy-component-log': file:components/legacy-component-log '@teambit/legacy.component-diff': file:components/legacy/component-diff(graphql@15.8.0) '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -64377,7 +64322,6 @@ snapshots: '@teambit/component.ui.component-size': 0.0.77(react-dom@17.0.2)(react@17.0.2) '@teambit/design.ui.pill-label': 0.0.360(react@17.0.2) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@teambit/ui-foundation.ui.react-router.use-query': 0.0.505(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -64396,7 +64340,6 @@ snapshots: '@teambit/component.ui.component-size': 0.0.77(react-dom@17.0.2)(react@17.0.2) '@teambit/design.ui.pill-label': 0.0.360(react@17.0.2) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@teambit/ui-foundation.ui.react-router.use-query': 0.0.505(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -64415,7 +64358,6 @@ snapshots: '@teambit/component.ui.component-size': 0.0.77(react-dom@17.0.2)(react@19.2.0) '@teambit/design.ui.pill-label': 0.0.360(react@19.2.0) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@17.0.2)(react@19.2.0) - '@teambit/harmony': 0.4.7 '@teambit/ui-foundation.ui.react-router.use-query': 0.0.505(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -64468,7 +64410,6 @@ snapshots: '@teambit/component-version': 1.0.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -64784,7 +64725,7 @@ snapshots: '@teambit/legacy.extension-data': 0.0.51(graphql@15.8.0) '@teambit/legacy.logger': 0.0.19 '@teambit/legacy.scope': 0.0.49(graphql@15.8.0) - '@teambit/pkg.modules.component-package-name': 0.0.56(graphql@15.8.0) + '@teambit/pkg.modules.component-package-name': 0.0.56 '@teambit/toolbox.fs.link-or-symlink': 0.0.20 '@teambit/toolbox.fs.remove-empty-dir': 0.0.5 '@teambit/toolbox.path.path': 0.0.8 @@ -68132,7 +68073,6 @@ snapshots: '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/component-version': 1.0.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) '@teambit/legacy.extension-data': file:components/legacy/extension-data(graphql@15.8.0) @@ -68155,7 +68095,6 @@ snapshots: '@teambit/config-store@file:components/config-store': dependencies: '@teambit/gitconfig': 2.0.10 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -69042,7 +68981,6 @@ snapshots: '@teambit/component-version': 1.0.4 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants @@ -69069,19 +69007,15 @@ snapshots: '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) - archy: 1.0.0 chai: 5.2.1 chalk: 4.1.2 - cli-table: 0.3.6 debug: 4.3.4(supports-color@9.4.0) detective-amd: 3.0.1 detective-stylus: 1.0.0 fs-extra: 10.0.0 lodash: 4.17.21 module-definition: 3.3.1 - moment: 2.29.4 node-source-walk: 4.2.0 - p-map-series: 2.1.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) read-pkg-up: 7.0.1 @@ -69109,7 +69043,6 @@ snapshots: '@teambit/component-version': 1.0.4 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants @@ -69136,19 +69069,15 @@ snapshots: '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) - archy: 1.0.0 chai: 5.2.1 chalk: 4.1.2 - cli-table: 0.3.6 debug: 4.3.4(supports-color@9.4.0) detective-amd: 3.0.1 detective-stylus: 1.0.0 fs-extra: 10.0.0 lodash: 4.17.21 module-definition: 3.3.1 - moment: 2.29.4 node-source-walk: 4.2.0 - p-map-series: 2.1.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) read-pkg-up: 7.0.1 @@ -69358,7 +69287,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.ui.component-deprecated': 0.0.41(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -69377,7 +69305,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.ui.component-deprecated': 0.0.41(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -69396,7 +69323,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.ui.component-deprecated': 0.0.41(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -73471,7 +73397,6 @@ snapshots: '@teambit/bvm.list': 1.1.1 '@teambit/component-id': 1.2.4 '@teambit/git.modules.git-executable': file:scopes/git/modules/git-executable - '@teambit/harmony': 0.4.7 '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -75001,7 +74926,6 @@ snapshots: dependencies: '@teambit/component-id': 1.2.4 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) @@ -75023,7 +74947,6 @@ snapshots: dependencies: '@teambit/component-id': 1.2.4 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) @@ -75043,7 +74966,6 @@ snapshots: '@teambit/env@file:scopes/envs/env(@types/react@17.0.83)(eslint@8.56.0)(jest@29.3.1)(typescript@5.5.3)': dependencies: - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -75170,7 +75092,6 @@ snapshots: dependencies: '@babel/runtime': 7.23.2 '@teambit/defender.eslint.config-mutator': file:scopes/defender/eslint-config-mutator - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -75189,7 +75110,6 @@ snapshots: dependencies: '@babel/runtime': 7.23.2 '@teambit/defender.eslint.config-mutator': file:scopes/defender/eslint-config-mutator - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -75921,7 +75841,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/lane-id': 0.0.312 '@teambit/legacy-bit-id': 1.1.3 @@ -75961,7 +75880,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/lane-id': 0.0.312 '@teambit/legacy-bit-id': 1.1.3 @@ -76034,7 +75952,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/component-version': 1.0.4 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.utils': file:components/legacy/utils '@types/node': 22.10.5 @@ -76056,7 +75973,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/component-version': 1.0.4 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.utils': file:components/legacy/utils '@types/node': 22.10.5 @@ -76074,7 +75990,6 @@ snapshots: '@teambit/formatter@file:scopes/defender/formatter(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/toolbox.time.timer': file:scopes/toolbox/time/timer '@types/node': 22.10.5 @@ -76091,7 +76006,6 @@ snapshots: '@teambit/formatter@file:scopes/defender/formatter(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/toolbox.time.timer': file:scopes/toolbox/time/timer '@types/node': 22.10.5 @@ -76236,7 +76150,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/gitconfig': 2.0.10 - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -76258,7 +76171,6 @@ snapshots: '@teambit/global-config@file:scopes/harmony/global-config(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2)': dependencies: '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -76281,7 +76193,6 @@ snapshots: '@teambit/global-config@file:scopes/harmony/global-config(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0)': dependencies: '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) @@ -76649,7 +76560,7 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -76665,8 +76576,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -76734,7 +76645,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -76750,8 +76661,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -76819,7 +76730,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -76835,8 +76746,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -76904,7 +76815,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -76920,8 +76831,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -76989,7 +76900,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -77005,8 +76916,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -77074,7 +76985,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -77090,8 +77001,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -77159,7 +77070,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/harmony.envs.core-aspect-env@0.1.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) @@ -77175,8 +77086,8 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -77418,7 +77329,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -77497,7 +77407,6 @@ snapshots: '@teambit/component-version': 1.0.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/lane-id': 0.0.312 '@teambit/legacy-bit-id': 1.1.3 @@ -77533,7 +77442,6 @@ snapshots: '@teambit/component-version': 1.0.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/lane-id': 0.0.312 '@teambit/legacy-bit-id': 1.1.3 @@ -77567,7 +77475,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -77583,7 +77490,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -77743,7 +77649,6 @@ snapshots: '@teambit/jest@file:scopes/defender/jest(@types/react@17.0.83)(babel-plugin-macros@3.1.0)(react@17.0.2)': dependencies: '@jest/test-result': 29.3.1 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/tests-results': 1.0.5 '@types/node': 22.10.5 @@ -77769,7 +77674,6 @@ snapshots: '@teambit/jest@file:scopes/defender/jest(@types/react@17.0.83)(babel-plugin-macros@3.1.0)(react@19.2.0)': dependencies: '@jest/test-result': 29.3.1 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/tests-results': 1.0.5 '@types/node': 22.10.5 @@ -79105,19 +79009,15 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) '@teambit/design.ui.pages.not-found': 0.0.371(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) - '@teambit/git.modules.git-executable': file:scopes/git/modules/git-executable '@teambit/harmony': 0.4.7 - '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/lane-id': 0.0.312 '@teambit/lanes.entities.lane-diff': file:scopes/lanes/entities/lane-diff '@teambit/lanes.hooks.use-lanes': file:components/hooks/use-lanes(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) '@teambit/lanes.hooks.use-viewed-lane-from-url': file:components/hooks/use-viewed-lane-from-url_1(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0) '@teambit/lanes.modules.create-lane': file:scopes/lanes/modules/create-lane(graphql@15.8.0) - '@teambit/lanes.modules.diff': file:scopes/lanes/diff(graphql@15.8.0) '@teambit/lanes.ui.compare.lane-compare': 0.0.206(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@19.2.0) '@teambit/lanes.ui.compare.lane-compare-page': 0.0.174(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@19.2.0) '@teambit/lanes.ui.lane-overview': file:components/ui/lane-overview(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react@17.0.83)(chai@5.2.1)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@19.2.0) @@ -79125,9 +79025,6 @@ snapshots: '@teambit/lanes.ui.menus.use-lanes-menu': 0.0.299(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) '@teambit/lanes.ui.models.lanes-model': file:components/ui/models/lanes-model(react-dom@17.0.2)(react@19.2.0) '@teambit/lanes.ui.navigation.lane-switcher': 0.0.239(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@19.2.0) - '@teambit/legacy-bit-id': 1.1.3 - '@teambit/legacy.component-diff': file:components/legacy/component-diff(graphql@15.8.0) - '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) @@ -79144,18 +79041,13 @@ snapshots: '@types/react-dom': 17.0.26(@types/react@17.0.83) chai: 5.2.1 chalk: 4.1.2 - execa: 2.1.0 - fs-extra: 10.0.0 fuse.js: 6.6.2 graphql-tag: 2.12.1(graphql@15.8.0) group-array: 1.0.0 lodash: 4.17.21 - p-map: 4.0.0 - p-map-series: 2.1.0 react: 19.2.0 react-dom: 17.0.2(react@19.2.0) react-router-dom: 6.30.1(react-dom@19.2.0)(react@19.2.0) - yesno: 0.4.0 transitivePeerDependencies: - '@apollo/client' - '@babel/core' @@ -79173,19 +79065,15 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) '@teambit/design.ui.pages.not-found': 0.0.371(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/git.modules.git-executable': file:scopes/git/modules/git-executable '@teambit/harmony': 0.4.7 - '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/lane-id': 0.0.312 '@teambit/lanes.entities.lane-diff': file:scopes/lanes/entities/lane-diff '@teambit/lanes.hooks.use-lanes': file:components/hooks/use-lanes(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.hooks.use-viewed-lane-from-url': file:components/hooks/use-viewed-lane-from-url_1(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5) '@teambit/lanes.modules.create-lane': file:scopes/lanes/modules/create-lane(graphql@15.8.0) - '@teambit/lanes.modules.diff': file:scopes/lanes/diff(graphql@15.8.0) '@teambit/lanes.ui.compare.lane-compare': 0.0.206(@apollo/client@3.12.2)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) '@teambit/lanes.ui.compare.lane-compare-page': 0.0.174(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) '@teambit/lanes.ui.lane-overview': file:components/ui/lane-overview(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react@17.0.83)(chai@5.2.1)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) @@ -79193,9 +79081,6 @@ snapshots: '@teambit/lanes.ui.menus.use-lanes-menu': 0.0.299(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.ui.models.lanes-model': file:components/ui/models/lanes-model(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.ui.navigation.lane-switcher': 0.0.239(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) - '@teambit/legacy-bit-id': 1.1.3 - '@teambit/legacy.component-diff': file:components/legacy/component-diff(graphql@15.8.0) - '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) @@ -79212,18 +79097,13 @@ snapshots: '@types/react-dom': 17.0.26(@types/react@17.0.83) chai: 5.2.1 chalk: 4.1.2 - execa: 2.1.0 - fs-extra: 10.0.0 fuse.js: 6.6.2 graphql-tag: 2.12.1(graphql@15.8.0) group-array: 1.0.0 lodash: 4.17.21 - p-map: 4.0.0 - p-map-series: 2.1.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-router-dom: 6.30.1(react-dom@17.0.2)(react@17.0.2) - yesno: 0.4.0 transitivePeerDependencies: - '@apollo/client' - '@babel/core' @@ -79241,19 +79121,15 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) '@teambit/design.ui.pages.not-found': 0.0.371(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/git.modules.git-executable': file:scopes/git/modules/git-executable '@teambit/harmony': 0.4.7 - '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/lane-id': 0.0.312 '@teambit/lanes.entities.lane-diff': file:scopes/lanes/entities/lane-diff '@teambit/lanes.hooks.use-lanes': file:components/hooks/use-lanes(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.hooks.use-viewed-lane-from-url': file:components/hooks/use-viewed-lane-from-url_1(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0) '@teambit/lanes.modules.create-lane': file:scopes/lanes/modules/create-lane(graphql@15.8.0) - '@teambit/lanes.modules.diff': file:scopes/lanes/diff(graphql@15.8.0) '@teambit/lanes.ui.compare.lane-compare': 0.0.206(@apollo/client@3.12.2)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) '@teambit/lanes.ui.compare.lane-compare-page': 0.0.174(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) '@teambit/lanes.ui.lane-overview': file:components/ui/lane-overview(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react@17.0.83)(chai@5.2.1)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) @@ -79261,9 +79137,6 @@ snapshots: '@teambit/lanes.ui.menus.use-lanes-menu': 0.0.299(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.ui.models.lanes-model': file:components/ui/models/lanes-model(react-dom@17.0.2)(react@17.0.2) '@teambit/lanes.ui.navigation.lane-switcher': 0.0.239(@apollo/client@3.12.2)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2) - '@teambit/legacy-bit-id': 1.1.3 - '@teambit/legacy.component-diff': file:components/legacy/component-diff(graphql@15.8.0) - '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) @@ -79280,18 +79153,13 @@ snapshots: '@types/react-dom': 17.0.26(@types/react@17.0.83) chai: 5.2.1 chalk: 4.1.2 - execa: 2.1.0 - fs-extra: 10.0.0 fuse.js: 6.6.2 graphql-tag: 2.12.1(graphql@15.8.0) group-array: 1.0.0 lodash: 4.17.21 - p-map: 4.0.0 - p-map-series: 2.1.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-router-dom: 6.30.1(react-dom@17.0.2)(react@17.0.2) - yesno: 0.4.0 transitivePeerDependencies: - '@apollo/client' - '@babel/core' @@ -79573,7 +79441,7 @@ snapshots: '@teambit/legacy.cli.error': 0.0.19 '@teambit/legacy.constants': 0.0.11 '@teambit/legacy.consumer': 0.0.49(graphql@15.8.0) - '@teambit/legacy.consumer-config': 0.0.49(graphql@15.8.0) + '@teambit/legacy.consumer-config': 0.0.49 '@teambit/legacy.extension-data': 0.0.51(graphql@15.8.0) '@teambit/legacy.loader': 0.0.7 '@teambit/legacy.logger': 0.0.19 @@ -79638,7 +79506,7 @@ snapshots: - graphql - supports-color - '@teambit/legacy.consumer-config@0.0.49(graphql@15.8.0)': + '@teambit/legacy.consumer-config@0.0.49': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 @@ -79655,9 +79523,7 @@ snapshots: lodash: 4.17.21 p-map-series: 2.1.0 transitivePeerDependencies: - - domexception - encoding - - graphql - supports-color '@teambit/legacy.consumer-config@file:components/legacy/consumer-config(graphql@15.8.0)': @@ -79697,7 +79563,7 @@ snapshots: '@teambit/legacy.bit-map': 0.0.106(graphql@15.8.0) '@teambit/legacy.constants': 0.0.11 '@teambit/legacy.consumer-component': 0.0.50(graphql@15.8.0) - '@teambit/legacy.consumer-config': 0.0.49(graphql@15.8.0) + '@teambit/legacy.consumer-config': 0.0.49 '@teambit/legacy.logger': 0.0.19 '@teambit/legacy.scope': 0.0.49(graphql@15.8.0) '@teambit/legacy.utils': 0.0.21 @@ -80074,7 +79940,7 @@ snapshots: '@teambit/legacy.constants': 0.0.11 '@teambit/legacy.consumer': 0.0.49(graphql@15.8.0) '@teambit/legacy.consumer-component': 0.0.50(graphql@15.8.0) - '@teambit/legacy.consumer-config': 0.0.49(graphql@15.8.0) + '@teambit/legacy.consumer-config': 0.0.49 '@teambit/legacy.dependency-graph': 0.0.52(graphql@15.8.0) '@teambit/legacy.extension-data': 0.0.51(graphql@15.8.0) '@teambit/legacy.loader': 0.0.7 @@ -80190,7 +80056,6 @@ snapshots: '@teambit/linter@file:scopes/defender/linter(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/toolbox.time.timer': file:scopes/toolbox/time/timer '@types/node': 22.10.5 @@ -80207,7 +80072,6 @@ snapshots: '@teambit/linter@file:scopes/defender/linter(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/toolbox.time.timer': file:scopes/toolbox/time/timer '@types/node': 22.10.5 @@ -80226,7 +80090,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 - '@teambit/harmony': 0.4.7 '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -80251,7 +80114,6 @@ snapshots: '@teambit/logger@file:scopes/harmony/logger(@types/react@17.0.83)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/harmony.aspect-docs.logger': file:scopes/harmony/aspect-docs/logger(react-dom@17.0.2)(react@17.0.2) '@teambit/legacy.loader': file:components/legacy/loader '@teambit/legacy.logger': file:components/legacy/logger @@ -80268,7 +80130,6 @@ snapshots: '@teambit/logger@file:scopes/harmony/logger(@types/react@17.0.83)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/harmony.aspect-docs.logger': file:scopes/harmony/aspect-docs/logger(react-dom@17.0.2)(react@19.2.0) '@teambit/legacy.loader': file:components/legacy/loader '@teambit/legacy.logger': file:components/legacy/logger @@ -80317,9 +80178,9 @@ snapshots: dependencies: '@teambit/mdx.modules.mdx-admonitions-adapter': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options@0.0.2(rollup@4.53.3)': + '@teambit/mdx.modules.mdx-v3-options@0.0.2(rollup@4.60.4)': dependencies: - '@mdx-js/rollup': 3.1.1(rollup@4.53.3) + '@mdx-js/rollup': 3.1.1(rollup@4.60.4) '@teambit/node.deps-detectors.detective-es6': 0.0.6 recma-mdx-is-mdx-component: 1.1.3 rehype-mdx-code-props: 3.0.1 @@ -80332,9 +80193,9 @@ snapshots: - rollup - supports-color - '@teambit/mdx.modules.mdx-v3-options@0.0.3(rollup@4.53.3)': + '@teambit/mdx.modules.mdx-v3-options@0.0.3(rollup@4.60.4)': dependencies: - '@mdx-js/rollup': 3.1.1(rollup@4.53.3) + '@mdx-js/rollup': 3.1.1(rollup@4.60.4) '@teambit/node.deps-detectors.detective-es6': 0.0.6 recma-mdx-is-mdx-component: 1.1.3 rehype-mdx-code-props: 3.0.1 @@ -80730,7 +80591,7 @@ snapshots: dependencies: react: 17.0.2 - '@teambit/mdx@file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.53.3)': + '@teambit/mdx@file:scopes/mdx/mdx(@testing-library/react@12.1.5)(rollup@4.60.4)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-test-runner': 7.16.7 @@ -80747,7 +80608,7 @@ snapshots: '@teambit/harmony': 0.4.7 '@teambit/mdx.aspect-docs.mdx': file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.generator.mdx-templates': 1.0.14 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/typescript.modules.ts-config-mutator': file:scopes/typescript/modules/ts-config-mutator core-js: 3.13.0 fs-extra: 10.0.0 @@ -80760,7 +80621,7 @@ snapshots: - rollup - supports-color - '@teambit/mdx@file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.53.3)': + '@teambit/mdx@file:scopes/mdx/mdx(@testing-library/react@13.4.0)(rollup@4.60.4)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-test-runner': 7.16.7 @@ -80777,7 +80638,7 @@ snapshots: '@teambit/harmony': 0.4.7 '@teambit/mdx.aspect-docs.mdx': file:scopes/mdx/aspect-docs/mdx(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.generator.mdx-templates': 1.0.14 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/typescript.modules.ts-config-mutator': file:scopes/typescript/modules/ts-config-mutator core-js: 3.13.0 fs-extra: 10.0.0 @@ -80796,7 +80657,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.get-basic-log': file:scopes/harmony/modules/get-basic-log(graphql@15.8.0) '@teambit/lane-id': 0.0.312 '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) @@ -80822,24 +80682,16 @@ snapshots: '@teambit/merging@file:scopes/component/merging(graphql@15.8.0)': dependencies: - '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/lane-id': 0.0.312 - '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) - '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) '@teambit/legacy.extension-data': file:components/legacy/extension-data(graphql@15.8.0) '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) - '@teambit/pkg.modules.component-package-name': file:components/modules/component-package-name(graphql@15.8.0) - '@teambit/toolbox.path.path': file:scopes/toolbox/path/path '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) - chalk: 4.1.2 lodash: 4.17.21 p-map-series: 2.1.0 react: 17.0.2 @@ -80854,7 +80706,6 @@ snapshots: dependencies: '@babel/core': 7.28.3 '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -80868,7 +80719,6 @@ snapshots: dependencies: '@babel/core': 7.28.3 '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@19.2.0) - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -80882,7 +80732,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) '@teambit/legacy.utils': file:components/legacy/utils @@ -80904,7 +80753,6 @@ snapshots: '@teambit/multi-compiler@file:scopes/compilation/multi-compiler(@types/react@17.0.83)(react@17.0.2)': dependencies: '@teambit/compilation.aspect-docs.multi-compiler': file:scopes/compilation/aspect-docs/multi-compiler(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@teambit/pipelines.modules.merge-component-results': file:scopes/pipelines/modules/merge-component-results '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -80916,7 +80764,6 @@ snapshots: '@teambit/multi-compiler@file:scopes/compilation/multi-compiler(@types/react@17.0.83)(react@19.2.0)': dependencies: '@teambit/compilation.aspect-docs.multi-compiler': file:scopes/compilation/aspect-docs/multi-compiler(react-dom@17.0.2)(react@19.2.0) - '@teambit/harmony': 0.4.7 '@teambit/pipelines.modules.merge-component-results': file:scopes/pipelines/modules/merge-component-results '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -80927,7 +80774,6 @@ snapshots: '@teambit/multi-tester@file:scopes/defender/multi-tester(@types/react@17.0.83)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/tests-results': 1.0.5 '@types/node': 22.10.5 @@ -80940,7 +80786,6 @@ snapshots: '@teambit/multi-tester@file:scopes/defender/multi-tester(@types/react@17.0.83)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@teambit/tests-results': 1.0.5 '@types/node': 22.10.5 @@ -80998,7 +80843,7 @@ snapshots: '@teambit/node.deps-detectors.parser-helper@0.0.6': {} - '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.19.6) '@babel/preset-env': 7.28.3(@babel/core@7.19.6) @@ -81011,7 +80856,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.19.6)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81068,7 +80913,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -81081,7 +80926,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.5.3) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81138,7 +80983,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -81151,7 +80996,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81208,7 +81053,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -81221,7 +81066,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81278,7 +81123,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-babel-mocha@0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -81291,7 +81136,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.5.3) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81357,7 +81202,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-babel-mocha@0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-babel-mocha@0.2.7(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(jest@29.3.1)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -81370,7 +81215,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -81436,7 +81281,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-typescript': 7.22.15(@babel/core@7.28.3) @@ -81446,7 +81291,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) '@types/mocha': 10.0.10 '@types/react': 17.0.83 @@ -81499,7 +81344,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-typescript': 7.22.15(@babel/core@7.28.3) @@ -81509,7 +81354,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) '@types/mocha': 10.0.10 '@types/react': 17.0.83 @@ -81562,7 +81407,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.envs.node-typescript-mocha@0.1.6(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-typescript': 7.22.15(@babel/core@7.28.3) @@ -81572,7 +81417,7 @@ snapshots: '@teambit/defender.mocha-tester': 1.1.1(@babel/core@7.28.3)(react@17.0.2) '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) '@types/mocha': 10.0.10 '@types/react': 17.0.83 @@ -81633,7 +81478,7 @@ snapshots: dependencies: lodash: 4.17.21 - '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/core': 7.26.9 '@babel/plugin-proposal-decorators': 7.20.2(@babel/core@7.26.9) @@ -81650,9 +81495,9 @@ snapshots: '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@19.2.0) '@teambit/node.generator.node-starters': 1.0.0 '@teambit/node.generator.node-templates': 1.0.22 - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@19.2.0) '@types/jest': 29.5.14 '@types/node': 22.10.5 @@ -81716,7 +81561,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/core': 7.26.9 '@babel/plugin-proposal-decorators': 7.20.2(@babel/core@7.26.9) @@ -81733,9 +81578,9 @@ snapshots: '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@19.2.0) '@teambit/node.generator.node-starters': 1.0.0 '@teambit/node.generator.node-templates': 1.0.22 - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@19.2.0) '@types/jest': 29.5.14 '@types/node': 22.10.5 @@ -81799,7 +81644,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/node.node@1.3.4(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/core': 7.26.9 '@babel/plugin-proposal-decorators': 7.20.2(@babel/core@7.26.9) @@ -81816,9 +81661,9 @@ snapshots: '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@19.2.0) '@teambit/node.generator.node-starters': 1.0.0 '@teambit/node.generator.node-templates': 1.0.22 - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.react-env': 1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@19.2.0) '@types/jest': 29.5.14 '@types/node': 22.10.5 @@ -82008,7 +81853,6 @@ snapshots: '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/graph.cleargraph': 0.0.11 - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.concurrency': file:scopes/harmony/modules/concurrency '@teambit/harmony.modules.get-basic-log': file:scopes/harmony/modules/get-basic-log(graphql@15.8.0) '@teambit/harmony.modules.in-memory-cache': file:scopes/harmony/modules/in-memory-cache @@ -82053,7 +81897,6 @@ snapshots: '@teambit/panels@file:scopes/ui-foundation/panels(@types/react@17.0.83)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -82064,7 +81907,6 @@ snapshots: '@teambit/panels@file:scopes/ui-foundation/panels(@types/react@17.0.83)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -82178,18 +82020,16 @@ snapshots: '@teambit/pkg.entities.registry@0.0.4': {} - '@teambit/pkg.modules.component-package-name@0.0.56(graphql@15.8.0)': + '@teambit/pkg.modules.component-package-name@0.0.56': dependencies: '@teambit/component-id': 1.2.4 '@teambit/legacy.constants': 0.0.11 - '@teambit/legacy.consumer-config': 0.0.49(graphql@15.8.0) + '@teambit/legacy.consumer-config': 0.0.49 '@teambit/legacy.extension-data': 0.0.51(graphql@15.8.0) '@teambit/legacy.utils': 0.0.21 '@teambit/toolbox.path.path': 0.0.8 transitivePeerDependencies: - - domexception - encoding - - graphql - supports-color '@teambit/pkg.modules.component-package-name@file:components/modules/component-package-name(graphql@15.8.0)': @@ -82378,7 +82218,6 @@ snapshots: '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/dependencies.aspect-docs.pnpm': file:scopes/dependencies/aspect-docs/pnpm(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.pnpm.dep-path': 1.0.1 - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.logger': file:components/legacy/logger @@ -82436,7 +82275,6 @@ snapshots: '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/dependencies.aspect-docs.pnpm': file:scopes/dependencies/aspect-docs/pnpm(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.pnpm.dep-path': 1.0.1 - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.logger': file:components/legacy/logger @@ -82494,7 +82332,6 @@ snapshots: '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/dependencies.aspect-docs.pnpm': file:scopes/dependencies/aspect-docs/pnpm(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.pnpm.dep-path': 1.0.1 - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.logger': file:components/legacy/logger @@ -82552,7 +82389,6 @@ snapshots: '@teambit/component-package-version': file:scopes/component/component-package-version '@teambit/dependencies.aspect-docs.pnpm': file:scopes/dependencies/aspect-docs/pnpm(react-dom@17.0.2)(react@19.2.0) '@teambit/dependencies.pnpm.dep-path': 1.0.1 - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.logger': file:components/legacy/logger @@ -82587,7 +82423,6 @@ snapshots: dependencies: '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/defender.prettier.config-mutator': file:scopes/defender/prettier-config-mutator - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -82603,7 +82438,6 @@ snapshots: dependencies: '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) '@teambit/defender.prettier.config-mutator': file:scopes/defender/prettier-config-mutator - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -82640,11 +82474,11 @@ snapshots: '@teambit/preview.modules.preview-modules@1.0.3': {} - '@teambit/preview.react-preview@1.0.102(@babel/core@7.19.6)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.19.6)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82694,11 +82528,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82748,11 +82582,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(typescript@5.5.3) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@19.2.0) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@19.2.0)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82802,11 +82636,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@19.2.0) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@19.2.0)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82856,11 +82690,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@19.2.0) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@19.2.0)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82910,11 +82744,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -82964,11 +82798,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83018,11 +82852,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.5.3) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83072,11 +82906,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83126,11 +82960,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83180,11 +83014,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83234,11 +83068,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83288,11 +83122,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83342,11 +83176,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83396,11 +83230,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83450,11 +83284,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83504,11 +83338,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83558,11 +83392,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83612,11 +83446,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83666,11 +83500,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/react.mounter': 1.0.53(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/ui-foundation.ui.rendering.html': 0.0.95(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@18.3.1) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) @@ -83720,11 +83554,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/preview.react-preview@1.1.5(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': + '@teambit/preview.react-preview@1.1.5(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)': dependencies: '@bitdev/react.preview.react-docs-app': 0.0.11 '@teambit/react.mounter': 1.1.2(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/react.webpack.react-webpack': 1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/webpack.webpack-bundler': 1.0.18(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(esbuild@0.14.29)(lightningcss@1.28.2)(react@17.0.2) '@teambit/webpack.webpack-dev-server': 1.0.24(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(lightningcss@1.28.2)(react@17.0.2)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack@5.97.1) html-webpack-inject-plugin: 5.3.1(html-webpack-plugin@5.3.2)(webpack@5.97.1) @@ -83847,7 +83681,7 @@ snapshots: - '@types/chai' - chai - '@teambit/preview@file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1)': + '@teambit/preview@file:scopes/preview/preview(@testing-library/react@12.1.5)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1)': dependencies: '@mdx-js/loader': 3.1.1(webpack@5.97.1) '@rspack/core': 1.7.8 @@ -83858,7 +83692,7 @@ snapshots: '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/harmony.modules.harmony-root-generator': file:components/modules/harmony-root-generator '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/preview.aspect-docs.preview': file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/preview.cli.webpack-events-listener': file:scopes/preview/cli/webpack-events-listener @@ -83905,7 +83739,7 @@ snapshots: - supports-color - webpack - '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(webpack@5.97.1)': + '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(webpack@5.97.1)': dependencies: '@mdx-js/loader': 3.1.1(webpack@5.97.1) '@rspack/core': 1.7.8 @@ -83916,7 +83750,7 @@ snapshots: '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/harmony.modules.harmony-root-generator': file:components/modules/harmony-root-generator '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/preview.aspect-docs.preview': file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/preview.cli.webpack-events-listener': file:scopes/preview/cli/webpack-events-listener @@ -83963,7 +83797,7 @@ snapshots: - supports-color - webpack - '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1)': + '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1)': dependencies: '@mdx-js/loader': 3.1.1(webpack@5.97.1) '@rspack/core': 1.7.8 @@ -83974,7 +83808,7 @@ snapshots: '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/harmony.modules.harmony-root-generator': file:components/modules/harmony-root-generator '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/preview.aspect-docs.preview': file:scopes/preview/aspect-docs/preview(react-dom@17.0.2)(react@17.0.2) '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/preview.cli.webpack-events-listener': file:scopes/preview/cli/webpack-events-listener @@ -84021,7 +83855,7 @@ snapshots: - supports-color - webpack - '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(webpack@5.97.1)': + '@teambit/preview@file:scopes/preview/preview(@testing-library/react@13.4.0)(@types/chai@5.2.2)(@types/react-dom@17.0.26)(@types/react@17.0.83)(chai@5.2.1)(graphql@15.8.0)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(webpack@5.97.1)': dependencies: '@mdx-js/loader': 3.1.1(webpack@5.97.1) '@rspack/core': 1.7.8 @@ -84032,7 +83866,7 @@ snapshots: '@teambit/harmony.modules.feature-toggle': file:scopes/harmony/modules/feature-toggle '@teambit/harmony.modules.harmony-root-generator': file:components/modules/harmony-root-generator '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/preview.aspect-docs.preview': file:scopes/preview/aspect-docs/preview(react-dom@19.2.0)(react@19.2.0) '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/preview.cli.webpack-events-listener': file:scopes/preview/cli/webpack-events-listener @@ -84081,7 +83915,6 @@ snapshots: '@teambit/pubsub@file:scopes/harmony/pubsub(@types/react@17.0.83)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -84092,7 +83925,6 @@ snapshots: '@teambit/pubsub@file:scopes/harmony/pubsub(@types/react@17.0.83)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) @@ -84146,11 +83978,11 @@ snapshots: transitivePeerDependencies: - '@testing-library/react' - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.19.6)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.19.6)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84199,11 +84031,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84252,11 +84084,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84305,11 +84137,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84358,11 +84190,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84411,11 +84243,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84464,11 +84296,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84517,11 +84349,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84570,11 +84402,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.apps.react-app-types@2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@teambit/bit-error': 0.0.404 '@teambit/react.rendering.ssr': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/react.webpack.react-webpack': 1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/toolbox.network.get-port': 1.0.10 '@teambit/ui-foundation.ui.pages.static-error': 0.0.108(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.transformers.favicon-reload': 1.0.0 @@ -84958,7 +84790,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@teambit/react.react-env@1.2.4(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.19.6)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -84968,8 +84800,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.19.6)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.19.6)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.19.6)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.19.6)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85041,7 +84873,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85051,8 +84883,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85124,7 +84956,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85134,8 +84966,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85207,7 +85039,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85217,8 +85049,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.26.9)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.26.9)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85290,7 +85122,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85300,8 +85132,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85373,7 +85205,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85383,8 +85215,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85456,7 +85288,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85466,8 +85298,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85539,7 +85371,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85549,8 +85381,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85622,7 +85454,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85632,8 +85464,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85705,7 +85537,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85715,8 +85547,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -85788,7 +85620,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.react-env@1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/runtime': 7.20.0 '@mdx-js/react': 1.6.22(react@18.3.1) @@ -85798,8 +85630,8 @@ snapshots: '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@18.3.1) '@teambit/docs.docs-template': 1.0.12(@mdx-js/react@1.6.22)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@18.3.1)(react@18.3.1)(typescript@5.9.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@18.3.1) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.apps.react-app-types': 2.1.0(@babel/core@7.28.3)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@13.4.0)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(less@4.2.1)(lightningcss@1.28.2)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.eslint-config-bit-react': 1.0.242(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.56.0)(typescript@5.9.2) '@teambit/react.generator.react-starters': 1.0.9 '@teambit/react.generator.react-templates': 1.0.13 @@ -87345,7 +87177,7 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@apollo/client': 3.12.2(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(subscriptions-transport-ws@0.9.19) '@babel/runtime': 7.20.0 @@ -87355,8 +87187,8 @@ snapshots: '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.5)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.5.3) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -87427,7 +87259,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.63.6)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.63.6)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@apollo/client': 3.12.2(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(subscriptions-transport-ws@0.9.19) '@babel/runtime': 7.20.0 @@ -87437,8 +87269,8 @@ snapshots: '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.3.2)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -87509,7 +87341,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.v17.react-env@1.2.5(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(sass@1.92.1)(subscriptions-transport-ws@0.9.19)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@apollo/client': 3.12.2(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(subscriptions-transport-ws@0.9.19) '@babel/runtime': 7.20.0 @@ -87519,8 +87351,8 @@ snapshots: '@teambit/defender.prettier-formatter': 1.0.23(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.modules.packages-excluder': 1.0.8(react@17.0.2) '@teambit/mdx.ui.mdx-scope-context': 1.0.7(@types/react@17.0.83)(react@17.0.2) - '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) - '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) + '@teambit/preview.react-preview': 1.0.102(@babel/core@7.28.3)(@mdx-js/react@1.6.22)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(graphql@15.8.0)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5) + '@teambit/react.react-env': 1.2.4(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@rspack/core@1.7.8)(@swc/css@0.0.20)(@types/react-syntax-highlighter@15.5.13)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(html-webpack-plugin@5.6.3)(less@4.2.1)(lightningcss@1.28.2)(react-test-renderer@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2) '@teambit/react.v17.docs-template': 1.0.7(@mdx-js/react@1.6.22)(@testing-library/react@12.1.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(graphql@15.8.0)(react-dom@17.0.2)(react@17.0.2)(typescript@5.9.2) '@teambit/react.v17.mounter': 1.0.1(react-dom@17.0.2)(react@17.0.2) '@teambit/typescript.typescript-compiler': 2.0.68(react@17.0.2) @@ -87591,7 +87423,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.19.6) '@babel/preset-react': 7.22.15(@babel/core@7.19.6) @@ -87603,7 +87435,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -87620,7 +87452,7 @@ snapshots: postcss: 8.4.19 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.19) postcss-loader: 7.0.1(postcss@8.4.19)(webpack@5.97.1) - postcss-normalize: 10.0.1(browserslist@4.28.2)(postcss@8.4.19) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.19) postcss-preset-env: 7.8.3(postcss@8.4.19) react-dev-utils: 12.0.1(eslint@8.56.0)(typescript@5.9.2)(webpack@5.97.1) react-dom: 18.3.1(react@18.3.1) @@ -87661,7 +87493,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.19.6)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.19.6) '@babel/preset-react': 7.22.15(@babel/core@7.19.6) @@ -87673,7 +87505,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -87690,7 +87522,7 @@ snapshots: postcss: 8.4.19 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.19) postcss-loader: 7.0.1(postcss@8.4.19)(webpack@5.97.1) - postcss-normalize: 10.0.1(browserslist@4.28.2)(postcss@8.4.19) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.19) postcss-preset-env: 7.8.3(postcss@8.4.19) react-dev-utils: 12.0.1(eslint@8.56.0)(typescript@5.9.2)(webpack@5.97.1) react-dom: 18.3.1(react@18.3.1) @@ -87731,7 +87563,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -87743,7 +87575,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -87801,7 +87633,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -87813,7 +87645,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -87871,7 +87703,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -87883,7 +87715,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -87941,7 +87773,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -87953,7 +87785,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88011,7 +87843,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -88023,7 +87855,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88081,7 +87913,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -88093,7 +87925,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88151,7 +87983,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -88163,7 +87995,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88221,7 +88053,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -88233,7 +88065,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88291,7 +88123,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.26.9)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@19.2.0)(react@19.2.0)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.26.9) '@babel/preset-react': 7.22.15(@babel/core@7.26.9) @@ -88303,7 +88135,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@19.2.0)(react@19.2.0) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88361,7 +88193,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88373,7 +88205,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88431,7 +88263,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88443,7 +88275,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88501,7 +88333,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.5.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88513,7 +88345,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88571,7 +88403,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88583,7 +88415,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88641,7 +88473,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88653,7 +88485,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88711,7 +88543,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.5)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88723,7 +88555,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88781,7 +88613,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88793,7 +88625,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88851,7 +88683,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88863,7 +88695,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88921,7 +88753,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -88933,7 +88765,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -88991,7 +88823,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89003,7 +88835,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89061,7 +88893,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89073,7 +88905,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89131,7 +88963,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.92.1)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89143,7 +88975,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89201,7 +89033,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89213,7 +89045,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89271,7 +89103,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.53.3)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.54(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.28.2)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@18.3.1)(react@18.3.1)(rollup@4.60.4)(sass@1.72.0)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.22.15(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89283,7 +89115,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.2(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@18.3.1)(react@18.3.1) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89341,7 +89173,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': + '@teambit/react.webpack.react-webpack@1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.0)': dependencies: '@babel/preset-env': 7.29.2(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89354,7 +89186,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89412,7 +89244,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react.webpack.react-webpack@1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.53.3)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react.webpack.react-webpack@1.0.56(@babel/core@7.28.3)(@rspack/core@1.7.8)(@types/webpack@5.28.5)(browserslist@4.23.3)(bufferutil@4.0.3)(debug@4.3.4)(eslint@8.56.0)(less@4.2.1)(react-dom@17.0.2)(react@17.0.2)(rollup@4.60.4)(sass@1.63.6)(type-fest@0.21.3)(typescript@5.9.2)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/preset-env': 7.29.2(@babel/core@7.28.3) '@babel/preset-react': 7.22.15(@babel/core@7.28.3) @@ -89425,7 +89257,7 @@ snapshots: '@swc/css': 0.0.20 '@teambit/component-id': 1.2.4 '@teambit/mdx.modules.mdx-pre-loader': 0.0.1 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': 1.0.34(react-dom@17.0.2)(react@17.0.2) '@teambit/webpack.modules.generate-style-loaders': 1.0.21 '@teambit/webpack.modules.style-regexps': 1.0.10 @@ -89483,7 +89315,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react@file:scopes/react/react(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@19.2.0)(react-router-dom@6.30.1)(react@19.2.0)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react@file:scopes/react/react(@babel/core@7.26.9)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@19.2.0)(react-router-dom@6.30.1)(react@19.2.0)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/helper-plugin-test-runner': 7.16.7 '@babel/preset-env': 7.28.3(@babel/core@7.26.9) @@ -89510,7 +89342,7 @@ snapshots: '@teambit/design.ui.input.option-button': 1.0.13(react-dom@19.2.0)(react@19.2.0) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@19.2.0)(react@19.2.0) '@teambit/harmony': 0.4.7 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': file:scopes/react/bit-react-transformer '@teambit/react.eslint-config-bit-react': file:scopes/react/eslint-config-bit-react(eslint@8.56.0)(jest@29.3.1)(typescript@5.9.2) '@teambit/react.instructions.react.adding-compositions': 0.0.7(@types/react@17.0.83)(react-dom@19.2.0)(react@19.2.0) @@ -89620,7 +89452,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react@file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react@file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react-hooks@8.0.1)(@testing-library/react@12.1.5)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/helper-plugin-test-runner': 7.16.7 '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -89647,7 +89479,7 @@ snapshots: '@teambit/design.ui.input.option-button': 1.0.13(react-dom@17.0.2)(react@17.0.2) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony': 0.4.7 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': file:scopes/react/bit-react-transformer '@teambit/react.eslint-config-bit-react': file:scopes/react/eslint-config-bit-react(eslint@8.56.0)(jest@29.3.1)(typescript@5.9.2) '@teambit/react.instructions.react.adding-compositions': 0.0.7(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) @@ -89757,7 +89589,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@teambit/react@file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.53.3)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': + '@teambit/react@file:scopes/react/react(@babel/core@7.28.3)(@babel/traverse@7.29.0)(@parcel/css@1.14.0)(@swc/css@0.0.20)(@teambit/base-react.navigation.link@2.0.33)(@testing-library/react@13.4.0)(@types/node@22.10.5)(@types/react-dom@17.0.26)(@types/react-syntax-highlighter@15.5.13)(@types/react@17.0.83)(@types/webpack@5.28.5)(babel-plugin-macros@3.1.0)(browserslist@4.28.2)(bufferutil@4.0.3)(graphql@15.8.0)(lightningcss@1.28.2)(postcss@8.4.45)(react-dom@17.0.2)(react-router-dom@6.30.1)(react@17.0.2)(rollup@4.60.4)(type-fest@0.21.3)(utf-8-validate@5.0.5)(webpack-dev-server@4.15.2)': dependencies: '@babel/helper-plugin-test-runner': 7.16.7 '@babel/preset-env': 7.28.3(@babel/core@7.28.3) @@ -89784,7 +89616,7 @@ snapshots: '@teambit/design.ui.input.option-button': 1.0.13(react-dom@17.0.2)(react@17.0.2) '@teambit/design.ui.tooltip': file:components/ui/tooltip(react-dom@17.0.2)(react@17.0.2) '@teambit/harmony': 0.4.7 - '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.53.3) + '@teambit/mdx.modules.mdx-v3-options': 0.0.3(rollup@4.60.4) '@teambit/react.babel.bit-react-transformer': file:scopes/react/bit-react-transformer '@teambit/react.eslint-config-bit-react': file:scopes/react/eslint-config-bit-react(eslint@8.56.0)(jest@29.3.1)(typescript@5.9.2) '@teambit/react.instructions.react.adding-compositions': 0.0.7(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) @@ -89896,7 +89728,6 @@ snapshots: '@teambit/readme@file:scopes/mdx/readme': dependencies: '@babel/runtime': 7.20.0 - '@teambit/harmony': 0.4.7 core-js: 3.13.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -89905,7 +89736,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.utils': file:components/legacy/utils '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -89925,7 +89755,6 @@ snapshots: '@teambit/component-id': 1.2.4 '@teambit/component-issues': file:components/component-issues '@teambit/component.sources': file:scopes/component/sources(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) @@ -89959,7 +89788,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy-bit-id': 1.1.3 '@teambit/workspace.modules.node-modules-linker': file:scopes/workspace/modules/node-modules-linker(graphql@15.8.0) @@ -89991,7 +89819,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component.testing.mock-components': file:scopes/component/testing/mock-components(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/harmony.testing.load-aspect': file:scopes/harmony/testing/load-aspect(graphql@15.8.0) '@teambit/legacy-bit-id': 1.1.3 '@teambit/workspace.modules.node-modules-linker': file:scopes/workspace/modules/node-modules-linker(graphql@15.8.0) @@ -90996,7 +90823,6 @@ snapshots: dependencies: '@babel/runtime': 7.20.0 '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 chalk: 4.1.2 core-js: 3.13.0 lodash: 4.17.21 @@ -91007,7 +90833,6 @@ snapshots: dependencies: '@babel/runtime': 7.20.0 '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 chalk: 4.1.2 core-js: 3.13.0 lodash: 4.17.21 @@ -91228,7 +91053,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 '@teambit/component.modules.merge-helper': file:scopes/component/modules/merge-helper - '@teambit/harmony': 0.4.7 '@teambit/harmony.modules.get-basic-log': file:scopes/harmony/modules/get-basic-log(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants '@teambit/legacy.consumer-component': file:components/legacy/consumer-component(graphql@15.8.0) @@ -91252,7 +91076,6 @@ snapshots: '@teambit/component-issues': file:components/component-issues '@teambit/component-version': 1.0.4 '@teambit/component.snap-distance': file:scopes/component/snap-distance(graphql@15.8.0) - '@teambit/harmony': 0.4.7 '@teambit/lane-id': 0.0.312 '@teambit/legacy.component-list': file:components/legacy/component-list(graphql@15.8.0) '@teambit/legacy.constants': file:components/legacy/constants @@ -91817,7 +91640,6 @@ snapshots: dependencies: '@teambit/bit-error': 0.0.404 '@teambit/component-id': 1.2.4 - '@teambit/harmony': 0.4.7 '@teambit/legacy-bit-id': 1.1.3 '@teambit/legacy.analytics': file:components/legacy/analytics '@teambit/legacy.bit-map': file:components/legacy/bit-map(graphql@15.8.0) @@ -94170,7 +93992,6 @@ snapshots: '@teambit/user-agent@file:scopes/ui-foundation/user-agent(@types/react@17.0.83)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/ui-foundation.ui.hooks.use-user-agent': 0.0.200(react-dom@17.0.2)(react@17.0.2) '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -94183,7 +94004,6 @@ snapshots: '@teambit/user-agent@file:scopes/ui-foundation/user-agent(@types/react@17.0.83)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/ui-foundation.ui.hooks.use-user-agent': 0.0.200(react-dom@17.0.2)(react@19.2.0) '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -94196,7 +94016,6 @@ snapshots: '@teambit/validator@file:scopes/defender/validator': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -94207,7 +94026,6 @@ snapshots: '@teambit/variants@file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@17.0.2)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy-bit-id': 1.1.3 '@teambit/legacy.extension-data': file:components/legacy/extension-data(graphql@15.8.0) '@teambit/toolbox.path.path': file:scopes/toolbox/path/path @@ -94227,7 +94045,6 @@ snapshots: '@teambit/variants@file:scopes/workspace/variants(@types/react@17.0.83)(graphql@15.8.0)(react@19.2.0)': dependencies: - '@teambit/harmony': 0.4.7 '@teambit/legacy-bit-id': 1.1.3 '@teambit/legacy.extension-data': file:components/legacy/extension-data(graphql@15.8.0) '@teambit/toolbox.path.path': file:scopes/toolbox/path/path @@ -94245,28 +94062,19 @@ snapshots: - graphql - supports-color - '@teambit/version-history@file:scopes/scope/version-history(graphql@15.8.0)': + '@teambit/version-history@file:scopes/scope/version-history': dependencies: - '@teambit/bit-error': 0.0.404 - '@teambit/component-id': 1.2.4 - '@teambit/harmony': 0.4.7 '@teambit/legacy.constants': file:components/legacy/constants - '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/legacy.dependency-graph': file:components/legacy/dependency-graph(graphql@15.8.0) '@teambit/legacy.scope': file:components/legacy/scope(graphql@15.8.0) - '@teambit/legacy.scope-api': file:components/legacy/scope-api(graphql@15.8.0) - '@teambit/scope.remotes': file:components/scope/remotes(graphql@15.8.0) '@types/node': 22.10.5 '@types/react': 17.0.83 '@types/react-dom': 17.0.26(@types/react@17.0.83) chalk: 4.1.2 - lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) transitivePeerDependencies: - - domexception - encoding - - graphql - supports-color '@teambit/vue-aspect@file:scopes/vue/vue(@types/react@17.0.83)(react@17.0.2)(typescript@5.5.3)': @@ -94275,7 +94083,6 @@ snapshots: '@teambit/api-reference.models.api-reference-model': 0.0.53(react-dom@17.0.2)(react@17.0.2) '@teambit/documenter.ui.table': 4.1.10(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@teambit/documenter.ui.table-row': 4.1.14(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) - '@teambit/harmony': 0.4.7 '@teambit/semantics.entities.semantic-schema': file:components/entities/semantic-schema '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -94293,7 +94100,6 @@ snapshots: '@teambit/api-reference.models.api-reference-model': 0.0.53(react-dom@17.0.2)(react@19.2.0) '@teambit/documenter.ui.table': 4.1.10(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) '@teambit/documenter.ui.table-row': 4.1.14(@types/react-dom@17.0.26)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) - '@teambit/harmony': 0.4.7 '@teambit/semantics.entities.semantic-schema': file:components/entities/semantic-schema '@types/node': 22.10.5 '@types/react': 17.0.83 @@ -94927,7 +94733,6 @@ snapshots: '@teambit/webpack@file:scopes/webpack/webpack(@types/react@17.0.83)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(react@17.0.2)(typescript@5.5.3)(utf-8-validate@5.0.5)': dependencies: '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/toolbox.path.path': file:scopes/toolbox/path/path '@teambit/webpack.modules.config-mutator': file:scopes/webpack/config-mutator(esbuild@0.14.29) @@ -94990,7 +94795,6 @@ snapshots: '@teambit/webpack@file:scopes/webpack/webpack(@types/react@17.0.83)(bufferutil@4.0.3)(debug@4.3.4)(esbuild@0.14.29)(eslint@8.56.0)(react@19.2.0)(typescript@5.5.3)(utf-8-validate@5.0.5)': dependencies: '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 '@teambit/preview.cli.dev-server-events-listener': 0.0.1 '@teambit/toolbox.path.path': file:scopes/toolbox/path/path '@teambit/webpack.modules.config-mutator': file:scopes/webpack/config-mutator(esbuild@0.14.29) @@ -95073,7 +94877,6 @@ snapshots: '@teambit/workspace-config-files@file:scopes/workspace/workspace-config-files(@types/chai@5.2.2)(chai@5.2.1)': dependencies: '@teambit/bit-error': 0.0.404 - '@teambit/harmony': 0.4.7 '@teambit/legacy.consumer': file:components/legacy/consumer(graphql@15.8.0) '@teambit/toolbox.crypto.sha1': file:components/crypto/sha1 '@teambit/toolbox.path.path': file:scopes/toolbox/path/path @@ -95818,7 +95621,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/dependencies.aspect-docs.yarn': file:scopes/dependencies/aspect-docs/yarn(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.fs.linked-dependencies': file:scopes/dependencies/fs/linked-dependencies - '@teambit/harmony': 0.4.7 '@teambit/pkg.entities.registry': 0.0.4 '@teambit/ui-foundation.ui.use-box.menu': 1.0.16(@testing-library/react@12.1.5)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@types/node': 22.10.5 @@ -95851,7 +95653,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/dependencies.aspect-docs.yarn': file:scopes/dependencies/aspect-docs/yarn(react-dom@17.0.2)(react@17.0.2) '@teambit/dependencies.fs.linked-dependencies': file:scopes/dependencies/fs/linked-dependencies - '@teambit/harmony': 0.4.7 '@teambit/pkg.entities.registry': 0.0.4 '@teambit/ui-foundation.ui.use-box.menu': 1.0.16(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@17.0.2) '@types/node': 22.10.5 @@ -95884,7 +95685,6 @@ snapshots: '@teambit/bit-error': 0.0.404 '@teambit/dependencies.aspect-docs.yarn': file:scopes/dependencies/aspect-docs/yarn(react-dom@17.0.2)(react@19.2.0) '@teambit/dependencies.fs.linked-dependencies': file:scopes/dependencies/fs/linked-dependencies - '@teambit/harmony': 0.4.7 '@teambit/pkg.entities.registry': 0.0.4 '@teambit/ui-foundation.ui.use-box.menu': 1.0.16(@testing-library/react@13.4.0)(@types/react@17.0.83)(react-dom@17.0.2)(react@19.2.0) '@types/node': 22.10.5 @@ -99605,6 +99405,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + clone-buffer@1.0.0: {} clone-deep@4.0.1: @@ -100663,6 +100469,8 @@ snapshots: emittery@0.13.1: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -101772,10 +101580,6 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.6(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -102098,6 +101902,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.3.0: @@ -103093,6 +102899,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} + is-inner-link@4.0.0: dependencies: is-subdir: 1.2.0 @@ -103152,6 +102960,10 @@ snapshots: is-promise@4.0.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.0: dependencies: call-bind: 1.0.8 @@ -104268,6 +104080,10 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -105489,6 +105305,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -106843,6 +106668,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + preferred-pm@3.1.4: dependencies: find-up: 5.0.0 @@ -108146,36 +107973,48 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + rollup-plugin-visualizer@7.0.1(rollup@4.60.4): + dependencies: + open: 11.0.0 + picomatch: 4.0.4 + source-map: 0.7.4 + yargs: 18.0.0 + optionalDependencies: + rollup: 4.60.4 + rollup@2.79.2: optionalDependencies: fsevents: 2.3.3 - rollup@4.53.3: + rollup@4.60.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 fsevents: 2.3.3 root-link-target@3.1.0: @@ -108912,6 +108751,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.8 @@ -109312,7 +109157,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 tinyglobby@0.2.15: @@ -110698,6 +110543,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -110755,6 +110606,11 @@ snapshots: dependencies: is-wsl: 3.1.1 + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + xml-name-validator@3.0.0: {} xml-name-validator@4.0.0: {} @@ -110804,6 +110660,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs-unparser@2.0.0: dependencies: camelcase: 6.2.0 @@ -110855,6 +110713,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yesno@0.4.0: {} yn@2.0.0: {} diff --git a/prototypes/mini-bit/README.md b/prototypes/mini-bit/README.md new file mode 100644 index 000000000000..5de1febbaa10 --- /dev/null +++ b/prototypes/mini-bit/README.md @@ -0,0 +1,79 @@ +# mini-bit + +Runnable prototype of the architecture proposed in +[`../../docs/rfc-esm-lazy-aspects.md`](../../docs/rfc-esm-lazy-aspects.md): +a Harmony-style aspect system on **native ESM** with **lazy dynamic-import** of +aspect runtimes, driven by a static command index. + +## What this demonstrates + +| Concept | Where to look | +| --- | --- | +| Aspect manifest / runtime split | `src//.aspect.js` (tiny) vs `.main.runtime.js` (heavy) | +| Lazy runtime loading via `() => import(...)` thunks | `src/cli/cli.aspect.js:7` and every other `*.aspect.js` | +| Command descriptors (data only, inlined) | `src//.commands.js` | +| Static command index | `src/command-index.generated.js` | +| Lazy Harmony resolver | `src/harmony/harmony.js#resolve` | +| Simulated heavy aspect cost | each aspect's `*-internals.js` busy-loops at module top level | +| Eager-mode fallback for comparison | `BIT_EAGER=1` | +| Per-aspect load tracing | `BIT_TRACE_ASPECT_LOAD=1` | + +## Run it + +Requires Node 18+ (anything with native ESM works). + +```sh +# fast paths — no aspect runtime loads +node bin/mini-bit.js --version +node bin/mini-bit.js --help + +# real commands (lazy mode by default) +BIT_TRACE_ASPECT_LOAD=1 node bin/mini-bit.js status +BIT_TRACE_ASPECT_LOAD=1 node bin/mini-bit.js install +BIT_TRACE_ASPECT_LOAD=1 node bin/mini-bit.js compile + +# eager mode for comparison +BIT_TRACE_ASPECT_LOAD=1 BIT_EAGER=1 node bin/mini-bit.js status +``` + +## What you should see + +In **lazy mode**, `bit status` loads exactly the aspects on its path: +`cli`, `logger`, `scope`, `workspace`, `status`. The `compiler` and `install` +runtimes are never imported. + +In **eager mode** (today's Bit behaviour), *every* core aspect runtime is +imported and its `provider()` runs, regardless of which command the user typed. + +The trailing `--- N aspect runtime(s) loaded in Mms ---` summary makes the +difference visible at a glance. + +## Layout + +``` +bin/mini-bit.js Entry point. Builds Harmony, dispatches. +src/harmony/ + aspect.js Aspect.create — manifest with lazy runtime thunk + harmony.js Harmony.load + Harmony.resolve (lazy DI) + tracer.js Per-aspect load tracing & summary +src// + .aspect.js Manifest (id, deps, runtime thunk) + .main.runtime.js Provider + command registration (heavy) + .commands.js Descriptor data (only for aspects with commands) + -internals.js Simulated weight at module-top-level +src/command-index.generated.js Static name → aspect mapping (would be codegen'd) +src/bit/bit.aspect.js Meta-aspect listing all cores (eager mode only) +``` + +## What's missing vs real Bit + +This is a prototype, not a port. Notably: +- **Slot machinery is omitted.** Aspects extend each other today via slots + (e.g., `commandsSlot`, `OnStartSlot`). The lazy-load model still works with + slots — see RFC §6.6 / §6.8 for the slot-producer index design — but adding + them here would obscure the core demonstration. +- **No yargs.** A real CLI needs argv parsing with subcommands, flags, help + rendering, completion. The prototype dispatches by `argv[0]` only. +- **No workspace.jsonc / config plumbing.** Harmony's `config` map is stubbed. +- **No user-extension loader.** RFC §6.7 specifies that user extensions use the + same `harmony.resolve` path as core; trivial to bolt on top of what's here. diff --git a/prototypes/mini-bit/bin/mini-bit.js b/prototypes/mini-bit/bin/mini-bit.js new file mode 100755 index 000000000000..1a6032b10f2e --- /dev/null +++ b/prototypes/mini-bit/bin/mini-bit.js @@ -0,0 +1,39 @@ +#!/usr/bin/env node +import { Harmony } from '../src/harmony/harmony.js'; +import { CLIAspect } from '../src/cli/cli.aspect.js'; +import { BitAspect } from '../src/bit/bit.aspect.js'; +import { trace, summarize } from '../src/harmony/tracer.js'; + +const argv = process.argv.slice(2); +const eager = process.env.BIT_EAGER === '1'; +const t0 = Date.now(); + +async function main() { + trace(`mode=${eager ? 'eager' : 'lazy'}`); + + let harmony; + if (eager) { + // Eager mode mirrors today's Bit: register all manifests via BitAspect, + // then force every reachable aspect to resolve before dispatch. + harmony = await Harmony.load([BitAspect], 'main', {}); + for (const id of harmony.manifests.keys()) { + // Skip BitAspect itself; it's already resolved by load(). + if (!harmony.instances.has(id)) await harmony.resolve(id); + } + } else { + // Lazy mode: register all manifests (cheap — pure data, no runtime imports), + // but only resolve CLI. The dispatcher triggers further resolves on demand. + harmony = await Harmony.load([CLIAspect], 'main', {}, [BitAspect]); + } + + const cli = harmony.get(CLIAspect.id); + await cli.run(argv); +} + +main() + .then(() => summarize(Date.now() - t0)) + .catch((err) => { + process.stderr.write(`error: ${err.message}\n`); + if (process.env.DEBUG) process.stderr.write(err.stack + '\n'); + process.exit(1); + }); diff --git a/prototypes/mini-bit/package.json b/prototypes/mini-bit/package.json new file mode 100644 index 000000000000..8028a169bd51 --- /dev/null +++ b/prototypes/mini-bit/package.json @@ -0,0 +1,14 @@ +{ + "name": "mini-bit", + "version": "0.1.0", + "private": true, + "type": "module", + "description": "Tiny prototype demonstrating lazy-loaded aspect architecture for Bit's ESM migration (see docs/rfc-esm-lazy-aspects.md)", + "bin": { + "mini-bit": "./bin/mini-bit.js" + }, + "scripts": { + "start": "node bin/mini-bit.js", + "demo": "node scripts/demo.js" + } +} diff --git a/prototypes/mini-bit/src/bit/bit.aspect.js b/prototypes/mini-bit/src/bit/bit.aspect.js new file mode 100644 index 000000000000..d574a7f3345a --- /dev/null +++ b/prototypes/mini-bit/src/bit/bit.aspect.js @@ -0,0 +1,28 @@ +// Meta-aspect that declares the full set of core aspects. +// Used only by eager mode (and by tooling that needs the full manifest). +import { Aspect } from '../harmony/aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { ScopeAspect } from '../scope/scope.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { StatusAspect } from '../status/status.aspect.js'; +import { InstallAspect } from '../install/install.aspect.js'; +import { CompilerAspect } from '../compiler/compiler.aspect.js'; + +export const BitAspect = Aspect.create({ + id: 'teambit.harmony/bit', + dependencies: [ + CLIAspect, + LoggerAspect, + ScopeAspect, + WorkspaceAspect, + StatusAspect, + InstallAspect, + CompilerAspect, + ], + runtimes: { + main: () => import('./bit.main.runtime.js'), + }, +}); + +export default BitAspect; diff --git a/prototypes/mini-bit/src/bit/bit.main.runtime.js b/prototypes/mini-bit/src/bit/bit.main.runtime.js new file mode 100644 index 000000000000..c45bd02c3eee --- /dev/null +++ b/prototypes/mini-bit/src/bit/bit.main.runtime.js @@ -0,0 +1,8 @@ +import { BitAspect } from './bit.aspect.js'; + +export class BitMain { + static id = BitAspect.id; + static dependencies = []; + static slots = []; + static async provider() { return new BitMain(); } +} diff --git a/prototypes/mini-bit/src/cli/cli-main.js b/prototypes/mini-bit/src/cli/cli-main.js new file mode 100644 index 000000000000..ebccc38ca473 --- /dev/null +++ b/prototypes/mini-bit/src/cli/cli-main.js @@ -0,0 +1,69 @@ +import { COMMAND_INDEX, ALL_DESCRIPTORS } from '../command-index.generated.js'; +import { trace } from '../harmony/tracer.js'; + +// Dispatch flow: +// 1. argv[0] → COMMAND_INDEX[name].aspectId +// 2. harmony.resolve(aspectId) — triggers lazy load of just that subtree +// 3. The resolved provider has called cli.register(...) with its handler +// 4. Look up the registered command and invoke its handler +export class CLIMain { + constructor(harmony) { + this.harmony = harmony; + this.commands = new Map(); + } + + // Aspects call this from their provider() with descriptor + handler merged. + register(command) { + this.commands.set(command.name, command); + if (command.alias) this.commands.set(command.alias, command); + } + + async run(argv) { + const cmdName = argv[0]; + + // Fast paths that need zero aspect loads beyond CLI itself. + if (!cmdName || cmdName === '--help' || cmdName === '-h') return this.printHelp(); + if (cmdName === '--version' || cmdName === '-v') { + process.stdout.write('mini-bit 0.1.0\n'); + return; + } + + const entry = COMMAND_INDEX[cmdName]; + if (!entry) { + process.stderr.write(`unknown command: ${cmdName}\n`); + this.printHelp(); + process.exit(1); + } + + // The actual lazy-load trigger. + trace(`dispatch ${cmdName} → resolve ${entry.aspectId}`); + await this.harmony.resolve(entry.aspectId); + + const cmd = this.commands.get(cmdName); + if (!cmd) throw new Error(`Command ${cmdName} not registered by ${entry.aspectId}`); + + const result = await cmd.report(argv.slice(1), {}); + if (result) process.stdout.write(result + '\n'); + } + + printHelp() { + const lines = [ + 'mini-bit — prototype of lazy-loaded Bit aspects', + '', + 'Commands:', + ]; + for (const d of ALL_DESCRIPTORS) { + const aliasStr = d.alias ? `, ${d.alias}` : ''; + lines.push(` ${d.name}${aliasStr.padEnd(6)} ${d.description}`); + } + lines.push(''); + lines.push('Flags:'); + lines.push(' --version, -v Print version'); + lines.push(' --help, -h This help'); + lines.push(''); + lines.push('Env:'); + lines.push(' BIT_TRACE_ASPECT_LOAD=1 Trace aspect loads'); + lines.push(' BIT_EAGER=1 Eager-load mode (compare to lazy)'); + process.stdout.write(lines.join('\n') + '\n'); + } +} diff --git a/prototypes/mini-bit/src/cli/cli.aspect.js b/prototypes/mini-bit/src/cli/cli.aspect.js new file mode 100644 index 000000000000..149786a0becf --- /dev/null +++ b/prototypes/mini-bit/src/cli/cli.aspect.js @@ -0,0 +1,11 @@ +import { Aspect } from '../harmony/aspect.js'; + +export const CLIAspect = Aspect.create({ + id: 'teambit.harmony/cli', + dependencies: [], + runtimes: { + main: () => import('./cli.main.runtime.js'), + }, +}); + +export default CLIAspect; diff --git a/prototypes/mini-bit/src/cli/cli.main.runtime.js b/prototypes/mini-bit/src/cli/cli.main.runtime.js new file mode 100644 index 000000000000..a28e20b7bc42 --- /dev/null +++ b/prototypes/mini-bit/src/cli/cli.main.runtime.js @@ -0,0 +1,11 @@ +import { CLIAspect } from './cli.aspect.js'; +import { CLIMain } from './cli-main.js'; + +export class CLIMainRuntime { + static id = CLIAspect.id; + static dependencies = []; + static slots = []; + static async provider(_deps, _config, _slots, harmony) { + return new CLIMain(harmony); + } +} diff --git a/prototypes/mini-bit/src/command-index.generated.js b/prototypes/mini-bit/src/command-index.generated.js new file mode 100644 index 000000000000..a50812c69c0f --- /dev/null +++ b/prototypes/mini-bit/src/command-index.generated.js @@ -0,0 +1,25 @@ +// AUTO-GENERATED — do not edit by hand. +// In real Bit this is emitted by codegen at publish time (see RFC §6.3). +// For the prototype we author it directly to keep the demo self-contained. +// +// Importing this file is cheap: descriptors are pure data, and the .commands.js +// files do NOT import their .main.runtime.js. So `bit --help`, `bit completion`, +// and the unknown-command path never touch a runtime module. + +import statusDescriptors from './status/status.commands.js'; +import installDescriptors from './install/install.commands.js'; +import compilerDescriptors from './compiler/compiler.commands.js'; +import workspaceDescriptors from './workspace/workspace.commands.js'; + +export const ALL_DESCRIPTORS = [ + ...statusDescriptors, + ...installDescriptors, + ...compilerDescriptors, + ...workspaceDescriptors, +]; + +export const COMMAND_INDEX = {}; +for (const d of ALL_DESCRIPTORS) { + COMMAND_INDEX[d.name] = { aspectId: d.aspectId }; + if (d.alias) COMMAND_INDEX[d.alias] = { aspectId: d.aspectId }; +} diff --git a/prototypes/mini-bit/src/compiler/compiler-internals.js b/prototypes/mini-bit/src/compiler/compiler-internals.js new file mode 100644 index 000000000000..5782b40f5bf2 --- /dev/null +++ b/prototypes/mini-bit/src/compiler/compiler-internals.js @@ -0,0 +1,8 @@ +// Heaviest aspect in the prototype — like babel/swc/ts-loader in real Bit. +const start = Date.now(); +const buf = []; +while (Date.now() - start < 90) buf.push({ ast: Math.random().toString(36) }); + +export function pretendCompile(components) { + return components.map((c) => `compiled ${c}`).join('\n'); +} diff --git a/prototypes/mini-bit/src/compiler/compiler.aspect.js b/prototypes/mini-bit/src/compiler/compiler.aspect.js new file mode 100644 index 000000000000..b626b626e606 --- /dev/null +++ b/prototypes/mini-bit/src/compiler/compiler.aspect.js @@ -0,0 +1,14 @@ +import { Aspect } from '../harmony/aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; + +export const CompilerAspect = Aspect.create({ + id: 'teambit.compilation/compiler', + dependencies: [LoggerAspect, WorkspaceAspect, CLIAspect], + runtimes: { + main: () => import('./compiler.main.runtime.js'), + }, +}); + +export default CompilerAspect; diff --git a/prototypes/mini-bit/src/compiler/compiler.commands.js b/prototypes/mini-bit/src/compiler/compiler.commands.js new file mode 100644 index 000000000000..f51de9dbdb9a --- /dev/null +++ b/prototypes/mini-bit/src/compiler/compiler.commands.js @@ -0,0 +1,10 @@ +const descriptors = [ + { + name: 'compile', + alias: 'c', + description: 'compile workspace components', + aspectId: 'teambit.compilation/compiler', + }, +]; + +export default descriptors; diff --git a/prototypes/mini-bit/src/compiler/compiler.main.runtime.js b/prototypes/mini-bit/src/compiler/compiler.main.runtime.js new file mode 100644 index 000000000000..7335e60144a9 --- /dev/null +++ b/prototypes/mini-bit/src/compiler/compiler.main.runtime.js @@ -0,0 +1,21 @@ +import { CompilerAspect } from './compiler.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; +import descriptors from './compiler.commands.js'; +import { pretendCompile } from './compiler-internals.js'; + +export class CompilerMain { + static id = CompilerAspect.id; + static dependencies = [LoggerAspect, WorkspaceAspect, CLIAspect]; + static slots = []; + + static async provider([logger, workspace, cli]) { + logger.createLogger('compiler').info('ready'); + cli.register({ + ...descriptors[0], + report: async () => pretendCompile(Object.keys(workspace.components())), + }); + return new CompilerMain(); + } +} diff --git a/prototypes/mini-bit/src/harmony/aspect.js b/prototypes/mini-bit/src/harmony/aspect.js new file mode 100644 index 000000000000..ed05100aaf24 --- /dev/null +++ b/prototypes/mini-bit/src/harmony/aspect.js @@ -0,0 +1,12 @@ +// Aspect manifest. Pure declarative data — safe to import eagerly. +// The heavy code lives behind the `runtimes` thunks, loaded on demand. +export class Aspect { + constructor(opts) { + this.id = opts.id; + this.dependencies = opts.dependencies || []; // Aspect[] — manifest-level + this.runtimes = opts.runtimes || {}; // { [runtimeName]: () => import(...) } + } + static create(opts) { + return new Aspect(opts); + } +} diff --git a/prototypes/mini-bit/src/harmony/harmony.js b/prototypes/mini-bit/src/harmony/harmony.js new file mode 100644 index 000000000000..d58518c25b03 --- /dev/null +++ b/prototypes/mini-bit/src/harmony/harmony.js @@ -0,0 +1,87 @@ +import { trace } from './tracer.js'; + +// Minimal Harmony with lazy resolve(). +// - `manifests` map holds Aspect declarations; tiny and cheap to register. +// - `instances` map holds resolved provider results. +// - `loading` map deduplicates concurrent resolves of the same aspect. +export class Harmony { + constructor(runtimeName, config) { + this.runtimeName = runtimeName; + this.config = config || {}; + this.manifests = new Map(); + this.instances = new Map(); + this.loading = new Map(); + } + + // `roots` are resolved immediately. `manifests` are just registered (cheap) + // so they can be discovered later by lazy dispatch. + static async load(rootAspects, runtimeName = 'main', config = {}, manifestOnly = []) { + const h = new Harmony(runtimeName, config); + for (const a of [...rootAspects, ...manifestOnly]) h.registerManifestTransitive(a); + await Promise.all(rootAspects.map((a) => h.resolve(a.id))); + return h; + } + + registerManifestTransitive(aspect) { + if (this.manifests.has(aspect.id)) return; + this.manifests.set(aspect.id, aspect); + for (const dep of aspect.dependencies) this.registerManifestTransitive(dep); + } + + // The hot path: dynamic-import the runtime module, register its declared deps, + // resolve them in parallel, then run provider(). + async resolve(aspectId) { + if (this.instances.has(aspectId)) return this.instances.get(aspectId); + if (this.loading.has(aspectId)) return this.loading.get(aspectId); + const p = this._doResolve(aspectId); + this.loading.set(aspectId, p); + return p; + } + + async _doResolve(aspectId) { + const aspect = this.manifests.get(aspectId); + if (!aspect) throw new Error(`Unknown aspect: ${aspectId}`); + const loader = aspect.runtimes[this.runtimeName]; + if (!loader) throw new Error(`Aspect ${aspectId} has no ${this.runtimeName} runtime`); + + const t0 = Date.now(); + const mod = await loader(); + const importMs = Date.now() - t0; + + const runtimeClass = pickRuntimeExport(mod); + if (!runtimeClass) throw new Error(`No runtime export with .provider in ${aspectId}`); + + // Lazy manifest discovery: runtime classes can reference aspects whose manifests + // weren't registered via the root closure. + for (const depAspect of runtimeClass.dependencies || []) { + this.registerManifestTransitive(depAspect); + } + + const deps = await Promise.all( + (runtimeClass.dependencies || []).map((d) => this.resolve(d.id)) + ); + + const t1 = Date.now(); + const instance = await runtimeClass.provider(deps, this.config[aspectId], [], this); + const providerMs = Date.now() - t1; + + trace(`load ${aspectId} (import: ${importMs}ms, provider: ${providerMs}ms)`); + this.instances.set(aspectId, instance); + return instance; + } + + get(aspectId) { + if (!this.instances.has(aspectId)) { + throw new Error(`Aspect ${aspectId} not resolved. Use await harmony.resolve(id).`); + } + return this.instances.get(aspectId); + } +} + +function pickRuntimeExport(mod) { + for (const key of Object.keys(mod)) { + const v = mod[key]; + if (typeof v === 'function' && typeof v.provider === 'function') return v; + } + return null; +} diff --git a/prototypes/mini-bit/src/harmony/tracer.js b/prototypes/mini-bit/src/harmony/tracer.js new file mode 100644 index 000000000000..7baa3ea6161c --- /dev/null +++ b/prototypes/mini-bit/src/harmony/tracer.js @@ -0,0 +1,21 @@ +// Lightweight tracing so we can see exactly what got loaded for each command. +// Enable with BIT_TRACE_ASPECT_LOAD=1 +const enabled = process.env.BIT_TRACE_ASPECT_LOAD === '1'; +const events = []; +const t0 = Date.now(); + +export function trace(event) { + const dt = Date.now() - t0; + events.push({ event, t: dt }); + if (enabled) process.stderr.write(`[trace +${dt}ms] ${event}\n`); +} + +export function getEvents() { return events; } + +export function summarize(totalMs) { + const loads = events.filter((e) => e.event.startsWith('load ')); + process.stderr.write( + `\n--- ${loads.length} aspect runtime(s) loaded in ${totalMs}ms ---\n` + ); + for (const e of loads) process.stderr.write(` ${e.event}\n`); +} diff --git a/prototypes/mini-bit/src/install/install-internals.js b/prototypes/mini-bit/src/install/install-internals.js new file mode 100644 index 000000000000..d0bb65da6770 --- /dev/null +++ b/prototypes/mini-bit/src/install/install-internals.js @@ -0,0 +1,7 @@ +const start = Date.now(); +const buf = []; +while (Date.now() - start < 70) buf.push({ pkg: Math.random().toString(36) }); + +export function pretendInstall(components) { + return components.map((c) => `installed deps for ${c}`).join('\n'); +} diff --git a/prototypes/mini-bit/src/install/install.aspect.js b/prototypes/mini-bit/src/install/install.aspect.js new file mode 100644 index 000000000000..6a57c49a4b1c --- /dev/null +++ b/prototypes/mini-bit/src/install/install.aspect.js @@ -0,0 +1,14 @@ +import { Aspect } from '../harmony/aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; + +export const InstallAspect = Aspect.create({ + id: 'teambit.dependencies/install', + dependencies: [LoggerAspect, WorkspaceAspect, CLIAspect], + runtimes: { + main: () => import('./install.main.runtime.js'), + }, +}); + +export default InstallAspect; diff --git a/prototypes/mini-bit/src/install/install.commands.js b/prototypes/mini-bit/src/install/install.commands.js new file mode 100644 index 000000000000..63cab0186c2a --- /dev/null +++ b/prototypes/mini-bit/src/install/install.commands.js @@ -0,0 +1,10 @@ +const descriptors = [ + { + name: 'install', + alias: 'i', + description: 'install dependencies for workspace components', + aspectId: 'teambit.dependencies/install', + }, +]; + +export default descriptors; diff --git a/prototypes/mini-bit/src/install/install.main.runtime.js b/prototypes/mini-bit/src/install/install.main.runtime.js new file mode 100644 index 000000000000..277d812be200 --- /dev/null +++ b/prototypes/mini-bit/src/install/install.main.runtime.js @@ -0,0 +1,21 @@ +import { InstallAspect } from './install.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; +import descriptors from './install.commands.js'; +import { pretendInstall } from './install-internals.js'; + +export class InstallMain { + static id = InstallAspect.id; + static dependencies = [LoggerAspect, WorkspaceAspect, CLIAspect]; + static slots = []; + + static async provider([logger, workspace, cli]) { + logger.createLogger('install').info('ready'); + cli.register({ + ...descriptors[0], + report: async () => pretendInstall(Object.keys(workspace.components())), + }); + return new InstallMain(); + } +} diff --git a/prototypes/mini-bit/src/logger/logger.aspect.js b/prototypes/mini-bit/src/logger/logger.aspect.js new file mode 100644 index 000000000000..42782e2584fd --- /dev/null +++ b/prototypes/mini-bit/src/logger/logger.aspect.js @@ -0,0 +1,11 @@ +import { Aspect } from '../harmony/aspect.js'; + +export const LoggerAspect = Aspect.create({ + id: 'teambit.harmony/logger', + dependencies: [], + runtimes: { + main: () => import('./logger.main.runtime.js'), + }, +}); + +export default LoggerAspect; diff --git a/prototypes/mini-bit/src/logger/logger.main.runtime.js b/prototypes/mini-bit/src/logger/logger.main.runtime.js new file mode 100644 index 000000000000..80e2e18d58ed --- /dev/null +++ b/prototypes/mini-bit/src/logger/logger.main.runtime.js @@ -0,0 +1,14 @@ +import { LoggerAspect } from './logger.aspect.js'; + +class Logger { + constructor(name) { this.name = name; } + info(msg) { if (process.env.BIT_LOG) process.stderr.write(`[${this.name}] ${msg}\n`); } +} + +export class LoggerMain { + static id = LoggerAspect.id; + static dependencies = []; + static slots = []; + static async provider() { return new LoggerMain(); } + createLogger(name) { return new Logger(name); } +} diff --git a/prototypes/mini-bit/src/scope/scope-internals.js b/prototypes/mini-bit/src/scope/scope-internals.js new file mode 100644 index 000000000000..4bbb77f6ca1c --- /dev/null +++ b/prototypes/mini-bit/src/scope/scope-internals.js @@ -0,0 +1,9 @@ +// Simulates the cost of parsing/evaluating a fat domain module +// (the way a real `.main.runtime.ts` does today by importing 30+ deps). +const start = Date.now(); +const buf = []; +while (Date.now() - start < 35) buf.push(Math.random().toString(36)); + +export function listComponents() { + return ['button', 'card', 'header', 'footer', 'nav']; +} diff --git a/prototypes/mini-bit/src/scope/scope.aspect.js b/prototypes/mini-bit/src/scope/scope.aspect.js new file mode 100644 index 000000000000..6cd03456998a --- /dev/null +++ b/prototypes/mini-bit/src/scope/scope.aspect.js @@ -0,0 +1,12 @@ +import { Aspect } from '../harmony/aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; + +export const ScopeAspect = Aspect.create({ + id: 'teambit.scope/scope', + dependencies: [LoggerAspect], + runtimes: { + main: () => import('./scope.main.runtime.js'), + }, +}); + +export default ScopeAspect; diff --git a/prototypes/mini-bit/src/scope/scope.main.runtime.js b/prototypes/mini-bit/src/scope/scope.main.runtime.js new file mode 100644 index 000000000000..2121dc988c2b --- /dev/null +++ b/prototypes/mini-bit/src/scope/scope.main.runtime.js @@ -0,0 +1,14 @@ +import { ScopeAspect } from './scope.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { listComponents } from './scope-internals.js'; + +export class ScopeMain { + static id = ScopeAspect.id; + static dependencies = [LoggerAspect]; + static slots = []; + static async provider([logger]) { + logger.createLogger('scope').info('ready'); + return new ScopeMain(); + } + list() { return listComponents(); } +} diff --git a/prototypes/mini-bit/src/status/status-internals.js b/prototypes/mini-bit/src/status/status-internals.js new file mode 100644 index 000000000000..18cd69d02a38 --- /dev/null +++ b/prototypes/mini-bit/src/status/status-internals.js @@ -0,0 +1,14 @@ +const start = Date.now(); +const buf = []; +while (Date.now() - start < 40) buf.push({ a: Math.random(), b: Math.random() }); + +export function computeStatus(workspace) { + const map = workspace.components(); + const modified = []; + const newComps = []; + for (const [name, info] of Object.entries(map)) { + if (info.modified) modified.push(name); + if (info.new) newComps.push(name); + } + return { modified, newComps }; +} diff --git a/prototypes/mini-bit/src/status/status.aspect.js b/prototypes/mini-bit/src/status/status.aspect.js new file mode 100644 index 000000000000..0897e850b50d --- /dev/null +++ b/prototypes/mini-bit/src/status/status.aspect.js @@ -0,0 +1,14 @@ +import { Aspect } from '../harmony/aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; + +export const StatusAspect = Aspect.create({ + id: 'teambit.component/status', + dependencies: [LoggerAspect, WorkspaceAspect, CLIAspect], + runtimes: { + main: () => import('./status.main.runtime.js'), + }, +}); + +export default StatusAspect; diff --git a/prototypes/mini-bit/src/status/status.commands.js b/prototypes/mini-bit/src/status/status.commands.js new file mode 100644 index 000000000000..86566c223ccc --- /dev/null +++ b/prototypes/mini-bit/src/status/status.commands.js @@ -0,0 +1,10 @@ +const descriptors = [ + { + name: 'status', + alias: 's', + description: 'show workspace component status', + aspectId: 'teambit.component/status', + }, +]; + +export default descriptors; diff --git a/prototypes/mini-bit/src/status/status.main.runtime.js b/prototypes/mini-bit/src/status/status.main.runtime.js new file mode 100644 index 000000000000..6a76ce0792f6 --- /dev/null +++ b/prototypes/mini-bit/src/status/status.main.runtime.js @@ -0,0 +1,38 @@ +import { StatusAspect } from './status.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { WorkspaceAspect } from '../workspace/workspace.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; +import descriptors from './status.commands.js'; +import { computeStatus } from './status-internals.js'; + +export class StatusMain { + static id = StatusAspect.id; + static dependencies = [LoggerAspect, WorkspaceAspect, CLIAspect]; + static slots = []; + + constructor(workspace) { this.workspace = workspace; } + + static async provider([logger, workspace, cli]) { + logger.createLogger('status').info('ready'); + const sm = new StatusMain(workspace); + + cli.register({ + ...descriptors[0], + report: async () => { + const { modified, newComps } = computeStatus(workspace); + const lines = ['Status:']; + if (modified.length) { + lines.push(' modified:'); + modified.forEach((c) => lines.push(` • ${c}`)); + } + if (newComps.length) { + lines.push(' new:'); + newComps.forEach((c) => lines.push(` • ${c}`)); + } + if (!modified.length && !newComps.length) lines.push(' clean'); + return lines.join('\n'); + }, + }); + return sm; + } +} diff --git a/prototypes/mini-bit/src/workspace/workspace-internals.js b/prototypes/mini-bit/src/workspace/workspace-internals.js new file mode 100644 index 000000000000..54b15d9b8c63 --- /dev/null +++ b/prototypes/mini-bit/src/workspace/workspace-internals.js @@ -0,0 +1,13 @@ +const start = Date.now(); +const buf = []; +while (Date.now() - start < 55) buf.push({ x: Math.random(), y: Math.random() }); + +export function readBitmap() { + return { + button: { modified: true }, + card: { new: true }, + header: { modified: true }, + footer: {}, + nav: { modified: true }, + }; +} diff --git a/prototypes/mini-bit/src/workspace/workspace.aspect.js b/prototypes/mini-bit/src/workspace/workspace.aspect.js new file mode 100644 index 000000000000..a7ebe5666b90 --- /dev/null +++ b/prototypes/mini-bit/src/workspace/workspace.aspect.js @@ -0,0 +1,14 @@ +import { Aspect } from '../harmony/aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { ScopeAspect } from '../scope/scope.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; + +export const WorkspaceAspect = Aspect.create({ + id: 'teambit.workspace/workspace', + dependencies: [LoggerAspect, ScopeAspect, CLIAspect], + runtimes: { + main: () => import('./workspace.main.runtime.js'), + }, +}); + +export default WorkspaceAspect; diff --git a/prototypes/mini-bit/src/workspace/workspace.commands.js b/prototypes/mini-bit/src/workspace/workspace.commands.js new file mode 100644 index 000000000000..e021910dd964 --- /dev/null +++ b/prototypes/mini-bit/src/workspace/workspace.commands.js @@ -0,0 +1,10 @@ +const descriptors = [ + { + name: 'list', + alias: 'ls', + description: 'list components tracked in workspace', + aspectId: 'teambit.workspace/workspace', + }, +]; + +export default descriptors; diff --git a/prototypes/mini-bit/src/workspace/workspace.main.runtime.js b/prototypes/mini-bit/src/workspace/workspace.main.runtime.js new file mode 100644 index 000000000000..822b1b119978 --- /dev/null +++ b/prototypes/mini-bit/src/workspace/workspace.main.runtime.js @@ -0,0 +1,31 @@ +import { WorkspaceAspect } from './workspace.aspect.js'; +import { LoggerAspect } from '../logger/logger.aspect.js'; +import { ScopeAspect } from '../scope/scope.aspect.js'; +import { CLIAspect } from '../cli/cli.aspect.js'; +import descriptors from './workspace.commands.js'; +import { readBitmap } from './workspace-internals.js'; + +export class WorkspaceMain { + static id = WorkspaceAspect.id; + static dependencies = [LoggerAspect, ScopeAspect, CLIAspect]; + static slots = []; + + constructor(scope) { this.scope = scope; } + + static async provider([logger, scope, cli]) { + const log = logger.createLogger('workspace'); + log.info('ready'); + const ws = new WorkspaceMain(scope); + + cli.register({ + ...descriptors[0], + report: async () => { + const map = ws.components(); + return ['Components:', ...Object.keys(map).map((n) => ` - ${n}`)].join('\n'); + }, + }); + return ws; + } + + components() { return readBitmap(); } +} diff --git a/scopes/api-reference/api-reference/api-reference.aspect.ts b/scopes/api-reference/api-reference/api-reference.aspect.ts index 7240845b8514..397f5e26fb53 100644 --- a/scopes/api-reference/api-reference/api-reference.aspect.ts +++ b/scopes/api-reference/api-reference/api-reference.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const APIReferenceAspect = Aspect.create({ id: 'teambit.api-reference/api-reference', + runtimes: { ui: () => import('./api-reference.ui.runtime') }, }); export default APIReferenceAspect; diff --git a/scopes/cloud/cloud/cloud.aspect.ts b/scopes/cloud/cloud/cloud.aspect.ts index f05da6a25d39..38e3311d829a 100644 --- a/scopes/cloud/cloud/cloud.aspect.ts +++ b/scopes/cloud/cloud/cloud.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CloudAspect = Aspect.create({ id: 'teambit.cloud/cloud', + runtimes: { main: () => import('./cloud.main.runtime') }, }); export default CloudAspect; diff --git a/scopes/cloud/ripple/ripple.aspect.ts b/scopes/cloud/ripple/ripple.aspect.ts index 3f446af43632..24a12f575bf3 100644 --- a/scopes/cloud/ripple/ripple.aspect.ts +++ b/scopes/cloud/ripple/ripple.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const RippleAspect = Aspect.create({ id: 'teambit.cloud/ripple', + runtimes: { main: () => import('./ripple.main.runtime') }, }); export default RippleAspect; diff --git a/scopes/community/community/community.aspect.ts b/scopes/community/community/community.aspect.ts index d018f94a234d..6945b6ada6dc 100644 --- a/scopes/community/community/community.aspect.ts +++ b/scopes/community/community/community.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CommunityAspect = Aspect.create({ id: 'teambit.community/community', + runtimes: { main: () => import('./community.main.runtime') }, }); diff --git a/scopes/compilation/babel/babel.aspect.ts b/scopes/compilation/babel/babel.aspect.ts index f497446c7795..77ab45011253 100644 --- a/scopes/compilation/babel/babel.aspect.ts +++ b/scopes/compilation/babel/babel.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const BabelAspect = Aspect.create({ id: 'teambit.compilation/babel', + runtimes: { main: () => import('./babel.main.runtime') }, }); diff --git a/scopes/compilation/bundler/bundler.aspect.ts b/scopes/compilation/bundler/bundler.aspect.ts index 84ea376dac28..a2f98aeca923 100644 --- a/scopes/compilation/bundler/bundler.aspect.ts +++ b/scopes/compilation/bundler/bundler.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const BundlerAspect = Aspect.create({ id: 'teambit.compilation/bundler', + runtimes: { main: () => import('./bundler.main.runtime') }, }); diff --git a/scopes/compilation/compiler/compiler.aspect.ts b/scopes/compilation/compiler/compiler.aspect.ts index e5b33fcbdc46..a464d6a8d326 100644 --- a/scopes/compilation/compiler/compiler.aspect.ts +++ b/scopes/compilation/compiler/compiler.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CompilerAspect = Aspect.create({ id: 'teambit.compilation/compiler', + runtimes: { main: () => import('./compiler.main.runtime') }, + commands: () => import('./compiler.commands').then((m) => [m.compileCommand]), }); diff --git a/scopes/compilation/compiler/compiler.cmd.ts b/scopes/compilation/compiler/compiler.cmd.ts index 364832d87359..4710d987cc84 100644 --- a/scopes/compilation/compiler/compiler.cmd.ts +++ b/scopes/compilation/compiler/compiler.cmd.ts @@ -6,30 +6,18 @@ import prettyTime from 'pretty-time'; import { formatCompileResults } from './output-formatter'; import type { WorkspaceCompiler, CompileOptions, BuildResult } from './workspace-compiler'; import { CompilationInitiator } from './types'; +import { compileCommand } from './compiler.commands'; export class CompileCmd implements Command { - name = 'compile [component-names...]'; - description = 'transpile component source files'; - extendedDescription = `compiles TypeScript, JSX, and other source files into JavaScript using the compiler configured by each component's environment. -outputs compiled files to node_modules/component-package-name/dist for consumption by other components. -automatically triggered by "bit watch", "bit start", or IDE extensions, but can be run manually for debugging.`; - helpUrl = 'reference/compiling/compiler-overview'; - arguments = [ - { - name: 'component-names...', - description: 'a list of component names or component IDs (defaults to all components)', - }, - ]; - alias = ''; - group = 'component-development'; - options = [ - ['c', 'changed', 'compile only new and modified components'], - ['v', 'verbose', 'show more data, such as, dist paths'], - ['j', 'json', 'return the compile results in json format'], - ['d', 'delete-dist-dir', 'delete existing dist folder before writing new compiled files'], - ['', 'generate-types', 'EXPERIMENTAL. generate d.ts files for typescript components (hurts performance)'], - ] as CommandOptions; - loader = true; + name = compileCommand.name; + description = compileCommand.description; + extendedDescription = compileCommand.extendedDescription; + helpUrl = compileCommand.helpUrl; + arguments = compileCommand.arguments; + alias = compileCommand.alias; + group = compileCommand.group; + options = compileCommand.options; + loader = compileCommand.loader; constructor( private compile: WorkspaceCompiler, diff --git a/scopes/compilation/compiler/compiler.commands.ts b/scopes/compilation/compiler/compiler.commands.ts new file mode 100644 index 000000000000..17284e6f8efb --- /dev/null +++ b/scopes/compilation/compiler/compiler.commands.ts @@ -0,0 +1,36 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const compileCommand: CommandDescriptor = { + name: 'compile [component-names...]', + alias: '', + description: 'transpile component source files', + extendedDescription: `compiles TypeScript, JSX, and other source files into JavaScript using the compiler configured by each component's environment. + outputs compiled files to node_modules/component-package-name/dist for consumption by other components. + automatically triggered by "bit watch", "bit start", or IDE extensions, but can be run manually for debugging.`, + helpUrl: 'reference/compiling/compiler-overview', + group: 'component-development', + arguments: [ + { + name: 'component-names...', + description: 'a list of component names or component IDs (defaults to all components)', + }, + ], + loader: true, + options: [ + ['c', 'changed', 'compile only new and modified components'], + ['v', 'verbose', 'show more data, such as, dist paths'], + ['j', 'json', 'return the compile results in json format'], + ['d', 'delete-dist-dir', 'delete existing dist folder before writing new compiled files'], + ['', 'generate-types', 'EXPERIMENTAL. generate d.ts files for typescript components (hurts performance)'], + ] as CommandOptions, +}; diff --git a/scopes/compilation/compiler/compiler.main.runtime.ts b/scopes/compilation/compiler/compiler.main.runtime.ts index fa3b092622c4..e25353a5e90d 100644 --- a/scopes/compilation/compiler/compiler.main.runtime.ts +++ b/scopes/compilation/compiler/compiler.main.runtime.ts @@ -41,6 +41,7 @@ import { CompilationInitiator } from './types'; import type { CompileOptions } from './workspace-compiler'; import { WorkspaceCompiler } from './workspace-compiler'; import { compilerTemplate } from './templates/compiler'; +import { compileCommand } from './compiler.commands'; export class CompilerMain { constructor( @@ -197,7 +198,7 @@ export class CompilerMain { dependencyResolver, compilerService ); - cli.register(new CompileCmd(workspaceCompiler, logger, pubsub)); + cli.register(compileCommand, () => new CompileCmd(workspaceCompiler, logger, pubsub)); if (issues) { issues.registerAddComponentsIssues(compilerMain.addMissingDistsIssue.bind(compilerMain)); } diff --git a/scopes/compilation/multi-compiler/multi-compiler.aspect.ts b/scopes/compilation/multi-compiler/multi-compiler.aspect.ts index 5a3e7ed52294..31ea0af946e5 100644 --- a/scopes/compilation/multi-compiler/multi-compiler.aspect.ts +++ b/scopes/compilation/multi-compiler/multi-compiler.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MultiCompilerAspect = Aspect.create({ id: 'teambit.compilation/multi-compiler', + runtimes: { main: () => import('./multi-compiler.main.runtime') }, }); diff --git a/scopes/component/changelog/changelog.aspect.ts b/scopes/component/changelog/changelog.aspect.ts index 33e6110dfc0d..4580765c1336 100644 --- a/scopes/component/changelog/changelog.aspect.ts +++ b/scopes/component/changelog/changelog.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ChangelogAspect = Aspect.create({ id: 'teambit.component/changelog', - dependencies: [], - defaultConfig: {}, + runtimes: { ui: () => import('./changelog.ui.runtime') }, }); export default ChangelogAspect; diff --git a/scopes/component/checkout/checkout-cmd.ts b/scopes/component/checkout/checkout-cmd.ts index fbfd754105ec..26b1c5b15252 100644 --- a/scopes/component/checkout/checkout-cmd.ts +++ b/scopes/component/checkout/checkout-cmd.ts @@ -10,6 +10,7 @@ import { warnSymbol, joinSections, } from '@teambit/cli'; +import { checkoutCommand } from './checkout.commands'; import type { ApplyVersionResults, MergeStrategy } from '@teambit/component.modules.merge-helper'; import { applyVersionReport, @@ -26,63 +27,15 @@ import { BitError } from '@teambit/bit-error'; import type { CheckoutMain, CheckoutProps } from './checkout.main.runtime'; export class CheckoutCmd implements Command { - name = 'checkout [component-pattern]'; - arguments = [ - { - name: 'to', - description: - "permitted values: `[head, latest, reset, {specific-version}, {head~x}]`. 'head' - last snap/tag. 'latest' - semver latest tag. 'reset' - removes local changes", - }, - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - description = 'switch between component versions or remove local changes'; - helpUrl = 'reference/components/merging-changes#checkout-snaps-to-the-working-directory'; - group = 'version-control'; - extendedDescription = `checkout components to specified versions or remove local changes. most commonly used as 'bit checkout head' to get latest versions. -the \`\` argument accepts these values: -- head: checkout to last snap/tag (most common usage) -- specific version: checkout to exact version (e.g. 'bit checkout 1.0.5 component-name') -- head~x: go back x generations from head (e.g. 'head~2' for two versions back) -- latest: checkout to latest semver tag -- reset: remove local modifications and restore original files (also restores deleted component directories) -when on lanes, 'checkout head' only affects lane components. to update main components, run 'bit lane merge main'.`; - alias = 'U'; - options = [ - [ - 'i', - 'interactive-merge', - 'when a component is modified and the merge process found conflicts, display options to resolve them', - ], - [ - 'r', - 'auto-merge-resolve ', - 'in case of merge conflict, resolve according to the provided strategy: [ours, theirs, manual]', - ], - [ - '', - 'manual', - 'same as "--auto-merge-resolve manual". in case of merge conflict, write the files with the conflict markers', - ], - ['a', 'all', 'all components'], - [ - 'e', - 'workspace-only', - "only relevant for 'bit checkout head' when on a lane. don't import components from the remote lane that are not already in the workspace", - ], - ['v', 'verbose', 'showing verbose output for inspection'], - ['x', 'skip-dependency-installation', 'do not auto-install dependencies of the imported components'], - ['', 'force-ours', 'do not merge, preserve local files as is'], - ['', 'force-theirs', 'do not merge, just overwrite with incoming files'], - [ - '', - 'include-new-from-scope', - "relevant for 'bit checkout head'. import components from the defaultScope that don't exist in the workspace", - ], - ] as CommandOptions; - loader = true; + name = checkoutCommand.name; + arguments = checkoutCommand.arguments; + description = checkoutCommand.description; + helpUrl = checkoutCommand.helpUrl; + group = checkoutCommand.group; + extendedDescription = checkoutCommand.extendedDescription; + alias = checkoutCommand.alias; + options = checkoutCommand.options; + loader = checkoutCommand.loader; constructor(private checkout: CheckoutMain) {} diff --git a/scopes/component/checkout/checkout.aspect.ts b/scopes/component/checkout/checkout.aspect.ts index 32a0816f3d78..e13e1e316580 100644 --- a/scopes/component/checkout/checkout.aspect.ts +++ b/scopes/component/checkout/checkout.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CheckoutAspect = Aspect.create({ id: 'teambit.component/checkout', + runtimes: { main: () => import('./checkout.main.runtime') }, + commands: () => import('./checkout.commands').then((m) => [m.checkoutCommand, m.revertCommand]), }); diff --git a/scopes/component/checkout/checkout.commands.ts b/scopes/component/checkout/checkout.commands.ts new file mode 100644 index 000000000000..7fbb580e1a75 --- /dev/null +++ b/scopes/component/checkout/checkout.commands.ts @@ -0,0 +1,96 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const checkoutCommand: CommandDescriptor = { + name: 'checkout [component-pattern]', + alias: 'U', + description: 'switch between component versions or remove local changes', + extendedDescription: `checkout components to specified versions or remove local changes. most commonly used as 'bit checkout head' to get latest versions. + the \`\` argument accepts these values: + - head: checkout to last snap/tag (most common usage) + - specific version: checkout to exact version (e.g. 'bit checkout 1.0.5 component-name') + - head~x: go back x generations from head (e.g. 'head~2' for two versions back) + - latest: checkout to latest semver tag + - reset: remove local modifications and restore original files (also restores deleted component directories) + when on lanes, 'checkout head' only affects lane components. to update main components, run 'bit lane merge main'.`, + helpUrl: 'reference/components/merging-changes#checkout-snaps-to-the-working-directory', + group: 'version-control', + arguments: [ + { + name: 'to', + description: + "permitted values: `[head, latest, reset, {specific-version}, {head~x}]`. 'head' - last snap/tag. 'latest' - semver latest tag. 'reset' - removes local changes", + }, + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + loader: true, + options: [ + [ + 'i', + 'interactive-merge', + 'when a component is modified and the merge process found conflicts, display options to resolve them', + ], + [ + 'r', + 'auto-merge-resolve ', + 'in case of merge conflict, resolve according to the provided strategy: [ours, theirs, manual]', + ], + [ + '', + 'manual', + 'same as "--auto-merge-resolve manual". in case of merge conflict, write the files with the conflict markers', + ], + ['a', 'all', 'all components'], + [ + 'e', + 'workspace-only', + "only relevant for 'bit checkout head' when on a lane. don't import components from the remote lane that are not already in the workspace", + ], + ['v', 'verbose', 'showing verbose output for inspection'], + ['x', 'skip-dependency-installation', 'do not auto-install dependencies of the imported components'], + ['', 'force-ours', 'do not merge, preserve local files as is'], + ['', 'force-theirs', 'do not merge, just overwrite with incoming files'], + [ + '', + 'include-new-from-scope', + "relevant for 'bit checkout head'. import components from the defaultScope that don't exist in the workspace", + ], + ] as CommandOptions, +}; + +export const revertCommand: CommandDescriptor = { + name: 'revert ', + alias: '', + description: 'replace component files with specified version while preserving current version', + extendedDescription: `replaces component source files with files from the specified version but keeps the current component version. + useful for reverting file changes without changing the component's version history. different from checkout which changes the version.`, + group: 'version-control', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + { + name: 'to', + description: "permitted values: [main, specific-version]. 'main' - head version on main.", + }, + ], + loader: true, + options: [ + ['v', 'verbose', 'showing verbose output for inspection'], + ['x', 'skip-dependency-installation', 'do not install packages of the imported components'], + ] as CommandOptions, +}; diff --git a/scopes/component/checkout/checkout.main.runtime.ts b/scopes/component/checkout/checkout.main.runtime.ts index 4cba30f66eed..c5f2a109112f 100644 --- a/scopes/component/checkout/checkout.main.runtime.ts +++ b/scopes/component/checkout/checkout.main.runtime.ts @@ -29,6 +29,7 @@ import type { ComponentStatus, ComponentStatusBase } from './checkout-version'; import { applyVersion, throwForFailures } from './checkout-version'; import { RevertCmd } from './revert-cmd'; import type { ComponentMap } from '@teambit/legacy.bit-map'; +import { checkoutCommand, revertCommand } from './checkout.commands'; export type CheckoutProps = { version?: string; // if reset/head/latest is true, the version is undefined @@ -661,7 +662,8 @@ export class CheckoutMain { ]) { const logger = loggerMain.createLogger(CheckoutAspect.id); const checkoutMain = new CheckoutMain(workspace, logger, compWriter, importer, remove, lister); - cli.register(new CheckoutCmd(checkoutMain), new RevertCmd(checkoutMain)); + cli.register(checkoutCommand, () => new CheckoutCmd(checkoutMain)); + cli.register(revertCommand, () => new RevertCmd(checkoutMain)); return checkoutMain; } } diff --git a/scopes/component/checkout/revert-cmd.ts b/scopes/component/checkout/revert-cmd.ts index dec8207febad..57d2531fdf50 100644 --- a/scopes/component/checkout/revert-cmd.ts +++ b/scopes/component/checkout/revert-cmd.ts @@ -2,29 +2,17 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { CheckoutMain } from './checkout.main.runtime'; import { CheckoutCmd } from './checkout-cmd'; +import { revertCommand } from './checkout.commands'; export class RevertCmd implements Command { - name = 'revert '; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - { - name: 'to', - description: "permitted values: [main, specific-version]. 'main' - head version on main.", - }, - ]; - description = 'replace component files with specified version while preserving current version'; - extendedDescription = `replaces component source files with files from the specified version but keeps the current component version. -useful for reverting file changes without changing the component's version history. different from checkout which changes the version.`; - group = 'version-control'; - alias = ''; - options = [ - ['v', 'verbose', 'showing verbose output for inspection'], - ['x', 'skip-dependency-installation', 'do not install packages of the imported components'], - ] as CommandOptions; - loader = true; + name = revertCommand.name; + arguments = revertCommand.arguments; + description = revertCommand.description; + extendedDescription = revertCommand.extendedDescription; + group = revertCommand.group; + alias = revertCommand.alias; + options = revertCommand.options; + loader = revertCommand.loader; constructor(private checkout: CheckoutMain) {} diff --git a/scopes/component/code/code.aspect.ts b/scopes/component/code/code.aspect.ts index d994a0cffa75..62646c7f04f8 100644 --- a/scopes/component/code/code.aspect.ts +++ b/scopes/component/code/code.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CodeAspect = Aspect.create({ id: 'teambit.component/code', - dependencies: [], - defaultConfig: {}, + runtimes: { ui: () => import('./code.ui.runtime') }, }); export default CodeAspect; diff --git a/scopes/component/component-compare/component-compare.aspect.ts b/scopes/component/component-compare/component-compare.aspect.ts index c0082d51b34e..5435eb636a03 100644 --- a/scopes/component/component-compare/component-compare.aspect.ts +++ b/scopes/component/component-compare/component-compare.aspect.ts @@ -1,7 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentCompareAspect = Aspect.create({ id: 'teambit.component/component-compare', + runtimes: { main: () => import('./component-compare.main.runtime') }, + commands: () => import('./component-compare.commands').then((m) => [m.diffCommand]), }); export default ComponentCompareAspect; diff --git a/scopes/component/component-compare/component-compare.commands.ts b/scopes/component/component-compare/component-compare.commands.ts new file mode 100644 index 000000000000..b2f479128fc4 --- /dev/null +++ b/scopes/component/component-compare/component-compare.commands.ts @@ -0,0 +1,74 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const diffCommand: CommandDescriptor = { + name: 'diff [component-pattern] [version] [to-version]', + alias: '', + description: 'compare component changes between versions or against the current workspace', + extendedDescription: `shows a detailed diff of component files, dependencies, and configuration changes. + by default, compares workspace changes against the latest version. specify versions to compare historical changes. + supports pattern matching to filter components and various output formats for better readability. + for ai-agent workflows, use --name-only to list what changed, --file to drill into a specific file, + --files-only / --configs-only to focus on one diff category, or --json for machine-readable output.`, + helpUrl: 'docs/components/merging-changes#compare-component-snaps', + group: 'info-analysis', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + { + name: 'version', + description: `the base version to compare from. if omitted, compares the workspace's current files to the component's latest version.`, + }, + { + name: 'to-version', + description: `the target version to compare against "version". + if both "version" and "to-version" are provided, compare those two versions directly (ignoring the workspace).`, + }, + ], + loader: true, + options: [ + ['p', 'parent', 'compare the specified "version" to its immediate parent instead of comparing to the current one'], + ['v', 'verbose', 'show a more verbose output where possible'], + ['t', 'table', 'show tables instead of plain text for dependencies diff'], + [ + '', + 'file ', + 'show only file diffs for the given component-relative path(s). comma-separated. implies --files-only', + ], + ['', 'files-only', 'show only file-content diffs; omit dependency, env, and aspect-config changes'], + ['', 'configs-only', 'show only dependency, env, and aspect-config changes; omit file-content diffs'], + ['', 'name-only', 'summary: list changed files with status (M/A/D) and changed field categories; no diff bodies'], + ['', 'stat', 'summary: like --name-only but includes +N -M line counts per file'], + ['j', 'json', 'return the diff result as json'], + ] as CommandOptions, + examples: [ + { cmd: 'diff', description: 'show diff for all modified components' }, + { cmd: 'diff foo', description: 'show diff for a component "foo"' }, + { cmd: 'diff foo 0.0.1', description: 'show diff for a component "foo" from the current state to version 0.0.1' }, + { cmd: 'diff foo 0.0.1 0.0.2', description: 'show diff for a component "foo" from version 0.0.1 to version 0.0.2' }, + { + cmd: "diff '$codeModified' ", + description: 'show diff only for components with modified files. ignore config changes', + }, + { + cmd: 'diff foo 0.0.2 --parent', + description: 'compare "foo@0.0.2" to its parent version. showing what changed in 0.0.2', + }, + { cmd: 'diff foo --name-only', description: 'list changed files and field categories without diff bodies' }, + { cmd: 'diff foo --file src/index.ts', description: 'show the diff of a single file in a component' }, + { cmd: 'diff foo --files-only', description: 'show only source-code diffs, skip dependency/config changes' }, + { cmd: 'diff foo --json', description: 'return the diff result as json for programmatic consumption' }, + ], +}; diff --git a/scopes/component/component-compare/component-compare.main.runtime.ts b/scopes/component/component-compare/component-compare.main.runtime.ts index 842b2b56d249..55718eeb8264 100644 --- a/scopes/component/component-compare/component-compare.main.runtime.ts +++ b/scopes/component/component-compare/component-compare.main.runtime.ts @@ -25,6 +25,7 @@ import type { Component, ComponentMain } from '@teambit/component'; import { ComponentAspect } from '@teambit/component'; import type { SchemaMain } from '@teambit/schema'; import { SchemaAspect } from '@teambit/schema'; +import { diffCommand } from './component-compare.commands'; import { componentCompareSchema } from './component-compare.graphql'; import { ComponentCompareAspect } from './component-compare.aspect'; @@ -364,7 +365,7 @@ export class ComponentCompareMain { schema, workspace ); - cli.register(new DiffCmd(componentCompareMain)); + cli.register(diffCommand, () => new DiffCmd(componentCompareMain)); graphql.register(() => componentCompareSchema(componentCompareMain)); return componentCompareMain; } diff --git a/scopes/component/component-compare/diff-cmd.ts b/scopes/component/component-compare/diff-cmd.ts index ebbeb0751e65..adffcb171dda 100644 --- a/scopes/component/component-compare/diff-cmd.ts +++ b/scopes/component/component-compare/diff-cmd.ts @@ -5,6 +5,7 @@ import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { DiffOutputOptions, DiffResults, FileDiff } from '@teambit/legacy.component-diff'; import { countDiffLines, filterDiffResults, outputDiffResultsFormatted } from '@teambit/legacy.component-diff'; import type { ComponentCompareMain } from './component-compare.main.runtime'; +import { diffCommand } from './component-compare.commands'; type DiffFlags = { verbose?: boolean; @@ -19,65 +20,16 @@ type DiffFlags = { }; export class DiffCmd implements Command { - name = 'diff [component-pattern] [version] [to-version]'; - group = 'info-analysis'; - description = 'compare component changes between versions or against the current workspace'; - extendedDescription = `shows a detailed diff of component files, dependencies, and configuration changes. -by default, compares workspace changes against the latest version. specify versions to compare historical changes. -supports pattern matching to filter components and various output formats for better readability. -for ai-agent workflows, use --name-only to list what changed, --file to drill into a specific file, ---files-only / --configs-only to focus on one diff category, or --json for machine-readable output.`; - helpUrl = 'docs/components/merging-changes#compare-component-snaps'; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - { - name: 'version', - description: `the base version to compare from. if omitted, compares the workspace's current files to the component's latest version.`, - }, - { - name: 'to-version', - description: `the target version to compare against "version". -if both "version" and "to-version" are provided, compare those two versions directly (ignoring the workspace).`, - }, - ]; - alias = ''; - options = [ - ['p', 'parent', 'compare the specified "version" to its immediate parent instead of comparing to the current one'], - ['v', 'verbose', 'show a more verbose output where possible'], - ['t', 'table', 'show tables instead of plain text for dependencies diff'], - [ - '', - 'file ', - 'show only file diffs for the given component-relative path(s). comma-separated. implies --files-only', - ], - ['', 'files-only', 'show only file-content diffs; omit dependency, env, and aspect-config changes'], - ['', 'configs-only', 'show only dependency, env, and aspect-config changes; omit file-content diffs'], - ['', 'name-only', 'summary: list changed files with status (M/A/D) and changed field categories; no diff bodies'], - ['', 'stat', 'summary: like --name-only but includes +N -M line counts per file'], - ['j', 'json', 'return the diff result as json'], - ] as CommandOptions; - examples = [ - { cmd: 'diff', description: 'show diff for all modified components' }, - { cmd: 'diff foo', description: 'show diff for a component "foo"' }, - { cmd: 'diff foo 0.0.1', description: 'show diff for a component "foo" from the current state to version 0.0.1' }, - { cmd: 'diff foo 0.0.1 0.0.2', description: 'show diff for a component "foo" from version 0.0.1 to version 0.0.2' }, - { - cmd: "diff '$codeModified' ", - description: 'show diff only for components with modified files. ignore config changes', - }, - { - cmd: 'diff foo 0.0.2 --parent', - description: 'compare "foo@0.0.2" to its parent version. showing what changed in 0.0.2', - }, - { cmd: 'diff foo --name-only', description: 'list changed files and field categories without diff bodies' }, - { cmd: 'diff foo --file src/index.ts', description: 'show the diff of a single file in a component' }, - { cmd: 'diff foo --files-only', description: 'show only source-code diffs, skip dependency/config changes' }, - { cmd: 'diff foo --json', description: 'return the diff result as json for programmatic consumption' }, - ]; - loader = true; + name = diffCommand.name; + group = diffCommand.group; + description = diffCommand.description; + extendedDescription = diffCommand.extendedDescription; + helpUrl = diffCommand.helpUrl; + arguments = diffCommand.arguments; + alias = diffCommand.alias; + options = diffCommand.options; + examples = diffCommand.examples; + loader = diffCommand.loader; constructor(private componentCompareMain: ComponentCompareMain) {} diff --git a/scopes/component/component-log/blame-cmd.ts b/scopes/component/component-log/blame-cmd.ts index 8e2a2337b955..ce48707da60a 100644 --- a/scopes/component/component-log/blame-cmd.ts +++ b/scopes/component/component-log/blame-cmd.ts @@ -2,17 +2,16 @@ import type { Command, CommandOptions } from '@teambit/cli'; import chalk from 'chalk'; import type { ComponentLogMain } from './component-log.main.runtime'; import { getEmptyTableWithoutStyle } from './log-cmd'; +import { blameCommand } from './component-log.commands'; export class BlameCmd implements Command { - name = 'blame '; - description = 'EXPERIMENTAL. show line-by-line authorship and modification history'; - extendedDescription = `displays who last modified each line of a file and when the change was made. -tracks line-level changes across component versions. -shows author, date, version hash, and optionally commit messages for each line.`; - group = 'version-control'; - alias = ''; - options = [['m', 'include-message', 'show the commit message']] as CommandOptions; - arguments = [{ name: 'filepath', description: 'file path relative to the workspace' }]; + name = blameCommand.name; + description = blameCommand.description; + extendedDescription = blameCommand.extendedDescription; + group = blameCommand.group; + alias = blameCommand.alias; + options = blameCommand.options; + arguments = blameCommand.arguments; constructor(private componentLog: ComponentLogMain) {} diff --git a/scopes/component/component-log/component-log.aspect.ts b/scopes/component/component-log/component-log.aspect.ts index 1d5eb6b15e24..53b498e8451e 100644 --- a/scopes/component/component-log/component-log.aspect.ts +++ b/scopes/component/component-log/component-log.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentLogAspect = Aspect.create({ id: 'teambit.component/component-log', + runtimes: { main: () => import('./component-log.main.runtime') }, + commands: () => import('./component-log.commands').then((m) => [m.logCommand, m.logFileCommand, m.blameCommand]), }); diff --git a/scopes/component/component-log/component-log.commands.ts b/scopes/component/component-log/component-log.commands.ts new file mode 100644 index 000000000000..de9c48f2c1ec --- /dev/null +++ b/scopes/component/component-log/component-log.commands.ts @@ -0,0 +1,62 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const logCommand: CommandDescriptor = { + name: 'log ', + alias: '', + description: 'display component version history', + extendedDescription: `shows chronological history of component versions including tags and snaps with metadata. + displays commit messages, authors, dates, and version information. supports both local and remote component logs. + use various format options for compact or detailed views of version history.`, + helpUrl: 'reference/components/navigating-history', + group: 'version-control', + arguments: [{ name: 'id', description: 'component-id or component-name' }], + remoteOp: true, + skipWorkspace: true, + options: [ + ['r', 'remote', 'show log of a remote component'], + ['', 'parents', 'show parents and lanes data'], + ['o', 'one-line', 'show each log entry in one line'], + ['f', 'full-hash', 'show full hash of the snap (default to the first 9 characters for --one-line/--parents flags)'], + ['m', 'full-message', 'show full message of the snap (default to the first line for --one-line/--parents flags)'], + [ + '', + 'show-hidden', + 'show hidden snaps (snaps are marked as hidden typically when the following tag has the same files/config)', + ], + ['j', 'json', 'json format'], + ] as CommandOptions, +}; + +export const logFileCommand: CommandDescriptor = { + name: 'log-file ', + alias: '', + description: 'EXPERIMENTAL. display history of changes to a specific file', + extendedDescription: `shows version history for a specific file within component versions. + tracks file-level changes across component snaps and tags. + displays file modifications, hashes, and associated commit information.`, + group: 'version-control', + arguments: [{ name: 'filepath', description: 'file path relative to the workspace' }], + options: [['o', 'one-line', 'show each log entry in one line']] as CommandOptions, +}; + +export const blameCommand: CommandDescriptor = { + name: 'blame ', + alias: '', + description: 'EXPERIMENTAL. show line-by-line authorship and modification history', + extendedDescription: `displays who last modified each line of a file and when the change was made. + tracks line-level changes across component versions. + shows author, date, version hash, and optionally commit messages for each line.`, + group: 'version-control', + arguments: [{ name: 'filepath', description: 'file path relative to the workspace' }], + options: [['m', 'include-message', 'show the commit message']] as CommandOptions, +}; diff --git a/scopes/component/component-log/component-log.main.runtime.ts b/scopes/component/component-log/component-log.main.runtime.ts index 1c72958eb15f..07fd648c9305 100644 --- a/scopes/component/component-log/component-log.main.runtime.ts +++ b/scopes/component/component-log/component-log.main.runtime.ts @@ -22,6 +22,7 @@ import LogCmd from './log-cmd'; import { buildSnapGraph } from './snap-graph'; import { LogFileCmd } from './log-file-cmd'; import { BlameCmd } from './blame-cmd'; +import { blameCommand, logCommand, logFileCommand } from './component-log.commands'; export type FileLog = { hash: string; @@ -374,7 +375,9 @@ export class ComponentLogMain { static runtime = MainRuntime; static async provider([cli, workspace]: [CLIMain, Workspace]) { const componentLog = new ComponentLogMain(workspace); - cli.register(new LogCmd(componentLog), new LogFileCmd(componentLog), new BlameCmd(componentLog)); + cli.register(logCommand, () => new LogCmd(componentLog)); + cli.register(logFileCommand, () => new LogFileCmd(componentLog)); + cli.register(blameCommand, () => new BlameCmd(componentLog)); return componentLog; } } diff --git a/scopes/component/component-log/log-cmd.ts b/scopes/component/component-log/log-cmd.ts index 4fb04d8e7a47..e4de4c7ceb2d 100644 --- a/scopes/component/component-log/log-cmd.ts +++ b/scopes/component/component-log/log-cmd.ts @@ -4,6 +4,7 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { warnSymbol, errorSymbol } from '@teambit/cli'; import type { LegacyComponentLog } from '@teambit/legacy-component-log'; import type { ComponentLogMain, LogOpts } from './component-log.main.runtime'; +import { logCommand } from './component-log.commands'; type LogFlags = { remote?: boolean; @@ -14,30 +15,16 @@ type LogFlags = { showHidden?: boolean; }; export default class LogCmd implements Command { - name = 'log '; - description = 'display component version history'; - helpUrl = 'reference/components/navigating-history'; - extendedDescription = `shows chronological history of component versions including tags and snaps with metadata. -displays commit messages, authors, dates, and version information. supports both local and remote component logs. -use various format options for compact or detailed views of version history.`; - group = 'version-control'; - alias = ''; - options = [ - ['r', 'remote', 'show log of a remote component'], - ['', 'parents', 'show parents and lanes data'], - ['o', 'one-line', 'show each log entry in one line'], - ['f', 'full-hash', 'show full hash of the snap (default to the first 9 characters for --one-line/--parents flags)'], - ['m', 'full-message', 'show full message of the snap (default to the first line for --one-line/--parents flags)'], - [ - '', - 'show-hidden', - 'show hidden snaps (snaps are marked as hidden typically when the following tag has the same files/config)', - ], - ['j', 'json', 'json format'], - ] as CommandOptions; - remoteOp = true; // should support log against remote - skipWorkspace = true; - arguments = [{ name: 'id', description: 'component-id or component-name' }]; + name = logCommand.name; + description = logCommand.description; + helpUrl = logCommand.helpUrl; + extendedDescription = logCommand.extendedDescription; + group = logCommand.group; + alias = logCommand.alias; + options = logCommand.options; + remoteOp = logCommand.remoteOp; // should support log against remote + skipWorkspace = logCommand.skipWorkspace; + arguments = logCommand.arguments; constructor(private componentLog: ComponentLogMain) {} diff --git a/scopes/component/component-log/log-file-cmd.ts b/scopes/component/component-log/log-file-cmd.ts index 04bba538d9e3..c988fbbf8ad2 100644 --- a/scopes/component/component-log/log-file-cmd.ts +++ b/scopes/component/component-log/log-file-cmd.ts @@ -2,17 +2,16 @@ import type { Command, CommandOptions } from '@teambit/cli'; import chalk from 'chalk'; import type { ComponentLogMain } from './component-log.main.runtime'; import { getEmptyTableWithoutStyle, paintAuthor } from './log-cmd'; +import { logFileCommand } from './component-log.commands'; export class LogFileCmd implements Command { - name = 'log-file '; - description = 'EXPERIMENTAL. display history of changes to a specific file'; - extendedDescription = `shows version history for a specific file within component versions. -tracks file-level changes across component snaps and tags. -displays file modifications, hashes, and associated commit information.`; - group = 'version-control'; - alias = ''; - options = [['o', 'one-line', 'show each log entry in one line']] as CommandOptions; - arguments = [{ name: 'filepath', description: 'file path relative to the workspace' }]; + name = logFileCommand.name; + description = logFileCommand.description; + extendedDescription = logFileCommand.extendedDescription; + group = logFileCommand.group; + alias = logFileCommand.alias; + options = logFileCommand.options; + arguments = logFileCommand.arguments; constructor(private componentLog: ComponentLogMain) {} diff --git a/scopes/component/component-sizer/component-sizer.aspect.ts b/scopes/component/component-sizer/component-sizer.aspect.ts index a1f2dc162e3b..d9e5e2be5508 100644 --- a/scopes/component/component-sizer/component-sizer.aspect.ts +++ b/scopes/component/component-sizer/component-sizer.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentSizerAspect = Aspect.create({ id: 'teambit.component/component-sizer', + runtimes: { main: () => import('./component-sizer.main.runtime') }, }); export default ComponentSizerAspect; diff --git a/scopes/component/component-tree/component-tree.aspect.ts b/scopes/component/component-tree/component-tree.aspect.ts index f830b9657ea7..68072bb3a70b 100644 --- a/scopes/component/component-tree/component-tree.aspect.ts +++ b/scopes/component/component-tree/component-tree.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentTreeAspect = Aspect.create({ id: 'teambit.component/component-tree', + runtimes: { ui: () => import('./component-tree.ui.runtime') }, }); export default ComponentTreeAspect; diff --git a/scopes/component/component-writer/component-writer.aspect.ts b/scopes/component/component-writer/component-writer.aspect.ts index 1f88fdf9fdec..e416cc430169 100644 --- a/scopes/component/component-writer/component-writer.aspect.ts +++ b/scopes/component/component-writer/component-writer.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentWriterAspect = Aspect.create({ id: 'teambit.component/component-writer', + runtimes: { main: () => import('./component-writer.main.runtime') }, }); diff --git a/scopes/component/component/cat/cat.cmd.ts b/scopes/component/component/cat/cat.cmd.ts index b83d9e83a5f9..0ef91e574101 100644 --- a/scopes/component/component/cat/cat.cmd.ts +++ b/scopes/component/component/cat/cat.cmd.ts @@ -3,6 +3,7 @@ import { BitError } from '@teambit/bit-error'; import { pathNormalizeToLinux } from '@teambit/toolbox.path.path'; import type { Component } from '../component'; import type { ComponentMain } from '../component.main.runtime'; +import { catCommand } from '../component.commands'; const ENVS_ASPECT_ID = 'teambit.envs/envs'; @@ -14,23 +15,13 @@ type CatFlags = { }; export class CatCmd implements Command { - name = 'cat '; - description = 'print source files or config of a component at a specific version'; - group = 'info-analysis'; - alias = ''; - skipWorkspace = true; - arguments = [ - { - name: 'component-id', - description: 'component ID, optionally with @version (e.g. scope/name@1.0.0)', - }, - ]; - options = [ - ['f', 'file ', 'show only the specified file (relative to component root)'], - ['c', 'config', 'show component configuration (env, dependencies) instead of source files'], - ['a', 'all', 'show both source files and configuration'], - ['j', 'json', 'output as JSON'], - ] as CommandOptions; + name = catCommand.name; + description = catCommand.description; + group = catCommand.group; + alias = catCommand.alias; + skipWorkspace = catCommand.skipWorkspace; + arguments = catCommand.arguments; + options = catCommand.options; constructor(private component: ComponentMain) {} diff --git a/scopes/component/component/component.aspect.ts b/scopes/component/component/component.aspect.ts index d4e42b53162a..3ba08ec94273 100644 --- a/scopes/component/component/component.aspect.ts +++ b/scopes/component/component/component.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ComponentAspect = Aspect.create({ id: 'teambit.component/component', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./component.main.runtime') }, }); export default ComponentAspect; diff --git a/scopes/component/component/component.commands.ts b/scopes/component/component/component.commands.ts new file mode 100644 index 000000000000..677a260bf6bd --- /dev/null +++ b/scopes/component/component/component.commands.ts @@ -0,0 +1,52 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const showCommand: CommandDescriptor = { + name: 'show ', + alias: '', + description: 'display component metadata, dependencies, and configuration', + extendedDescription: `shows detailed information about a component including its version, dependencies, environment, and other metadata. + note: to see file changes made in a specific version, use \`bit diff --parent\`.`, + group: 'info-analysis', + arguments: [{ name: 'component-name', description: 'component name or component id' }], + options: [ + ['j', 'json', 'return the component data in json format'], + ['l', 'legacy', 'use the legacy bit show.'], + ['r', 'remote', 'show data for a remote component'], + ['b', 'browser', 'open the component page in the browser'], + [ + 'c', + 'compare', + 'legacy-only. compare current file system component to its latest tagged version [default=latest]', + ], + ] as CommandOptions, +}; + +export const catCommand: CommandDescriptor = { + name: 'cat ', + alias: '', + description: 'print source files or config of a component at a specific version', + group: 'info-analysis', + arguments: [ + { + name: 'component-id', + description: 'component ID, optionally with @version (e.g. scope/name@1.0.0)', + }, + ], + skipWorkspace: true, + options: [ + ['f', 'file ', 'show only the specified file (relative to component root)'], + ['c', 'config', 'show component configuration (env, dependencies) instead of source files'], + ['a', 'all', 'show both source files and configuration'], + ['j', 'json', 'output as JSON'], + ] as CommandOptions, +}; diff --git a/scopes/component/component/component.main.runtime.ts b/scopes/component/component/component.main.runtime.ts index 7b3a447702f6..90e6fe548dcc 100644 --- a/scopes/component/component/component.main.runtime.ts +++ b/scopes/component/component/component.main.runtime.ts @@ -30,6 +30,7 @@ import { FilesFragment, ExtensionsFragment, } from './show'; +import { catCommand, showCommand } from './component.commands'; import { CatCmd } from './cat'; export type ComponentHostSlot = SlotRegistry; @@ -170,7 +171,8 @@ export class ComponentMain { ) { const logger = loggerMain.createLogger(ComponentAspect.id); const componentExtension = new ComponentMain(hostSlot, express, showFragmentSlot); - cli.register(new ShowCmd(componentExtension, logger), new CatCmd(componentExtension)); + cli.register(showCommand, () => new ShowCmd(componentExtension, logger)); + cli.register(catCommand, () => new CatCmd(componentExtension)); componentExtension.registerShowFragments([ new NameFragment(), diff --git a/scopes/component/component/index.ts b/scopes/component/component/index.ts index 6e2a2188f086..9f5506304d3b 100644 --- a/scopes/component/component/index.ts +++ b/scopes/component/component/index.ts @@ -4,7 +4,8 @@ import type { ConsumerComponent } from '@teambit/legacy.consumer-component'; export type { GetComponentsOptions } from './get-component-opts'; export type { UseComponentType } from './ui/use-component'; export type { ConsumerComponent }; -export { useComponentHost } from './host'; +// `useComponentHost` (UI hook) moved out of this barrel — see comment near +// the UI block below. export { Component, InvalidComponent } from './component'; export { ComponentID } from '@teambit/component-id'; export { default as ComponentFS } from './component-fs'; @@ -32,19 +33,18 @@ export { ComponentMap } from './component-map'; export type { ComponentMain } from './component.main.runtime'; export type { ComponentUI } from './component.ui.runtime'; export type { Section } from './section'; -export { ComponentContext, ComponentDescriptorContext, useComponentDescriptor } from './ui/context/component-context'; +// UI runtime symbols moved out of this barrel so that main-runtime callers +// don't pay for the entire UI graph at module-init. Once babel-lazy was +// removed (it was deferring these requires for free), every `import` from +// `@teambit/component` ended up loading the navbar + dropdown packages even +// for `bit status`. UI callers should import directly from the dist subpath, +// e.g. `import { ComponentModel } from '@teambit/component/dist/ui/component-model'`. export type { ComponentProviderProps, ComponentDescriptorProviderProps } from './ui/context'; -export { ComponentProvider, ComponentDescriptorProvider } from './ui/context'; -export { componentFields, componentIdFields, componentOverviewFields } from './ui'; export type { NavPlugin, ConsumePlugin, MenuNavProps } from './ui/menu'; -export { CollapsibleMenuNav, ComponentMenu, VersionRelatedDropdowns } from './ui/menu'; export type { RegisteredComponentRoute, ComponentUrlParams } from './component.route'; export type { ComponentModelProps } from './ui/component-model'; -export { ComponentModel } from './ui/component-model'; -export { TopBarNav } from './ui/top-bar-nav'; export type { ShowFragment, ShowRow, ShowJSONRow } from './show'; export { Config } from './config'; -export { useComponent, useIdFromLocation, useComponentLogs, ComponentLogsResult, Filters } from './ui'; // export { AspectList } from './aspect-list'; // export { AspectEntry } from './aspect-entry'; diff --git a/scopes/component/component/show/show.cmd.ts b/scopes/component/component/show/show.cmd.ts index 99c000ad6fdb..815fbffb5d16 100644 --- a/scopes/component/component/show/show.cmd.ts +++ b/scopes/component/component/show/show.cmd.ts @@ -1,6 +1,7 @@ import open from 'open'; import type { Command, CommandOptions } from '@teambit/cli'; import { compact } from 'lodash'; +import { showCommand } from '../component.commands'; // import { Logger } from '@teambit/logger'; // import chalk from 'chalk'; import { CLITable } from '@teambit/cli-table'; @@ -11,24 +12,13 @@ import type { ComponentMain } from '../component.main.runtime'; import { isLikelyPackageName, resolveComponentIdFromPackageName } from '@teambit/pkg.modules.component-package-name'; export class ShowCmd implements Command { - name = 'show '; - description = 'display component metadata, dependencies, and configuration'; - extendedDescription = `shows detailed information about a component including its version, dependencies, environment, and other metadata. -note: to see file changes made in a specific version, use \`bit diff --parent\`.`; - alias = ''; - group = 'info-analysis'; - arguments = [{ name: 'component-name', description: 'component name or component id' }]; - options = [ - ['j', 'json', 'return the component data in json format'], - ['l', 'legacy', 'use the legacy bit show.'], - ['r', 'remote', 'show data for a remote component'], - ['b', 'browser', 'open the component page in the browser'], - [ - 'c', - 'compare', - 'legacy-only. compare current file system component to its latest tagged version [default=latest]', - ], - ] as CommandOptions; + name = showCommand.name; + description = showCommand.description; + extendedDescription = showCommand.extendedDescription; + alias = showCommand.alias; + group = showCommand.group; + arguments = showCommand.arguments; + options = showCommand.options; constructor( private component: ComponentMain, diff --git a/scopes/component/deprecation/deprecate-cmd.ts b/scopes/component/deprecation/deprecate-cmd.ts index 6ffcbf87cf3f..4c6f5702b598 100644 --- a/scopes/component/deprecation/deprecate-cmd.ts +++ b/scopes/component/deprecation/deprecate-cmd.ts @@ -1,32 +1,20 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { formatSuccessSummary, formatHint } from '@teambit/cli'; import type { DeprecationMain } from './deprecation.main.runtime'; +import { deprecateCommand } from './deprecation.commands'; export class DeprecateCmd implements Command { - name = 'deprecate '; - arguments = [{ name: 'component-name', description: 'component name or component id' }]; - description = 'mark a component as deprecated to discourage its use'; - extendedDescription = `marks a component as deprecated locally, then after snap/tag and export it becomes deprecated in the remote scope. -optionally specify a replacement component or deprecate only specific version ranges. -deprecated components remain available but display warnings when installed or imported.`; - group = 'collaborate'; - skipWorkspace = true; - alias = 'd'; - options = [ - [ - '', - 'new-id ', - 'if replaced by another component, enter the new component id. alternatively use "bit rename --deprecate" to do this automatically', - ], - [ - '', - 'range ', - 'enter a Semver range to deprecate specific versions. see https://www.npmjs.com/package/semver#ranges for the range syntax', - ], - ] as CommandOptions; - loader = true; - remoteOp = true; - helpUrl = 'reference/components/removing-components'; + name = deprecateCommand.name; + arguments = deprecateCommand.arguments; + description = deprecateCommand.description; + extendedDescription = deprecateCommand.extendedDescription; + group = deprecateCommand.group; + skipWorkspace = deprecateCommand.skipWorkspace; + alias = deprecateCommand.alias; + options = deprecateCommand.options; + loader = deprecateCommand.loader; + remoteOp = deprecateCommand.remoteOp; + helpUrl = deprecateCommand.helpUrl; constructor(private deprecation: DeprecationMain) {} diff --git a/scopes/component/deprecation/deprecation.aspect.ts b/scopes/component/deprecation/deprecation.aspect.ts index 7a2f8456bba6..0dd1c997cdc0 100644 --- a/scopes/component/deprecation/deprecation.aspect.ts +++ b/scopes/component/deprecation/deprecation.aspect.ts @@ -1,9 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DeprecationAspect = Aspect.create({ id: 'teambit.component/deprecation', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./deprecation.main.runtime') }, + commands: () => import('./deprecation.commands').then((m) => [m.deprecateCommand, m.undeprecateCommand]), }); export default DeprecationAspect; diff --git a/scopes/component/deprecation/deprecation.commands.ts b/scopes/component/deprecation/deprecation.commands.ts new file mode 100644 index 000000000000..45cc0040553d --- /dev/null +++ b/scopes/component/deprecation/deprecation.commands.ts @@ -0,0 +1,50 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const deprecateCommand: CommandDescriptor = { + name: 'deprecate ', + alias: 'd', + description: 'mark a component as deprecated to discourage its use', + extendedDescription: `marks a component as deprecated locally, then after snap/tag and export it becomes deprecated in the remote scope. + optionally specify a replacement component or deprecate only specific version ranges. + deprecated components remain available but display warnings when installed or imported.`, + helpUrl: 'reference/components/removing-components', + group: 'collaborate', + arguments: [{ name: 'component-name', description: 'component name or component id' }], + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + [ + '', + 'new-id ', + 'if replaced by another component, enter the new component id. alternatively use "bit rename --deprecate" to do this automatically', + ], + [ + '', + 'range ', + 'enter a Semver range to deprecate specific versions. see https://www.npmjs.com/package/semver#ranges for the range syntax', + ], + ] as CommandOptions, +}; + +export const undeprecateCommand: CommandDescriptor = { + name: 'undeprecate ', + alias: '', + description: 'remove the deprecation status from a component', + extendedDescription: 'reverses the deprecation of a component, removing warnings and allowing normal use again.', + group: 'collaborate', + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [] as CommandOptions, +}; diff --git a/scopes/component/deprecation/deprecation.main.runtime.ts b/scopes/component/deprecation/deprecation.main.runtime.ts index 6daa51c3019f..f655f5ba82b0 100644 --- a/scopes/component/deprecation/deprecation.main.runtime.ts +++ b/scopes/component/deprecation/deprecation.main.runtime.ts @@ -22,6 +22,7 @@ import type { DependencyResolverMain } from '@teambit/dependency-resolver'; import { DependencyResolverAspect } from '@teambit/dependency-resolver'; import { compact } from 'lodash'; import { IssuesClasses } from '@teambit/component-issues'; +import { deprecateCommand, undeprecateCommand } from './deprecation.commands'; export type DeprecationInfo = { isDeprecate: boolean; @@ -194,7 +195,8 @@ export class DeprecationMain { ]) { const deprecation = new DeprecationMain(scope, workspace, depsResolver); issues.registerAddComponentsIssues(deprecation.addDeprecatedDependenciesIssues.bind(deprecation)); - cli.register(new DeprecateCmd(deprecation), new UndeprecateCmd(deprecation)); + cli.register(deprecateCommand, () => new DeprecateCmd(deprecation)); + cli.register(undeprecateCommand, () => new UndeprecateCmd(deprecation)); componentAspect.registerShowFragments([new DeprecationFragment(deprecation)]); graphql.register(() => deprecationSchema(deprecation)); diff --git a/scopes/component/deprecation/undeprecate-cmd.ts b/scopes/component/deprecation/undeprecate-cmd.ts index 4602748bd3b4..c6e04e7d1a4e 100644 --- a/scopes/component/deprecation/undeprecate-cmd.ts +++ b/scopes/component/deprecation/undeprecate-cmd.ts @@ -1,17 +1,18 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { formatSuccessSummary, formatHint } from '@teambit/cli'; import type { DeprecationMain } from './deprecation.main.runtime'; +import { undeprecateCommand } from './deprecation.commands'; export class UndeprecateCmd implements Command { - name = 'undeprecate '; - group = 'collaborate'; - description = 'remove the deprecation status from a component'; - extendedDescription = 'reverses the deprecation of a component, removing warnings and allowing normal use again.'; - alias = ''; - options = [] as CommandOptions; - loader = true; - skipWorkspace = true; - remoteOp = true; + name = undeprecateCommand.name; + group = undeprecateCommand.group; + description = undeprecateCommand.description; + extendedDescription = undeprecateCommand.extendedDescription; + alias = undeprecateCommand.alias; + options = undeprecateCommand.options; + loader = undeprecateCommand.loader; + skipWorkspace = undeprecateCommand.skipWorkspace; + remoteOp = undeprecateCommand.remoteOp; constructor(private deprecation: DeprecationMain) {} diff --git a/scopes/component/dev-files/dev-files.aspect.ts b/scopes/component/dev-files/dev-files.aspect.ts index 692d392a504a..8da117cb084d 100644 --- a/scopes/component/dev-files/dev-files.aspect.ts +++ b/scopes/component/dev-files/dev-files.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DevFilesAspect = Aspect.create({ id: 'teambit.component/dev-files', + runtimes: { main: () => import('./dev-files.main.runtime') }, }); diff --git a/scopes/component/forking/fork.cmd.ts b/scopes/component/forking/fork.cmd.ts index d2bb182e6a93..c775a8d01ac5 100644 --- a/scopes/component/forking/fork.cmd.ts +++ b/scopes/component/forking/fork.cmd.ts @@ -6,6 +6,7 @@ import { hasWildcard } from '@teambit/legacy.utils'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { WorkspaceComponentLoadOptions } from '@teambit/workspace'; import type { ForkingMain } from './forking.main.runtime'; +import { forkCommand } from './forking.commands'; export type ForkOptions = { scope?: string; @@ -23,49 +24,16 @@ export type ForkOptions = { }; export class ForkCmd implements Command { - name = 'fork [target-component-name]'; - description = 'create a new component by copying from an existing one'; - extendedDescription = `duplicates an existing component's source files and configuration to create a new independent component. -useful for creating variations or starting development from a similar component. -automatically handles import/require statement updates and provides refactoring options. + name = forkCommand.name; + description = forkCommand.description; + extendedDescription = forkCommand.extendedDescription; + helpUrl = forkCommand.helpUrl; + arguments = forkCommand.arguments; + group = forkCommand.group; + skipWorkspace = forkCommand.skipWorkspace; + alias = forkCommand.alias; -when using a pattern, all matching components are forked with the same name to a target scope. -the target-component-name argument is not allowed when using patterns.`; - helpUrl = 'docs/getting-started/collaborate/importing-components#fork-a-component'; - arguments = [ - { - name: 'pattern', - description: COMPONENT_PATTERN_HELP, - }, - { - name: 'target-component-name', - description: - "the name for the new component (component name without scope, e.g. name/spaces/my-button). to set a different scope, use the '--scope' flag. not allowed when using patterns", - }, - ]; - group = 'collaborate'; - skipWorkspace = true; - alias = ''; - - options = [ - ['s', 'scope ', 'default scope for the new component'], - [ - 'p', - 'path ', - 'relative path in the workspace for the new component. by default the path is `//`', - ], - ['r', 'refactor', 'update the import/require statements in all dependent components (in the same workspace)'], - ['x', 'skip-dependency-installation', 'do not install packages of the imported components'], - ['e', 'env ', 'set the environment for the new component'], - [ - '', - 'skip-config', - 'do not copy the config (aspects-config, env, etc) to the new component. helpful when it fails during aspect loading', - ], - ['', 'preserve', 'avoid refactoring file and variable/class names according to the new component name'], - ['', 'no-link', 'avoid saving a reference to the original component'], - ['', 'ast', 'use ast to transform files instead of regex'], - ] as CommandOptions; + options = forkCommand.options; example: [ { @@ -81,8 +49,8 @@ the target-component-name argument is not allowed when using patterns.`; description: 'fork all string utility components to the workspace default scope'; }, ]; - loader = true; - remoteOp = true; + loader = forkCommand.loader; + remoteOp = forkCommand.remoteOp; constructor(private forking: ForkingMain) {} diff --git a/scopes/component/forking/forking.aspect.ts b/scopes/component/forking/forking.aspect.ts index 8b8c6f0b567e..dbef019d1e74 100644 --- a/scopes/component/forking/forking.aspect.ts +++ b/scopes/component/forking/forking.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ForkingAspect = Aspect.create({ id: 'teambit.component/forking', + runtimes: { main: () => import('./forking.main.runtime') }, + commands: () => import('./forking.commands').then((m) => [m.forkCommand]), }); diff --git a/scopes/component/forking/forking.commands.ts b/scopes/component/forking/forking.commands.ts new file mode 100644 index 000000000000..c9b42d41c87d --- /dev/null +++ b/scopes/component/forking/forking.commands.ts @@ -0,0 +1,59 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const forkCommand: CommandDescriptor = { + name: 'fork [target-component-name]', + alias: '', + description: 'create a new component by copying from an existing one', + extendedDescription: `duplicates an existing component's source files and configuration to create a new independent component. + useful for creating variations or starting development from a similar component. + automatically handles import/require statement updates and provides refactoring options. + + when using a pattern, all matching components are forked with the same name to a target scope. + the target-component-name argument is not allowed when using patterns.`, + helpUrl: 'docs/getting-started/collaborate/importing-components#fork-a-component', + group: 'collaborate', + arguments: [ + { + name: 'pattern', + description: COMPONENT_PATTERN_HELP, + }, + { + name: 'target-component-name', + description: + "the name for the new component (component name without scope, e.g. name/spaces/my-button). to set a different scope, use the '--scope' flag. not allowed when using patterns", + }, + ], + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + ['s', 'scope ', 'default scope for the new component'], + [ + 'p', + 'path ', + 'relative path in the workspace for the new component. by default the path is `//`', + ], + ['r', 'refactor', 'update the import/require statements in all dependent components (in the same workspace)'], + ['x', 'skip-dependency-installation', 'do not install packages of the imported components'], + ['e', 'env ', 'set the environment for the new component'], + [ + '', + 'skip-config', + 'do not copy the config (aspects-config, env, etc) to the new component. helpful when it fails during aspect loading', + ], + ['', 'preserve', 'avoid refactoring file and variable/class names according to the new component name'], + ['', 'no-link', 'avoid saving a reference to the original component'], + ['', 'ast', 'use ast to transform files instead of regex'], + ] as CommandOptions, +}; diff --git a/scopes/component/forking/forking.main.runtime.ts b/scopes/component/forking/forking.main.runtime.ts index e5fe89c51c45..b78b2d196478 100644 --- a/scopes/component/forking/forking.main.runtime.ts +++ b/scopes/component/forking/forking.main.runtime.ts @@ -35,6 +35,7 @@ import type { ScopeForkOptions } from './scope-fork.cmd'; import { ScopeForkCmd } from './scope-fork.cmd'; import type { ScopeMain } from '@teambit/scope'; import { ScopeAspect } from '@teambit/scope'; +import { forkCommand } from './forking.commands'; export type ForkInfo = { forkedFrom: ComponentID; @@ -543,7 +544,7 @@ the reason is that the refactor changes the components using ${sourceId.toString refactoring, pkg ); - cli.register(new ForkCmd(forkingMain)); + cli.register(forkCommand, () => new ForkCmd(forkingMain)); graphql.register(() => forkingSchema(forkingMain)); componentMain.registerShowFragments([new ForkingFragment(forkingMain)]); diff --git a/scopes/component/graph/graph-cmd.ts b/scopes/component/graph/graph-cmd.ts index 555df746fa6f..e03cea33aa46 100644 --- a/scopes/component/graph/graph-cmd.ts +++ b/scopes/component/graph/graph-cmd.ts @@ -7,6 +7,7 @@ import { VisualDependencyGraph } from '@teambit/legacy.dependency-graph'; import { getRemoteByName } from '@teambit/scope.remotes'; import type { ComponentMain } from '@teambit/component'; import type { GraphMain } from './graph.main.runtime'; +import { graphCommand } from './graph.commands'; export type GraphOpt = { remote?: string; @@ -19,35 +20,13 @@ export type GraphOpt = { }; export class GraphCmd implements Command { - name = 'graph [id]'; - description = 'visualize component dependencies as a graph image'; - extendedDescription = `generates an SVG (or PNG) image showing component dependency relationships. -black arrows represent runtime dependencies, red arrows show dev or peer dependencies. -by default shows only workspace components; use --include-dependencies for full dependency tree.`; - group = 'info-analysis'; - alias = ''; - options = [ - ['r', 'remote [remoteName]', 'remote name (name is optional, leave empty when id is specified)'], - [ - '', - 'layout ', - 'GraphVis layout. default to "dot". options are [circo, dot, fdp, neato, osage, patchwork, sfdp, twopi]', - ], - ['', 'png', 'save the graph as a png file instead of svg. requires "graphviz" to be installed'], - ['', 'cycles', 'generate a graph of cycles only'], - [ - '', - 'include-local-only', - 'DEPRECATED: include only the components in the workspace (or local scope). This is now the default behavior.', - ], - [ - '', - 'include-dependencies', - 'include all dependencies recursively, not just workspace (or local scope) components', - ], - ['j', 'json', 'json format'], - ] as CommandOptions; - remoteOp = true; + name = graphCommand.name; + description = graphCommand.description; + extendedDescription = graphCommand.extendedDescription; + group = graphCommand.group; + alias = graphCommand.alias; + options = graphCommand.options; + remoteOp = graphCommand.remoteOp; constructor( private componentAspect: ComponentMain, diff --git a/scopes/component/graph/graph.aspect.ts b/scopes/component/graph/graph.aspect.ts index a29235d37d48..9fee4149214b 100644 --- a/scopes/component/graph/graph.aspect.ts +++ b/scopes/component/graph/graph.aspect.ts @@ -1,9 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const GraphAspect = Aspect.create({ id: 'teambit.component/graph', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./graph.main.runtime') }, + commands: () => import('./graph.commands').then((m) => [m.graphCommand]), }); export default GraphAspect; diff --git a/scopes/component/graph/graph.commands.ts b/scopes/component/graph/graph.commands.ts new file mode 100644 index 000000000000..555f1eb5068e --- /dev/null +++ b/scopes/component/graph/graph.commands.ts @@ -0,0 +1,43 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const graphCommand: CommandDescriptor = { + name: 'graph [id]', + alias: '', + description: 'visualize component dependencies as a graph image', + extendedDescription: `generates an SVG (or PNG) image showing component dependency relationships. + black arrows represent runtime dependencies, red arrows show dev or peer dependencies. + by default shows only workspace components; use --include-dependencies for full dependency tree.`, + group: 'info-analysis', + remoteOp: true, + options: [ + ['r', 'remote [remoteName]', 'remote name (name is optional, leave empty when id is specified)'], + [ + '', + 'layout ', + 'GraphVis layout. default to "dot". options are [circo, dot, fdp, neato, osage, patchwork, sfdp, twopi]', + ], + ['', 'png', 'save the graph as a png file instead of svg. requires "graphviz" to be installed'], + ['', 'cycles', 'generate a graph of cycles only'], + [ + '', + 'include-local-only', + 'DEPRECATED: include only the components in the workspace (or local scope). This is now the default behavior.', + ], + [ + '', + 'include-dependencies', + 'include all dependencies recursively, not just workspace (or local scope) components', + ], + ['j', 'json', 'json format'], + ] as CommandOptions, +}; diff --git a/scopes/component/graph/graph.main.runtime.ts b/scopes/component/graph/graph.main.runtime.ts index e4b8a6a921ad..55f175be4378 100644 --- a/scopes/component/graph/graph.main.runtime.ts +++ b/scopes/component/graph/graph.main.runtime.ts @@ -17,6 +17,7 @@ import type { ComponentGraph } from './component-graph'; import type { ComponentIdGraph } from './component-id-graph'; import type { GraphConfig } from '@teambit/legacy.dependency-graph'; import { VisualDependencyGraph } from '@teambit/legacy.dependency-graph'; +import { graphCommand } from './graph.commands'; export class GraphMain { constructor( @@ -103,7 +104,7 @@ export class GraphMain { graphql.register(() => graphSchema(graphBuilder, componentAspect)); const graphMain = new GraphMain(componentAspect, logger); - cli.register(new GraphCmd(componentAspect, graphMain)); + cli.register(graphCommand, () => new GraphCmd(componentAspect, graphMain)); return graphMain; } diff --git a/scopes/component/graph/index.ts b/scopes/component/graph/index.ts index b7fcfd2baff0..874654b600ab 100644 --- a/scopes/component/graph/index.ts +++ b/scopes/component/graph/index.ts @@ -1,18 +1,13 @@ -export { DependenciesCompare } from './ui/dependencies-compare'; +// UI value exports removed from this barrel: +// - DependenciesCompare (was: './ui/dependencies-compare') +// - calcElements / calcLayout / etc. (was: './ui/dependencies-graph') +// - GraphFilters / graphPageStyles (was: './ui/graph-page') +// - EdgeModel / GraphModel / NodeModel / useGraph / useGraphQuery (was: './ui/query') +// - componentNodeStyles / root / defaultNode / external (was: './ui/component-node') +// UI callers should import from those paths directly. export { Dependency, DependencyType } from './model/dependency'; export { DuplicateDependency } from './duplicate-dependency'; export { GraphAspect as default, GraphAspect } from './graph.aspect'; -export { - calcElements, - calcLayout, - calcMinimapColors, - depTypeToClass, - depTypeToLabel, - styles as dependenciesGraphStyles, -} from './ui/dependencies-graph'; -export { GraphFilters, styles as graphPageStyles } from './ui/graph-page'; -export { EdgeModel, GraphModel, NodeModel, useGraph, useGraphQuery } from './ui/query'; -export { styles as componentNodeStyles, root, defaultNode, external } from './ui/component-node'; export type { RawGraph } from './ui/query'; export type { CompIdGraph, DepEdgeType, ComponentIdGraph } from './component-id-graph'; export type { ComponentGraph } from './component-graph'; diff --git a/scopes/component/isolator/isolator.aspect.ts b/scopes/component/isolator/isolator.aspect.ts index 238ec02c035d..b5818147ed75 100644 --- a/scopes/component/isolator/isolator.aspect.ts +++ b/scopes/component/isolator/isolator.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const IsolatorAspect = Aspect.create({ id: 'teambit.component/isolator', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./isolator.main.runtime') }, }); diff --git a/scopes/component/issues/issues-cmd.ts b/scopes/component/issues/issues-cmd.ts index b2cbd4bce6be..0cd3d4750f3d 100644 --- a/scopes/component/issues/issues-cmd.ts +++ b/scopes/component/issues/issues-cmd.ts @@ -2,15 +2,16 @@ import chalk from 'chalk'; import type { Command, CommandOptions } from '@teambit/cli'; import { IssuesAspect } from './issues.aspect'; import type { IssuesMain } from './issues.main.runtime'; +import { componentIssuesCommand } from './issues.commands'; export class ComponentIssuesCmd implements Command { - name = 'component-issues'; - description = 'list available component-issues'; - alias = ''; - group = 'info-analysis'; - options = [['j', 'json', 'output issues in json format']] as CommandOptions; - loader = true; - private = true; + name = componentIssuesCommand.name; + description = componentIssuesCommand.description; + alias = componentIssuesCommand.alias; + group = componentIssuesCommand.group; + options = componentIssuesCommand.options; + loader = componentIssuesCommand.loader; + private = componentIssuesCommand.private; constructor(private issues: IssuesMain) {} diff --git a/scopes/component/issues/issues.aspect.ts b/scopes/component/issues/issues.aspect.ts index 2dc66111d869..0438fc5464e1 100644 --- a/scopes/component/issues/issues.aspect.ts +++ b/scopes/component/issues/issues.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const IssuesAspect = Aspect.create({ id: 'teambit.component/issues', + runtimes: { main: () => import('./issues.main.runtime') }, + commands: () => import('./issues.commands').then((m) => [m.componentIssuesCommand]), }); diff --git a/scopes/component/issues/issues.commands.ts b/scopes/component/issues/issues.commands.ts new file mode 100644 index 000000000000..fe730baf30c5 --- /dev/null +++ b/scopes/component/issues/issues.commands.ts @@ -0,0 +1,21 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const componentIssuesCommand: CommandDescriptor = { + name: 'component-issues', + alias: '', + description: 'list available component-issues', + group: 'info-analysis', + private: true, + loader: true, + options: [['j', 'json', 'output issues in json format']] as CommandOptions, +}; diff --git a/scopes/component/issues/issues.main.runtime.ts b/scopes/component/issues/issues.main.runtime.ts index 66f0d602f85e..2d5480b66a55 100644 --- a/scopes/component/issues/issues.main.runtime.ts +++ b/scopes/component/issues/issues.main.runtime.ts @@ -8,6 +8,7 @@ import pMapSeries from 'p-map-series'; import { ComponentIssuesCmd } from './issues-cmd'; import { IssuesAspect } from './issues.aspect'; import { NonExistIssueError } from './non-exist-issue-error'; +import { componentIssuesCommand } from './issues.commands'; export type IssuesConfig = { ignoreIssues: string[]; @@ -93,7 +94,7 @@ export class IssuesMain { static runtime = MainRuntime; static async provider([cli]: [CLIMain], config: IssuesConfig, [addComponentsIssuesSlot]: [AddComponentsIssuesSlot]) { const issuesMain = new IssuesMain(config, addComponentsIssuesSlot); - cli.register(new ComponentIssuesCmd(issuesMain)); + cli.register(componentIssuesCommand, () => new ComponentIssuesCmd(issuesMain)); return issuesMain; } } diff --git a/scopes/component/lister/list.cmd.ts b/scopes/component/lister/list.cmd.ts index 913d3854a389..ee84eb108b4e 100644 --- a/scopes/component/lister/list.cmd.ts +++ b/scopes/component/lister/list.cmd.ts @@ -4,6 +4,7 @@ import chalk from 'chalk'; import { hasWildcard } from '@teambit/legacy.utils'; import { listTemplate } from './list-template'; import type { ListerMain, ListScopeResult } from './lister.main.runtime'; +import { listCommand } from './lister.commands'; type ListFlags = { ids?: boolean; @@ -16,30 +17,17 @@ type ListFlags = { }; export class ListCmd implements Command { - name = 'list [remote-scope]'; - description = 'display components in workspace or remote scope'; - extendedDescription = `shows components in the current workspace by default, or from a specified remote scope. -supports filtering by scope, namespace, and various display options. -use --outdated to highlight components that have newer versions available.`; - group = 'info-analysis'; - helpUrl = 'reference/reference/cli-reference#list'; - alias = 'ls'; - options = [ - ['i', 'ids', 'show only component ids, unformatted'], - ['l', 'local-scope', 'show only components stored in the local scope, including indirect dependencies'], - ['s', 'scope ', 'filter components by their scope name (e.g., teambit.workspace)'], - ['o', 'outdated', 'highlight outdated components, in comparison with their latest remote version (if one exists)'], - ['d', 'include-deleted', 'EXPERIMENTAL. show also deleted components'], - ['j', 'json', 'show the output in JSON format'], - [ - 'n', - 'namespace ', - "filter components by their namespace (a logical grouping within a scope, e.g., 'ui', '*/ui')", - ], - ] as CommandOptions; - loader = true; - skipWorkspace = true; - remoteOp = true; + name = listCommand.name; + description = listCommand.description; + extendedDescription = listCommand.extendedDescription; + group = listCommand.group; + helpUrl = listCommand.helpUrl; + alias = listCommand.alias; + options = listCommand.options; + loader = listCommand.loader; + loadAspects = listCommand.loadAspects; + skipWorkspace = listCommand.skipWorkspace; + remoteOp = listCommand.remoteOp; constructor(private lister: ListerMain) {} diff --git a/scopes/component/lister/lister.aspect.ts b/scopes/component/lister/lister.aspect.ts index de70ecd2d147..d2865864a6f8 100644 --- a/scopes/component/lister/lister.aspect.ts +++ b/scopes/component/lister/lister.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ListerAspect = Aspect.create({ id: 'teambit.component/lister', + runtimes: { main: () => import('./lister.main.runtime') }, + commands: () => import('./lister.commands').then((m) => [m.listCommand, m.searchCommand]), }); diff --git a/scopes/component/lister/lister.commands.ts b/scopes/component/lister/lister.commands.ts new file mode 100644 index 000000000000..3184a0a176ba --- /dev/null +++ b/scopes/component/lister/lister.commands.ts @@ -0,0 +1,62 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const listCommand: CommandDescriptor = { + name: 'list [remote-scope]', + alias: 'ls', + description: 'display components in workspace or remote scope', + extendedDescription: `shows components in the current workspace by default, or from a specified remote scope. + supports filtering by scope, namespace, and various display options. + use --outdated to highlight components that have newer versions available.`, + helpUrl: 'reference/reference/cli-reference#list', + group: 'info-analysis', + remoteOp: true, + skipWorkspace: true, + loader: true, + // `list` only reads bitmap + scope cache; it doesn't need workspace + // aspects resolved per component. Skipping `loadAspects` lets the + // `workspace.cli.registerOnStart` hook exit early, which saves a + // significant chunk on workspaces with many configured extensions. + loadAspects: false, + options: [ + ['i', 'ids', 'show only component ids, unformatted'], + ['l', 'local-scope', 'show only components stored in the local scope, including indirect dependencies'], + ['s', 'scope ', 'filter components by their scope name (e.g., teambit.workspace)'], + ['o', 'outdated', 'highlight outdated components, in comparison with their latest remote version (if one exists)'], + ['d', 'include-deleted', 'EXPERIMENTAL. show also deleted components'], + ['j', 'json', 'show the output in JSON format'], + [ + 'n', + 'namespace ', + "filter components by their namespace (a logical grouping within a scope, e.g., 'ui', '*/ui')", + ], + ] as CommandOptions, +}; + +export const searchCommand: CommandDescriptor = { + name: 'search ', + description: 'search for components by keyword in the local workspace and remote bit cloud', + extendedDescription: `runs the provided query terms in parallel against bit cloud and against the local workspace. + multiple queries are unioned (deduplicated) in the output. by default, remote results are filtered by the + owner extracted from the workspace's defaultScope; use --owners or --skip-auto-owner to change this.`, + group: 'info-analysis', + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + ['o', 'owners ', 'comma-separated list of owners/orgs to filter remote results by'], + ['', 'skip-auto-owner', 'do not auto-extract owner from workspace defaultScope'], + ['r', 'remote-only', 'only search remote bit cloud, skip local workspace'], + ['l', 'local-only', 'only search the local workspace, skip remote bit cloud'], + ['j', 'json', 'show the output in JSON format'], + ] as CommandOptions, +}; diff --git a/scopes/component/lister/lister.main.runtime.ts b/scopes/component/lister/lister.main.runtime.ts index 025e9008351a..6b10c1d34b0e 100644 --- a/scopes/component/lister/lister.main.runtime.ts +++ b/scopes/component/lister/lister.main.runtime.ts @@ -18,6 +18,7 @@ import { ListCmd } from './list.cmd'; import { SearchCmd } from './search.cmd'; import { ListerAspect } from './lister.aspect'; import { NoIdMatchWildcard } from './no-id-match-wildcard'; +import { listCommand, searchCommand } from './lister.commands'; const BEFORE_REMOTE_LIST = 'listing remote components'; const BEFORE_LOCAL_LIST = 'listing components'; @@ -290,7 +291,8 @@ export class ListerMain { static async provider([cli, loggerMain, workspace]: [CLIMain, LoggerMain, Workspace]) { const logger = loggerMain.createLogger(ListerAspect.id); const lister = new ListerMain(logger, workspace); - cli.register(new ListCmd(lister), new SearchCmd(lister)); + cli.register(listCommand, () => new ListCmd(lister)); + cli.register(searchCommand, () => new SearchCmd(lister)); return lister; } } diff --git a/scopes/component/lister/search.cmd.ts b/scopes/component/lister/search.cmd.ts index 06de9ed4ad5d..29c51f49e2ac 100644 --- a/scopes/component/lister/search.cmd.ts +++ b/scopes/component/lister/search.cmd.ts @@ -1,6 +1,7 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { formatTitle, formatHint, formatWarningSummary, joinSections } from '@teambit/cli'; import type { ListerMain, SearchResults } from './lister.main.runtime'; +import { searchCommand } from './lister.commands'; type SearchFlags = { owners?: string; @@ -11,22 +12,14 @@ type SearchFlags = { }; export class SearchCmd implements Command { - name = 'search '; - description = 'search for components by keyword in the local workspace and remote bit cloud'; - extendedDescription = `runs the provided query terms in parallel against bit cloud and against the local workspace. -multiple queries are unioned (deduplicated) in the output. by default, remote results are filtered by the -owner extracted from the workspace's defaultScope; use --owners or --skip-auto-owner to change this.`; - group = 'info-analysis'; - options = [ - ['o', 'owners ', 'comma-separated list of owners/orgs to filter remote results by'], - ['', 'skip-auto-owner', 'do not auto-extract owner from workspace defaultScope'], - ['r', 'remote-only', 'only search remote bit cloud, skip local workspace'], - ['l', 'local-only', 'only search the local workspace, skip remote bit cloud'], - ['j', 'json', 'show the output in JSON format'], - ] as CommandOptions; - loader = true; - skipWorkspace = true; - remoteOp = true; + name = searchCommand.name; + description = searchCommand.description; + extendedDescription = searchCommand.extendedDescription; + group = searchCommand.group; + options = searchCommand.options; + loader = searchCommand.loader; + skipWorkspace = searchCommand.skipWorkspace; + remoteOp = searchCommand.remoteOp; constructor(private lister: ListerMain) {} diff --git a/scopes/component/merging/merge-cmd.ts b/scopes/component/merging/merge-cmd.ts index f55724498e03..cfca6d0eaee7 100644 --- a/scopes/component/merging/merge-cmd.ts +++ b/scopes/component/merging/merge-cmd.ts @@ -10,6 +10,7 @@ import { formatDetailsHint, joinSections, } from '@teambit/cli'; +import { mergeCommand } from './merging.commands'; import { COMPONENT_PATTERN_HELP, AUTO_SNAPPED_MSG, @@ -31,43 +32,15 @@ import { compHasBeenRemovedMsg } from './merge-status-provider'; import type { ConfigStoreMain } from '@teambit/config-store'; export class MergeCmd implements Command { - name = 'merge [component-pattern]'; - description = 'merge diverged component history when local and remote have different versions'; - helpUrl = 'reference/components/merging-changes'; - group = 'version-control'; - arguments = [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }]; - extendedDescription = `resolves diverged component history when both local and remote have created different snaps/tags from the same base version. -if no component pattern is specified, all pending-merge components will be merged (run 'bit status' to list them). -'bit status' will show diverged components and suggest either merging or resetting local changes. -preferred approach: use 'bit reset' to remove local versions, then 'bit checkout head' to get remote versions. -for lane-to-lane merging, use 'bit lane merge' instead.`; - alias = ''; - options = [ - ['', 'ours', 'DEPRECATED. use --auto-merge-resolve. in case of a conflict, keep the local modification'], - [ - '', - 'theirs', - 'DEPRECATED. use --auto-merge-resolve. in case of a conflict, override the local modification with the specified version', - ], - [ - '', - 'manual', - 'same as "--auto-merge-resolve manual". in case of merge conflict, write the files with the conflict markers', - ], - [ - 'r', - 'auto-merge-resolve ', - 'in case of a conflict, resolve according to the strategy: [ours, theirs, manual]', - ], - ['', 'abort', 'in case of an unresolved merge, revert to pre-merge state'], - ['', 'resolve', 'mark an unresolved merge as resolved and create a new snap with the changes'], - ['', 'no-snap', 'do not auto snap even if the merge completed without conflicts'], - ['', 'build', 'in case of snap during the merge, run the build-pipeline (similar to bit snap --build)'], - ['', 'verbose', 'show details of components that were not merged successfully'], - ['x', 'skip-dependency-installation', 'do not install new dependencies resulting from the merge'], - ['m', 'message ', 'override the default message for the auto snap'], - ] as CommandOptions; - loader = true; + name = mergeCommand.name; + description = mergeCommand.description; + helpUrl = mergeCommand.helpUrl; + group = mergeCommand.group; + arguments = mergeCommand.arguments; + extendedDescription = mergeCommand.extendedDescription; + alias = mergeCommand.alias; + options = mergeCommand.options; + loader = mergeCommand.loader; constructor( private merging: MergingMain, diff --git a/scopes/component/merging/merging.aspect.ts b/scopes/component/merging/merging.aspect.ts index c1dde8a56a69..b55f67255f0d 100644 --- a/scopes/component/merging/merging.aspect.ts +++ b/scopes/component/merging/merging.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MergingAspect = Aspect.create({ id: 'teambit.component/merging', + runtimes: { main: () => import('./merging.main.runtime') }, + commands: () => import('./merging.commands').then((m) => [m.mergeCommand]), }); diff --git a/scopes/component/merging/merging.commands.ts b/scopes/component/merging/merging.commands.ts new file mode 100644 index 000000000000..228532de2de1 --- /dev/null +++ b/scopes/component/merging/merging.commands.ts @@ -0,0 +1,52 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const mergeCommand: CommandDescriptor = { + name: 'merge [component-pattern]', + alias: '', + description: 'merge diverged component history when local and remote have different versions', + extendedDescription: `resolves diverged component history when both local and remote have created different snaps/tags from the same base version. + if no component pattern is specified, all pending-merge components will be merged (run 'bit status' to list them). + 'bit status' will show diverged components and suggest either merging or resetting local changes. + preferred approach: use 'bit reset' to remove local versions, then 'bit checkout head' to get remote versions. + for lane-to-lane merging, use 'bit lane merge' instead.`, + helpUrl: 'reference/components/merging-changes', + group: 'version-control', + arguments: [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }], + loader: true, + options: [ + ['', 'ours', 'DEPRECATED. use --auto-merge-resolve. in case of a conflict, keep the local modification'], + [ + '', + 'theirs', + 'DEPRECATED. use --auto-merge-resolve. in case of a conflict, override the local modification with the specified version', + ], + [ + '', + 'manual', + 'same as "--auto-merge-resolve manual". in case of merge conflict, write the files with the conflict markers', + ], + [ + 'r', + 'auto-merge-resolve ', + 'in case of a conflict, resolve according to the strategy: [ours, theirs, manual]', + ], + ['', 'abort', 'in case of an unresolved merge, revert to pre-merge state'], + ['', 'resolve', 'mark an unresolved merge as resolved and create a new snap with the changes'], + ['', 'no-snap', 'do not auto snap even if the merge completed without conflicts'], + ['', 'build', 'in case of snap during the merge, run the build-pipeline (similar to bit snap --build)'], + ['', 'verbose', 'show details of components that were not merged successfully'], + ['x', 'skip-dependency-installation', 'do not install new dependencies resulting from the merge'], + ['m', 'message ', 'override the default message for the auto snap'], + ] as CommandOptions, +}; diff --git a/scopes/component/merging/merging.main.runtime.ts b/scopes/component/merging/merging.main.runtime.ts index 14645ad7ea50..6850135b819b 100644 --- a/scopes/component/merging/merging.main.runtime.ts +++ b/scopes/component/merging/merging.main.runtime.ts @@ -50,6 +50,7 @@ import type { FailedComponents, MergeSnapResults, } from '@teambit/component.modules.merge-helper'; +import { mergeCommand } from './merging.commands'; import { applyModifiedVersion, FileStatus, @@ -924,7 +925,7 @@ export class MergingMain { depResolver, application ); - cli.register(new MergeCmd(merging, configStore)); + cli.register(mergeCommand, () => new MergeCmd(merging, configStore)); return merging; } } diff --git a/scopes/component/mover/move-cmd.ts b/scopes/component/mover/move-cmd.ts index 3e25747e9bd5..86e66c1815c1 100644 --- a/scopes/component/mover/move-cmd.ts +++ b/scopes/component/mover/move-cmd.ts @@ -3,28 +3,18 @@ import type { Command } from '@teambit/cli'; import { formatTitle, formatItem, joinSections } from '@teambit/cli'; import type { PathChangeResult } from '@teambit/legacy.bit-map'; import type { MoverMain } from './mover.main.runtime'; +import { moveCommand } from './mover.commands'; export class MoveCmd implements Command { - name = 'move '; - description = 'relocate a component to a different directory'; - extendedDescription = `moves component files to a new location within the workspace and updates the .bitmap tracking. -only changes the filesystem location - does not affect the component's name, scope, or ID. -useful for reorganizing workspace structure or following new directory conventions.`; - helpUrl = 'reference/workspace/moving-components'; - arguments = [ - { - name: 'current-component-dir', - description: "the component's current directory (relative to the workspace root)", - }, - { - name: 'new-component-dir', - description: "the new directory (relative to the workspace root) to create and move the component's files to", - }, - ]; - group = 'component-development'; - alias = 'mv'; - loader = true; - options = []; + name = moveCommand.name; + description = moveCommand.description; + extendedDescription = moveCommand.extendedDescription; + helpUrl = moveCommand.helpUrl; + arguments = moveCommand.arguments; + group = moveCommand.group; + alias = moveCommand.alias; + loader = moveCommand.loader; + options = moveCommand.options; constructor(private mover: MoverMain) {} diff --git a/scopes/component/mover/mover.aspect.ts b/scopes/component/mover/mover.aspect.ts index 4cc0a5ba8b62..55ae3a1aebf5 100644 --- a/scopes/component/mover/mover.aspect.ts +++ b/scopes/component/mover/mover.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MoverAspect = Aspect.create({ id: 'teambit.component/mover', + runtimes: { main: () => import('./mover.main.runtime') }, + commands: () => import('./mover.commands').then((m) => [m.moveCommand]), }); diff --git a/scopes/component/mover/mover.commands.ts b/scopes/component/mover/mover.commands.ts new file mode 100644 index 000000000000..1a810db3e6c7 --- /dev/null +++ b/scopes/component/mover/mover.commands.ts @@ -0,0 +1,34 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const moveCommand: CommandDescriptor = { + name: 'move ', + alias: 'mv', + description: 'relocate a component to a different directory', + extendedDescription: `moves component files to a new location within the workspace and updates the .bitmap tracking. + only changes the filesystem location - does not affect the component's name, scope, or ID. + useful for reorganizing workspace structure or following new directory conventions.`, + helpUrl: 'reference/workspace/moving-components', + group: 'component-development', + arguments: [ + { + name: 'current-component-dir', + description: "the component's current directory (relative to the workspace root)", + }, + { + name: 'new-component-dir', + description: "the new directory (relative to the workspace root) to create and move the component's files to", + }, + ], + loader: true, + options: [] as CommandOptions, +}; diff --git a/scopes/component/mover/mover.main.runtime.ts b/scopes/component/mover/mover.main.runtime.ts index a6b0fda03a72..6d47a9712473 100644 --- a/scopes/component/mover/mover.main.runtime.ts +++ b/scopes/component/mover/mover.main.runtime.ts @@ -14,6 +14,7 @@ import type { ConsumerComponent as Component } from '@teambit/legacy.consumer-co import { RemovePath } from '@teambit/component.sources'; import { MoverAspect } from './mover.aspect'; import { MoveCmd } from './move-cmd'; +import { moveCommand } from './mover.commands'; export class MoverMain { constructor(private workspace: Workspace) {} @@ -77,7 +78,7 @@ to change the main-file, use "bit add --main "`); static async provider([cli, workspace]: [CLIMain, Workspace]) { const moverMain = new MoverMain(workspace); - cli.register(new MoveCmd(moverMain)); + cli.register(moveCommand, () => new MoveCmd(moverMain)); return moverMain; } } diff --git a/scopes/component/new-component-helper/new-component-helper.aspect.ts b/scopes/component/new-component-helper/new-component-helper.aspect.ts index 45ad2472a3fc..1d06cc85010e 100644 --- a/scopes/component/new-component-helper/new-component-helper.aspect.ts +++ b/scopes/component/new-component-helper/new-component-helper.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const NewComponentHelperAspect = Aspect.create({ id: 'teambit.component/new-component-helper', + runtimes: { main: () => import('./new-component-helper.main.runtime') }, }); diff --git a/scopes/component/refactoring/refactoring.aspect.ts b/scopes/component/refactoring/refactoring.aspect.ts index f775aa34d566..359aebff4dbe 100644 --- a/scopes/component/refactoring/refactoring.aspect.ts +++ b/scopes/component/refactoring/refactoring.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const RefactoringAspect = Aspect.create({ id: 'teambit.component/refactoring', + runtimes: { main: () => import('./refactoring.main.runtime') }, }); diff --git a/scopes/component/remove/delete-cmd.ts b/scopes/component/remove/delete-cmd.ts index 44750194e279..665f9e12da1d 100644 --- a/scopes/component/remove/delete-cmd.ts +++ b/scopes/component/remove/delete-cmd.ts @@ -8,50 +8,20 @@ import type { RemovedObjects } from '@teambit/legacy.scope'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { RemoveMain } from './remove.main.runtime'; import { removeTemplate } from './remove-template'; +import { deleteCommand } from './remove.commands'; export class DeleteCmd implements Command { - name = 'delete '; - description = 'soft-delete components from remote scopes'; - extendedDescription = `marks components as deleted so they won't be visible on remote scopes after export. -components remain recoverable using "bit recover" unless --hard is used (permanent deletion, not recommended). -to remove components from your local workspace only, use "bit remove" instead.`; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - group = 'collaborate'; - helpUrl = 'reference/components/removing-components'; - skipWorkspace = true; - alias = ''; - options = [ - [ - '', - 'lane', - 'when on a lane, delete the component from this lane only. this removal will not affect main when the lane is merged', - ], - ['', 'update-main', 'delete component/s on the main lane after merging this lane into main'], - [ - '', - 'range ', - 'EXPERIMENTAL. enter a Semver range to delete specific tags (cannot be used for snaps). see https://www.npmjs.com/package/semver#ranges for the range syntax', - ], - ['s', 'silent', 'skip confirmation'], - [ - '', - 'hard', - 'NOT-RECOMMENDED. delete a component completely from a remote scope. careful! this is a permanent change that could corrupt dependents.', - ], - [ - 'f', - 'force', - 'relevant for --hard. allow the deletion even if used as a dependency. WARNING: components that depend on this component will corrupt', - ], - ['', 'snaps ', 'comma-separated list of snap hashes to mark as deleted (e.g. --snaps "hash1,hash2,hash3")'], - ] as CommandOptions; - loader = true; - remoteOp = true; + name = deleteCommand.name; + description = deleteCommand.description; + extendedDescription = deleteCommand.extendedDescription; + arguments = deleteCommand.arguments; + group = deleteCommand.group; + helpUrl = deleteCommand.helpUrl; + skipWorkspace = deleteCommand.skipWorkspace; + alias = deleteCommand.alias; + options = deleteCommand.options; + loader = deleteCommand.loader; + remoteOp = deleteCommand.remoteOp; constructor( private remove: RemoveMain, diff --git a/scopes/component/remove/recover-cmd.ts b/scopes/component/remove/recover-cmd.ts index af5c5051371c..8de1507e8f32 100644 --- a/scopes/component/remove/recover-cmd.ts +++ b/scopes/component/remove/recover-cmd.ts @@ -3,6 +3,7 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { formatItem, formatSuccessSummary } from '@teambit/cli'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { RemoveMain } from './remove.main.runtime'; +import { recoverCommand } from './remove.commands'; export type RecoverOptions = { skipDependencyInstallation?: boolean; @@ -10,22 +11,14 @@ export type RecoverOptions = { }; export class RecoverCmd implements Command { - name = 'recover '; - description = 'restore soft-deleted components'; + name = recoverCommand.name; + description = recoverCommand.description; extendedDescription = - 'reverses the soft-deletion of components marked with "bit delete", restoring them to their previous state. works for both local and remote soft-deleted components. supports patterns like "comp1", "org.scope/*", etc.'; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - group = 'collaborate'; - options = [ - ['x', 'skip-dependency-installation', 'do not install packages in case of importing components'], - ['', 'skip-write-config-files', 'do not write config files (such as eslint, tsconfig, prettier, etc...)'], - ] as CommandOptions; - loader = true; + recoverCommand.extendedDescription; + arguments = recoverCommand.arguments; + group = recoverCommand.group; + options = recoverCommand.options; + loader = recoverCommand.loader; constructor(private remove: RemoveMain) {} diff --git a/scopes/component/remove/remove-cmd.ts b/scopes/component/remove/remove-cmd.ts index 9a63d8a3bb74..5ed84e6af82f 100644 --- a/scopes/component/remove/remove-cmd.ts +++ b/scopes/component/remove/remove-cmd.ts @@ -7,41 +7,21 @@ import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { RemovedLocalObjects } from './removed-local-objects'; import type { RemoveMain } from './remove.main.runtime'; import { removeTemplate } from './remove-template'; +import { removeCommand } from './remove.commands'; export class RemoveCmd implements Command { - name = 'remove '; - description = 'untrack components from the workspace'; - extendedDescription = `removes components from the local workspace only - stops tracking them in .bitmap and deletes their files by default. -does not affect remote scopes - to delete components from remotes, use "bit delete" instead. -use --keep-files to preserve component files while only removing the tracking.`; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - group = 'component-development'; - helpUrl = 'reference/components/removing-components'; - skipWorkspace = true; - alias = 'rm'; - options = [ - ['t', 'track', 'keep tracking component in .bitmap (default = false), helps transform a tagged-component to new'], - ['', 'keep-files', 'keep component files (just untrack the component)'], - [ - 'f', - 'force', - 'removes the component from the scope, even if used as a dependency. WARNING: you will need to fix the components that depend on this component', - ], - ['s', 'silent', 'skip confirmation'], - ] as CommandOptions; - loader = true; - examples = [ - { - cmd: 'remove "$deprecated"', - description: 'remove all components that are deprecated', - }, - ]; - remoteOp = true; + name = removeCommand.name; + description = removeCommand.description; + extendedDescription = removeCommand.extendedDescription; + arguments = removeCommand.arguments; + group = removeCommand.group; + helpUrl = removeCommand.helpUrl; + skipWorkspace = removeCommand.skipWorkspace; + alias = removeCommand.alias; + options = removeCommand.options; + loader = removeCommand.loader; + examples = removeCommand.examples; + remoteOp = removeCommand.remoteOp; constructor( private remove: RemoveMain, diff --git a/scopes/component/remove/remove.aspect.ts b/scopes/component/remove/remove.aspect.ts index 7774cf3e061d..785dfaf67187 100644 --- a/scopes/component/remove/remove.aspect.ts +++ b/scopes/component/remove/remove.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const RemoveAspect = Aspect.create({ id: 'teambit.component/remove', + runtimes: { main: () => import('./remove.main.runtime') }, + commands: () => import('./remove.commands').then((m) => [m.removeCommand, m.deleteCommand, m.recoverCommand]), }); diff --git a/scopes/component/remove/remove.commands.ts b/scopes/component/remove/remove.commands.ts new file mode 100644 index 000000000000..020dbf75f345 --- /dev/null +++ b/scopes/component/remove/remove.commands.ts @@ -0,0 +1,111 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const removeCommand: CommandDescriptor = { + name: 'remove ', + alias: 'rm', + description: 'untrack components from the workspace', + extendedDescription: `removes components from the local workspace only - stops tracking them in .bitmap and deletes their files by default. + does not affect remote scopes - to delete components from remotes, use "bit delete" instead. + use --keep-files to preserve component files while only removing the tracking.`, + helpUrl: 'reference/components/removing-components', + group: 'component-development', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + ['t', 'track', 'keep tracking component in .bitmap (default = false), helps transform a tagged-component to new'], + ['', 'keep-files', 'keep component files (just untrack the component)'], + [ + 'f', + 'force', + 'removes the component from the scope, even if used as a dependency. WARNING: you will need to fix the components that depend on this component', + ], + ['s', 'silent', 'skip confirmation'], + ] as CommandOptions, + examples: [ + { + cmd: 'remove "$deprecated"', + description: 'remove all components that are deprecated', + }, + ], +}; + +export const deleteCommand: CommandDescriptor = { + name: 'delete ', + alias: '', + description: 'soft-delete components from remote scopes', + extendedDescription: `marks components as deleted so they won't be visible on remote scopes after export. + components remain recoverable using "bit recover" unless --hard is used (permanent deletion, not recommended). + to remove components from your local workspace only, use "bit remove" instead.`, + helpUrl: 'reference/components/removing-components', + group: 'collaborate', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + [ + '', + 'lane', + 'when on a lane, delete the component from this lane only. this removal will not affect main when the lane is merged', + ], + ['', 'update-main', 'delete component/s on the main lane after merging this lane into main'], + [ + '', + 'range ', + 'EXPERIMENTAL. enter a Semver range to delete specific tags (cannot be used for snaps). see https://www.npmjs.com/package/semver#ranges for the range syntax', + ], + ['s', 'silent', 'skip confirmation'], + [ + '', + 'hard', + 'NOT-RECOMMENDED. delete a component completely from a remote scope. careful! this is a permanent change that could corrupt dependents.', + ], + [ + 'f', + 'force', + 'relevant for --hard. allow the deletion even if used as a dependency. WARNING: components that depend on this component will corrupt', + ], + ['', 'snaps ', 'comma-separated list of snap hashes to mark as deleted (e.g. --snaps "hash1,hash2,hash3")'], + ] as CommandOptions, +}; + +export const recoverCommand: CommandDescriptor = { + name: 'recover ', + description: 'restore soft-deleted components', + extendedDescription: 'reverses the soft-deletion of components marked with "bit delete", restoring them to their previous state. works for both local and remote soft-deleted components. supports patterns like "comp1", "org.scope/*", etc.', + group: 'collaborate', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + loader: true, + options: [ + ['x', 'skip-dependency-installation', 'do not install packages in case of importing components'], + ['', 'skip-write-config-files', 'do not write config files (such as eslint, tsconfig, prettier, etc...)'], + ] as CommandOptions, +}; diff --git a/scopes/component/remove/remove.main.runtime.ts b/scopes/component/remove/remove.main.runtime.ts index d48ef7e8487f..fafa7283e9db 100644 --- a/scopes/component/remove/remove.main.runtime.ts +++ b/scopes/component/remove/remove.main.runtime.ts @@ -35,6 +35,7 @@ import { ScopeAspect } from '@teambit/scope'; import type { ListerMain } from '@teambit/lister'; import { ListerAspect } from '@teambit/lister'; import chalk from 'chalk'; +import { deleteCommand, recoverCommand, removeCommand } from './remove.commands'; const BEFORE_REMOVE = 'removing components'; @@ -599,11 +600,9 @@ ${mainComps.map((c) => c.id.toString()).join('\n')}`); const removeMain = new RemoveMain(workspace, scope, logger, importerMain, depResolver, lister); issues.registerAddComponentsIssues(removeMain.addRemovedDependenciesIssues.bind(removeMain)); componentAspect.registerShowFragments([new RemoveFragment(removeMain)]); - cli.register( - new RemoveCmd(removeMain, workspace), - new DeleteCmd(removeMain, workspace), - new RecoverCmd(removeMain) - ); + cli.register(removeCommand, () => new RemoveCmd(removeMain, workspace)); + cli.register(deleteCommand, () => new DeleteCmd(removeMain, workspace)); + cli.register(recoverCommand, () => new RecoverCmd(removeMain)); return removeMain; } } diff --git a/scopes/component/renaming/rename.cmd.ts b/scopes/component/renaming/rename.cmd.ts index e13ffcb9d16c..86a8ae1d0a3a 100644 --- a/scopes/component/renaming/rename.cmd.ts +++ b/scopes/component/renaming/rename.cmd.ts @@ -2,6 +2,7 @@ import chalk from 'chalk'; import type { Command, CommandOptions } from '@teambit/cli'; import { formatSuccessSummary } from '@teambit/cli'; import type { RenamingMain } from './renaming.main.runtime'; +import { renameCommand } from './renaming.commands'; export type RenameOptions = { scope?: string; @@ -14,40 +15,17 @@ export type RenameOptions = { }; export class RenameCmd implements Command { - name = 'rename '; - description = 'change a component name'; - extendedDescription = `renames a component and optionally refactors dependent code to use the new name. -for exported components: creates a new component with the new name and marks the original as deleted. -for local components: simply renames the existing component in place.`; - helpUrl = 'reference/components/renaming-components'; - arguments = [ - { - name: 'current-name', - description: 'the current component name (without its scope name)', - }, - { - name: 'new-name', - description: "the new component name (without its scope name. use --scope to define the new component's scope)", - }, - ]; - group = 'component-development'; - skipWorkspace = true; - alias = ''; - options = [ - ['s', 'scope ', 'define the scope for the new component'], - ['r', 'refactor', 'update the import/require statements in all dependent components (in the same workspace)'], - ['', 'preserve', 'avoid renaming files and variables/classes according to the new component name'], - ['', 'ast', 'use ast to transform files instead of regex'], - ['', 'delete', 'DEPRECATED. this is now the default'], - ['', 'deprecate', 'instead of deleting the original component, deprecating it'], - [ - 'p', - 'path ', - 'relative path in the workspace to place new component in. by default, the directory of the new component is from your workspace\'s "defaultScope" value', - ], - ] as CommandOptions; - loader = true; - remoteOp = true; + name = renameCommand.name; + description = renameCommand.description; + extendedDescription = renameCommand.extendedDescription; + helpUrl = renameCommand.helpUrl; + arguments = renameCommand.arguments; + group = renameCommand.group; + skipWorkspace = renameCommand.skipWorkspace; + alias = renameCommand.alias; + options = renameCommand.options; + loader = renameCommand.loader; + remoteOp = renameCommand.remoteOp; constructor(private renaming: RenamingMain) {} diff --git a/scopes/component/renaming/renaming.aspect.ts b/scopes/component/renaming/renaming.aspect.ts index 16a2dbc6719a..e4771c96a84a 100644 --- a/scopes/component/renaming/renaming.aspect.ts +++ b/scopes/component/renaming/renaming.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const RenamingAspect = Aspect.create({ id: 'teambit.component/renaming', + runtimes: { main: () => import('./renaming.main.runtime') }, + commands: () => import('./renaming.commands').then((m) => [m.renameCommand]), }); diff --git a/scopes/component/renaming/renaming.commands.ts b/scopes/component/renaming/renaming.commands.ts new file mode 100644 index 000000000000..ef69038f602c --- /dev/null +++ b/scopes/component/renaming/renaming.commands.ts @@ -0,0 +1,48 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const renameCommand: CommandDescriptor = { + name: 'rename ', + alias: '', + description: 'change a component name', + extendedDescription: `renames a component and optionally refactors dependent code to use the new name. + for exported components: creates a new component with the new name and marks the original as deleted. + for local components: simply renames the existing component in place.`, + helpUrl: 'reference/components/renaming-components', + group: 'component-development', + arguments: [ + { + name: 'current-name', + description: 'the current component name (without its scope name)', + }, + { + name: 'new-name', + description: "the new component name (without its scope name. use --scope to define the new component's scope)", + }, + ], + remoteOp: true, + skipWorkspace: true, + loader: true, + options: [ + ['s', 'scope ', 'define the scope for the new component'], + ['r', 'refactor', 'update the import/require statements in all dependent components (in the same workspace)'], + ['', 'preserve', 'avoid renaming files and variables/classes according to the new component name'], + ['', 'ast', 'use ast to transform files instead of regex'], + ['', 'delete', 'DEPRECATED. this is now the default'], + ['', 'deprecate', 'instead of deleting the original component, deprecating it'], + [ + 'p', + 'path ', + 'relative path in the workspace to place new component in. by default, the directory of the new component is from your workspace\'s "defaultScope" value', + ], + ] as CommandOptions, +}; diff --git a/scopes/component/renaming/renaming.main.runtime.ts b/scopes/component/renaming/renaming.main.runtime.ts index 9aec3e017eb1..d8b29a2b647c 100644 --- a/scopes/component/renaming/renaming.main.runtime.ts +++ b/scopes/component/renaming/renaming.main.runtime.ts @@ -41,6 +41,7 @@ import { ScopeRenameCmd } from './scope-rename.cmd'; import { OldScopeNotFound } from './exceptions/old-scope-not-found'; import { ScopeRenameOwnerCmd } from './scope-rename-owner.cmd'; import { RenamingTagged } from './exceptions/renaming-tagged'; +import { renameCommand } from './renaming.commands'; type RenameId = { sourceId: ComponentID; targetId: ComponentID }; type RenameData = RenameId & { @@ -401,7 +402,7 @@ make sure this argument is the name only, without the scope-name. to change the envs, remove ); - cli.register(new RenameCmd(renaming)); + cli.register(renameCommand, () => new RenameCmd(renaming)); const scopeCommand = cli.getCommand('scope'); scopeCommand?.commands?.push(new ScopeRenameCmd(renaming)); diff --git a/scopes/component/snapping/snapping.aspect.ts b/scopes/component/snapping/snapping.aspect.ts index 1a672914274a..468c54cdd7f8 100644 --- a/scopes/component/snapping/snapping.aspect.ts +++ b/scopes/component/snapping/snapping.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const SnappingAspect = Aspect.create({ id: 'teambit.component/snapping', + runtimes: { main: () => import('./snapping.main.runtime') }, }); diff --git a/scopes/component/stash/stash.aspect.ts b/scopes/component/stash/stash.aspect.ts index af0c10fd6c7c..ef54036c9b5b 100644 --- a/scopes/component/stash/stash.aspect.ts +++ b/scopes/component/stash/stash.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const StashAspect = Aspect.create({ id: 'teambit.component/stash', + runtimes: { main: () => import('./stash.main.runtime') }, }); diff --git a/scopes/component/status/mini-status-cmd.ts b/scopes/component/status/mini-status-cmd.ts index 1ffb39fdf621..fa6b2b797335 100644 --- a/scopes/component/status/mini-status-cmd.ts +++ b/scopes/component/status/mini-status-cmd.ts @@ -1,8 +1,8 @@ -import type { Command, CommandOptions } from '@teambit/cli'; -import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; +import type { Command } from '@teambit/cli'; import type { ComponentID } from '@teambit/component-id'; import chalk from 'chalk'; import type { StatusMain } from './status.main.runtime'; +import { miniStatusCommand } from './status.commands'; export type MiniStatusOpts = { showIssues?: boolean; @@ -10,30 +10,16 @@ export type MiniStatusOpts = { }; export class MiniStatusCmd implements Command { - name = 'mini-status [component-pattern]'; - description = 'basic status for fast execution'; - extendedDescription = `shows only modified/new components with code changes. for the full status, use "bit status". -this command only checks source code changes, it doesn't check for config/aspect/dependency changes`; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - group = 'info-analysis'; - alias = 'ms'; - private = true; - options = [ - ['', 'show-issues', 'show component issues (slows down the command)'], - [ - 'c', - 'ignore-circular-dependencies', - 'do not check for circular dependencies to get the results quicker (relevant when --show-issues flag is used)', - ], - ['j', 'json', 'json format'], - ] as CommandOptions; - loadAspects = false; - loader = true; + name = miniStatusCommand.name; + description = miniStatusCommand.description; + extendedDescription = miniStatusCommand.extendedDescription; + arguments = miniStatusCommand.arguments; + group = miniStatusCommand.group; + alias = miniStatusCommand.alias; + private = miniStatusCommand.private; + options = miniStatusCommand.options; + loadAspects = miniStatusCommand.loadAspects; + loader = miniStatusCommand.loader; constructor(private status: StatusMain) {} diff --git a/scopes/component/status/status-cmd.ts b/scopes/component/status/status-cmd.ts index 4294424fbdd5..266ef4f37950 100644 --- a/scopes/component/status/status-cmd.ts +++ b/scopes/component/status/status-cmd.ts @@ -1,9 +1,10 @@ -import type { Command, CommandOptions } from '@teambit/cli'; +import type { Command } from '@teambit/cli'; import { renderSections, formatSuccessSummary, formatSection, formatItem, joinSections } from '@teambit/cli'; import type { ComponentID } from '@teambit/component-id'; import chalk from 'chalk'; import type { StatusMain, StatusResult } from './status.main.runtime'; import { formatStatusOutput } from './status-formatter'; +import { statusCommand } from './status.commands'; type StatusFlags = { strict?: boolean; @@ -60,31 +61,13 @@ type StatusJsonResults = { }; export class StatusCmd implements Command { - name = 'status'; - description = 'show workspace component status and issues'; - group = 'info-analysis'; - extendedDescription = `displays the current state of all workspace components including new, modified, staged, and problematic components. -identifies blocking issues that prevent tagging/snapping and provides warnings with --warnings flag. -essential for understanding workspace health before versioning components. -use --quick for a faster check that only detects file-level changes (new/modified components). -for maximum speed (skips aspect loading entirely), use "bit mini-status".`; - alias = 's'; - options = [ - ['j', 'json', 'return a json version of the component'], - ['w', 'warnings', 'show warnings. by default, only issues that block tag/snap are shown'], - ['', 'verbose', 'show extra data: full snap hashes for staged components, and divergence point for lanes'], - ['l', 'lanes', 'when on a lane, show updates from main and updates from forked lanes'], - ['', 'strict', 'exit with code 1 if any issues are found (both errors and warnings)'], - ['', 'fail-on-error', 'exit with code 1 only when tag/snap blocker issues are found (not warnings)'], - ['c', 'ignore-circular-dependencies', 'do not check for circular dependencies to get the results quicker'], - [ - '', - 'quick', - 'show only new and modified components based on file changes. much faster, but does not detect dependency or config changes', - ], - ['', 'expand', 'expand all collapsed sections (e.g. auto-tag pending components)'], - ] as CommandOptions; - loader = true; + name = statusCommand.name; + alias = statusCommand.alias; + description = statusCommand.description; + extendedDescription = statusCommand.extendedDescription; + group = statusCommand.group; + options = statusCommand.options; + loader = statusCommand.loader; constructor(private status: StatusMain) {} diff --git a/scopes/component/status/status.aspect.ts b/scopes/component/status/status.aspect.ts index e62f8c6c3bf2..caf61c8e4f0b 100644 --- a/scopes/component/status/status.aspect.ts +++ b/scopes/component/status/status.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const StatusAspect = Aspect.create({ id: 'teambit.component/status', + runtimes: { main: () => import('./status.main.runtime') }, }); diff --git a/scopes/component/status/status.commands.ts b/scopes/component/status/status.commands.ts new file mode 100644 index 000000000000..3a0d231cdfc4 --- /dev/null +++ b/scopes/component/status/status.commands.ts @@ -0,0 +1,66 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative descriptors for the status aspect's commands. + * + * Pilot of Slice 3 in the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single source + * of truth for its command's static fields; the matching handler class + * (`StatusCmd`, `MiniStatusCmd`) reads these fields rather than redeclaring + * them, and `cli.register(descriptor, factory)` consumes the pair. + */ +export const statusCommand: CommandDescriptor = { + name: 'status', + alias: 's', + description: 'show workspace component status and issues', + group: 'info-analysis', + extendedDescription: `displays the current state of all workspace components including new, modified, staged, and problematic components. +identifies blocking issues that prevent tagging/snapping and provides warnings with --warnings flag. +essential for understanding workspace health before versioning components. +use --quick for a faster check that only detects file-level changes (new/modified components). +for maximum speed (skips aspect loading entirely), use "bit mini-status".`, + options: [ + ['j', 'json', 'return a json version of the component'], + ['w', 'warnings', 'show warnings. by default, only issues that block tag/snap are shown'], + ['', 'verbose', 'show extra data: full snap hashes for staged components, and divergence point for lanes'], + ['l', 'lanes', 'when on a lane, show updates from main and updates from forked lanes'], + ['', 'strict', 'exit with code 1 if any issues are found (both errors and warnings)'], + ['', 'fail-on-error', 'exit with code 1 only when tag/snap blocker issues are found (not warnings)'], + ['c', 'ignore-circular-dependencies', 'do not check for circular dependencies to get the results quicker'], + [ + '', + 'quick', + 'show only new and modified components based on file changes. much faster, but does not detect dependency or config changes', + ], + ['', 'expand', 'expand all collapsed sections (e.g. auto-tag pending components)'], + ] as CommandOptions, + loader: true, +}; + +export const miniStatusCommand: CommandDescriptor = { + name: 'mini-status [component-pattern]', + description: 'basic status for fast execution', + extendedDescription: `shows only modified/new components with code changes. for the full status, use "bit status". +this command only checks source code changes, it doesn't check for config/aspect/dependency changes`, + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + group: 'info-analysis', + alias: 'ms', + private: true, + options: [ + ['', 'show-issues', 'show component issues (slows down the command)'], + [ + 'c', + 'ignore-circular-dependencies', + 'do not check for circular dependencies to get the results quicker (relevant when --show-issues flag is used)', + ], + ['j', 'json', 'json format'], + ] as CommandOptions, + loadAspects: false, + loader: true, +}; diff --git a/scopes/component/status/status.main.runtime.ts b/scopes/component/status/status.main.runtime.ts index a6b72398ef43..2087dac3ca9e 100644 --- a/scopes/component/status/status.main.runtime.ts +++ b/scopes/component/status/status.main.runtime.ts @@ -25,6 +25,7 @@ import { StatusCmd } from './status-cmd'; import { StatusAspect } from './status.aspect'; import type { MiniStatusOpts } from './mini-status-cmd'; import { MiniStatusCmd } from './mini-status-cmd'; +import { statusCommand, miniStatusCommand } from './status.commands'; import type { LoggerMain, Logger } from '@teambit/logger'; import { LoggerAspect } from '@teambit/logger'; import type { MergingMain } from '@teambit/merging'; @@ -280,7 +281,8 @@ export class StatusMain { ]) { const logger = loggerMain.createLogger(StatusAspect.id); const statusMain = new StatusMain(workspace, issues, insights, remove, lanes, logger, merging); - cli.register(new StatusCmd(statusMain), new MiniStatusCmd(statusMain)); + cli.register(statusCommand, () => new StatusCmd(statusMain)); + cli.register(miniStatusCommand, () => new MiniStatusCmd(statusMain)); return statusMain; } } diff --git a/scopes/component/tracker/add-cmd.ts b/scopes/component/tracker/add-cmd.ts index 1ec5653e71dc..07068d08074a 100644 --- a/scopes/component/tracker/add-cmd.ts +++ b/scopes/component/tracker/add-cmd.ts @@ -7,6 +7,7 @@ import type { PathLinux, PathOsBased } from '@teambit/legacy.utils'; import { pathNormalizeToLinux } from '@teambit/legacy.utils'; import type { AddActionResults, Warnings } from './add-components'; import type { TrackerMain } from './tracker.main.runtime'; +import { addCommand } from './tracker.commands'; type AddFlags = { id: string | null | undefined; @@ -23,27 +24,15 @@ type AddResults = { }; export class AddCmd implements Command { - name = 'add [path...]'; - description = 'track existing directory contents as new components in the workspace'; - group = 'component-development'; + name = addCommand.name; + description = addCommand.description; + group = addCommand.group; extendedDescription = - 'Registers one or more directories as Bit components without changing your files. Each provided path becomes a component root tracked by Bit.'; - helpUrl = 'reference/workspace/component-directory'; - alias = 'a'; - options = [ - ['i', 'id ', 'manually set component id'], - ['m', 'main ', 'define component entry point'], - ['n', 'namespace ', 'organize component in a namespace'], - ['o', 'override ', 'override existing component if exists (default = false)'], - [ - 's', - 'scope ', - `sets the component's scope. if not entered, the default-scope from workspace.jsonc will be used`, - ], - ['e', 'env ', "set the component's environment. (overrides the env from variants if exists)"], - ['j', 'json', 'output as json format'], - ] as CommandOptions; - loader = true; + addCommand.extendedDescription; + helpUrl = addCommand.helpUrl; + alias = addCommand.alias; + options = addCommand.options; + loader = addCommand.loader; constructor(private tracker: TrackerMain) {} diff --git a/scopes/component/tracker/tracker.aspect.ts b/scopes/component/tracker/tracker.aspect.ts index 6db930583fe4..1ae67d9f651d 100644 --- a/scopes/component/tracker/tracker.aspect.ts +++ b/scopes/component/tracker/tracker.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const TrackerAspect = Aspect.create({ id: 'teambit.component/tracker', + runtimes: { main: () => import('./tracker.main.runtime') }, + commands: () => import('./tracker.commands').then((m) => [m.addCommand]), }); diff --git a/scopes/component/tracker/tracker.commands.ts b/scopes/component/tracker/tracker.commands.ts new file mode 100644 index 000000000000..fabbd796d96a --- /dev/null +++ b/scopes/component/tracker/tracker.commands.ts @@ -0,0 +1,34 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const addCommand: CommandDescriptor = { + name: 'add [path...]', + alias: 'a', + description: 'track existing directory contents as new components in the workspace', + extendedDescription: 'Registers one or more directories as Bit components without changing your files. Each provided path becomes a component root tracked by Bit.', + helpUrl: 'reference/workspace/component-directory', + group: 'component-development', + loader: true, + options: [ + ['i', 'id ', 'manually set component id'], + ['m', 'main ', 'define component entry point'], + ['n', 'namespace ', 'organize component in a namespace'], + ['o', 'override ', 'override existing component if exists (default = false)'], + [ + 's', + 'scope ', + `sets the component's scope. if not entered, the default-scope from workspace.jsonc will be used`, + ], + ['e', 'env ', "set the component's environment. (overrides the env from variants if exists)"], + ['j', 'json', 'output as json format'], + ] as CommandOptions, +}; diff --git a/scopes/component/tracker/tracker.main.runtime.ts b/scopes/component/tracker/tracker.main.runtime.ts index 7839012a96a5..001333a18da9 100644 --- a/scopes/component/tracker/tracker.main.runtime.ts +++ b/scopes/component/tracker/tracker.main.runtime.ts @@ -13,6 +13,7 @@ import { AddCmd } from './add-cmd'; import type { AddActionResults, AddContext, AddProps, Warnings } from './add-components'; import AddComponents, { addMultipleFromResolvedTrackData } from './add-components'; import { TrackerAspect } from './tracker.aspect'; +import { addCommand } from './tracker.commands'; export type TrackResult = { files: string[]; warnings: Warnings; componentId: ComponentID }; @@ -143,7 +144,7 @@ export class TrackerMain { static async provider([cli, workspace, loggerMain]: [CLIMain, Workspace, LoggerMain]) { const logger = loggerMain.createLogger(TrackerAspect.id); const trackerMain = new TrackerMain(workspace, logger); - cli.register(new AddCmd(trackerMain)); + cli.register(addCommand, () => new AddCmd(trackerMain)); return trackerMain; } } diff --git a/scopes/compositions/compositions/compositions.aspect.ts b/scopes/compositions/compositions/compositions.aspect.ts index ddbebdfae165..e7af3b66fb00 100644 --- a/scopes/compositions/compositions/compositions.aspect.ts +++ b/scopes/compositions/compositions/compositions.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CompositionsAspect = Aspect.create({ id: 'teambit.compositions/compositions', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./compositions.main.runtime') }, }); export default CompositionsAspect; diff --git a/scopes/compositions/compositions/index.ts b/scopes/compositions/compositions/index.ts index b981d29eed6f..0ba95cfcf2d3 100644 --- a/scopes/compositions/compositions/index.ts +++ b/scopes/compositions/compositions/index.ts @@ -9,10 +9,14 @@ export type { UsePreviewSandboxSlot, } from './compositions.ui.runtime'; export type { CompositionProps } from './composition'; -export { Composition } from './composition'; export type { CompositionContentProps } from './compositions'; -export { CompositionContent } from './compositions'; -export { useDefaultControlsSchemaResponder } from './use-default-controls-schema-responder'; +// UI value exports removed from this barrel — main-runtime imports of +// `@teambit/compositions` must not drag in UI-side dependencies (which +// transitively pull `@teambit/documenter.ui.*`, `react`, etc.). UI callers +// import these directly: +// - Composition (was: './composition') +// - CompositionContent (was: './compositions') +// - ComponentComposition, LiveControls, LiveControlsDiffPanel, LiveControlsRenderer (was: './ui') +// - useDefaultControlsSchemaResponder (was: './use-default-controls-schema-responder') export type { CompositionsPreview } from './compositions.preview.runtime'; -export { ComponentComposition, LiveControls, LiveControlsDiffPanel, LiveControlsRenderer } from './ui'; export default CompositionsAspect; diff --git a/scopes/defender/eslint/eslint.aspect.ts b/scopes/defender/eslint/eslint.aspect.ts index 9e59a6bad7bc..ac802bac2ef6 100644 --- a/scopes/defender/eslint/eslint.aspect.ts +++ b/scopes/defender/eslint/eslint.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ESLintAspect = Aspect.create({ id: 'teambit.defender/eslint', + runtimes: { main: () => import('./eslint.main.runtime') }, }); diff --git a/scopes/defender/formatter/format.cmd.ts b/scopes/defender/formatter/format.cmd.ts index 61468953cf90..35b45fe142ef 100644 --- a/scopes/defender/formatter/format.cmd.ts +++ b/scopes/defender/formatter/format.cmd.ts @@ -10,6 +10,7 @@ import { compact, flatten } from 'lodash'; import type { FormatterMain } from './formatter.main.runtime'; import type { ComponentFormatResult, FormatResults, FileFormatResult } from './formatter'; import type { FormatterOptions } from './formatter-context'; +import { formatCommand } from './formatter.commands'; export type FormatCmdOptions = { changed?: boolean; @@ -40,19 +41,13 @@ export type JsonFormatResults = { }; export class FormatCmd implements Command { - name = 'format [component-pattern]'; - description = 'auto-format component source code'; - extendedDescription = `formats component files using the formatter configured by each component's environment (Prettier, etc.). -by default formats all components. use --changed to format only new and modified components. -supports check mode to verify formatting without making changes.`; - arguments = [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }]; - group = 'testing'; - helpUrl = 'reference/formatting/formatter-overview'; - options = [ - ['c', 'changed', 'format only new and modified components'], - ['', 'check', 'will output a human-friendly message and a list of unformatted files, if any'], - ['j', 'json', 'return the format results in json format'], - ] as CommandOptions; + name = formatCommand.name; + description = formatCommand.description; + extendedDescription = formatCommand.extendedDescription; + arguments = formatCommand.arguments; + group = formatCommand.group; + helpUrl = formatCommand.helpUrl; + options = formatCommand.options; constructor( private formatter: FormatterMain, diff --git a/scopes/defender/formatter/formatter.aspect.ts b/scopes/defender/formatter/formatter.aspect.ts index d91b0ef19177..091c2e558fd3 100644 --- a/scopes/defender/formatter/formatter.aspect.ts +++ b/scopes/defender/formatter/formatter.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const FormatterAspect = Aspect.create({ id: 'teambit.defender/formatter', + runtimes: { main: () => import('./formatter.main.runtime') }, + commands: () => import('./formatter.commands').then((m) => [m.formatCommand]), }); diff --git a/scopes/defender/formatter/formatter.commands.ts b/scopes/defender/formatter/formatter.commands.ts new file mode 100644 index 000000000000..95b4ec73471d --- /dev/null +++ b/scopes/defender/formatter/formatter.commands.ts @@ -0,0 +1,28 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const formatCommand: CommandDescriptor = { + name: 'format [component-pattern]', + description: 'auto-format component source code', + extendedDescription: `formats component files using the formatter configured by each component's environment (Prettier, etc.). + by default formats all components. use --changed to format only new and modified components. + supports check mode to verify formatting without making changes.`, + helpUrl: 'reference/formatting/formatter-overview', + group: 'testing', + arguments: [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }], + options: [ + ['c', 'changed', 'format only new and modified components'], + ['', 'check', 'will output a human-friendly message and a list of unformatted files, if any'], + ['j', 'json', 'return the format results in json format'], + ] as CommandOptions, +}; diff --git a/scopes/defender/formatter/formatter.main.runtime.ts b/scopes/defender/formatter/formatter.main.runtime.ts index 80e82eab8b88..c4fbc536e78e 100644 --- a/scopes/defender/formatter/formatter.main.runtime.ts +++ b/scopes/defender/formatter/formatter.main.runtime.ts @@ -16,6 +16,7 @@ import type { FormatterOptions } from './formatter-context'; import type { Formatter } from './formatter'; import type { SnappingMain } from '@teambit/snapping'; import { SnappingAspect } from '@teambit/snapping'; +import { formatCommand } from './formatter.commands'; export type FormatterConfig = { formatOnPreSnap?: boolean; @@ -85,7 +86,7 @@ export class FormatterMain { const formatterService = new FormatterService(config); const formatterMain = new FormatterMain(envs, formatterService, logger); envs.registerService(formatterService); - cli.register(new FormatCmd(formatterMain, component.getHost(), workspace)); + cli.register(formatCommand, () => new FormatCmd(formatterMain, component.getHost(), workspace)); snapping.registerOnPreSnap(async (components) => { if (!config.formatOnPreSnap) { return; diff --git a/scopes/defender/jest/jest.aspect.ts b/scopes/defender/jest/jest.aspect.ts index 3d04d4e55578..07cdbbcaecd0 100644 --- a/scopes/defender/jest/jest.aspect.ts +++ b/scopes/defender/jest/jest.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const JestAspect = Aspect.create({ id: 'teambit.defender/jest', + runtimes: { main: () => import('./jest.main.runtime') }, }); diff --git a/scopes/defender/linter/lint.cmd.ts b/scopes/defender/linter/lint.cmd.ts index 2001b51939e4..95ef01ee70c6 100644 --- a/scopes/defender/linter/lint.cmd.ts +++ b/scopes/defender/linter/lint.cmd.ts @@ -11,6 +11,7 @@ import { compact, flatten, groupBy, omit } from 'lodash'; import type { LinterMain } from './linter.main.runtime'; import type { ComponentLintResult, LintResults } from './linter'; import type { FixTypes, LinterOptions } from './linter-context'; +import { lintCommand } from './linter.commands'; export type LintCmdOptions = { changed?: boolean; @@ -42,20 +43,13 @@ export type JsonLintResults = { }; export class LintCmd implements Command { - name = 'lint [component-pattern]'; - description = 'analyze component code for issues and style violations'; - extendedDescription = `runs linters configured by each component's environment (ESLint, etc.) to check for code quality issues. -by default lints all components. use --changed to lint only new and modified components. -supports automatic fixing of certain issues with --fix flag.`; - arguments = [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }]; - helpUrl = 'reference/linting/linter-overview'; - group = 'testing'; - options = [ - ['c', 'changed', 'lint only new and modified components'], - ['f', 'fix', 'automatically fix problems'], - ['', 'fix-type ', 'specify the types of fixes to apply (problem, suggestion, layout)'], - ['j', 'json', 'return the lint results in json format'], - ] as CommandOptions; + name = lintCommand.name; + description = lintCommand.description; + extendedDescription = lintCommand.extendedDescription; + arguments = lintCommand.arguments; + helpUrl = lintCommand.helpUrl; + group = lintCommand.group; + options = lintCommand.options; constructor( private linter: LinterMain, diff --git a/scopes/defender/linter/linter.aspect.ts b/scopes/defender/linter/linter.aspect.ts index d9a7f0f30d2a..047cfa4b2b85 100644 --- a/scopes/defender/linter/linter.aspect.ts +++ b/scopes/defender/linter/linter.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const LinterAspect = Aspect.create({ id: 'teambit.defender/linter', + runtimes: { main: () => import('./linter.main.runtime') }, + commands: () => import('./linter.commands').then((m) => [m.lintCommand]), }); diff --git a/scopes/defender/linter/linter.commands.ts b/scopes/defender/linter/linter.commands.ts new file mode 100644 index 000000000000..39d2c1076df1 --- /dev/null +++ b/scopes/defender/linter/linter.commands.ts @@ -0,0 +1,29 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const lintCommand: CommandDescriptor = { + name: 'lint [component-pattern]', + description: 'analyze component code for issues and style violations', + extendedDescription: `runs linters configured by each component's environment (ESLint, etc.) to check for code quality issues. + by default lints all components. use --changed to lint only new and modified components. + supports automatic fixing of certain issues with --fix flag.`, + helpUrl: 'reference/linting/linter-overview', + group: 'testing', + arguments: [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }], + options: [ + ['c', 'changed', 'lint only new and modified components'], + ['f', 'fix', 'automatically fix problems'], + ['', 'fix-type ', 'specify the types of fixes to apply (problem, suggestion, layout)'], + ['j', 'json', 'return the lint results in json format'], + ] as CommandOptions, +}; diff --git a/scopes/defender/linter/linter.main.runtime.ts b/scopes/defender/linter/linter.main.runtime.ts index 0acfe10bbf8a..89c0eac0dcf9 100644 --- a/scopes/defender/linter/linter.main.runtime.ts +++ b/scopes/defender/linter/linter.main.runtime.ts @@ -14,6 +14,7 @@ import { LintTask } from './lint.task'; import { LintCmd } from './lint.cmd'; import type { FixTypes, LinterOptions } from './linter-context'; import type { Linter } from './linter'; +import { lintCommand } from './linter.commands'; export type LinterConfig = { /** @@ -68,7 +69,7 @@ export class LinterMain { const linterService = new LinterService(config, workspace); const linterAspect = new LinterMain(envs, linterService); envs.registerService(linterService); - cli.register(new LintCmd(linterAspect, component.getHost(), workspace)); + cli.register(lintCommand, () => new LintCmd(linterAspect, component.getHost(), workspace)); return linterAspect; } diff --git a/scopes/defender/mocha/mocha.aspect.ts b/scopes/defender/mocha/mocha.aspect.ts index 1c1fd0fa1338..e8ba5e156e5f 100644 --- a/scopes/defender/mocha/mocha.aspect.ts +++ b/scopes/defender/mocha/mocha.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MochaAspect = Aspect.create({ id: 'teambit.defender/mocha', + runtimes: { main: () => import('./mocha.main.runtime') }, }); diff --git a/scopes/defender/multi-tester/multi-tester.aspect.ts b/scopes/defender/multi-tester/multi-tester.aspect.ts index 421e02d3238c..ee66367cb04e 100644 --- a/scopes/defender/multi-tester/multi-tester.aspect.ts +++ b/scopes/defender/multi-tester/multi-tester.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MultiTesterAspect = Aspect.create({ id: 'teambit.defender/multi-tester', + runtimes: { main: () => import('./multi-tester.main.runtime') }, }); diff --git a/scopes/defender/prettier/prettier.aspect.ts b/scopes/defender/prettier/prettier.aspect.ts index 9f7f494a54b8..fa6f2d7b3ca7 100644 --- a/scopes/defender/prettier/prettier.aspect.ts +++ b/scopes/defender/prettier/prettier.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PrettierAspect = Aspect.create({ id: 'teambit.defender/prettier', + runtimes: { main: () => import('./prettier.main.runtime') }, }); diff --git a/scopes/defender/tester/test.cmd.ts b/scopes/defender/tester/test.cmd.ts index 9ac856094794..36f2c5160a78 100644 --- a/scopes/defender/tester/test.cmd.ts +++ b/scopes/defender/tester/test.cmd.ts @@ -8,6 +8,7 @@ import { Timer } from '@teambit/toolbox.time.timer'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { TesterMain, TestResults } from './tester.main.runtime'; import { aggregateTestResults, formatTestReport } from './test-output-formatter'; +import { testCommand } from './tester.commands'; type TestFlags = { watch: boolean; @@ -24,39 +25,14 @@ type TestFlags = { }; export class TestCmd implements Command { - name = 'test [component-pattern]'; - description = 'run component tests'; - extendedDescription = `executes tests using the testing framework configured by each component's environment (Jest, Mocha, etc.). -by default only runs tests for new and modified components. use --unmodified to test all components. -supports watch mode, coverage reporting, and debug mode for development workflows.`; - helpUrl = 'reference/testing/tester-overview'; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - alias = 'at'; - group = 'testing'; - options = [ - ['w', 'watch', 'start the tester in watch mode.'], - ['d', 'debug', 'start the tester in debug mode.'], - ['a', 'all', 'DEPRECATED. (use --unmodified)'], - ['u', 'unmodified', 'test all components, not only new and modified'], - ['', 'junit ', 'write tests results as JUnit XML format into the specified file path'], - ['', 'coverage', 'show code coverage data'], - ['e', 'env ', 'test only components assigned the given env'], - ['', 'update-snapshot', 'if supported by the tester, re-record every snapshot that fails during the test run'], - [ - 's', - 'scope ', - 'DEPRECATED. (use the pattern instead, e.g. "scopeName/**"). name of the scope to test', - ], - ['j', 'json', 'return the results in json format'], - ['', 'verbose', 'list the component ids that have no tests (default collapses them into a count)'], - ['', 'summary', 'suppress tester output, print only the final pass/fail headline (or summary object with --json)'], - // TODO: we need to reduce this redundant casting every time. - ] as CommandOptions; + name = testCommand.name; + description = testCommand.description; + extendedDescription = testCommand.extendedDescription; + helpUrl = testCommand.helpUrl; + arguments = testCommand.arguments; + alias = testCommand.alias; + group = testCommand.group; + options = testCommand.options; constructor( private tester: TesterMain, diff --git a/scopes/defender/tester/tester.aspect.ts b/scopes/defender/tester/tester.aspect.ts index 85f2be63e595..6f3f876f3153 100644 --- a/scopes/defender/tester/tester.aspect.ts +++ b/scopes/defender/tester/tester.aspect.ts @@ -1,7 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const TesterAspect = Aspect.create({ id: 'teambit.defender/tester', + runtimes: { main: () => import('./tester.main.runtime') }, + commands: () => import('./tester.commands').then((m) => [m.testCommand]), }); export default TesterAspect; diff --git a/scopes/defender/tester/tester.commands.ts b/scopes/defender/tester/tester.commands.ts new file mode 100644 index 000000000000..9973edf454fd --- /dev/null +++ b/scopes/defender/tester/tester.commands.ts @@ -0,0 +1,48 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const testCommand: CommandDescriptor = { + name: 'test [component-pattern]', + alias: 'at', + description: 'run component tests', + extendedDescription: `executes tests using the testing framework configured by each component's environment (Jest, Mocha, etc.). + by default only runs tests for new and modified components. use --unmodified to test all components. + supports watch mode, coverage reporting, and debug mode for development workflows.`, + helpUrl: 'reference/testing/tester-overview', + group: 'testing', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + options: [ + ['w', 'watch', 'start the tester in watch mode.'], + ['d', 'debug', 'start the tester in debug mode.'], + ['a', 'all', 'DEPRECATED. (use --unmodified)'], + ['u', 'unmodified', 'test all components, not only new and modified'], + ['', 'junit ', 'write tests results as JUnit XML format into the specified file path'], + ['', 'coverage', 'show code coverage data'], + ['e', 'env ', 'test only components assigned the given env'], + ['', 'update-snapshot', 'if supported by the tester, re-record every snapshot that fails during the test run'], + [ + 's', + 'scope ', + 'DEPRECATED. (use the pattern instead, e.g. "scopeName/**"). name of the scope to test', + ], + ['j', 'json', 'return the results in json format'], + ['', 'verbose', 'list the component ids that have no tests (default collapses them into a count)'], + ['', 'summary', 'suppress tester output, print only the final pass/fail headline (or summary object with --json)'], + // TODO: we need to reduce this redundant casting every time. + ] as CommandOptions, +}; diff --git a/scopes/defender/tester/tester.main.runtime.ts b/scopes/defender/tester/tester.main.runtime.ts index 864a00f0363d..da6954411fb5 100644 --- a/scopes/defender/tester/tester.main.runtime.ts +++ b/scopes/defender/tester/tester.main.runtime.ts @@ -27,6 +27,7 @@ import { TesterTask } from './tester.task'; import { detectTestFiles } from './utils'; import { testerSchema } from './tester.graphql'; import { testsResultsToJUnitFormat } from './utils/junit-generator'; +import { testCommand } from './tester.commands'; export type TesterExtensionConfig = { /** @@ -300,7 +301,7 @@ export class TesterMain { return undefined; }); } - cli.register(new TestCmd(tester, workspace, logger)); + cli.register(testCommand, () => new TestCmd(tester, workspace, logger)); graphql.register(() => testerSchema(tester, graphql)); diff --git a/scopes/defender/validator/validate.cmd.ts b/scopes/defender/validator/validate.cmd.ts index 755d9ba0c29f..4a7bd08c72cd 100644 --- a/scopes/defender/validator/validate.cmd.ts +++ b/scopes/defender/validator/validate.cmd.ts @@ -5,29 +5,18 @@ import type { Workspace } from '@teambit/workspace'; import { OutsideWorkspaceError } from '@teambit/workspace'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import type { ValidatorMain } from './validator.main.runtime'; +import { validateCommand } from './validator.commands'; const VALID_TASKS = ['check-types', 'lint', 'test'] as const; export class ValidateCmd implements Command { - name = 'validate [component-pattern]'; - description = 'run type-checking, linting, and testing in sequence'; - extendedDescription = `validates components by running check-types, lint, and test commands in sequence. -by default runs all checks even when errors are found. -use --fail-fast to stop at the first failure. -by default validates only new and modified components. use --all to validate all components.`; - arguments = [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }]; - alias = ''; - group = 'testing'; - options = [ - ['a', 'all', 'validate all components, not only modified and new'], - ['', 'fail-fast', 'stop at the first failure instead of running all checks'], - ['c', 'continue-on-error', 'DEPRECATED: this is now the default behavior'], - [ - '', - 'skip-tasks ', - 'skip the given tasks. for multiple tasks, separate by a comma and wrap with quotes. available tasks: "check-types", "lint", "test"', - ], - ] as CommandOptions; + name = validateCommand.name; + description = validateCommand.description; + extendedDescription = validateCommand.extendedDescription; + arguments = validateCommand.arguments; + alias = validateCommand.alias; + group = validateCommand.group; + options = validateCommand.options; constructor( private validator: ValidatorMain, diff --git a/scopes/defender/validator/validator.aspect.ts b/scopes/defender/validator/validator.aspect.ts index 5b8d2279a3ab..c347038f1ab6 100644 --- a/scopes/defender/validator/validator.aspect.ts +++ b/scopes/defender/validator/validator.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ValidatorAspect = Aspect.create({ id: 'teambit.defender/validator', + runtimes: { main: () => import('./validator.main.runtime') }, + commands: () => import('./validator.commands').then((m) => [m.validateCommand]), }); diff --git a/scopes/defender/validator/validator.commands.ts b/scopes/defender/validator/validator.commands.ts new file mode 100644 index 000000000000..1c03471cc3c2 --- /dev/null +++ b/scopes/defender/validator/validator.commands.ts @@ -0,0 +1,34 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const validateCommand: CommandDescriptor = { + name: 'validate [component-pattern]', + alias: '', + description: 'run type-checking, linting, and testing in sequence', + extendedDescription: `validates components by running check-types, lint, and test commands in sequence. + by default runs all checks even when errors are found. + use --fail-fast to stop at the first failure. + by default validates only new and modified components. use --all to validate all components.`, + group: 'testing', + arguments: [{ name: 'component-pattern', description: COMPONENT_PATTERN_HELP }], + options: [ + ['a', 'all', 'validate all components, not only modified and new'], + ['', 'fail-fast', 'stop at the first failure instead of running all checks'], + ['c', 'continue-on-error', 'DEPRECATED: this is now the default behavior'], + [ + '', + 'skip-tasks ', + 'skip the given tasks. for multiple tasks, separate by a comma and wrap with quotes. available tasks: "check-types", "lint", "test"', + ], + ] as CommandOptions, +}; diff --git a/scopes/defender/validator/validator.main.runtime.ts b/scopes/defender/validator/validator.main.runtime.ts index 190ff21b64c9..0d948e69d1d2 100644 --- a/scopes/defender/validator/validator.main.runtime.ts +++ b/scopes/defender/validator/validator.main.runtime.ts @@ -14,6 +14,7 @@ import type { Component } from '@teambit/component'; import chalk from 'chalk'; import { ValidatorAspect } from './validator.aspect'; import { ValidateCmd } from './validate.cmd'; +import { validateCommand } from './validator.commands'; export type ValidationResult = { code: number; @@ -163,7 +164,7 @@ export class ValidatorMain { ]) { const logger = loggerAspect.createLogger(ValidatorAspect.id); const validator = new ValidatorMain(workspace, typescript, linter, tester, logger); - cli.register(new ValidateCmd(validator, workspace, logger)); + cli.register(validateCommand, () => new ValidateCmd(validator, workspace, logger)); return validator; } } diff --git a/scopes/dependencies/dependencies/dependencies-cmd.ts b/scopes/dependencies/dependencies/dependencies-cmd.ts index 3d151d3ac85d..916a42a23f25 100644 --- a/scopes/dependencies/dependencies/dependencies-cmd.ts +++ b/scopes/dependencies/dependencies/dependencies-cmd.ts @@ -9,6 +9,7 @@ import { joinSections, warnSymbol, } from '@teambit/cli'; +import { unsetPeerCommand } from './dependencies.commands'; import Table from 'cli-table'; import chalk from 'chalk'; import archy from 'archy'; @@ -546,14 +547,13 @@ the specified version range will be used when adding this component as a peer de } export class UnsetPeerCmd implements Command { - name = 'unset-peer '; - arguments = [{ name: 'component-id', description: 'the component to unset as always peer' }]; - group = 'dependencies'; - description = 'remove always-peer configuration from component'; - extendedDescription = `removes the always-peer marking from a component, allowing it to be installed as a regular dependency. -reverses the effect of 'bit set-peer' command. the component will be treated normally in dependency resolution.`; - alias = ''; - options = []; + name = unsetPeerCommand.name; + arguments = unsetPeerCommand.arguments; + group = unsetPeerCommand.group; + description = unsetPeerCommand.description; + extendedDescription = unsetPeerCommand.extendedDescription; + alias = unsetPeerCommand.alias; + options = unsetPeerCommand.options; constructor(private deps: DependenciesMain) {} diff --git a/scopes/dependencies/dependencies/dependencies.aspect.ts b/scopes/dependencies/dependencies/dependencies.aspect.ts index 65377c49183b..9df4ae099f08 100644 --- a/scopes/dependencies/dependencies/dependencies.aspect.ts +++ b/scopes/dependencies/dependencies/dependencies.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DependenciesAspect = Aspect.create({ id: 'teambit.dependencies/dependencies', + runtimes: { main: () => import('./dependencies.main.runtime') }, + commands: () => import('./dependencies.commands').then((m) => [m.whyCommand, m.setPeerCommand, m.unsetPeerCommand, m.dependentsCommand]), }); diff --git a/scopes/dependencies/dependencies/dependencies.commands.ts b/scopes/dependencies/dependencies/dependencies.commands.ts new file mode 100644 index 000000000000..66934a889942 --- /dev/null +++ b/scopes/dependencies/dependencies/dependencies.commands.ts @@ -0,0 +1,62 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const whyCommand: CommandDescriptor = { + name: 'why ', +}; + +export const setPeerCommand: CommandDescriptor = { + name: 'set-peer ', + alias: '', + description: 'configure component to always be installed as peer dependency', + extendedDescription: `marks a component to always be treated as a peer dependency when used by other components. + useful for shared libraries that should be provided by the consuming application. + the specified version range will be used when adding this component as a peer dependency.`, + group: 'dependencies', + arguments: [ + { name: 'component-id', description: 'the component to set as always peer' }, + { + name: 'range', + description: 'the default range to use for the component, when added to peerDependencies', + }, + ], + options: [] as CommandOptions, +}; + +export const unsetPeerCommand: CommandDescriptor = { + name: 'unset-peer ', + alias: '', + description: 'remove always-peer configuration from component', + extendedDescription: `removes the always-peer marking from a component, allowing it to be installed as a regular dependency. + reverses the effect of 'bit set-peer' command. the component will be treated normally in dependency resolution.`, + group: 'dependencies', + arguments: [{ name: 'component-id', description: 'the component to unset as always peer' }], + options: [] as CommandOptions, +}; + +export const dependentsCommand: CommandDescriptor = { + name: 'dependents ', + alias: '', + description: 'show components that depend on the specified component', + extendedDescription: `displays components from both workspace and scope that depend on the specified component. + useful for understanding impact before making changes to a component or when planning refactoring. + shows both direct and transitive dependents organized by their origin (workspace vs scope).`, + helpUrl: 'reference/dependencies/inspecting-dependencies#review-dependents', + group: 'dependencies', + arguments: [ + { + name: 'component-name', + description: 'component name or component id', + }, + ], + options: [['j', 'json', 'return the dependents in JSON format']] as CommandOptions, +}; diff --git a/scopes/dependencies/dependencies/dependencies.main.runtime.ts b/scopes/dependencies/dependencies/dependencies.main.runtime.ts index 4b1c41c4439b..634f07385bf8 100644 --- a/scopes/dependencies/dependencies/dependencies.main.runtime.ts +++ b/scopes/dependencies/dependencies/dependencies.main.runtime.ts @@ -43,6 +43,7 @@ import { UnsetPeerCmd, WhyCmd, } from './dependencies-cmd'; +import { dependentsCommand, setPeerCommand, unsetPeerCommand, whyCommand } from './dependencies.commands'; import { DependenciesAspect } from './dependencies.aspect'; import type { DebugDependencies } from './dependencies-loader/auto-detect-deps'; import { DependentsCmd } from './dependents-cmd'; @@ -705,13 +706,10 @@ export class DependenciesMain { new DependenciesCircularCmd(depsMain), new DependenciesWriteCmd(workspace), ]; - cli.register( - depsCmd, - new WhyCmd(depsMain), - new SetPeerCmd(depsMain), - new UnsetPeerCmd(depsMain), - new DependentsCmd(workspace) - ); + cli.register(whyCommand, () => new WhyCmd(depsMain)); + cli.register(setPeerCommand, () => new SetPeerCmd(depsMain)); + cli.register(unsetPeerCommand, () => new UnsetPeerCmd(depsMain)); + cli.register(dependentsCommand, () => new DependentsCmd(workspace)); ComponentLoader.loadDeps = depsMain.loadDependencies.bind(depsMain); diff --git a/scopes/dependencies/dependencies/dependents-cmd.ts b/scopes/dependencies/dependencies/dependents-cmd.ts index f5f2e540d6cb..7e0897341678 100644 --- a/scopes/dependencies/dependencies/dependents-cmd.ts +++ b/scopes/dependencies/dependencies/dependents-cmd.ts @@ -4,23 +4,17 @@ import type { DependentsResults } from './dependents'; import { dependents } from './dependents'; import { generateDependentsInfoTable } from './template'; import type { Workspace } from '@teambit/workspace'; +import { dependentsCommand } from './dependencies.commands'; export class DependentsCmd implements Command { - name = 'dependents '; - helpUrl = 'reference/dependencies/inspecting-dependencies#review-dependents'; - arguments = [ - { - name: 'component-name', - description: 'component name or component id', - }, - ]; - description = 'show components that depend on the specified component'; - extendedDescription = `displays components from both workspace and scope that depend on the specified component. -useful for understanding impact before making changes to a component or when planning refactoring. -shows both direct and transitive dependents organized by their origin (workspace vs scope).`; - group = 'dependencies'; - alias = ''; - options = [['j', 'json', 'return the dependents in JSON format']] as CommandOptions; + name = dependentsCommand.name; + helpUrl = dependentsCommand.helpUrl; + arguments = dependentsCommand.arguments; + description = dependentsCommand.description; + extendedDescription = dependentsCommand.extendedDescription; + group = dependentsCommand.group; + alias = dependentsCommand.alias; + options = dependentsCommand.options; constructor(private workspace: Workspace) {} diff --git a/scopes/dependencies/dependency-resolver/dependency-resolver.aspect.ts b/scopes/dependencies/dependency-resolver/dependency-resolver.aspect.ts index 7657d73afa58..730a188cf059 100644 --- a/scopes/dependencies/dependency-resolver/dependency-resolver.aspect.ts +++ b/scopes/dependencies/dependency-resolver/dependency-resolver.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DependencyResolverAspect = Aspect.create({ id: 'teambit.dependencies/dependency-resolver', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./dependency-resolver.main.runtime') }, }); diff --git a/scopes/dependencies/pnpm/pnpm.aspect.ts b/scopes/dependencies/pnpm/pnpm.aspect.ts index f4349bc5e2df..7bfd5a2885a9 100644 --- a/scopes/dependencies/pnpm/pnpm.aspect.ts +++ b/scopes/dependencies/pnpm/pnpm.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PnpmAspect = Aspect.create({ id: 'teambit.dependencies/pnpm', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./pnpm.main.runtime') }, }); export default PnpmAspect; diff --git a/scopes/dependencies/yarn/yarn.aspect.ts b/scopes/dependencies/yarn/yarn.aspect.ts index c0a49dbdf5cd..7b0574188aee 100644 --- a/scopes/dependencies/yarn/yarn.aspect.ts +++ b/scopes/dependencies/yarn/yarn.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const YarnAspect = Aspect.create({ id: 'teambit.dependencies/yarn', + runtimes: { main: () => import('./yarn.main.runtime') }, }); export default YarnAspect; diff --git a/scopes/docs/docs/docs.aspect.ts b/scopes/docs/docs/docs.aspect.ts index d29c52ab623d..240df3e9fb1a 100644 --- a/scopes/docs/docs/docs.aspect.ts +++ b/scopes/docs/docs/docs.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DocsAspect = Aspect.create({ id: 'teambit.docs/docs', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./docs.main.runtime') }, }); export default DocsAspect; diff --git a/scopes/docs/docs/index.ts b/scopes/docs/docs/index.ts index ac5da12c98bb..28f15b7bd1cc 100644 --- a/scopes/docs/docs/index.ts +++ b/scopes/docs/docs/index.ts @@ -14,8 +14,9 @@ export type { Docs, Example } from './docs'; export { defaultDocs } from './docs'; export type { TitleBadgeSlot, TitleBadge, OverviewOptionsSlot, OverviewOptions } from './overview'; -export { BadgePosition } from './overview'; -export { Overview } from './overview'; +// UI value exports removed: +// - BadgePosition / Overview (was: './overview') +// UI callers should import from './overview' directly. export { DocsAspect }; export default DocsAspect; diff --git a/scopes/envs/env/env.aspect.ts b/scopes/envs/env/env.aspect.ts index f926ba463d00..0e93387fb9c7 100644 --- a/scopes/envs/env/env.aspect.ts +++ b/scopes/envs/env/env.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const EnvAspect = Aspect.create({ id: 'teambit.envs/env', + runtimes: { main: () => import('./env.main.runtime') }, }); diff --git a/scopes/envs/envs/environments.aspect.ts b/scopes/envs/envs/environments.aspect.ts index 0a42e057b33c..2b10d4b7b5e0 100644 --- a/scopes/envs/envs/environments.aspect.ts +++ b/scopes/envs/envs/environments.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const EnvsAspect = Aspect.create({ id: 'teambit.envs/envs', + runtimes: { main: () => import('./environments.main.runtime') }, }); diff --git a/scopes/explorer/command-bar/command-bar.aspect.ts b/scopes/explorer/command-bar/command-bar.aspect.ts index 84961ee9e715..e41943a038be 100644 --- a/scopes/explorer/command-bar/command-bar.aspect.ts +++ b/scopes/explorer/command-bar/command-bar.aspect.ts @@ -1,9 +1,11 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CommandBarAspect = Aspect.create({ id: 'teambit.explorer/command-bar', - dependencies: [], - defaultConfig: {}, + runtimes: { + ui: () => import('./command-bar.ui.runtime'), + preview: () => import('./command-bar.preview.runtime'), + }, }); export default CommandBarAspect; diff --git a/scopes/explorer/command-bar/index.ts b/scopes/explorer/command-bar/index.ts index 2ef7c3bf2d19..87d8e5c04667 100644 --- a/scopes/explorer/command-bar/index.ts +++ b/scopes/explorer/command-bar/index.ts @@ -5,4 +5,6 @@ export type { CommandBarUI, CommandEntry } from './command-bar.ui.runtime'; export type { CommandHandler, CommandId, Keybinding } from './types'; export type { SearchResult, ResultsComponentProps, SearchResults } from '@teambit/explorer.ui.command-bar'; export type { FuzzySearchItem } from '@teambit/explorer.ui.command-bar'; -export { FuzzySearcher, CommandBarItem } from '@teambit/explorer.ui.command-bar'; +// UI value exports removed: +// - FuzzySearcher / CommandBarItem (was: '@teambit/explorer.ui.command-bar') +// UI callers should import from that package directly. diff --git a/scopes/explorer/insights/insights.aspect.ts b/scopes/explorer/insights/insights.aspect.ts index bfb9ae57190c..fa7755c46cd4 100644 --- a/scopes/explorer/insights/insights.aspect.ts +++ b/scopes/explorer/insights/insights.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const InsightsAspect = Aspect.create({ id: 'teambit.explorer/insights', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./insights.main.runtime') }, }); diff --git a/scopes/generator/generator/generator.aspect.ts b/scopes/generator/generator/generator.aspect.ts index 1c7e16d99d48..9944270ed491 100644 --- a/scopes/generator/generator/generator.aspect.ts +++ b/scopes/generator/generator/generator.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const GeneratorAspect = Aspect.create({ id: 'teambit.generator/generator', + runtimes: { main: () => import('./generator.main.runtime') }, }); diff --git a/scopes/git/ci/ci.aspect.ts b/scopes/git/ci/ci.aspect.ts index 86ec0b15e002..fd9fa91de10e 100644 --- a/scopes/git/ci/ci.aspect.ts +++ b/scopes/git/ci/ci.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CiAspect = Aspect.create({ id: 'teambit.git/ci', + runtimes: { main: () => import('./ci.main.runtime') }, }); export default CiAspect; diff --git a/scopes/git/git/git.aspect.ts b/scopes/git/git/git.aspect.ts index 6cea79eb5745..4990d1bb0f60 100644 --- a/scopes/git/git/git.aspect.ts +++ b/scopes/git/git/git.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const GitAspect = Aspect.create({ id: 'teambit.git/git', + runtimes: { main: () => import('./git.main.runtime') }, }); diff --git a/scopes/harmony/api-server/api-server.aspect.ts b/scopes/harmony/api-server/api-server.aspect.ts index 0dfee83bd33c..c5b71b4d36ca 100644 --- a/scopes/harmony/api-server/api-server.aspect.ts +++ b/scopes/harmony/api-server/api-server.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ApiServerAspect = Aspect.create({ id: 'teambit.harmony/api-server', + runtimes: { main: () => import('./api-server.main.runtime') }, + commands: () => import('./api-server.commands').then((m) => [m.serverCommand]), }); diff --git a/scopes/harmony/api-server/api-server.commands.ts b/scopes/harmony/api-server/api-server.commands.ts new file mode 100644 index 000000000000..c2240ecd2e01 --- /dev/null +++ b/scopes/harmony/api-server/api-server.commands.ts @@ -0,0 +1,24 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const serverCommand: CommandDescriptor = { + name: 'server', + alias: '', + description: 'communicate with bit cli program via http requests', + group: 'workspace-setup', + private: true, + options: [ + ['p', 'port [port]', 'port to run the server on'], + ['c', 'compile', 'compile components during the watch process'], + ] as CommandOptions, + commands: [], +}; diff --git a/scopes/harmony/api-server/api-server.main.runtime.ts b/scopes/harmony/api-server/api-server.main.runtime.ts index 4ca64e9cacca..3bbd992b0dab 100644 --- a/scopes/harmony/api-server/api-server.main.runtime.ts +++ b/scopes/harmony/api-server/api-server.main.runtime.ts @@ -62,6 +62,7 @@ import type { ScopeMain } from '@teambit/scope'; import { ScopeAspect } from '@teambit/scope'; import type { SchemaMain } from '@teambit/schema'; import { SchemaAspect } from '@teambit/schema'; +import { serverCommand } from './api-server.commands'; export class ApiServerMain { private serverToken?: string; @@ -519,7 +520,7 @@ export class ApiServerMain { ]) { const logger = loggerMain.createLogger(ApiServerAspect.id); const apiServer = new ApiServerMain(workspace, logger, express, watcher, installer, importer); - cli.register(new ServerCmd(apiServer)); + cli.register(serverCommand, () => new ServerCmd(apiServer)); const apiForIDE = new APIForIDE( workspace, diff --git a/scopes/harmony/api-server/server.cmd.ts b/scopes/harmony/api-server/server.cmd.ts index 4c2ff19ebae1..d544a8d83945 100644 --- a/scopes/harmony/api-server/server.cmd.ts +++ b/scopes/harmony/api-server/server.cmd.ts @@ -1,18 +1,16 @@ // eslint-disable-next-line max-classes-per-file import type { Command, CommandOptions } from '@teambit/cli'; import type { ApiServerMain } from './api-server.main.runtime'; +import { serverCommand } from './api-server.commands'; export class ServerCmd implements Command { - name = 'server'; - description = 'communicate with bit cli program via http requests'; - alias = ''; - commands: Command[] = []; - group = 'workspace-setup'; - options = [ - ['p', 'port [port]', 'port to run the server on'], - ['c', 'compile', 'compile components during the watch process'], - ] as CommandOptions; - private = true; + name = serverCommand.name; + description = serverCommand.description; + alias = serverCommand.alias; + commands: Command[] = serverCommand.commands; + group = serverCommand.group; + options = serverCommand.options; + private = serverCommand.private; constructor(private apiServer: ApiServerMain) {} diff --git a/scopes/harmony/application/application.aspect.ts b/scopes/harmony/application/application.aspect.ts index 599df116ef3f..d33afa4142be 100644 --- a/scopes/harmony/application/application.aspect.ts +++ b/scopes/harmony/application/application.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ApplicationAspect = Aspect.create({ id: 'teambit.harmony/application', + runtimes: { main: () => import('./application.main.runtime') }, + commands: () => import('./application.commands').then((m) => [m.runCommand]), }); diff --git a/scopes/harmony/application/application.commands.ts b/scopes/harmony/application/application.commands.ts new file mode 100644 index 000000000000..0de8e0b2ab5a --- /dev/null +++ b/scopes/harmony/application/application.commands.ts @@ -0,0 +1,42 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const runCommand: CommandDescriptor = { + name: 'run [app-name]', + alias: 'c', + description: 'start an application component locally', + extendedDescription: `runs application components in their own development server, separate from the "bit start" UI. + apps are components that create deployable applications (React apps, Node.js servers, etc.). + when no app name is specified, automatically detects and runs the app if only one exists in the workspace.`, + helpUrl: 'reference/apps/apps-overview/', + group: 'run-serve', + arguments: [ + { + name: 'app-name', + description: + "the app's name is registered by the app (run 'bit app list' to list the names of the available apps)", + }, + ], + options: [ + ['d', 'dev', 'start the application in dev mode.'], + ['p', 'port [port-number]', 'port to run the app on'], + ['v', 'verbose', 'show verbose output for inspection and print stack trace'], + // ['', 'skip-watch', 'avoid running the watch process that compiles components in the background'], + ['w', 'watch', 'watch and compile your components upon changes'], + ['n', 'no-browser', 'do not automatically open browser when ready'], + [ + 'a', + 'args ', + 'the arguments passing to the app. for example, --args="--a=1 --b". don\'t forget to use quotes to wrap the value to escape special characters.', + ], + ] as CommandOptions, +}; diff --git a/scopes/harmony/application/application.main.runtime.ts b/scopes/harmony/application/application.main.runtime.ts index d8b5950d62ba..a15e362e0ba4 100644 --- a/scopes/harmony/application/application.main.runtime.ts +++ b/scopes/harmony/application/application.main.runtime.ts @@ -33,6 +33,7 @@ import { AppPlugin, BIT_APP_PATTERN } from './app.plugin'; import { AppTypePlugin } from './app-type.plugin'; import { AppContext } from './app-context'; import { DeployTask } from './deploy.task'; +import { runCommand } from './application.commands'; export type ApplicationTypeSlot = SlotRegistry[]>; export type ApplicationSlot = SlotRegistry; @@ -538,7 +539,7 @@ export class ApplicationMain { builder.registerTagTasks([new DeployTask(application, builder)]); envs.registerService(appService); cli.registerGroup('apps', 'Applications'); - cli.register(new RunCmd(application, logger), appCmd); + cli.register(runCommand, () => new RunCmd(application, logger)); // cli.registerOnStart(async () => { // await application.loadAppsToSlot(); // }); diff --git a/scopes/harmony/application/run.cmd.ts b/scopes/harmony/application/run.cmd.ts index f538faf39c04..af257d3dc67a 100644 --- a/scopes/harmony/application/run.cmd.ts +++ b/scopes/harmony/application/run.cmd.ts @@ -4,6 +4,7 @@ import { formatItem, formatSection } from '@teambit/cli'; import type { Logger } from '@teambit/logger'; import open from 'open'; import type { ApplicationMain } from './application.main.runtime'; +import { runCommand } from './application.commands'; function openBrowser(url: string): Promise { const openUrl = @@ -25,34 +26,14 @@ type RunOptions = { }; export class RunCmd implements Command { - name = 'run [app-name]'; - description = 'start an application component locally'; - extendedDescription = `runs application components in their own development server, separate from the "bit start" UI. -apps are components that create deployable applications (React apps, Node.js servers, etc.). -when no app name is specified, automatically detects and runs the app if only one exists in the workspace.`; - helpUrl = 'reference/apps/apps-overview/'; - arguments = [ - { - name: 'app-name', - description: - "the app's name is registered by the app (run 'bit app list' to list the names of the available apps)", - }, - ]; - alias = 'c'; - group = 'run-serve'; - options = [ - ['d', 'dev', 'start the application in dev mode.'], - ['p', 'port [port-number]', 'port to run the app on'], - ['v', 'verbose', 'show verbose output for inspection and print stack trace'], - // ['', 'skip-watch', 'avoid running the watch process that compiles components in the background'], - ['w', 'watch', 'watch and compile your components upon changes'], - ['n', 'no-browser', 'do not automatically open browser when ready'], - [ - 'a', - 'args ', - 'the arguments passing to the app. for example, --args="--a=1 --b". don\'t forget to use quotes to wrap the value to escape special characters.', - ], - ] as CommandOptions; + name = runCommand.name; + description = runCommand.description; + extendedDescription = runCommand.extendedDescription; + helpUrl = runCommand.helpUrl; + arguments = runCommand.arguments; + alias = runCommand.alias; + group = runCommand.group; + options = runCommand.options; constructor( /** diff --git a/scopes/harmony/aspect-loader/aspect-loader.aspect.ts b/scopes/harmony/aspect-loader/aspect-loader.aspect.ts index de11b666e3dc..ca3383151ab6 100644 --- a/scopes/harmony/aspect-loader/aspect-loader.aspect.ts +++ b/scopes/harmony/aspect-loader/aspect-loader.aspect.ts @@ -1,8 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const AspectLoaderAspect = Aspect.create({ id: 'teambit.harmony/aspect-loader', - dependencies: [], + runtimes: { main: () => import('./aspect-loader.main.runtime') }, }); export default AspectLoaderAspect; diff --git a/scopes/harmony/aspect/aspect.aspect.ts b/scopes/harmony/aspect/aspect.aspect.ts index 80f130f0f2cb..6f6789fe61e7 100644 --- a/scopes/harmony/aspect/aspect.aspect.ts +++ b/scopes/harmony/aspect/aspect.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const AspectAspect = Aspect.create({ id: 'teambit.harmony/aspect', + runtimes: { main: () => import('./aspect.main.runtime') }, }); export default AspectAspect; diff --git a/scopes/harmony/aspect/babel/babel-config.ts b/scopes/harmony/aspect/babel/babel-config.ts index a2cee6574bd3..8b26a21266ca 100644 --- a/scopes/harmony/aspect/babel/babel-config.ts +++ b/scopes/harmony/aspect/babel/babel-config.ts @@ -13,12 +13,6 @@ const presets = [ ], ]; const plugins = [ - [ - require.resolve('@babel/plugin-transform-modules-commonjs'), - { - lazy: () => true, - }, - ], require.resolve('babel-plugin-transform-typescript-metadata'), [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }], // [require.resolve('@babel/plugin-transform-runtime')], diff --git a/scopes/harmony/bit/bit.aspect.ts b/scopes/harmony/bit/bit.aspect.ts index 5829c7f4b033..48bd3a4e5b0b 100644 --- a/scopes/harmony/bit/bit.aspect.ts +++ b/scopes/harmony/bit/bit.aspect.ts @@ -1,9 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; /** * Main bit aspect */ export const BitAspect = Aspect.create({ id: 'teambit.harmony/bit', - dependencies: [], + runtimes: { main: () => import('./bit.main.runtime') }, }); diff --git a/scopes/harmony/bit/bootstrap.ts b/scopes/harmony/bit/bootstrap.ts index c2003c8c73d7..bf57fdd5332a 100644 --- a/scopes/harmony/bit/bootstrap.ts +++ b/scopes/harmony/bit/bootstrap.ts @@ -1,6 +1,8 @@ import chalk from 'chalk'; import fs from 'fs-extra'; import semver from 'semver'; +import { EventEmitter } from 'events'; +import 'regenerator-runtime/runtime.js'; import { getBitVersion } from '@teambit/bit.get-bit-version'; import { Analytics } from '@teambit/legacy.analytics'; import { handleUnhandledRejection } from '@teambit/cli'; @@ -13,9 +15,7 @@ const SUPPORTED_NODE_VERSIONS = '>=16.0.0 <25.0.0'; process.env.MEMFS_DONT_WARN = 'true'; // suppress fs experimental warnings from memfs -require('events').EventEmitter.defaultMaxListeners = 100; // set max listeners to a more appropriate numbers - -require('regenerator-runtime/runtime'); +EventEmitter.defaultMaxListeners = 100; // set max listeners to a more appropriate numbers // eslint-disable-next-line @typescript-eslint/no-misused-promises process.on('unhandledRejection', async (err: any) => handleUnhandledRejection(err)); diff --git a/scopes/harmony/bit/command-index-assert.ts b/scopes/harmony/bit/command-index-assert.ts new file mode 100644 index 000000000000..da2a10a363f8 --- /dev/null +++ b/scopes/harmony/bit/command-index-assert.ts @@ -0,0 +1,128 @@ +import type { CLIMain, Command } from '@teambit/cli'; +import { logger } from '@teambit/legacy.logger'; +import type { CommandIndexEntry } from './command-index.generated'; +import { COMMAND_INDEX } from './command-index.generated'; + +/** + * Verifies that the generated command index (committed under + * `command-index.generated.ts`) matches the live `commandsSlot` after eager + * bootstrap. On divergence, logs a loud warning. When + * `BIT_STRICT_COMMAND_INDEX=1` is set, divergence throws instead. + * + * See RFC §7 Phase 1 / §10 Slice 2 (docs/rfc-esm-lazy-aspects.md). + */ +export function assertCommandIndexMatchesLive(cli: CLIMain) { + // Empty placeholder index means the codegen hasn't run yet on this checkout. + // Don't fail — just hint at how to populate it. + if (COMMAND_INDEX.length === 0) { + logger.debug('command-index.generated.ts is empty; run `npm run generate-command-index`'); + return; + } + + const live = buildLiveIndex(cli); + const diff = diffIndexes(COMMAND_INDEX, live); + if (diff.length === 0) return; + + const msg = [ + '*** command index out of date ***', + 'The generated index at scopes/harmony/bit/command-index.generated.ts', + 'does not match the live commandsSlot. Regenerate it with:', + ' npm run generate-command-index', + '', + 'Differences (first 20):', + ...diff.slice(0, 20).map((d) => ` - ${d}`), + diff.length > 20 ? ` ... and ${diff.length - 20} more` : '', + ] + .filter(Boolean) + .join('\n'); + + if (process.env.BIT_STRICT_COMMAND_INDEX === '1') { + throw new Error(msg); + } + // Show on stderr too so devs notice — logger.warn alone is silent in normal runs. + // eslint-disable-next-line no-console + console.error(msg); + logger.warn(msg); +} + +function buildLiveIndex(cli: CLIMain): CommandIndexEntry[] { + const result: CommandIndexEntry[] = []; + for (const [aspectId, commands] of cli.commandsByAspect()) { + for (const cmd of commands) { + result.push(toEntry(aspectId, cmd)); + } + } + return sortEntries(result); +} + +function toEntry(aspectId: string, cmd: Command): CommandIndexEntry { + const entry: CommandIndexEntry = { + name: commandName(cmd.name), + aspectId, + }; + if (cmd.alias) entry.alias = cmd.alias; + if (cmd.description) entry.description = String(cmd.description); + if (cmd.group) entry.group = String(cmd.group); + if (cmd.private) entry.private = true; + if (cmd.loader === false) entry.loader = false; + if (cmd.loadAspects === false) entry.loadAspects = false; + if (cmd.remoteOp) entry.remoteOp = true; + if (cmd.skipWorkspace) entry.skipWorkspace = true; + if (cmd.commands && cmd.commands.length > 0) { + entry.subCommands = sortEntries(cmd.commands.map((sub) => toEntry(aspectId, sub))); + } + return entry; +} + +function commandName(name: string): string { + return name.split(' ')[0].trim(); +} + +function sortEntries(entries: CommandIndexEntry[]): CommandIndexEntry[] { + return [...entries].sort((a, b) => a.name.localeCompare(b.name) || a.aspectId.localeCompare(b.aspectId)); +} + +function diffIndexes(generated: CommandIndexEntry[], live: CommandIndexEntry[]): string[] { + const out: string[] = []; + const keyOf = (e: CommandIndexEntry) => `${e.name}@${e.aspectId}`; + const genMap = new Map(generated.map((e) => [keyOf(e), e])); + const liveMap = new Map(live.map((e) => [keyOf(e), e])); + + for (const key of genMap.keys()) { + if (!liveMap.has(key)) out.push(`missing at runtime: ${key} (in generated index but not registered)`); + } + for (const key of liveMap.keys()) { + if (!genMap.has(key)) out.push(`missing from index: ${key} (registered at runtime but not in generated index)`); + } + for (const [key, genEntry] of genMap.entries()) { + const liveEntry = liveMap.get(key); + if (!liveEntry) continue; + const fieldDiffs = compareFields(genEntry, liveEntry); + for (const fd of fieldDiffs) out.push(`${key}: ${fd}`); + } + return out; +} + +const COMPARED_FIELDS: Array = [ + 'alias', + 'description', + 'group', + 'private', + 'loader', + 'loadAspects', + 'remoteOp', + 'skipWorkspace', +]; + +function compareFields(a: CommandIndexEntry, b: CommandIndexEntry): string[] { + const out: string[] = []; + for (const f of COMPARED_FIELDS) { + if (a[f] !== b[f]) out.push(`${f}: generated=${JSON.stringify(a[f])} live=${JSON.stringify(b[f])}`); + } + const aSub = (a.subCommands ?? []).map((s) => s.name).sort(); + const bSub = (b.subCommands ?? []).map((s) => s.name).sort(); + if (aSub.join(',') !== bSub.join(',')) { + out.push(`subCommands: generated=[${aSub.join(',')}] live=[${bSub.join(',')}]`); + } + return out; +} diff --git a/scopes/harmony/bit/command-index.generated.ts b/scopes/harmony/bit/command-index.generated.ts new file mode 100644 index 000000000000..fd594e04696c --- /dev/null +++ b/scopes/harmony/bit/command-index.generated.ts @@ -0,0 +1,1212 @@ +// AUTO-GENERATED — DO NOT EDIT BY HAND. +// Generated by scripts/generate-command-index.mjs +// (RFC: ESM Migration with Lazy-Loaded Aspects, Slice 2) +// To regenerate, run: npm run generate-command-index + +export interface CommandIndexEntry { + /** Command name (first word of `Command.name` — strips the `` / `[arg]` parts). */ + name: string; + /** Full `Command.name` (including positional patterns like `` / `[arg...]`), only set when it differs from `name`. The lazy stub trampoline uses this so yargs accepts positional arguments. */ + pattern?: string; + /** Aspect id that registered the command. */ + aspectId: string; + alias?: string; + description?: string; + group?: string; + private?: boolean; + loader?: boolean; + loadAspects?: boolean; + remoteOp?: boolean; + skipWorkspace?: boolean; + /** Sub-command entries (same shape, inherits aspectId from parent). */ + subCommands?: CommandIndexEntry[]; +} + +export const COMMAND_INDEX: CommandIndexEntry[] = [ + { + "name": "add", + "aspectId": "teambit.component/tracker", + "pattern": "add [path...]", + "alias": "a", + "description": "track existing directory contents as new components in the workspace", + "group": "component-development" + }, + { + "name": "artifacts", + "aspectId": "teambit.pipelines/builder", + "pattern": "artifacts ", + "description": "view and download build artifacts", + "group": "testing" + }, + { + "name": "aspect", + "aspectId": "teambit.harmony/aspect", + "pattern": "aspect ", + "description": "manage component aspects and their configurations", + "group": "component-config", + "subCommands": [ + { + "name": "get", + "aspectId": "teambit.harmony/aspect", + "pattern": "get ", + "description": "list the aspects set on a component, as well as their configs and data", + "group": "info-analysis" + }, + { + "name": "list", + "aspectId": "teambit.harmony/aspect", + "pattern": "list [pattern]", + "description": "list all aspects configured on component(s)", + "group": "info-analysis" + }, + { + "name": "list-core", + "aspectId": "teambit.harmony/aspect", + "description": "list all core aspects", + "group": "info-analysis" + }, + { + "name": "set", + "aspectId": "teambit.harmony/aspect", + "pattern": "set [config]", + "description": "set components with an aspect to extend their development tools, metadata and (possibly) artifacts", + "group": "component-config" + }, + { + "name": "unset", + "aspectId": "teambit.harmony/aspect", + "pattern": "unset ", + "description": "unset an aspect from component(s).", + "group": "component-config" + }, + { + "name": "update", + "aspectId": "teambit.harmony/aspect", + "pattern": "update [pattern]", + "description": "update a version of an aspect for all or specified components", + "group": "component-config" + } + ] + }, + { + "name": "blame", + "aspectId": "teambit.component/component-log", + "pattern": "blame ", + "description": "EXPERIMENTAL. show line-by-line authorship and modification history", + "group": "version-control" + }, + { + "name": "build", + "aspectId": "teambit.pipelines/builder", + "pattern": "build [component-pattern]", + "description": "run build pipeline tasks in isolated environments", + "group": "component-development" + }, + { + "name": "capsule", + "aspectId": "teambit.workspace/workspace", + "description": "manage isolated component environments", + "group": "advanced", + "subCommands": [ + { + "name": "create", + "aspectId": "teambit.workspace/workspace", + "pattern": "create [component-id...]", + "description": "create capsules for components", + "group": "advanced" + }, + { + "name": "delete", + "aspectId": "teambit.workspace/workspace", + "description": "delete capsules", + "group": "advanced" + }, + { + "name": "list", + "aspectId": "teambit.workspace/workspace", + "description": "list the capsules generated for this workspace", + "group": "advanced" + } + ] + }, + { + "name": "cat", + "aspectId": "teambit.component/component", + "pattern": "cat ", + "description": "print source files or config of a component at a specific version", + "group": "info-analysis", + "skipWorkspace": true + }, + { + "name": "cat-component", + "aspectId": "teambit.scope/scope", + "pattern": "cat-component [id]", + "alias": "cmp", + "description": "cat a bit object by component-id", + "group": "advanced", + "private": true, + "loadAspects": false + }, + { + "name": "cat-lane", + "aspectId": "teambit.scope/scope", + "pattern": "cat-lane ", + "alias": "cl", + "description": "cat a bit object by lane-name", + "group": "advanced", + "private": true, + "loader": false, + "loadAspects": false + }, + { + "name": "cat-lane-history", + "aspectId": "teambit.lanes/lanes", + "pattern": "cat-lane-history ", + "alias": "clh", + "description": "cat lane-history object by lane-name", + "group": "advanced", + "private": true + }, + { + "name": "cat-object", + "aspectId": "teambit.scope/scope", + "pattern": "cat-object ", + "description": "cat a bit object by hash", + "group": "advanced", + "private": true, + "loader": false, + "loadAspects": false + }, + { + "name": "cat-scope", + "aspectId": "teambit.scope/scope", + "pattern": "cat-scope [scopePath]", + "description": "cat a scope and show all the contents", + "group": "advanced", + "private": true, + "loader": false, + "loadAspects": false + }, + { + "name": "cat-version-history", + "aspectId": "teambit.scope/version-history", + "pattern": "cat-version-history ", + "alias": "cvh", + "description": "cat version-history object by component-id", + "group": "advanced", + "private": true, + "loadAspects": false + }, + { + "name": "check-types", + "aspectId": "teambit.typescript/typescript", + "pattern": "check-types [component-pattern]", + "description": "validate TypeScript type correctness", + "group": "testing" + }, + { + "name": "checkout", + "aspectId": "teambit.component/checkout", + "pattern": "checkout [component-pattern]", + "alias": "U", + "description": "switch between component versions or remove local changes", + "group": "version-control" + }, + { + "name": "ci", + "aspectId": "teambit.git/ci", + "pattern": "ci ", + "description": "continuous integration commands for automated workflows", + "group": "collaborate", + "subCommands": [ + { + "name": "merge", + "aspectId": "teambit.git/ci", + "description": "Tags and exports new semantic versions after merging a PR to main.", + "group": "collaborate" + }, + { + "name": "pr", + "aspectId": "teambit.git/ci", + "description": "Exports a feature lane to Bit Cloud when a Pull Request is opened or updated.", + "group": "collaborate" + }, + { + "name": "verify", + "aspectId": "teambit.git/ci", + "description": "Ensures the workspace passes CI checks on every commit.", + "group": "development" + } + ] + }, + { + "name": "clear-cache", + "aspectId": "teambit.bit/clear-cache", + "alias": "cc", + "description": "remove cached data to resolve stale data issues", + "group": "system", + "loader": false, + "skipWorkspace": true + }, + { + "name": "compile", + "aspectId": "teambit.compilation/compiler", + "pattern": "compile [component-names...]", + "description": "transpile component source files", + "group": "component-development" + }, + { + "name": "completion", + "aspectId": "teambit.harmony/cli", + "description": "enable bash/zsh-completion shortcuts for commands and options", + "group": "system", + "private": true + }, + { + "name": "component-issues", + "aspectId": "teambit.component/issues", + "description": "list available component-issues", + "group": "info-analysis", + "private": true + }, + { + "name": "config", + "aspectId": "teambit.harmony/config-store", + "description": "manage Bit configuration settings", + "group": "system", + "loadAspects": false, + "subCommands": [ + { + "name": "del", + "aspectId": "teambit.harmony/config-store", + "pattern": "del ", + "description": "delete given key from global configuration", + "group": "ungrouped" + }, + { + "name": "get", + "aspectId": "teambit.harmony/config-store", + "pattern": "get ", + "description": "get a value from global configuration", + "group": "ungrouped" + }, + { + "name": "list", + "aspectId": "teambit.harmony/config-store", + "description": "list all configuration(s)", + "group": "ungrouped" + }, + { + "name": "set", + "aspectId": "teambit.harmony/config-store", + "pattern": "set ", + "description": "set a configuration. default to save it globally", + "group": "ungrouped", + "skipWorkspace": true + } + ] + }, + { + "name": "create", + "aspectId": "teambit.generator/generator", + "pattern": "create ", + "description": "scaffold new component(s) from a template (sources, config, and env)", + "group": "component-development" + }, + { + "name": "delete", + "aspectId": "teambit.component/remove", + "pattern": "delete ", + "description": "soft-delete components from remote scopes", + "group": "collaborate", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "dependents", + "aspectId": "teambit.dependencies/dependencies", + "pattern": "dependents ", + "description": "show components that depend on the specified component", + "group": "dependencies" + }, + { + "name": "deprecate", + "aspectId": "teambit.component/deprecation", + "pattern": "deprecate ", + "alias": "d", + "description": "mark a component as deprecated to discourage its use", + "group": "collaborate", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "details", + "aspectId": "teambit.harmony/cli", + "description": "show expanded details from the last command that provided them (e.g. tag, snap)", + "group": "general", + "loader": false, + "loadAspects": false, + "skipWorkspace": true + }, + { + "name": "diff", + "aspectId": "teambit.component/component-compare", + "pattern": "diff [component-pattern] [version] [to-version]", + "description": "compare component changes between versions or against the current workspace", + "group": "info-analysis" + }, + { + "name": "doctor", + "aspectId": "teambit.harmony/doctor", + "pattern": "doctor [diagnosis-name]", + "description": "diagnose and troubleshoot workspace issues", + "group": "system", + "loadAspects": false + }, + { + "name": "eject", + "aspectId": "teambit.workspace/eject", + "pattern": "eject ", + "alias": "E", + "description": "remove component from workspace and install it as npm package", + "group": "dependencies" + }, + { + "name": "eject-conf", + "aspectId": "teambit.workspace/workspace", + "pattern": "eject-conf ", + "description": "create component.json configuration files for components", + "group": "component-config" + }, + { + "name": "envs", + "aspectId": "teambit.envs/envs", + "alias": "env", + "description": "show components and their assigned environments", + "group": "component-config", + "subCommands": [ + { + "name": "get", + "aspectId": "teambit.envs/envs", + "pattern": "get ", + "description": "show config information from a component's env", + "group": "component-config" + }, + { + "name": "list", + "aspectId": "teambit.envs/envs", + "description": "list all envs currently used in the workspace", + "group": "component-config" + }, + { + "name": "replace", + "aspectId": "teambit.envs/envs", + "pattern": "replace ", + "description": "replace an existing env with another env for all components using the old env", + "group": "component-config" + }, + { + "name": "set", + "aspectId": "teambit.envs/envs", + "pattern": "set ", + "description": "Assigns one or more components a development environment (env)", + "group": "component-config" + }, + { + "name": "unset", + "aspectId": "teambit.envs/envs", + "pattern": "unset ", + "description": "un-sets an env from components that were previously set by \"bit env set\" or by a component template", + "group": "component-config" + }, + { + "name": "update", + "aspectId": "teambit.envs/envs", + "pattern": "update [env-id] [pattern]", + "description": "update a version of an env for all components using that env", + "group": "component-config" + } + ] + }, + { + "name": "export", + "aspectId": "teambit.scope/export", + "pattern": "export [component-patterns...]", + "alias": "e", + "description": "upload components to remote scopes", + "group": "collaborate", + "remoteOp": true + }, + { + "name": "fetch", + "aspectId": "teambit.scope/importer", + "pattern": "fetch [ids...]", + "description": "fetch remote objects and store locally", + "group": "collaborate", + "private": true + }, + { + "name": "fork", + "aspectId": "teambit.component/forking", + "pattern": "fork [target-component-name]", + "description": "create a new component by copying from an existing one", + "group": "collaborate", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "format", + "aspectId": "teambit.defender/formatter", + "pattern": "format [component-pattern]", + "description": "auto-format component source code", + "group": "testing" + }, + { + "name": "generate-preview", + "aspectId": "teambit.preview/preview", + "pattern": "generate-preview [component-pattern]", + "description": "generate preview bundle for components", + "group": "run-serve", + "private": true + }, + { + "name": "git", + "aspectId": "teambit.git/git", + "pattern": "git ", + "description": "Git utilities for Bit repositories", + "group": "workspace-tools", + "subCommands": [ + { + "name": "merge-bitmaps", + "aspectId": "teambit.git/git", + "pattern": "merge-bitmaps ", + "description": "a special command to merge conflicting bitmap files during git merge", + "group": "workspace-tools", + "private": true + }, + { + "name": "set-merge-driver", + "aspectId": "teambit.git/git", + "alias": "smd", + "description": "setup bit's git merge driver for bitmap files", + "group": "workspace-tools" + } + ] + }, + { + "name": "globals", + "aspectId": "teambit.harmony/global-config", + "description": "display global directories and paths used by Bit", + "group": "system" + }, + { + "name": "graph", + "aspectId": "teambit.component/graph", + "pattern": "graph [id]", + "description": "visualize component dependencies as a graph image", + "group": "info-analysis", + "remoteOp": true + }, + { + "name": "import", + "aspectId": "teambit.scope/importer", + "pattern": "import [component-patterns...]", + "description": "bring components from remote scopes into your workspace", + "group": "collaborate", + "remoteOp": true + }, + { + "name": "init", + "aspectId": "teambit.harmony/host-initializer", + "pattern": "init [path]", + "description": "initialize a Bit workspace in an existing project", + "group": "workspace-setup", + "loadAspects": false, + "skipWorkspace": true + }, + { + "name": "insights", + "aspectId": "teambit.explorer/insights", + "pattern": "insights [names...]", + "description": "Insights on component graph", + "group": "workspace-tools", + "private": true + }, + { + "name": "install", + "aspectId": "teambit.workspace/install", + "pattern": "install [packages...]", + "alias": "in", + "description": "install workspace dependencies", + "group": "dependencies" + }, + { + "name": "link", + "aspectId": "teambit.workspace/install", + "pattern": "link [component-names...]", + "description": "create links between components and node_modules", + "group": "dependencies" + }, + { + "name": "lint", + "aspectId": "teambit.defender/linter", + "pattern": "lint [component-pattern]", + "description": "analyze component code for issues and style violations", + "group": "testing" + }, + { + "name": "list", + "aspectId": "teambit.component/lister", + "pattern": "list [remote-scope]", + "alias": "ls", + "description": "display components in workspace or remote scope", + "group": "info-analysis", + "loadAspects": false, + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "local-only", + "aspectId": "teambit.workspace/workspace", + "pattern": "local-only ", + "description": "manage components that exist only in the workspace", + "group": "component-config", + "subCommands": [ + { + "name": "list", + "aspectId": "teambit.workspace/workspace", + "description": "list all local-only components", + "group": "ungrouped" + }, + { + "name": "set", + "aspectId": "teambit.workspace/workspace", + "pattern": "set ", + "description": "set a component as local-only", + "group": "ungrouped" + }, + { + "name": "unset", + "aspectId": "teambit.workspace/workspace", + "pattern": "unset ", + "description": "remove a component from local-only", + "group": "ungrouped" + } + ] + }, + { + "name": "log", + "aspectId": "teambit.component/component-log", + "pattern": "log ", + "description": "display component version history", + "group": "version-control", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "log-file", + "aspectId": "teambit.component/component-log", + "pattern": "log-file ", + "description": "EXPERIMENTAL. display history of changes to a specific file", + "group": "version-control" + }, + { + "name": "login", + "aspectId": "teambit.cloud/cloud", + "description": "authenticate with Bit Cloud for component publishing and collaboration", + "group": "auth", + "loadAspects": false, + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "logout", + "aspectId": "teambit.cloud/cloud", + "description": "sign out of Bit Cloud and clear authentication tokens", + "group": "auth", + "loadAspects": false, + "skipWorkspace": true + }, + { + "name": "mcp-server", + "aspectId": "teambit.mcp/cli-mcp-server", + "pattern": "mcp-server [sub-command]", + "description": "start Model Context Protocol server for AI assistants", + "group": "advanced", + "loader": false, + "subCommands": [ + { + "name": "rules", + "aspectId": "teambit.mcp/cli-mcp-server", + "pattern": "rules [editor]", + "description": "Write Bit MCP rules/instructions file for VS Code, Cursor, Roo Code, Cline, Claude Code, or print to screen", + "group": "ungrouped" + }, + { + "name": "setup", + "aspectId": "teambit.mcp/cli-mcp-server", + "pattern": "setup [editor]", + "description": "Setup MCP integration with VS Code, Cursor, Windsurf, Roo Code, Cline, Claude Code, or other editors", + "group": "ungrouped" + }, + { + "name": "start", + "aspectId": "teambit.mcp/cli-mcp-server", + "description": "Start the MCP server", + "group": "advanced", + "loader": false + } + ] + }, + { + "name": "merge", + "aspectId": "teambit.component/merging", + "pattern": "merge [component-pattern]", + "description": "merge diverged component history when local and remote have different versions", + "group": "version-control" + }, + { + "name": "mini-status", + "aspectId": "teambit.component/status", + "pattern": "mini-status [component-pattern]", + "alias": "ms", + "description": "basic status for fast execution", + "group": "info-analysis", + "private": true, + "loadAspects": false + }, + { + "name": "move", + "aspectId": "teambit.component/mover", + "pattern": "move ", + "alias": "mv", + "description": "relocate a component to a different directory", + "group": "component-development" + }, + { + "name": "new", + "aspectId": "teambit.generator/generator", + "pattern": "new ", + "description": "create a new Bit workspace from a template", + "group": "workspace-setup" + }, + { + "name": "npmrc", + "aspectId": "teambit.cloud/cloud", + "pattern": "npmrc [sub-command]", + "description": "configure .npmrc file with Bit Cloud registry and authentication settings", + "group": "auth", + "skipWorkspace": true, + "subCommands": [ + { + "name": "generate", + "aspectId": "teambit.cloud/cloud", + "description": "update npmrc file with scope, registry, and token information from bit.cloud", + "group": "auth" + } + ] + }, + { + "name": "pack", + "aspectId": "teambit.pkg/pkg", + "pattern": "pack [scopePath]", + "description": "create tar for npm publish", + "group": "collaborate", + "private": true + }, + { + "name": "pattern", + "aspectId": "teambit.workspace/workspace", + "pattern": "pattern ", + "description": "test and validate component patterns", + "group": "info-analysis", + "remoteOp": true + }, + { + "name": "publish", + "aspectId": "teambit.pkg/pkg", + "pattern": "publish ", + "description": "publish components to npm (npm publish)", + "group": "collaborate", + "private": true + }, + { + "name": "recover", + "aspectId": "teambit.component/remove", + "pattern": "recover ", + "description": "restore soft-deleted components", + "group": "collaborate" + }, + { + "name": "refactor", + "aspectId": "teambit.component/refactoring", + "pattern": "refactor ", + "description": "automatically refactor component source code", + "group": "workspace-tools", + "subCommands": [ + { + "name": "dependency-name", + "aspectId": "teambit.component/refactoring", + "pattern": "dependency-name ", + "description": "replace the dependency's old package-name with a new one in the code", + "group": "workspace-tools" + } + ] + }, + { + "name": "remote", + "aspectId": "teambit.harmony/global-config", + "description": "manage remote scopes for self-hosted environments", + "group": "collaborate", + "loadAspects": false, + "subCommands": [ + { + "name": "add", + "aspectId": "teambit.harmony/global-config", + "pattern": "add ", + "description": "add a bare-scope as a remote", + "group": "ungrouped", + "loadAspects": false + }, + { + "name": "del", + "aspectId": "teambit.harmony/global-config", + "pattern": "del ", + "description": "remove a tracked bit remote", + "group": "ungrouped", + "loadAspects": false + }, + { + "name": "list", + "aspectId": "teambit.harmony/global-config", + "description": "list all configured remotes", + "group": "collaborate", + "loadAspects": false + } + ] + }, + { + "name": "remove", + "aspectId": "teambit.component/remove", + "pattern": "remove ", + "alias": "rm", + "description": "untrack components from the workspace", + "group": "component-development", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "rename", + "aspectId": "teambit.component/renaming", + "pattern": "rename ", + "description": "change a component name", + "group": "component-development", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "reset", + "aspectId": "teambit.component/snapping", + "pattern": "reset [component-pattern]", + "description": "revert local tags and snaps to previous versions", + "group": "version-control" + }, + { + "name": "resume-export", + "aspectId": "teambit.scope/export", + "pattern": "resume-export ", + "description": "EXPERIMENTAL. resume failed export", + "group": "advanced", + "private": true, + "remoteOp": true + }, + { + "name": "revert", + "aspectId": "teambit.component/checkout", + "pattern": "revert ", + "description": "replace component files with specified version while preserving current version", + "group": "version-control" + }, + { + "name": "ripple", + "aspectId": "teambit.cloud/ripple", + "pattern": "ripple ", + "description": "manage Ripple CI jobs on bit.cloud", + "group": "collaborate", + "remoteOp": true, + "skipWorkspace": true, + "subCommands": [ + { + "name": "errors", + "aspectId": "teambit.cloud/ripple", + "pattern": "errors [job-id]", + "description": "show build errors for a Ripple CI job (auto-detects current lane, or your last export when on main)", + "group": "ungrouped", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "list", + "aspectId": "teambit.cloud/ripple", + "description": "list recent Ripple CI jobs (filtered by workspace owner by default)", + "group": "ungrouped", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "log", + "aspectId": "teambit.cloud/ripple", + "pattern": "log [job-id]", + "description": "show job details and component build task summaries (auto-detects current lane, or your last export when on main)", + "group": "ungrouped", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "retry", + "aspectId": "teambit.cloud/ripple", + "pattern": "retry [job-id]", + "description": "retry a failed Ripple CI job (auto-detects current lane when no job-id given)", + "group": "ungrouped", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "stop", + "aspectId": "teambit.cloud/ripple", + "pattern": "stop [job-id]", + "description": "stop a running Ripple CI job (auto-detects current lane when no job-id given)", + "group": "ungrouped", + "remoteOp": true, + "skipWorkspace": true + } + ] + }, + { + "name": "run", + "aspectId": "teambit.harmony/application", + "pattern": "run [app-name]", + "alias": "c", + "description": "start an application component locally", + "group": "run-serve" + }, + { + "name": "run-action", + "aspectId": "teambit.scope/scope", + "pattern": "run-action ", + "description": "run an action on a remote", + "group": "advanced", + "private": true, + "loadAspects": false + }, + { + "name": "schema", + "aspectId": "teambit.semantics/schema", + "pattern": "schema ", + "alias": "api", + "description": "display component API schema and type definitions", + "group": "info-analysis", + "subCommands": [ + { + "name": "diff", + "aspectId": "teambit.semantics/schema", + "pattern": "diff ", + "description": "show API changes between two versions of a component", + "group": "info-analysis" + } + ] + }, + { + "name": "scope", + "aspectId": "teambit.scope/scope", + "pattern": "scope ", + "description": "manage component scope names and assignments", + "group": "component-config", + "subCommands": [ + { + "name": "fork", + "aspectId": "teambit.scope/scope", + "pattern": "fork [new-scope] [pattern]", + "description": "fork all components of the original-scope and refactor the source-code to use the new scope name", + "group": "component-config" + }, + { + "name": "rename", + "aspectId": "teambit.scope/scope", + "pattern": "rename ", + "description": "rename the scope name for all components with the specified 'current scope name'. if exported, create new components and delete the original ones", + "group": "component-config" + }, + { + "name": "rename-owner", + "aspectId": "teambit.scope/scope", + "pattern": "rename-owner ", + "description": "Renames the owner part of the scope-name for all components with the specified 'current owner name'", + "group": "component-config" + }, + { + "name": "set", + "aspectId": "teambit.scope/scope", + "pattern": "set [component-pattern]", + "description": "Sets the scope for specified component/s. If no component is specified, sets the default scope of the workspace", + "group": "component-config" + }, + { + "name": "trust", + "aspectId": "teambit.scope/scope", + "pattern": "trust [action] [pattern]", + "description": "manage which scopes are trusted to load aspects (envs, etc.) into the workspace's process", + "group": "component-config", + "loadAspects": false + } + ] + }, + { + "name": "script", + "aspectId": "teambit.workspace/scripts", + "pattern": "script [script-name]", + "description": "run a script defined by the environment", + "group": "development" + }, + { + "name": "search", + "aspectId": "teambit.component/lister", + "pattern": "search ", + "description": "search for components by keyword in the local workspace and remote bit cloud", + "group": "info-analysis", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "serve-preview", + "aspectId": "teambit.preview/preview", + "description": "serve local preview bundle for components", + "group": "run-serve", + "private": true + }, + { + "name": "server", + "aspectId": "teambit.harmony/api-server", + "description": "communicate with bit cli program via http requests", + "group": "workspace-setup", + "private": true + }, + { + "name": "set-peer", + "aspectId": "teambit.dependencies/dependencies", + "pattern": "set-peer ", + "description": "configure component to always be installed as peer dependency", + "group": "dependencies" + }, + { + "name": "show", + "aspectId": "teambit.component/component", + "pattern": "show ", + "description": "display component metadata, dependencies, and configuration", + "group": "info-analysis" + }, + { + "name": "snap", + "aspectId": "teambit.component/snapping", + "pattern": "snap [component-pattern]", + "description": "create immutable component snapshots for development versions", + "group": "version-control" + }, + { + "name": "snap-distance", + "aspectId": "teambit.component/snapping", + "pattern": "snap-distance [source-snap] [target-snap]", + "description": "show common-snap and distance between two given snaps or between local and remote snaps", + "group": "advanced", + "private": true + }, + { + "name": "start", + "aspectId": "teambit.ui-foundation/ui", + "pattern": "start [component-pattern]", + "alias": "c", + "description": "launch the Bit development server", + "group": "run-serve" + }, + { + "name": "stash", + "aspectId": "teambit.component/stash", + "pattern": "stash ", + "description": "temporarily save and restore component changes", + "group": "version-control", + "subCommands": [ + { + "name": "list", + "aspectId": "teambit.component/stash", + "description": "list stash", + "group": "version-control" + }, + { + "name": "load", + "aspectId": "teambit.component/stash", + "pattern": "load [stash-id]", + "alias": "pop", + "description": "apply the changes according to the stash. if no stash-id provided, it loads the latest stash", + "group": "version-control" + }, + { + "name": "save", + "aspectId": "teambit.component/stash", + "alias": "s", + "description": "stash modified components", + "group": "version-control" + } + ] + }, + { + "name": "status", + "aspectId": "teambit.component/status", + "alias": "s", + "description": "show workspace component status and issues", + "group": "info-analysis" + }, + { + "name": "tag", + "aspectId": "teambit.component/snapping", + "pattern": "tag [component-patterns...]", + "alias": "t", + "description": "create immutable component snapshots with semantic version tags", + "group": "version-control", + "remoteOp": true + }, + { + "name": "templates", + "aspectId": "teambit.generator/generator", + "description": "list available templates for creating components and workspaces", + "group": "component-development" + }, + { + "name": "test", + "aspectId": "teambit.defender/tester", + "pattern": "test [component-pattern]", + "alias": "at", + "description": "run component tests", + "group": "testing" + }, + { + "name": "ui-build", + "aspectId": "teambit.ui-foundation/ui", + "pattern": "ui-build [type]", + "alias": "c", + "description": "build production assets for deployment.", + "group": "run-serve", + "private": true + }, + { + "name": "undeprecate", + "aspectId": "teambit.component/deprecation", + "pattern": "undeprecate ", + "description": "remove the deprecation status from a component", + "group": "collaborate", + "remoteOp": true, + "skipWorkspace": true + }, + { + "name": "uninstall", + "aspectId": "teambit.workspace/install", + "pattern": "uninstall [packages...]", + "alias": "un", + "description": "remove dependencies from workspace", + "group": "dependencies" + }, + { + "name": "unset-peer", + "aspectId": "teambit.dependencies/dependencies", + "pattern": "unset-peer ", + "description": "remove always-peer configuration from component", + "group": "dependencies" + }, + { + "name": "unuse", + "aspectId": "teambit.workspace/workspace", + "pattern": "unuse ", + "description": "unset aspects in the workspace config (opposite of \"use\" command)", + "group": "workspace-setup", + "private": true, + "remoteOp": true + }, + { + "name": "update", + "aspectId": "teambit.workspace/install", + "pattern": "update [package-patterns...]", + "alias": "up", + "description": "update workspace dependencies to newer versions", + "group": "dependencies" + }, + { + "name": "use", + "aspectId": "teambit.workspace/workspace", + "pattern": "use ", + "description": "set aspects in the workspace/scope config to make them loadable by the workspace/scope", + "group": "workspace-setup", + "private": true, + "remoteOp": true + }, + { + "name": "validate", + "aspectId": "teambit.defender/validator", + "pattern": "validate [component-pattern]", + "description": "run type-checking, linting, and testing in sequence", + "group": "testing" + }, + { + "name": "version", + "aspectId": "teambit.harmony/cli", + "description": "display the installed Bit version", + "group": "system", + "loader": false + }, + { + "name": "watch", + "aspectId": "teambit.workspace/watcher", + "description": "watch and compile components on file changes", + "group": "component-development" + }, + { + "name": "whoami", + "aspectId": "teambit.cloud/cloud", + "description": "display the currently authenticated Bit Cloud user", + "group": "auth", + "skipWorkspace": true + }, + { + "name": "why", + "aspectId": "teambit.dependencies/dependencies", + "pattern": "why ", + "description": "find components that use the specified dependency", + "group": "dependencies" + }, + { + "name": "ws-config", + "aspectId": "teambit.workspace/workspace-config-files", + "pattern": "ws-config ", + "alias": "workspace-config", + "description": "generate IDE configuration files", + "group": "workspace-tools", + "subCommands": [ + { + "name": "clean", + "aspectId": "teambit.workspace/workspace-config-files", + "description": "clean (delete) written config files in the workspace. useful for IDEs", + "group": "workspace-tools" + }, + { + "name": "list", + "aspectId": "teambit.workspace/workspace-config-files", + "description": "list config writers", + "group": "workspace-tools" + }, + { + "name": "write", + "aspectId": "teambit.workspace/workspace-config-files", + "description": "write config files in the workspace. useful for IDEs", + "group": "workspace-tools" + } + ] + } +]; diff --git a/scopes/harmony/bit/help-from-index.ts b/scopes/harmony/bit/help-from-index.ts new file mode 100644 index 000000000000..664db965e0eb --- /dev/null +++ b/scopes/harmony/bit/help-from-index.ts @@ -0,0 +1,209 @@ +// Render `bit --help` (top-level help only) directly from the +// auto-generated `COMMAND_INDEX`. Avoids the aspect-load pass entirely. +// +// Part of RFC ESM Migration with Lazy-Loaded Aspects — Slice 5. +// (docs/migration/05-command-index-codegen.md, acceptance: `bit --help` +// reads from ALL_DESCRIPTORS, not from a live slot.) + +import chalk from 'chalk'; +import type { CommandIndexEntry } from './command-index.generated'; + +// Inlined to keep this module's dep graph tiny — the whole point of the +// `bit --help` short-circuit is to load as little as possible. +function capitalize(s: string): string { + return s.length === 0 ? s : s[0].toUpperCase() + s.slice(1); +} +function rightpad(s: string, length: number, pad: string): string { + return s.length >= length ? s : s + pad.repeat(length - s.length); +} + +// Mirrored from scopes/harmony/cli/command-groups.ts. Kept here as a tiny +// snapshot to avoid pulling @teambit/cli's full surface area into the +// --help fast path. If the source moves, sync this list. +const STATIC_GROUPS: Record = { + start: 'Start a working area', + development: 'Develop components', + discover: 'Explore components', + info: 'View components', + general: 'Workspace commands', + 'workspace-setup': 'Workspace & Project Setup', + collaborate: 'Collaboration & Remote', + 'info-analysis': 'Information & Analysis', + 'workspace-tools': 'Workspace Tools', + 'component-config': 'Component Configuration', + 'component-development': 'Component Development', + dependencies: 'Dependencies & Packages', + 'version-control': 'Version Control', + testing: 'Testing & Quality', + 'run-serve': 'Run & Serve', + system: 'System & Utility', + auth: 'Authentication & Cloud', + advanced: 'Advanced/Debug', + ungrouped: 'Ungrouped', +}; + +const SPACE = ' '; +const TITLE_LEFT_SPACES_NUMBER = 2; +const COMMAND_LEFT_SPACES_NUMBER = 4; +const NAME_WITH_SPACES_LENGTH = 16; + +/** + * Group descriptions used by the live `formatHelp` come from each aspect's + * `cli.registerGroup(name, description)` calls. Loading aspects to recover + * them defeats the purpose of the index. We reuse the static `groups` map + * for the built-in groups and add an entry per aspect that calls + * `cli.registerGroup` dynamically (currently: `apps`, `git`). + * + * If a new dynamic group is added or renamed, update this map. A future + * pass can fold group descriptions into the codegen output so this map + * stays in lockstep with the live registration automatically. + */ +const GROUP_DESCRIPTIONS: Record = { + ...STATIC_GROUPS, + apps: 'Applications', + git: 'Git', +}; + +type GroupContent = { + description: string; + commands: Array<{ name: string; description: string }>; +}; + +export function formatHelpFromIndex( + index: CommandIndexEntry[], + showPrivateCommands = false, +): string { + const grouped = groupByGroupName(index, showPrivateCommands); + const commandsStr = formatGroups(grouped); + return `${getHeader()} + +${commandsStr} + +${getFooter()}`; +} + +function groupByGroupName( + index: CommandIndexEntry[], + showPrivateCommands: boolean, +): Map { + const groups = new Map(); + for (const entry of index) { + if (!showPrivateCommands && entry.private) continue; + if (!entry.description) continue; + const groupName = entry.group || 'ungrouped'; + let group = groups.get(groupName); + if (!group) { + group = { + description: GROUP_DESCRIPTIONS[groupName] ?? capitalize(groupName.replace(/-/g, ' ')), + commands: [], + }; + groups.set(groupName, group); + } + group.commands.push({ name: entry.name, description: entry.description }); + } + return groups; +} + +function formatGroups(groups: Map): string { + const sections: string[] = []; + for (const group of groups.values()) { + sections.push(formatGroup(group)); + } + return sections.join('\n\n'); +} + +function formatGroup(group: GroupContent): string { + const titleSpace = SPACE.repeat(TITLE_LEFT_SPACES_NUMBER); + const title = `${titleSpace}${chalk.underline.bold.blue(group.description)}`; + const commands = group.commands + .map((cmd) => formatCommandLine(cmd.name, cmd.description)) + .join('\n'); + return `${title}\n${commands}`; +} + +function formatCommandLine(name: string, description: string): string { + const nameSpace = SPACE.repeat(COMMAND_LEFT_SPACES_NUMBER); + const nameWithRightSpace = rightpad(name, NAME_WITH_SPACES_LENGTH, SPACE); + return `${nameSpace}${chalk.green(nameWithRightSpace)}${description}`; +} + +function getHeader(): string { + return `${chalk.bold('usage: bit [--version] [--help] []')} + +${chalk.yellow(`bit documentation: https://bit.dev/`)}`; +} + +function getFooter(): string { + return chalk.yellow(`use 'bit --help' for more information and guides on specific commands. +use 'bit --internal' to show advanced commands.`); +} + +/** + * Returns true when argv represents a standalone `bit --help` / `bit -h` + * invocation that the static index can answer without loading aspects. + * + * Returns false when there's any positional command (`bit status --help` + * needs the command-specific help and yargs to assemble it). + */ +export function isStandaloneHelp(argv: string[]): boolean { + // argv starts with [node, script, ...userArgs] + const userArgs = argv.slice(2); + if (userArgs.length === 0) return false; + const hasHelpFlag = userArgs.some((a) => a === '--help' || a === '-h'); + if (!hasHelpFlag) return false; + const firstPositional = userArgs.find((a) => !a.startsWith('-')); + return !firstPositional; +} + +/** + * True for `--internal` flag — same surface as `bit --help --internal`. + */ +export function showInternalRequested(argv: string[]): boolean { + return argv.slice(2).some((a) => a === '--internal'); +} + +/** + * Returns true when argv represents a standalone `bit --version` / `bit -v` + * invocation. No aspect needs to load; the version string is in + * `@teambit/bit.get-bit-version`. + */ +export function isStandaloneVersion(argv: string[]): boolean { + const userArgs = argv.slice(2); + if (userArgs.length === 0) return false; + const hasVersionFlag = userArgs.some((a) => a === '--version' || a === '-v'); + if (!hasVersionFlag) return false; + const firstPositional = userArgs.find((a) => !a.startsWith('-')); + return !firstPositional; +} + +/** + * Returns the first positional argument (the entered command name), or + * undefined if argv has no positional. Server-mode handshakes + * (`server-forever`) and yargs-completion are also "no command" cases. + */ +export function enteredCommandName(argv: string[]): string | undefined { + const userArgs = argv.slice(2); + for (const a of userArgs) { + if (a === '--') return undefined; + if (!a.startsWith('-')) return a; + } + return undefined; +} + +/** + * Build the set of every command name + alias known to the static + * `COMMAND_INDEX`, including all sub-command names. Used to short-circuit + * the "unknown command" case before paying the bootstrap cost. + */ +export function buildKnownNameSet(index: { name: string; alias?: string; subCommands?: any[] }[]): Set { + const out = new Set(); + const walk = (entries: any[]) => { + for (const e of entries) { + if (e?.name) out.add(String(e.name).split(' ')[0]); + if (e?.alias) out.add(String(e.alias)); + if (Array.isArray(e?.subCommands)) walk(e.subCommands); + } + }; + walk(index); + return out; +} diff --git a/scopes/harmony/bit/hook-require.ts b/scopes/harmony/bit/hook-require.ts index 49833373cfb9..0963fbdb111b 100644 --- a/scopes/harmony/bit/hook-require.ts +++ b/scopes/harmony/bit/hook-require.ts @@ -1,7 +1,12 @@ import path from 'path'; +import { Module } from 'module'; export function hookRequire() { - module.constructor.prototype.require = function (id: string) { + // `module` (the implicit CJS variable) is undefined when this file is + // loaded from an ESM context (e.g. the rollup ESM bundle). Reach the + // Module prototype via the named `module` import so the patch works in + // both CJS and ESM output. + (Module.prototype as any).require = function (id: string) { if (typeof id !== 'string') throw new Error('hookRequire - id must be a string'); if (!id) throw new Error('hookRequire - missing id'); diff --git a/scopes/harmony/bit/load-bit.ts b/scopes/harmony/bit/load-bit.ts index 6cce638ecbcd..40d2a0551246 100644 --- a/scopes/harmony/bit/load-bit.ts +++ b/scopes/harmony/bit/load-bit.ts @@ -25,9 +25,10 @@ import { CLIAspect, MainRuntime } from '@teambit/cli'; import { ConfigAspect, ConfigRuntime } from '@teambit/config'; import type { RuntimeDefinition, Extension, Aspect } from '@teambit/harmony'; import { Harmony } from '@teambit/harmony'; +import { Harmony as LazyHarmony } from '@teambit/core'; // TODO: expose this types from harmony (once we have a way to expose it only for node) -import { Config } from '@teambit/harmony/dist/harmony-config'; -import { readConfigFile } from '@teambit/harmony/dist/harmony-config/config-reader'; +import { Config } from '@teambit/harmony/dist/harmony-config/index.js'; +import { readConfigFile } from '@teambit/harmony/dist/harmony-config/config-reader.js'; import { VERSION_DELIMITER } from '@teambit/legacy-bit-id'; import { loadConsumer } from '@teambit/legacy.consumer'; import type { WorkspaceInfo } from '@teambit/workspace.modules.workspace-locator'; @@ -50,6 +51,7 @@ import { resolve, join } from 'path'; import { getAllCoreAspectsIds, isCoreAspect, manifestsMap } from './manifests'; import { BitAspect } from './bit.aspect'; import { registerCoreExtensions } from './bit.main.runtime'; +import { assertCommandIndexMatchesLive } from './command-index-assert'; import type { BitConfig } from './bit.provider'; import type { EnvsMain } from '@teambit/envs'; import { EnvsAspect } from '@teambit/envs'; @@ -280,15 +282,122 @@ export async function loadBit(path = process.cwd(), additionalAspects?: Aspect[] if (additionalAspects) additionalAspects.forEach((aspect) => aspectsToLoad.push(aspect)); const loadCLIOnly = shouldLoadInSafeMode(); if (isClearCacheCommand()) aspectsToLoad.push(ClearCacheAspect); - if (!loadCLIOnly) { + // Lazy is the default per RFC §6.5. `BIT_EAGER_LOAD=1` opts back into the + // legacy `Harmony.load + harmony.run(requireAspects)` path. The `--lazy` + // / `BIT_LAZY=1` flags remain accepted but are now no-ops. + const isLazy = process.env.BIT_EAGER_LOAD !== '1'; + if (!loadCLIOnly && !isLazy) { + // Eager mode: BitAspect goes in roots so its `dependencies: manifests` + // transitively pulls every core aspect's provider. Lazy mode below + // keeps BitAspect manifest-only and resolves aspects on command dispatch. aspectsToLoad.push(BitAspect); } + const entered = process.argv[2]; + if (!loadCLIOnly && isLazy) { + // Aspects this function and the wider bootstrap consult via + // `harmony.get(...)` after `loadBit` returns. Resolve them eagerly so + // the rest of the bootstrap keeps working; everything else stays lazy. + aspectsToLoad.push(AspectLoaderAspect, EnvsAspect, GeneratorAspect); + // Package managers are satellite aspects: their providers self-register + // into `dependencyResolver.registerPackageManager(...)`, so without an + // explicit resolve nothing pulls them in. For commands that actually + // install (or trigger an install — `import`, `tag`, etc.) we need at + // least one PM registered before the command's provider runs. + const NEEDS_PM_COMMANDS = new Set([ + 'install', + 'uninstall', + 'update', + 'import', + 'new', + 'create', + 'tag', + 'snap', + 'build', + 'compile', + 'test', + ]); + if (entered && NEEDS_PM_COMMANDS.has(entered)) { + const pnpm = manifestsMap['teambit.dependencies/pnpm']; + const yarn = manifestsMap['teambit.dependencies/yarn']; + if (pnpm) aspectsToLoad.push(pnpm); + if (yarn) aspectsToLoad.push(yarn); + } + } if (shouldRunAsDaemon()) { logger.isDaemon = true; } - const harmony = await Harmony.load(aspectsToLoad, MainRuntime.name, configMap); - await harmony.run(async (aspect: Extension, runtime: RuntimeDefinition) => requireAspects(aspect, runtime)); + // UI / GraphQL / Bundler / Builder are the four heaviest aspects and are + // pulled in transitively by ~15 different aspect providers (most of which + // only call `graphql.register(...)` / `ui.registerUiRoot(...)` once and + // never again). Without the eager-skip below, those providers force + // every CLI command to load apollo, react, webpack, etc. — even + // commands that have nothing to do with the UI server. The skip flag + // tells LazyHarmony to deliver a no-op proxy for these as DI deps; the + // hosts get loaded only when something explicitly resolves them (in + // `bit start` / `bit run`, see the entered-command check below). + const HEAVY_HOSTS = [ + 'teambit.harmony/graphql', + 'teambit.ui-foundation/ui', + 'teambit.compilation/bundler', + 'teambit.pipelines/builder', + 'teambit.compilation/compiler', + 'teambit.defender/tester', + 'teambit.harmony/application', + ]; + // Commands that need one of the heavy hosts at runtime opt OUT of the + // lazy skip so DI hands back the real instance. Status / list / install + // stay lazy. + const HEAVY_COMMANDS = new Set([ + 'start', + 'run', + 'build', + 'tag', + 'snap', + 'export', + 'compile', + 'test', + 'preview', + 'ui-build', + 'serve-preview', + 'generate-preview', + ]); + const wantsHeavyHosts = entered && HEAVY_COMMANDS.has(entered); + const lazyAspectIds = wantsHeavyHosts ? [] : HEAVY_HOSTS; + const harmony = isLazy + ? await (LazyHarmony.load( + aspectsToLoad, + MainRuntime.name, + configMap, + // Manifests only — registered for later lazy resolution, no provider call. + [BitAspect, ...Object.values(manifestsMap)], + lazyAspectIds, + ) as any) + : await Harmony.load(aspectsToLoad, MainRuntime.name, configMap); + + if (!isLazy) { + await harmony.run(async (aspect: Extension, runtime: RuntimeDefinition) => requireAspects(aspect, runtime)); + } else { + // Lazy dispatch: seed CLIMain with stub commands read from + // command-index.generated.ts so cli.run can match argv even though + // no aspect provider has run. The stubs delegate to the real handler + // after resolving the owning aspect (see CLIMain.registerLazyStubs). + const cli = harmony.get(CLIAspect.id); + if (typeof (cli as any).registerLazyStubs === 'function') { + (cli as any).registerLazyStubs(harmony); + } + } if (loadCLIOnly) return harmony; + // Slice 2 of the ESM/lazy-aspects RFC: verify the committed command index + // matches the live commandsSlot. Skipped when BIT_SKIP_COMMAND_INDEX_ASSERT=1. + if (process.env.BIT_SKIP_COMMAND_INDEX_ASSERT !== '1') { + try { + const cli = harmony.get(CLIAspect.id); + assertCommandIndexMatchesLive(cli); + } catch (err: any) { + if (process.env.BIT_STRICT_COMMAND_INDEX === '1') throw err; + logger.warn(`command-index assertion failed: ${err?.message ?? err}`); + } + } const aspectLoader = harmony.get(AspectLoaderAspect.id); aspectLoader.setCoreAspects(Object.values(manifestsMap)); aspectLoader.setNonCoreAspects(additionalAspects || []); diff --git a/scopes/harmony/bit/manifests.ts b/scopes/harmony/bit/manifests.ts index 1f0241b6d176..da4609f345ee 100644 --- a/scopes/harmony/bit/manifests.ts +++ b/scopes/harmony/bit/manifests.ts @@ -1,113 +1,117 @@ -import { AspectAspect } from '@teambit/aspect'; -import { AspectLoaderAspect } from '@teambit/aspect-loader'; -import { BuilderAspect } from '@teambit/builder'; -import { BundlerAspect } from '@teambit/bundler'; -import { CacheAspect } from '@teambit/cache'; -import { CLIAspect } from '@teambit/cli'; -import { CompilerAspect } from '@teambit/compiler'; -import { ComponentAspect } from '@teambit/component'; -import { CompositionsAspect } from '@teambit/compositions'; -import { ConfigAspect } from '@teambit/config'; -import { DependencyResolverAspect } from '@teambit/dependency-resolver'; -import { DeprecationAspect } from '@teambit/deprecation'; -import { DocsAspect } from '@teambit/docs'; -import { EnvsAspect } from '@teambit/envs'; -import { EnvAspect } from '@teambit/env'; -import { ExpressAspect } from '@teambit/express'; -import { YarnAspect } from '@teambit/yarn'; -import { GeneratorAspect } from '@teambit/generator'; -import { HarmonyUiAppAspect } from '@teambit/harmony-ui-app'; -import { GraphAspect } from '@teambit/graph'; -import { GraphqlAspect } from '@teambit/graphql'; -import { InsightsAspect } from '@teambit/insights'; -import { IsolatorAspect } from '@teambit/isolator'; -import { JestAspect } from '@teambit/jest'; -import { LoggerAspect } from '@teambit/logger'; -import { NodeAspect } from '@teambit/node'; -import { NotificationsAspect } from '@teambit/notifications'; -import { PanelUiAspect } from '@teambit/panels'; -import { PkgAspect } from '@teambit/pkg'; -import { PnpmAspect } from '@teambit/pnpm'; -import { PreviewAspect } from '@teambit/preview'; -import { ComponentSizerAspect } from '@teambit/component-sizer'; -import { ReactAspect } from '@teambit/react'; -import { VueAspect } from '@teambit/vue-aspect'; -import { ReactRouterAspect } from '@teambit/react-router'; -import { SchemaAspect } from '@teambit/schema'; -import { PubsubAspect } from '@teambit/pubsub'; -import { ScopeAspect } from '@teambit/scope'; +import { AspectAspect } from '@teambit/aspect/dist/aspect.aspect.js'; +import { AspectLoaderAspect } from '@teambit/aspect-loader/dist/aspect-loader.aspect.js'; +import { BuilderAspect } from '@teambit/builder/dist/builder.aspect.js'; +import { BundlerAspect } from '@teambit/bundler/dist/bundler.aspect.js'; +import { CacheAspect } from '@teambit/cache/dist/cache.aspect.js'; +import { CLIAspect } from '@teambit/cli/dist/cli.aspect.js'; +import { CompilerAspect } from '@teambit/compiler/dist/compiler.aspect.js'; +import { ComponentAspect } from '@teambit/component/dist/component.aspect.js'; +import { CompositionsAspect } from '@teambit/compositions/dist/compositions.aspect.js'; +import { ConfigAspect } from '@teambit/config/dist/config.aspect.js'; +import { DependencyResolverAspect } from '@teambit/dependency-resolver/dist/dependency-resolver.aspect.js'; +import { DeprecationAspect } from '@teambit/deprecation/dist/deprecation.aspect.js'; +import { DocsAspect } from '@teambit/docs/dist/docs.aspect.js'; +import { EnvsAspect } from '@teambit/envs/dist/environments.aspect.js'; +import { EnvAspect } from '@teambit/env/dist/env.aspect.js'; +import { ExpressAspect } from '@teambit/express/dist/express.aspect.js'; +import { YarnAspect } from '@teambit/yarn/dist/yarn.aspect.js'; +import { GeneratorAspect } from '@teambit/generator/dist/generator.aspect.js'; +import { HarmonyUiAppAspect } from '@teambit/harmony-ui-app/dist/harmony-ui-app.aspect.js'; +import { GraphAspect } from '@teambit/graph/dist/graph.aspect.js'; +import { GraphqlAspect } from '@teambit/graphql/dist/graphql.aspect.js'; +import { InsightsAspect } from '@teambit/insights/dist/insights.aspect.js'; +import { IsolatorAspect } from '@teambit/isolator/dist/isolator.aspect.js'; +import { JestAspect } from '@teambit/jest/dist/jest.aspect.js'; +import { LoggerAspect } from '@teambit/logger/dist/logger.aspect.js'; +import { NodeAspect } from '@teambit/node/dist/node.aspect.js'; +import { NotificationsAspect } from '@teambit/notifications/dist/notifications.aspect.js'; +import { PanelUiAspect } from '@teambit/panels/dist/panel-ui.aspect.js'; +import { PkgAspect } from '@teambit/pkg/dist/pkg.aspect.js'; +import { PnpmAspect } from '@teambit/pnpm/dist/pnpm.aspect.js'; +import { PreviewAspect } from '@teambit/preview/dist/preview.aspect.js'; +import { ComponentSizerAspect } from '@teambit/component-sizer/dist/component-sizer.aspect.js'; +import { ReactAspect } from '@teambit/react/dist/react.aspect.js'; +import { VueAspect } from '@teambit/vue-aspect/dist/vue.aspect.js'; +import { ReactRouterAspect } from '@teambit/react-router/dist/react-router.aspect.js'; +import { SchemaAspect } from '@teambit/schema/dist/schema.aspect.js'; +import { PubsubAspect } from '@teambit/pubsub/dist/pubsub.aspect.js'; +import { ScopeAspect } from '@teambit/scope/dist/scope.aspect.js'; // import { StencilAspect } from '@teambit/stencil'; -import { TesterAspect } from '@teambit/tester'; -import { MultiTesterAspect } from '@teambit/multi-tester'; -import { TypescriptAspect } from '@teambit/typescript'; -import { BabelAspect } from '@teambit/babel'; -import { UIAspect } from '@teambit/ui'; -import { VariantsAspect } from '@teambit/variants'; -import { WebpackAspect } from '@teambit/webpack'; -import { WorkspaceAspect } from '@teambit/workspace'; -import { WorkspaceConfigFilesAspect } from '@teambit/workspace-config-files'; -import { InstallAspect } from '@teambit/install'; -import { LinterAspect } from '@teambit/linter'; -import { FormatterAspect } from '@teambit/formatter'; -import { ValidatorAspect } from '@teambit/validator'; -import { ChangelogAspect } from '@teambit/changelog'; -import { CodeAspect } from '@teambit/code'; -import { CommandBarAspect } from '@teambit/command-bar'; -import { SidebarAspect } from '@teambit/sidebar'; -import { ComponentTreeAspect } from '@teambit/component-tree'; -import { DevFilesAspect } from '@teambit/dev-files'; -import { ESLintAspect } from '@teambit/eslint'; -import { PrettierAspect } from '@teambit/prettier'; -import { WorkerAspect } from '@teambit/worker'; -import { GlobalConfigAspect } from '@teambit/global-config'; -import { MultiCompilerAspect } from '@teambit/multi-compiler'; -import { MDXAspect } from '@teambit/mdx'; -import { ReadmeAspect } from '@teambit/readme'; -import { ApplicationAspect } from '@teambit/application'; -import { ExportAspect } from '@teambit/export'; -import { ImporterAspect } from '@teambit/importer'; -import { EjectAspect } from '@teambit/eject'; -import { UserAgentAspect } from '@teambit/user-agent'; -import { LanesAspect } from '@teambit/lanes'; -import { ForkingAspect } from '@teambit/forking'; -import { RenamingAspect } from '@teambit/renaming'; -import { ComponentLogAspect } from '@teambit/component-log'; -import { ClearCacheAspect } from '@teambit/clear-cache'; -import { DiagnosticAspect } from '@teambit/diagnostic'; -import { NewComponentHelperAspect } from '@teambit/new-component-helper'; -import { MochaAspect } from '@teambit/mocha'; -import { CommunityAspect } from '@teambit/community'; -import { CloudAspect } from '@teambit/cloud'; -import { StatusAspect } from '@teambit/status'; -import { SnappingAspect } from '@teambit/snapping'; -import { MergingAspect } from '@teambit/merging'; -import { IssuesAspect } from '@teambit/issues'; -import { RefactoringAspect } from '@teambit/refactoring'; -import { ComponentCompareAspect } from '@teambit/component-compare'; -import { ListerAspect } from '@teambit/lister'; -import { DependenciesAspect } from '@teambit/dependencies'; -import { RemoveAspect } from '@teambit/remove'; -import { MergeLanesAspect } from '@teambit/merge-lanes'; -import { CheckoutAspect } from '@teambit/checkout'; -import { APIReferenceAspect } from '@teambit/api-reference'; -import { ApiServerAspect } from '@teambit/api-server'; -import { ComponentWriterAspect } from '@teambit/component-writer'; -import { TrackerAspect } from '@teambit/tracker'; -import { MoverAspect } from '@teambit/mover'; -import { WatcherAspect } from '@teambit/watcher'; -import { StashAspect } from '@teambit/stash'; -import { GitAspect } from '@teambit/git'; -import { IpcEventsAspect } from '@teambit/ipc-events'; -import { ConfigMergerAspect } from '@teambit/config-merger'; -import { VersionHistoryAspect } from '@teambit/version-history'; -import { HostInitializerAspect } from '@teambit/host-initializer'; -import { DoctorAspect } from '@teambit/doctor'; -import { ObjectsAspect } from '@teambit/objects'; +import { TesterAspect } from '@teambit/tester/dist/tester.aspect.js'; +import { MultiTesterAspect } from '@teambit/multi-tester/dist/multi-tester.aspect.js'; +import { TypescriptAspect } from '@teambit/typescript/dist/typescript.aspect.js'; +import { BabelAspect } from '@teambit/babel/dist/babel.aspect.js'; +import { UIAspect } from '@teambit/ui/dist/ui.aspect.js'; +import { VariantsAspect } from '@teambit/variants/dist/variants.aspect.js'; +import { WebpackAspect } from '@teambit/webpack/dist/webpack.aspect.js'; +import { WorkspaceAspect } from '@teambit/workspace/dist/workspace.aspect.js'; +import { WorkspaceConfigFilesAspect } from '@teambit/workspace-config-files/dist/workspace-config-files.aspect.js'; +import { InstallAspect } from '@teambit/install/dist/install.aspect.js'; +import { LinterAspect } from '@teambit/linter/dist/linter.aspect.js'; +import { FormatterAspect } from '@teambit/formatter/dist/formatter.aspect.js'; +import { ValidatorAspect } from '@teambit/validator/dist/validator.aspect.js'; +import { ChangelogAspect } from '@teambit/changelog/dist/changelog.aspect.js'; +import { CodeAspect } from '@teambit/code/dist/code.aspect.js'; +import { CommandBarAspect } from '@teambit/command-bar/dist/command-bar.aspect.js'; +import { SidebarAspect } from '@teambit/sidebar/dist/sidebar.aspect.js'; +import { ComponentTreeAspect } from '@teambit/component-tree/dist/component-tree.aspect.js'; +import { DevFilesAspect } from '@teambit/dev-files/dist/dev-files.aspect.js'; +import { ESLintAspect } from '@teambit/eslint/dist/eslint.aspect.js'; +import { PrettierAspect } from '@teambit/prettier/dist/prettier.aspect.js'; +import { WorkerAspect } from '@teambit/worker/dist/worker.aspect.js'; +import { GlobalConfigAspect } from '@teambit/global-config/dist/global-config.aspect.js'; +import { MultiCompilerAspect } from '@teambit/multi-compiler/dist/multi-compiler.aspect.js'; +import { MDXAspect } from '@teambit/mdx/dist/mdx.aspect.js'; +import { ReadmeAspect } from '@teambit/readme/dist/readme.aspect.js'; +import { ApplicationAspect } from '@teambit/application/dist/application.aspect.js'; +import { ExportAspect } from '@teambit/export/dist/export.aspect.js'; +import { ImporterAspect } from '@teambit/importer/dist/importer.aspect.js'; +import { EjectAspect } from '@teambit/eject/dist/eject.aspect.js'; +import { UserAgentAspect } from '@teambit/user-agent/dist/user-agent.aspect.js'; +import { LanesAspect } from '@teambit/lanes/dist/lanes.aspect.js'; +import { ForkingAspect } from '@teambit/forking/dist/forking.aspect.js'; +import { RenamingAspect } from '@teambit/renaming/dist/renaming.aspect.js'; +import { ComponentLogAspect } from '@teambit/component-log/dist/component-log.aspect.js'; +import { ClearCacheAspect } from '@teambit/clear-cache/dist/clear-cache.aspect.js'; +import { DiagnosticAspect } from '@teambit/diagnostic/dist/diagnostic.aspect.js'; +import { NewComponentHelperAspect } from '@teambit/new-component-helper/dist/new-component-helper.aspect.js'; +import { MochaAspect } from '@teambit/mocha/dist/mocha.aspect.js'; +import { CommunityAspect } from '@teambit/community/dist/community.aspect.js'; +import { CloudAspect } from '@teambit/cloud/dist/cloud.aspect.js'; +import { StatusAspect } from '@teambit/status/dist/status.aspect.js'; +import { SnappingAspect } from '@teambit/snapping/dist/snapping.aspect.js'; +import { MergingAspect } from '@teambit/merging/dist/merging.aspect.js'; +import { IssuesAspect } from '@teambit/issues/dist/issues.aspect.js'; +import { RefactoringAspect } from '@teambit/refactoring/dist/refactoring.aspect.js'; +import { ComponentCompareAspect } from '@teambit/component-compare/dist/component-compare.aspect.js'; +import { ListerAspect } from '@teambit/lister/dist/lister.aspect.js'; +import { DependenciesAspect } from '@teambit/dependencies/dist/dependencies.aspect.js'; +import { RemoveAspect } from '@teambit/remove/dist/remove.aspect.js'; +import { MergeLanesAspect } from '@teambit/merge-lanes/dist/merge-lanes.aspect.js'; +import { CheckoutAspect } from '@teambit/checkout/dist/checkout.aspect.js'; +import { APIReferenceAspect } from '@teambit/api-reference/dist/api-reference.aspect.js'; +import { ApiServerAspect } from '@teambit/api-server/dist/api-server.aspect.js'; +import { ComponentWriterAspect } from '@teambit/component-writer/dist/component-writer.aspect.js'; +import { TrackerAspect } from '@teambit/tracker/dist/tracker.aspect.js'; +import { MoverAspect } from '@teambit/mover/dist/mover.aspect.js'; +import { WatcherAspect } from '@teambit/watcher/dist/watcher.aspect.js'; +import { StashAspect } from '@teambit/stash/dist/stash.aspect.js'; +import { GitAspect } from '@teambit/git/dist/git.aspect.js'; +import { IpcEventsAspect } from '@teambit/ipc-events/dist/ipc-events.aspect.js'; +import { ConfigMergerAspect } from '@teambit/config-merger/dist/config-merger.aspect.js'; +import { VersionHistoryAspect } from '@teambit/version-history/dist/version-history.aspect.js'; +import { HostInitializerAspect } from '@teambit/host-initializer/dist/host-initializer.aspect.js'; +import { DoctorAspect } from '@teambit/doctor/dist/doctor.aspect.js'; +import { ObjectsAspect } from '@teambit/objects/dist/objects.aspect.js'; import { BitAspect } from './bit.aspect'; -import { ConfigStoreAspect } from '@teambit/config-store'; -import { CliMcpServerAspect } from '@teambit/cli-mcp-server'; -import { CiAspect } from '@teambit/ci'; -import { RippleAspect } from '@teambit/ripple'; +import { ConfigStoreAspect } from '@teambit/config-store/dist/config-store.aspect.js'; +import { CliMcpServerAspect } from '@teambit/cli-mcp-server/dist/cli-mcp-server.aspect.js'; +import { CiAspect } from '@teambit/ci/dist/ci.aspect.js'; +import { RippleAspect } from '@teambit/ripple/dist/ripple.aspect.js'; +// `@teambit/scripts` ships with a restrictive `exports` map (only `.` is +// defined), so the direct-subpath trick used for every other aspect blows +// up with ERR_PACKAGE_PATH_NOT_EXPORTED. The barrel re-exports just the +// aspect manifest here, so the cost is tiny anyway. import { ScriptsAspect } from '@teambit/scripts'; /** @@ -238,3 +242,4 @@ export function getAllCoreAspectsIds(): string[] { const _reserved = [BitAspect.id, ConfigAspect.id]; return [...Object.keys(manifestsMap), ..._reserved]; } + diff --git a/scopes/harmony/bit/run-bit.ts b/scopes/harmony/bit/run-bit.ts index 1e2ac62afe34..bc506f9fec0b 100644 --- a/scopes/harmony/bit/run-bit.ts +++ b/scopes/harmony/bit/run-bit.ts @@ -1,4 +1,4 @@ -/* eslint-disable import/first */ +/* eslint-disable import/first, global-require */ import fs from 'fs'; consoleFileReadUsages(); @@ -7,20 +7,73 @@ import gracefulFs from 'graceful-fs'; // monkey patch fs module to avoid EMFILE error (especially when running watch operation) gracefulFs.gracefulify(fs); -import './hook-require'; -import { bootstrap } from './bootstrap'; -import { handleErrorAndExit } from '@teambit/cli'; import type { Aspect } from '@teambit/harmony'; -import { runCLI } from './load-bit'; -import { autocomplete } from './autocomplete'; -import { ServerCommander, shouldUseBitServer } from './server-commander'; -import { spawnPTY } from './server-forever'; +import { COMMAND_INDEX } from './command-index.generated'; +import { + buildKnownNameSet, + enteredCommandName, + formatHelpFromIndex, + isStandaloneHelp, + isStandaloneVersion, + showInternalRequested, +} from './help-from-index'; /** * run bit cli tool * @param additionalAspects optionally, add non-core aspects to the runtime. */ export async function runBit(additionalAspects?: Aspect[]) { + // Slice 5: short-circuit `bit --help` / `bit -h` without loading any + // aspect. We render from the committed `COMMAND_INDEX`; the regular + // bootstrap path validates the snapshot against the live `commandsSlot` + // (see `command-index-assert.ts`) so the static output stays accurate. + // + // Done first — and the heavy imports below are deferred via `require()` — + // so the help case pays only for parsing this file + COMMAND_INDEX. On + // a M1 laptop that's ~80ms cold vs ~500ms for the full bootstrap. + if (isStandaloneHelp(process.argv) && COMMAND_INDEX.length > 0) { + process.stdout.write(`${formatHelpFromIndex(COMMAND_INDEX, showInternalRequested(process.argv))}\n`); + process.exit(0); + } + // Same trick for `bit --version` — read the version string directly without + // touching aspects. + if (isStandaloneVersion(process.argv)) { + const { getBitVersion } = await import('@teambit/bit.get-bit-version'); + process.stdout.write(`${getBitVersion()}\n`); + process.exit(0); + } + // And for unknown commands: if the entered command isn't in the static + // index, no aspect can ever register it. Print the familiar suggestion + // line and exit 1 without booting Harmony. + if (COMMAND_INDEX.length > 0) { + const entered = enteredCommandName(process.argv); + if (entered && entered !== 'server-forever' && !process.argv.includes('--get-yargs-completions')) { + const known = buildKnownNameSet(COMMAND_INDEX); + if (!known.has(entered)) { + const chalkMod = await import('chalk'); + const chalk: any = (chalkMod as any).default || chalkMod; + const allNames = [...known]; + const didYouMeanMod = await import('didyoumean'); + const didYouMean: any = (didYouMeanMod as any).default || didYouMeanMod; + didYouMean.returnFirstMatch = true; + const suggestion = didYouMean(entered, allNames); + const tail = suggestion + ? `\nDid you mean ${chalk.bold(Array.isArray(suggestion) ? suggestion[0] : suggestion)}?` + : "\nsee 'bit help' for additional information."; + process.stderr.write(`warning: '${chalk.bold(entered)}' is not a valid command.${tail}\n`); + process.exit(1); + } + } + } + + // Lazy: only load these once we know we're going to actually run a command. + // Static dynamic imports so the bundler emits a chunk per module while + // still keeping the help short-circuit fast. + await import('./hook-require'); + const { autocomplete } = await import('./autocomplete'); + const { ServerCommander, shouldUseBitServer } = await import('./server-commander'); + const { spawnPTY } = await import('./server-forever'); + if (process.argv.includes('--get-yargs-completions')) { autocomplete(); process.exit(0); @@ -43,6 +96,12 @@ async function initApp(additionalAspects?: Aspect[]) { console.error('uncaughtException', err); process.exit(1); }); + // Deferred dynamic imports — Rollup recognises these as code-split + // boundaries so the heavy bootstrap lives in its own chunk(s) instead + // of inlining into the entry. + const { bootstrap } = await import('./bootstrap'); + const { runCLI } = await import('./load-bit'); + const { handleErrorAndExit } = await import('@teambit/cli'); try { await bootstrap(); await runCLI(additionalAspects); diff --git a/scopes/harmony/cache/cache.aspect.ts b/scopes/harmony/cache/cache.aspect.ts index 6208f29a30b7..5d3faa0a2c66 100644 --- a/scopes/harmony/cache/cache.aspect.ts +++ b/scopes/harmony/cache/cache.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CacheAspect = Aspect.create({ id: 'teambit.harmony/cache', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./cache.main.runtime') }, }); diff --git a/scopes/harmony/cli/cli-parser.ts b/scopes/harmony/cli/cli-parser.ts index 968fefa5ff45..54ae8696406f 100644 --- a/scopes/harmony/cli/cli-parser.ts +++ b/scopes/harmony/cli/cli-parser.ts @@ -1,5 +1,6 @@ import didYouMean from 'didyoumean'; -import yargs from 'yargs'; +import yargsFactory from 'yargs'; +import type { Argv } from 'yargs'; import type { Command } from './command'; import type { GroupsType } from './command-groups'; import { compact } from 'lodash'; @@ -16,7 +17,14 @@ import type { CommandRunner } from './command-runner'; import { YargsExitWorkaround } from './exceptions/yargs-exit-workaround'; export class CLIParser { - public parser = yargs; + // Constructed lazily inside `parse()` — the modern yargs API requires + // calling `yargs(args)` to obtain an instance; all configuration chains + // off that instance instead of off the imported function (which is the + // pre-yargs-17 singleton pattern that no longer exists in the ESM build). + private yargs!: Argv; + public get parser(): Argv { + return this.yargs; + } private yargsCommands: YargsAdapter[] = []; constructor( private commands: Command[], @@ -28,7 +36,8 @@ export class CLIParser { this.throwForNonExistsCommand(args[0]); logger.debug(`[+] CLI-INPUT: ${args.join(' ')}`); logger.writeCommandHistoryStart(); - yargs(args); + const yargs = ((yargsFactory as any).default ?? yargsFactory)(args) as Argv; + this.yargs = yargs; yargs.help(false); this.configureParser(); this.commands.forEach((command: Command) => { @@ -50,7 +59,7 @@ export class CLIParser { // .recommendCommands() // don't use it, it brings the global help of yargs, we have a custom one .wrap(null); - await yargs.parse(); + await (yargs.parse() as unknown as Promise); const currentYargsCommand = this.yargsCommands.find((y) => y.commandRunner); if (!currentYargsCommand) { @@ -64,11 +73,11 @@ export class CLIParser { private addYargsCommand(yargsCommand: YargsAdapter) { this.yargsCommands.push(yargsCommand); - yargs.command(yargsCommand); + this.yargs.command(yargsCommand); } private setHelpMiddleware() { - yargs.middleware((argv) => { + this.yargs.middleware((argv) => { if (argv._.length === 0 && argv.help) { const shouldShowInternalCommands = Boolean(argv.internal); // this is the main help page @@ -78,14 +87,14 @@ export class CLIParser { if (argv.help) { loader.off(); // stop the "loading bit..." before showing help if needed // this is a command help page - yargs.showHelp(this.logCommandHelp.bind(this)); + this.yargs.showHelp(this.logCommandHelp.bind(this)); process.exit(0); } }, true); } private handleCommandFailure() { - yargs.fail((msg, err) => { + this.yargs.fail((msg, err) => { loader.stop(); if (err) { throw err; @@ -94,7 +103,7 @@ export class CLIParser { const isHelpFlagEntered = args.includes('--help') || args.includes('-h'); let msgForDaemon = ''; try { - yargs.showHelp(this.logCommandHelp.bind(this)); + this.yargs.showHelp(this.logCommandHelp.bind(this)); } catch (error: any) { if (error instanceof YargsExitWorkaround) { msgForDaemon = error.helpMsg; @@ -131,7 +140,7 @@ export class CLIParser { 'dependencies', ]; // @ts-ignore - yargs.completion('completion', async function (current, argv, completionFilter, done) { + this.yargs.completion('completion', async function (current, argv, completionFilter, done) { if (!current.startsWith('-') && commandsToShowComponentIdsForCompletion.includes(argv._[1])) { const consumer = await loadConsumerIfExist(); done(consumer?.bitmapIdsFromCurrentLane.map((id) => id.toStringWithoutVersion())); @@ -148,7 +157,7 @@ export class CLIParser { } private configureParser() { - yargs.parserConfiguration({ + this.yargs.parserConfiguration({ // 'strip-dashed': true, // we can't enable it, otherwise, the completion doesn't work 'strip-aliased': true, 'boolean-negation': false, @@ -158,14 +167,15 @@ export class CLIParser { private parseCommandWithSubCommands(command: Command) { const yarnCommand = this.getYargsCommand(command); + const yargsRef = this.yargs; const builderFunc = () => { command.commands?.forEach((cmd) => { const subCommand = this.getYargsCommand(cmd); this.addYargsCommand(subCommand); }); // since the "builder" method is overridden, the global flags of the main command are gone, this fixes it. - yargs.options(YargsAdapter.getGlobalOptions(command)); - return yargs; + yargsRef.options(YargsAdapter.getGlobalOptions(command)); + return yargsRef; }; yarnCommand.builder = builderFunc; this.addYargsCommand(yarnCommand); @@ -180,7 +190,7 @@ export class CLIParser { } private configureGlobalFlags() { - yargs + this.yargs .option('help', { alias: 'h', describe: 'show help', diff --git a/scopes/harmony/cli/cli.aspect.ts b/scopes/harmony/cli/cli.aspect.ts index e73da595c333..e10580ce4276 100644 --- a/scopes/harmony/cli/cli.aspect.ts +++ b/scopes/harmony/cli/cli.aspect.ts @@ -1,11 +1,12 @@ -import { Aspect, RuntimeDefinition } from '@teambit/harmony'; +import { RuntimeDefinition } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MainRuntime = new RuntimeDefinition('main'); export const CLIAspect = Aspect.create({ id: 'teambit.harmony/cli', - dependencies: [], - declareRuntime: MainRuntime, + runtimes: { main: () => import('./cli.main.runtime') }, + commands: () => import('./cli.commands').then((m) => [m.completionCommand, m.versionCommand, m.detailsCommand]), }); export default CLIAspect; diff --git a/scopes/harmony/cli/cli.commands.ts b/scopes/harmony/cli/cli.commands.ts new file mode 100644 index 000000000000..e818729410a8 --- /dev/null +++ b/scopes/harmony/cli/cli.commands.ts @@ -0,0 +1,40 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const completionCommand: CommandDescriptor = { + name: 'completion', + alias: '', + description: 'enable bash/zsh-completion shortcuts for commands and options', + group: 'system', + private: true, + options: [] as CommandOptions, +}; + +export const versionCommand: CommandDescriptor = { + name: 'version', + alias: '', + description: 'display the installed Bit version', + group: 'system', + loader: false, + options: [['j', 'json', 'return the version in json format']] as CommandOptions, +}; + +export const detailsCommand: CommandDescriptor = { + name: 'details', + alias: '', + description: 'show expanded details from the last command that provided them (e.g. tag, snap)', + group: 'general', + skipWorkspace: true, + loadAspects: false, + loader: false, + options: [] as CommandOptions, +}; diff --git a/scopes/harmony/cli/cli.main.runtime.ts b/scopes/harmony/cli/cli.main.runtime.ts index 2a35a26485cc..427dbe0fd094 100644 --- a/scopes/harmony/cli/cli.main.runtime.ts +++ b/scopes/harmony/cli/cli.main.runtime.ts @@ -1,7 +1,7 @@ import type { SlotRegistry } from '@teambit/harmony'; import { Slot } from '@teambit/harmony'; import { logger as legacyLogger } from '@teambit/legacy.logger'; -import type { CLIArgs, Flags, Command } from './command'; +import type { CLIArgs, Flags, Command, CommandDescriptor, CommandFactory } from './command'; import pMapSeries from 'p-map-series'; import type { GroupsType } from './command-groups'; import { groups } from './command-groups'; @@ -16,6 +16,7 @@ import { CliCmd, CliGenerateCmd } from './cli.cmd'; import { HelpCmd } from './help.cmd'; import { VersionCmd } from './version.cmd'; import { DetailsCmd } from './details.cmd'; +import { completionCommand, detailsCommand, versionCommand } from './cli.commands'; export type CommandList = Array; export type OnStart = (hasWorkspace: boolean, currentCommand: string, commandObject?: Command) => Promise; @@ -29,6 +30,7 @@ export type OnBeforeExitSlot = SlotRegistry; export class CLIMain { public groups: GroupsType = clone(groups); // if it's not cloned, it is cached across loadBit() instances + private lazyHarmony: { resolve: (id: string) => Promise } | undefined; constructor( private commandsSlot: CommandsSlot, private onStartSlot: OnStartSlot, @@ -39,14 +41,56 @@ export class CLIMain { /** * registers a new command in to the CLI. + * + * Two forms are supported: + * - Legacy: `cli.register(cmd1, cmd2, ...)` — variadic `Command` instances. + * - Descriptor + factory (RFC §6.2): `cli.register(descriptor, factory)` — + * the descriptor carries the static fields; the factory produces the + * runnable handler. For now the factory is invoked immediately so + * downstream behaviour is unchanged; in later slices the dispatcher + * defers the call until the command is actually run. */ - register(...commands: CommandList) { + register(...commands: CommandList): void; + register(descriptor: CommandDescriptor, factory: CommandFactory): void; + register(...args: unknown[]): void { + if (args.length === 2 && typeof args[1] === 'function') { + const factory = args[1] as CommandFactory; + const command = factory(); + this.setDefaults(command); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + command.commands!.forEach((cmd) => this.setDefaults(cmd)); + this.appendToSlot([command]); + return; + } + const commands = args as CommandList; commands.forEach((command) => { this.setDefaults(command); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion command.commands!.forEach((cmd) => this.setDefaults(cmd)); }); + this.appendToSlot(commands); + } + + // The underlying Slot stores one entry per aspect (keyed by harmony.current). + // `slot.register(value)` overwrites that entry, so two `cli.register` calls from + // the same provider would drop the first registration. We snapshot the slot + // before delegating, then merge any pre-existing commands back in — minus any + // lazy stubs whose command name now has a real handler. + private appendToSlot(commands: CommandList): void { + const before = new Map(this.commandsSlot.map); this.commandsSlot.register(commands); + const newNames = new Set(commands.map((c) => getCommandId(c.name))); + for (const [id, post] of this.commandsSlot.map) { + const prev = before.get(id); + if (prev === post) continue; + if (prev && prev.length > 0) { + const filteredPrev = prev.filter( + (c: any) => !(isLazyStub(c) && newNames.has(getCommandId(c.name))), + ); + this.commandsSlot.map.set(id, [...filteredPrev, ...post]); + } + return; + } } /** @@ -69,6 +113,16 @@ export class CLIMain { return this.commandsSlot.values().flat(); } + /** + * Pairs of (aspectId, commands) as registered in the commands slot. + * Used by the codegen script (`scripts/generate-command-index.mjs`) and the + * load-bit assertion that the generated command index matches live state. + * See docs/rfc-esm-lazy-aspects.md, Slice 2. + */ + commandsByAspect(): Array<[string, CommandList]> { + return this.commandsSlot.toArray(); + } + /** * get an instance of a registered command. (useful for aspects to modify and extend existing commands) */ @@ -138,12 +192,115 @@ export class CLIMain { * execute commands registered to this aspect. */ async run(hasWorkspace: boolean) { + // Lazy bootstrap: if the entered command is still a stub (its owning + // aspect's provider hasn't run yet), resolve that aspect now so yargs + // sees the real Command — with full options, args, and sub-commands. + await this.resolveEnteredCommand(); await this.invokeOnStart(hasWorkspace); const CliParser = new CLIParser(this.commands, this.groups, this.onCommandStartSlot); const commandRunner = await CliParser.parse(); await commandRunner.runCommand(); } + private async resolveEnteredCommand(): Promise { + if (!this.lazyHarmony) return; + const argv = process.argv.slice(2); + const name = argv.find((a) => !a.startsWith('-')); + if (!name) return; + const match = this.commands.find((c) => { + const n = getCommandId(c.name); + return n === name || c.alias === name; + }); + if (!match) return; + const aspectId = (match as any).aspectId; + if (!aspectId) return; // real command already, not a stub + // Only stubs carry `aspectId`. Resolve to get the real command in place. + await this.lazyHarmony.resolve(aspectId); + // Drop any leftover stubs for this aspect (the resolved provider has + // registered the real ones with the same name; stubs would shadow them + // when `this.commands` returns the slot's flat values). + const after = (this.commandsSlot.map.get(aspectId) || []).filter( + (c: any) => !c.aspectId, // stubs are tagged with `aspectId` + ); + this.commandsSlot.map.set(aspectId, after); + } + + /** + * Lazy bootstrap (RFC §6.5). Seed `commandsSlot` with stub Command + * objects read from `command-index.generated.ts` so cli.run() can + * match argv before any aspect provider has run. Each stub's handler + * resolves the owning aspect via Harmony.resolve, then delegates to + * the real handler the aspect's provider just registered. + */ + registerLazyStubs(harmony: { resolve: (id: string) => Promise }): void { + this.lazyHarmony = harmony; + // Lazy require to avoid circular dep with @teambit/bit. + // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require + const { COMMAND_INDEX } = require('@teambit/bit/dist/command-index.generated.js'); + for (const entry of COMMAND_INDEX as Array) { + // Some aspects are pulled in as transitive DI deps of the eagerly-loaded + // root aspects, so their real commands are already registered before + // we get here. Skip — and don't append a stub that would shadow the + // real handler in `commandsByAspect` / `commandsSlot.values()`. + const existing = this.commandsSlot.map.get(entry.aspectId) || []; + const alreadyReal = existing.some( + (c: any) => !c.__lazyStub && getCommandId(c.name) === entry.name, + ); + if (alreadyReal) continue; + const stub = this.makeLazyStub(entry, harmony); + // Bypass the slot accumulator — we know each stub is from a distinct + // aspect id, and we want it keyed by that aspect, not by `harmony.current`. + this.commandsSlot.map.set(entry.aspectId, [...existing, stub]); + } + } + + private makeLazyStub(entry: any, harmony: { resolve: (id: string) => Promise }): Command { + const subCommands = Array.isArray(entry.subCommands) ? entry.subCommands : []; + const slot = this.commandsSlot; + const self = this; + const stub: any = { + // `entry.pattern` preserves the positional-arg syntax (e.g. + // `show `) that yargs needs. Without it, lazy + // commands reject their own arguments as "Unknown argument". + name: entry.pattern || entry.name, + // Marker so `appendToSlot` can drop the stub once the real + // handler is registered. See `isLazyStub`. + __lazyStub: true, + description: entry.description ?? '', + extendedDescription: '', + group: entry.group ?? 'ungrouped', + options: [], + commands: subCommands.map((s: any) => this.makeLazyStub(s, harmony)), + private: entry.private ?? false, + alias: entry.alias ?? '', + loader: entry.loader !== false, + loadAspects: entry.loadAspects !== false, + remoteOp: entry.remoteOp ?? false, + skipWorkspace: entry.skipWorkspace ?? false, + helpUrl: undefined, + aspectId: entry.aspectId, + }; + + async function trampoline(method: 'report' | 'json' | 'wait', args: unknown[]): Promise { + // Remove the stub so the real Command (just registered by the + // resolved aspect's provider) takes over. + const before = slot.map.get(entry.aspectId) || []; + slot.map.set(entry.aspectId, before.filter((c: any) => c !== stub)); + await harmony.resolve(entry.aspectId); + const real = self.getCommand(entry.name); + if (!real) throw new Error(`lazy dispatch: no command "${entry.name}" after resolving ${entry.aspectId}`); + const fn = (real as any)[method]; + if (typeof fn !== 'function') { + throw new Error(`command "${entry.name}" has no .${method} handler`); + } + return fn.apply(real, args); + } + stub.report = (...args: unknown[]) => trampoline('report', args); + stub.json = (...args: unknown[]) => trampoline('json', args); + stub.wait = (...args: unknown[]) => trampoline('wait', args); + return stub as Command; + } + private async invokeOnStart(hasWorkspace: boolean) { const onStartFns = this.onStartSlot.values(); const foundCmd = findCommandByArgv(this.commands); @@ -196,7 +353,9 @@ export class CLIMain { const cliCmd = new CliCmd(cliMain); const helpCmd = new HelpCmd(cliMain); cliCmd.commands.push(cliGenerateCmd); - cliMain.register(new CompletionCmd(), cliCmd, helpCmd, new VersionCmd(), new DetailsCmd()); + cliMain.register(completionCommand, () => new CompletionCmd()); + cliMain.register(versionCommand, () => new VersionCmd()); + cliMain.register(detailsCommand, () => new DetailsCmd()); return cliMain; } } @@ -206,3 +365,7 @@ CLIAspect.addRuntime(CLIMain); function isFullUrl(url: string) { return url.startsWith('http://') || url.startsWith('https://'); } + +function isLazyStub(cmd: unknown): boolean { + return Boolean((cmd as any)?.__lazyStub); +} diff --git a/scopes/harmony/cli/command.ts b/scopes/harmony/cli/command.ts index 5594b7c59216..92585d0be277 100644 --- a/scopes/harmony/cli/command.ts +++ b/scopes/harmony/cli/command.ts @@ -3,7 +3,16 @@ import type { Group } from './command-groups'; type CommandOption = [string, string, string]; export type CommandOptions = Array; -export interface Command { +/** + * Declarative description of a CLI command — everything except the handlers. + * + * Used by the codegen / bundler pipeline (RFC: ESM Migration with Lazy-Loaded + * Aspects, see docs/rfc-esm-lazy-aspects.md §6.2) to drive help/completion + * without instantiating the owning aspect's runtime. The handler class + * (`Command`) reads its static fields from a descriptor to keep a single + * source of truth. + */ +export interface CommandDescriptor { /** * Name of command with arguments: * <> for mandatory arguments. @@ -72,7 +81,7 @@ export interface Command { * sub commands for example: * bit capsule list to list active capsules. */ - commands?: Command[]; + commands?: CommandDescriptor[]; /** * interact with a remote, e.g. "export" push to a remote @@ -96,6 +105,18 @@ export interface Command { * default is true. */ loadAspects?: boolean; +} + +/** + * Factory that produces the runnable handler for a descriptor. Used by the + * `cli.register(descriptor, factory)` overload — lets the dispatcher defer + * handler construction until the command is actually invoked. + */ +export type CommandFactory = () => Command; + +export interface Command extends CommandDescriptor { + /** override: subcommands carry handlers too. */ + commands?: Command[]; /** * do not set this. it is being set once the command run. diff --git a/scopes/harmony/cli/completion.cmd.ts b/scopes/harmony/cli/completion.cmd.ts index 736118bf4b21..2bc528732d4a 100644 --- a/scopes/harmony/cli/completion.cmd.ts +++ b/scopes/harmony/cli/completion.cmd.ts @@ -1,10 +1,11 @@ import type { Command } from './command'; +import { completionCommand } from './cli.commands'; export class CompletionCmd implements Command { - name = 'completion'; - description = 'enable bash/zsh-completion shortcuts for commands and options'; - alias = ''; - group = 'system'; - options = []; - private = true; + name = completionCommand.name; + description = completionCommand.description; + alias = completionCommand.alias; + group = completionCommand.group; + options = completionCommand.options; + private = completionCommand.private; } diff --git a/scopes/harmony/cli/details.cmd.ts b/scopes/harmony/cli/details.cmd.ts index 5959a9006694..58adf4a8883e 100644 --- a/scopes/harmony/cli/details.cmd.ts +++ b/scopes/harmony/cli/details.cmd.ts @@ -4,16 +4,17 @@ import path from 'path'; import type { Command, CommandOptions } from './command'; import { formatTitle, formatHint } from './output-formatter'; import { LAST_COMMAND_DETAILS_DIR } from './command-runner'; +import { detailsCommand } from './cli.commands'; export class DetailsCmd implements Command { - name = 'details'; - description = 'show expanded details from the last command that provided them (e.g. tag, snap)'; - alias = ''; - group = 'general'; - options = [] as CommandOptions; - loader = false; - loadAspects = false; - skipWorkspace = true; + name = detailsCommand.name; + description = detailsCommand.description; + alias = detailsCommand.alias; + group = detailsCommand.group; + options = detailsCommand.options; + loader = detailsCommand.loader; + loadAspects = detailsCommand.loadAspects; + skipWorkspace = detailsCommand.skipWorkspace; async report() { const contentPath = path.join(LAST_COMMAND_DETAILS_DIR, 'content'); diff --git a/scopes/harmony/cli/index.ts b/scopes/harmony/cli/index.ts index 94ebf2f9959e..ff788f732d7d 100644 --- a/scopes/harmony/cli/index.ts +++ b/scopes/harmony/cli/index.ts @@ -6,7 +6,16 @@ export type { CLIMain, CommandList, CommandsSlot } from './cli.main.runtime'; export { handleUnhandledRejection, handleErrorAndExit, setExitOnUnhandledRejection } from './handle-errors'; export { globalFlags }; export { defaultErrorHandler }; -export type { Command, CLIArgs, Flags, GenericObject, CommandOptions, Report } from './command'; +export type { + Command, + CommandDescriptor, + CommandFactory, + CLIArgs, + Flags, + GenericObject, + CommandOptions, + Report, +} from './command'; export { getArgsData, getCommandName, getFlagsData } from './command-helper'; export * from './exceptions'; diff --git a/scopes/harmony/cli/version.cmd.ts b/scopes/harmony/cli/version.cmd.ts index 2b9f616cbac8..1e450bcdcbad 100644 --- a/scopes/harmony/cli/version.cmd.ts +++ b/scopes/harmony/cli/version.cmd.ts @@ -1,13 +1,14 @@ import type { CommandOptions, Command } from './command'; import { getBitVersion } from '@teambit/bit.get-bit-version'; +import { versionCommand } from './cli.commands'; export class VersionCmd implements Command { - name = 'version'; - description = 'display the installed Bit version'; - alias = ''; - loader = false; - group = 'system'; - options = [['j', 'json', 'return the version in json format']] as CommandOptions; + name = versionCommand.name; + description = versionCommand.description; + alias = versionCommand.alias; + loader = versionCommand.loader; + group = versionCommand.group; + options = versionCommand.options; async report() { const results = await this.json(); diff --git a/scopes/harmony/config/config.aspect.ts b/scopes/harmony/config/config.aspect.ts index ee58489e4c62..41d4945d8489 100644 --- a/scopes/harmony/config/config.aspect.ts +++ b/scopes/harmony/config/config.aspect.ts @@ -1,9 +1,9 @@ -import { Aspect, RuntimeDefinition } from '@teambit/harmony'; +import { RuntimeDefinition } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ConfigRuntime = new RuntimeDefinition('main'); export const ConfigAspect = Aspect.create({ id: 'teambit.harmony/config', - dependencies: [], - declareRuntime: ConfigRuntime, + runtimes: { main: () => import('./config.main.runtime') }, }); diff --git a/scopes/harmony/core/aspect.ts b/scopes/harmony/core/aspect.ts new file mode 100644 index 000000000000..30662ff8971b --- /dev/null +++ b/scopes/harmony/core/aspect.ts @@ -0,0 +1,68 @@ +// Aspect manifest. Pure declarative data — safe to import eagerly. +// The heavy code lives behind the `runtimes` and `commands` thunks, +// loaded on demand. + +import { Aspect as HarmonyAspect, RuntimeDefinition } from '@teambit/harmony'; +import type { SlotProvider } from '@teambit/harmony'; + +export type RuntimeLoader = () => Promise>; + +export type CommandsLoader = () => Promise; + +export interface CommandDescriptor { + name: string; + aspectId: string; + [key: string]: unknown; +} + +export interface AspectOptions { + id: string; + dependencies?: Aspect[]; + slots?: SlotProvider[]; + defaultConfig?: Record; + declareRuntime?: RuntimeDefinition; + files?: string[]; + runtimes?: Record; + commands?: CommandsLoader; +} + +export class Aspect extends HarmonyAspect { + readonly runtimes: Record; + readonly commands?: CommandsLoader; + + constructor(opts: AspectOptions) { + super( + opts.id, + opts.dependencies || [], + opts.slots || [], + opts.defaultConfig || {}, + // Synthesize declareRuntime from the runtimes thunk keys when the + // caller didn't pass one. Without it, the legacy `Harmony.load(...) + // + harmony.run(...)` path's `Runtimes.load` finds no runtime + // declaration on this aspect and fails with + // `runtime: '' was not defined by any aspect`. + opts.declareRuntime ?? deriveDeclareRuntime(opts.runtimes), + opts.files || [], + ); + this.runtimes = opts.runtimes || {}; + this.commands = opts.commands; + } + + static create(opts: AspectOptions): Aspect { + return new Aspect(opts); + } +} + +function deriveDeclareRuntime( + runtimes: Record | undefined, +): RuntimeDefinition | undefined { + if (!runtimes) return undefined; + const names = Object.keys(runtimes); + if (names.length === 0) return undefined; + // The legacy `Runtimes.load` only needs the runtime *name* to register a + // declaration; the actual RuntimeManifest is supplied later when the + // runtime file is `require()`d and its top-level `Aspect.addRuntime(...)` + // fires (see e.g. `clear-cache.main.runtime.ts`). One declaration is enough + // to unblock the lookup path. + return new RuntimeDefinition(names[0]); +} diff --git a/scopes/harmony/core/harmony.ts b/scopes/harmony/core/harmony.ts new file mode 100644 index 000000000000..9dc650829f4b --- /dev/null +++ b/scopes/harmony/core/harmony.ts @@ -0,0 +1,323 @@ +// Minimal Harmony with lazy resolve(). +// - `manifests` map holds Aspect declarations; tiny and cheap to register. +// - `instances` map holds resolved provider results. +// - `loading` map deduplicates concurrent resolves of the same aspect. + +import { AsyncLocalStorage } from 'async_hooks'; +import { Aspect } from './aspect'; +import { SLOT_INDEX } from './slot-index.generated'; + +// Each provider invocation runs inside its own ALS context carrying the +// invoking aspect's id. Slot register-fns read this so concurrent +// `_doResolve` calls (Promise.all over deps) don't clobber each other's +// slot keys. +const currentAspectStore = new AsyncLocalStorage(); + +export interface RuntimeClass { + id: string; + dependencies?: Aspect[]; + slots?: any[]; + provider: ( + deps: any[], + config: any, + slots: any[], + harmony: Harmony, + ) => Promise | any; +} + +export class Slot { + private values: Map = new Map(); + register(value: T): void { + // In a real implementation, we'd need to know which aspect is registering + // to keep the map key. For now, we use a simple counter or similar. + this.values.set(Math.random().toString(), value); + } + toArray(): [string, T][] { + return Array.from(this.values.entries()); + } + values_(): T[] { + return Array.from(this.values.values()); + } +} + +const traceEnabled = process.env.BIT_TRACE_ASPECT_LOAD === '1'; +const traceStart = Date.now(); +function trace(event: string): void { + if (!traceEnabled) return; + const dt = Date.now() - traceStart; + process.stderr.write(`[trace +${dt}ms] ${event}\n`); +} + +// Recursive no-op proxy. Used as the placeholder value for "optional" / +// lazy aspect deps. Any property access returns another no-op proxy; +// any call returns undefined. So unconditional caller code like +// graphql.register(...) +// ui.registerUiRoot(...) +// ui.registerPreStart(async () => { ... }) +// ui.getUIServer() +// bundler.addNewDevServers(...) +// all silently no-op without throwing, and the eventual return value is +// `undefined` (which `if (!x)` style guards already handle). +function makeNoopProxy(): any { + const target: any = function () { return undefined; }; + return new Proxy(target, { + get(_t, prop) { + // Pretend not to be a thenable so `await noop` short-circuits. + if (prop === 'then') return undefined; + // `pubsub.publish(...)` and similar nested-method calls work via + // the recursive proxy. + return makeNoopProxy(); + }, + apply() { return undefined; }, + has() { return false; }, + set() { return true; }, + }); +} + +// Minimal shim matching @teambit/harmony/config/config.ts so providers that +// read `harmony.config.raw.get(...)` keep working under lazy resolve. +class LazyConfig { + readonly raw: Map; + constructor(entries: Record = {}) { + this.raw = new Map(Object.entries(entries)); + } + toObject(): Record { + const out: Record = {}; + for (const [k, v] of this.raw) out[k] = v; + return out; + } + get(id: string): any { + return this.raw.get(id); + } + set(id: string, value: any): void { + this.raw.set(id, value); + } + static from(raw: Record): LazyConfig { + return new LazyConfig(raw); + } +} + +export class Harmony { + readonly runtimeName: string; + readonly config: LazyConfig; + readonly manifests: Map; + readonly instances: Map; + readonly loading: Map>; + readonly slots: Map>; + // Aspect ids that should NOT be eagerly resolved as part of another + // aspect's `static dependencies` walk. The dep slot is filled with + // `undefined`; providers are expected to guard with `if (graphql) ...`. + // Mainly used to keep heavy UI / GraphQL / bundler hosts out of the CLI + // hot path. If a caller explicitly `harmony.resolve(id)`s one of these + // (or it's in `rootAspects`), it resolves normally and subsequent + // provider injections see the real instance. + readonly lazyAspectIds: Set; + // The aspect id whose provider is currently being invoked. Read by + // SlotRegistry.registerFn (built from legacy `Slot.withType()`) to key + // entries by aspect. + current: string | null = null; + + constructor( + runtimeName: string, + config?: Record | LazyConfig, + lazyAspectIds: Iterable = [], + ) { + this.runtimeName = runtimeName; + this.config = config instanceof LazyConfig ? config : new LazyConfig(config || {}); + this.manifests = new Map(); + this.instances = new Map(); + this.loading = new Map(); + this.slots = new Map(); + this.lazyAspectIds = new Set(lazyAspectIds); + } + + // `roots` are resolved immediately. `manifests` are just registered (cheap) + // so they can be discovered later by lazy dispatch. + static async load( + rootAspects: Aspect[], + runtimeName: string = 'main', + config: Record = {}, + manifestOnly: Aspect[] = [], + lazyAspectIds: Iterable = [], + ): Promise { + const h = new Harmony(runtimeName, config, lazyAspectIds); + for (const a of [...rootAspects, ...manifestOnly]) h.registerManifestTransitive(a); + await Promise.all(rootAspects.map((a) => h.resolve(a.id))); + return h; + } + + registerManifestTransitive(aspect: Aspect): void { + if (this.manifests.has(aspect.id)) return; + this.manifests.set(aspect.id, aspect); + for (const dep of aspect.dependencies as Aspect[]) this.registerManifestTransitive(dep); + } + + // The hot path: dynamic-import the runtime module, register its declared deps, + // resolve them in parallel, then run provider(). + async resolve(aspectId: string): Promise { + if (this.instances.has(aspectId)) return this.instances.get(aspectId); + if (this.loading.has(aspectId)) return this.loading.get(aspectId); + const p = this._doResolve(aspectId); + this.loading.set(aspectId, p); + return p; + } + + private async _doResolve(aspectId: string): Promise { + const aspect = this.manifests.get(aspectId); + if (!aspect) throw new Error(`Unknown aspect: ${aspectId}`); + // Some aspects only declare e.g. a `ui` runtime and appear in main-runtime + // dependency lists purely as manifests. Treat the absence of a runtime + // loader for the current runtime as "no instance" rather than an error — + // the same way the legacy harmony loader silently skipped such aspects. + const loader = aspect.runtimes?.[this.runtimeName]; + if (!loader) { + this.instances.set(aspectId, undefined); + return undefined; + } + + const t0 = Date.now(); + const mod = await loader(); + const importMs = Date.now() - t0; + + const runtimeClass = pickRuntimeExport(mod); + if (!runtimeClass) throw new Error(`No runtime export with .provider in ${aspectId}`); + + // Lazy manifest discovery: runtime classes can reference aspects whose manifests + // weren't registered via the root closure. + for (const depAspect of runtimeClass.dependencies || []) { + this.registerManifestTransitive(depAspect); + } + + const deps = await Promise.all( + (runtimeClass.dependencies || []).map((d) => { + // Lazy / "optional" deps: don't trigger eager resolution. If + // they've already been resolved (or are mid-resolve) by someone + // else, hand back that instance. Otherwise hand back a recursive + // no-op proxy so unconditional caller code like + // `graphql.register(...)` / `ui.registerUiRoot(...)` becomes a + // silent no-op for CLI commands that don't actually need the + // graphql / UI server. + if (this.lazyAspectIds.has(d.id)) { + if (this.instances.has(d.id)) return this.instances.get(d.id); + if (this.loading.has(d.id)) return this.loading.get(d.id); + return makeNoopProxy(); + } + return this.resolve(d.id); + }), + ); + + // `runtimeClass.slots` is a list of legacy `Slot.withType()` providers — + // each is a function `(registerFn) => SlotRegistry`. The registerFn + // reads `currentAspectStore` so writes from inside any aspect's provider + // get keyed by THAT aspect, not by this slot's owner. + const slotInstances = (runtimeClass.slots || []).map((slotProvider: any) => { + if (typeof slotProvider === 'function') { + return slotProvider(() => currentAspectStore.getStore() ?? this.current ?? aspectId); + } + // Fallback for the previous experimental shape (slot defs with a `.type`). + const type = slotProvider?.type; + return type ? this.getSlot(type) : undefined; + }); + + const t1 = Date.now(); + const instance = await currentAspectStore.run(aspectId, async () => { + // Also keep `this.current` updated for legacy callers (e.g. graph code + // that reads `harmony.current` synchronously). ALS is the source of + // truth for concurrent provider isolation. + const prev = this.current; + this.current = aspectId; + try { + return await runtimeClass.provider(deps, this.config.get(aspectId) ?? {}, slotInstances, this); + } finally { + this.current = prev; + } + }); + const providerMs = Date.now() - t1; + + trace(`load ${aspectId} (import: ${importMs}ms, provider: ${providerMs}ms)`); + this.instances.set(aspectId, instance); + return instance; + } + + get(aspectId: string): T { + if (!this.instances.has(aspectId)) { + throw new Error(`Aspect ${aspectId} not resolved. Use await harmony.resolve(id).`); + } + return this.instances.get(aspectId) as T; + } + + getSlot(type: string): Slot { + if (!this.slots.has(type)) { + this.slots.set(type, new Slot()); + } + return this.slots.get(type) as Slot; + } + + // ── Legacy @teambit/harmony compatibility shims ───────────────────────── + // Older callers (aspect-loader, workspace-aspects-loader, load-aspect) + // expect the eager Harmony API. Keep these thin so the surface stays the + // same while the underlying model is lazy. + + // Legacy `harmony.extensionsIds` — list of registered aspect ids. + get extensionsIds(): string[] { + return Array.from(this.manifests.keys()); + } + + // Legacy `harmony.extensions.get(id)?.loaded` lookup. + get extensions(): { get(id: string): { loaded: boolean } | undefined } { + const instances = this.instances; + const manifests = this.manifests; + return { + get(id: string) { + if (!manifests.has(id)) return undefined; + return { loaded: instances.has(id) }; + }, + }; + } + + // Legacy `harmony.load(manifests)` — register more aspects at runtime and + // resolve them (the legacy variant ran their providers immediately). + async load(aspects: Aspect[]): Promise { + for (const a of aspects) this.registerManifestTransitive(a); + await Promise.all(aspects.map((a) => this.resolve(a.id))); + } + + // Legacy `harmony.run(requireFn?)` — eagerly drove the full graph load + // through a user-supplied require callback. With native `import()` thunks + // on each aspect, there's nothing to drive — `load(roots)` already resolved + // them transitively. Kept as a no-op so existing call sites keep working. + async run(_requireFn?: unknown): Promise { + // intentionally empty — lazy resolve handles this on demand + } + + async loadExternalAspect(manifestPath: string): Promise { + trace(`loading external aspect from ${manifestPath}`); + const aspectMod = await import(manifestPath); + const aspect = pickAspectExport(aspectMod); + if (!aspect) throw new Error(`No Aspect export found in ${manifestPath}`); + + this.registerManifestTransitive(aspect); + return this.resolve(aspect.id); + } +} + +export function pickAspectExport(mod: any): Aspect | null { + if (mod.default instanceof Aspect) return mod.default; + for (const key of Object.keys(mod)) { + if (mod[key] instanceof Aspect) return mod[key]; + } + return null; +} + +export function pickRuntimeExport(mod: Record): RuntimeClass | null { + for (const key of Object.keys(mod)) { + const v = mod[key] as { provider?: unknown } | undefined; + if (!v) continue; + // Accept either a class with a static `provider` (the common form, + // e.g. `StatusMain`) or a plain object with a `provider` (e.g. `BitMain`). + if ((typeof v === 'function' || typeof v === 'object') && typeof v.provider === 'function') { + return v as unknown as RuntimeClass; + } + } + return null; +} diff --git a/scopes/harmony/core/index.ts b/scopes/harmony/core/index.ts new file mode 100644 index 000000000000..2e8ef9182ce1 --- /dev/null +++ b/scopes/harmony/core/index.ts @@ -0,0 +1,2 @@ +export * from './aspect'; +export * from './harmony'; diff --git a/scopes/harmony/core/slot-index.generated.ts b/scopes/harmony/core/slot-index.generated.ts new file mode 100644 index 000000000000..08bfe22b7699 --- /dev/null +++ b/scopes/harmony/core/slot-index.generated.ts @@ -0,0 +1,253 @@ +// AUTO-GENERATED — DO NOT EDIT BY HAND. +// Generated by scripts/generate-command-index.mjs +// (RFC: ESM Migration with Lazy-Loaded Aspects — slot producer index) +// To regenerate, run: npm run generate-command-index +// +// Map of slot type-parameter name → list of aspect ids whose `*.main.runtime.ts` +// declares a `static slots = [Slot.withType()]` of that type. Built by +// static analysis; the type name is the literal source text inside `<...>`. + +export const SLOT_INDEX: Record = { + "AddComponentsIssues": [ + "teambit.component/issues" + ], + "AddPackagesToLinkSlot": [ + "teambit.dependencies/dependency-resolver" + ], + "Application[]": [ + "teambit.harmony/application" + ], + "ApplicationType[]": [ + "teambit.harmony/application" + ], + "BrowserRuntime": [ + "teambit.compilation/bundler" + ], + "BuildMethodOverwriteSlot": [ + "teambit.ui-foundation/ui" + ], + "BuildTask": [ + "teambit.pipelines/builder" + ], + "BundlingStrategy": [ + "teambit.preview/preview" + ], + "CapsuleTransferFn": [ + "teambit.component/isolator" + ], + "CommandList": [ + "teambit.harmony/cli" + ], + "ComponentFactory": [ + "teambit.component/component" + ], + "ComponentTemplate[]": [ + "teambit.generator/generator" + ], + "DependencyDetector": [ + "teambit.dependencies/dependency-resolver" + ], + "DependencyFactory": [ + "teambit.dependencies/dependency-resolver" + ], + "DeploymentProvider[]": [ + "teambit.harmony/application" + ], + "DevPatterns": [ + "teambit.component/dev-files" + ], + "DevServerTransformerSlot": [ + "teambit.compilation/bundler" + ], + "Diagnostic[]": [ + "teambit.harmony/diagnostic" + ], + "DocProp": [ + "teambit.docs/docs" + ], + "DocReader": [ + "teambit.docs/docs" + ], + "Environment": [ + "teambit.envs/envs" + ], + "EnvJsoncMergeCustomizerRegistry": [ + "teambit.envs/envs" + ], + "EnvJsoncResolverRegistry": [ + "teambit.envs/envs" + ], + "EnvService": [ + "teambit.envs/envs" + ], + "GotEventSlot": [ + "teambit.harmony/ipc-events" + ], + "GraphQLServer": [ + "teambit.harmony/graphql" + ], + "HarmonyWorker": [ + "teambit.harmony/worker" + ], + "ImpactRule[]": [ + "teambit.semantics/schema" + ], + "MiddlewareManifest[]": [ + "teambit.harmony/express" + ], + "OnAspectLoadError": [ + "teambit.harmony/aspect-loader" + ], + "OnAspectsResolve": [ + "teambit.workspace/workspace" + ], + "OnBeforeExitFn": [ + "teambit.harmony/cli" + ], + "OnBitmapChange": [ + "teambit.workspace/workspace" + ], + "OnCommandStart": [ + "teambit.harmony/cli" + ], + "OnCompAspectReCalc": [ + "teambit.scope/scope" + ], + "OnComponentAdd": [ + "teambit.workspace/workspace" + ], + "OnComponentChange": [ + "teambit.workspace/workspace" + ], + "OnComponentCreateFn": [ + "teambit.generator/generator" + ], + "OnComponentLoad": [ + "teambit.workspace/workspace" + ], + "OnComponentRemove": [ + "teambit.workspace/workspace" + ], + "OnLoadRequireableExtension": [ + "teambit.harmony/aspect-loader" + ], + "OnPostDelete": [ + "teambit.scope/scope" + ], + "OnPostExport": [ + "teambit.scope/scope" + ], + "OnPostObjectRead": [ + "teambit.scope/scope" + ], + "OnPostObjectsPersist": [ + "teambit.scope/scope" + ], + "OnPostPut": [ + "teambit.scope/scope" + ], + "OnPreDevServerCreatedSlot": [ + "teambit.compilation/bundler" + ], + "OnPreFetchObjects": [ + "teambit.scope/scope" + ], + "OnPreObjectPersist": [ + "teambit.scope/scope" + ], + "OnPreSnap": [ + "teambit.component/snapping" + ], + "OnPreWatch": [ + "teambit.workspace/watcher" + ], + "OnRootAspectAdded": [ + "teambit.workspace/workspace" + ], + "OnStart": [ + "teambit.harmony/cli", + "teambit.ui-foundation/ui" + ], + "OnSuccessLogin": [ + "teambit.cloud/cloud" + ], + "OnWorkspaceConfigChange": [ + "teambit.workspace/workspace" + ], + "PackageJsonProps": [ + "teambit.pkg/pkg" + ], + "PackageManager": [ + "teambit.dependencies/dependency-resolver" + ], + "Parser": [ + "teambit.semantics/schema" + ], + "PluginDefinition[]": [ + "teambit.harmony/aspect-loader" + ], + "PostInstallSlot": [ + "teambit.workspace/install" + ], + "PostInstallSubscriberList": [ + "teambit.dependencies/dependency-resolver" + ], + "PreInstallSlot": [ + "teambit.workspace/install" + ], + "PreInstallSubscriberList": [ + "teambit.dependencies/dependency-resolver" + ], + "PreLinkSlot": [ + "teambit.workspace/install" + ], + "PreStart": [ + "teambit.ui-foundation/ui" + ], + "PreviewDefinition": [ + "teambit.preview/preview" + ], + "PublicDirOverwriteSlot": [ + "teambit.ui-foundation/ui" + ], + "PubSubSlot": [ + "teambit.harmony/graphql" + ], + "RegExp": [ + "teambit.dependencies/dependency-resolver" + ], + "Route[]": [ + "teambit.component/component", + "teambit.harmony/express" + ], + "Schema": [ + "teambit.harmony/graphql" + ], + "SchemaNodeTransformer[]": [ + "teambit.typescript/typescript" + ], + "SchemaTransformer[]": [ + "teambit.typescript/typescript" + ], + "ShowFragment[]": [ + "teambit.component/component" + ], + "StartPlugin": [ + "teambit.ui-foundation/ui" + ], + "string": [ + "teambit.harmony/worker" + ], + "UIRoot": [ + "teambit.ui-foundation/ui" + ], + "VariantPolicyConfigObject": [ + "teambit.dependencies/dependency-resolver" + ], + "WorkspacePolicy": [ + "teambit.dependencies/dependency-resolver" + ], + "WorkspaceTemplate[]": [ + "teambit.generator/generator" + ] +}; diff --git a/scopes/harmony/diagnostic/diagnostic.aspect.ts b/scopes/harmony/diagnostic/diagnostic.aspect.ts index db13fb48f01f..02bdc6832953 100644 --- a/scopes/harmony/diagnostic/diagnostic.aspect.ts +++ b/scopes/harmony/diagnostic/diagnostic.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DiagnosticAspect = Aspect.create({ id: 'teambit.harmony/diagnostic', + runtimes: { main: () => import('./diagnostic.main.runtime') }, }); diff --git a/scopes/harmony/doctor/doctor-cmd.ts b/scopes/harmony/doctor/doctor-cmd.ts index 095c7e2ddf2b..501f52f30be7 100644 --- a/scopes/harmony/doctor/doctor-cmd.ts +++ b/scopes/harmony/doctor/doctor-cmd.ts @@ -2,6 +2,7 @@ import type { Command, CommandOptions } from '@teambit/cli'; import formatDiagnosesList from './diagnosis-list-template'; import formatDiagnosesResult from './doctor-results-template'; import type { DoctorMain, DoctorOptions } from './doctor.main.runtime'; +import { doctorCommand } from './doctor.commands'; type Flags = { list?: boolean; @@ -14,28 +15,13 @@ type Flags = { }; export class DoctorCmd implements Command { - name = 'doctor [diagnosis-name]'; - description = 'diagnose and troubleshoot workspace issues'; - extendedDescription = `runs comprehensive health checks on your workspace to detect and report configuration problems, -missing dependencies, corrupted data, and other issues that may affect workspace functionality. -can generate diagnostic reports and workspace archives for debugging and support purposes.`; - group = 'system'; - alias = ''; - loadAspects = false; - options = [ - ['j', 'json', 'return diagnoses in json format'], - ['', 'list', 'list all available diagnoses'], - ['s', 'save [filePath]', 'save diagnoses to a file'], - [ - 'a', - 'archive [filePath]', - 'archive the workspace including diagnosis info (by default exclude node-modules and include .bit)', - ], - ['n', 'include-node-modules', 'relevant for --archive. include node_modules in the archive file'], - ['p', 'include-public', 'relevant for --archive. include public folder in the archive file'], - ['e', 'exclude-local-scope', 'relevant for --archive. exclude .bit or .git/bit from the archive file'], - ['r', 'remote ', 'run doctor checks on a remote scope'], - ] as CommandOptions; + name = doctorCommand.name; + description = doctorCommand.description; + extendedDescription = doctorCommand.extendedDescription; + group = doctorCommand.group; + alias = doctorCommand.alias; + loadAspects = doctorCommand.loadAspects; + options = doctorCommand.options; constructor(private doctor: DoctorMain) {} diff --git a/scopes/harmony/doctor/doctor.aspect.ts b/scopes/harmony/doctor/doctor.aspect.ts index 890f73cc1c24..44eda2f58d0f 100644 --- a/scopes/harmony/doctor/doctor.aspect.ts +++ b/scopes/harmony/doctor/doctor.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const DoctorAspect = Aspect.create({ id: 'teambit.harmony/doctor', + runtimes: { main: () => import('./doctor.main.runtime') }, + commands: () => import('./doctor.commands').then((m) => [m.doctorCommand]), }); diff --git a/scopes/harmony/doctor/doctor.commands.ts b/scopes/harmony/doctor/doctor.commands.ts new file mode 100644 index 000000000000..28d05fd85210 --- /dev/null +++ b/scopes/harmony/doctor/doctor.commands.ts @@ -0,0 +1,36 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const doctorCommand: CommandDescriptor = { + name: 'doctor [diagnosis-name]', + alias: '', + description: 'diagnose and troubleshoot workspace issues', + extendedDescription: `runs comprehensive health checks on your workspace to detect and report configuration problems, + missing dependencies, corrupted data, and other issues that may affect workspace functionality. + can generate diagnostic reports and workspace archives for debugging and support purposes.`, + group: 'system', + loadAspects: false, + options: [ + ['j', 'json', 'return diagnoses in json format'], + ['', 'list', 'list all available diagnoses'], + ['s', 'save [filePath]', 'save diagnoses to a file'], + [ + 'a', + 'archive [filePath]', + 'archive the workspace including diagnosis info (by default exclude node-modules and include .bit)', + ], + ['n', 'include-node-modules', 'relevant for --archive. include node_modules in the archive file'], + ['p', 'include-public', 'relevant for --archive. include public folder in the archive file'], + ['e', 'exclude-local-scope', 'relevant for --archive. exclude .bit or .git/bit from the archive file'], + ['r', 'remote ', 'run doctor checks on a remote scope'], + ] as CommandOptions, +}; diff --git a/scopes/harmony/doctor/doctor.main.runtime.ts b/scopes/harmony/doctor/doctor.main.runtime.ts index 6af15e0d5689..da81dc684948 100644 --- a/scopes/harmony/doctor/doctor.main.runtime.ts +++ b/scopes/harmony/doctor/doctor.main.runtime.ts @@ -28,6 +28,7 @@ import { MissingDiagnosisName } from './exceptions/missing-diagnosis-name'; import { getRemoteByName } from '@teambit/scope.remotes'; import { loadConsumerIfExist } from '@teambit/legacy.consumer'; import type { Network } from '@teambit/scope.network'; +import { doctorCommand } from './doctor.commands'; import { DoctorAspect } from './doctor.aspect'; import { DoctorCmd } from './doctor-cmd'; @@ -390,7 +391,7 @@ export class DoctorMain { static async provider([cliMain, loggerMain, graphql, scope]: [CLIMain, LoggerMain, GraphqlMain, ScopeMain]) { const logger = loggerMain.createLogger(DoctorAspect.id); const doctor = new DoctorMain(logger); - cliMain.register(new DoctorCmd(doctor)); + cliMain.register(doctorCommand, () => new DoctorCmd(doctor)); graphql.register(() => doctorSchema(scope)); return doctor; } diff --git a/scopes/harmony/express/express.aspect.ts b/scopes/harmony/express/express.aspect.ts index f43d28fc1353..e172ff43184b 100644 --- a/scopes/harmony/express/express.aspect.ts +++ b/scopes/harmony/express/express.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ExpressAspect = Aspect.create({ id: 'teambit.harmony/express', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./express.main.runtime') }, }); diff --git a/scopes/harmony/global-config/global-config.aspect.ts b/scopes/harmony/global-config/global-config.aspect.ts index 4146d234214b..77604e3c75fd 100644 --- a/scopes/harmony/global-config/global-config.aspect.ts +++ b/scopes/harmony/global-config/global-config.aspect.ts @@ -1,8 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const GlobalConfigAspect = Aspect.create({ id: 'teambit.harmony/global-config', - dependencies: [], + runtimes: { main: () => import('./global-config.main.runtime') }, + commands: () => import('./global-config.commands').then((m) => [m.globalsCommand, m.remoteCommand]), }); export default GlobalConfigAspect; diff --git a/scopes/harmony/global-config/global-config.commands.ts b/scopes/harmony/global-config/global-config.commands.ts new file mode 100644 index 000000000000..f0f7c3f853ea --- /dev/null +++ b/scopes/harmony/global-config/global-config.commands.ts @@ -0,0 +1,37 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { RemoteAdd, RemoteRm, RemoteList } from './remote-cmd'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const globalsCommand: CommandDescriptor = { + name: 'globals', + alias: '', + description: 'display global directories and paths used by Bit', + extendedDescription: `shows all global directories including cache, logs, and config locations used by Bit across your system. + useful for debugging and understanding where Bit stores data.`, + helpUrl: 'reference/config/config-files', + group: 'system', + options: [['j', 'json', 'json format']] as CommandOptions, +}; + +export const remoteCommand: CommandDescriptor = { + name: 'remote', + alias: '', + description: 'manage remote scopes for self-hosted environments', + extendedDescription: `configure connections to self-hosted remote scopes via HTTP or file protocol. + note: this command is only needed for self-hosted scopes. when using bit.cloud, remote scopes are automatically configured. + remotes are bare scopes that store exported components and enable collaboration across teams.`, + helpUrl: 'reference/scope/remote-scopes', + group: 'collaborate', + loadAspects: false, + options: [['g', 'global', 'see globally configured remotes']] as CommandOptions, + commands: [new RemoteAdd(), new RemoteRm(), new RemoteList()], +}; diff --git a/scopes/harmony/global-config/global-config.main.runtime.ts b/scopes/harmony/global-config/global-config.main.runtime.ts index 39fc995abd39..4dd0812f1dd7 100644 --- a/scopes/harmony/global-config/global-config.main.runtime.ts +++ b/scopes/harmony/global-config/global-config.main.runtime.ts @@ -8,6 +8,7 @@ import { CFG_CAPSULES_ROOT_BASE_DIR, GLOBALS_DEFAULT_CAPSULES, } from '@teambit/legacy.constants'; +import { globalsCommand, remoteCommand } from './global-config.commands'; import { GlobalConfigAspect } from './global-config.aspect'; import { GlobalsCmd } from './globals.cmd'; import { SystemCmd, SystemLogCmd, SystemTailLogCmd } from './system.cmd'; @@ -100,7 +101,8 @@ export class GlobalConfigMain { const globalConfig = new GlobalConfigMain(configStore); const systemCmd = new SystemCmd(); systemCmd.commands = [new SystemLogCmd(), new SystemTailLogCmd()]; - cli.register(new GlobalsCmd(globalConfig), systemCmd, new RemoteCmd()); + cli.register(globalsCommand, () => new GlobalsCmd(globalConfig)); + cli.register(remoteCommand, () => new RemoteCmd()); return globalConfig; } } diff --git a/scopes/harmony/global-config/globals.cmd.ts b/scopes/harmony/global-config/globals.cmd.ts index cacd265d0dc3..d54f273a92ae 100644 --- a/scopes/harmony/global-config/globals.cmd.ts +++ b/scopes/harmony/global-config/globals.cmd.ts @@ -4,16 +4,16 @@ import chalk from 'chalk'; import padRight from 'pad-right'; import { CACHE_GLOBALS_ENV } from '@teambit/legacy.constants'; import type { GlobalConfigMain } from './global-config.main.runtime'; +import { globalsCommand } from './global-config.commands'; export class GlobalsCmd implements Command { - name = 'globals'; - description = 'display global directories and paths used by Bit'; - extendedDescription = `shows all global directories including cache, logs, and config locations used by Bit across your system. -useful for debugging and understanding where Bit stores data.`; - group = 'system'; - helpUrl = 'reference/config/config-files'; - alias = ''; - options = [['j', 'json', 'json format']] as CommandOptions; + name = globalsCommand.name; + description = globalsCommand.description; + extendedDescription = globalsCommand.extendedDescription; + group = globalsCommand.group; + helpUrl = globalsCommand.helpUrl; + alias = globalsCommand.alias; + options = globalsCommand.options; constructor(private globalConfig: GlobalConfigMain) {} diff --git a/scopes/harmony/global-config/remote-cmd.ts b/scopes/harmony/global-config/remote-cmd.ts index 5955b0f9afc5..fd308afc7748 100644 --- a/scopes/harmony/global-config/remote-cmd.ts +++ b/scopes/harmony/global-config/remote-cmd.ts @@ -6,8 +6,9 @@ import { forEach, isEmpty } from 'lodash'; import { add, list, remove } from './remote'; import type { Command, CommandOptions } from '@teambit/cli'; import { formatSuccessSummary, formatHint } from '@teambit/cli'; +import { remoteCommand } from './global-config.commands'; -class RemoteAdd implements Command { +export class RemoteAdd implements Command { name = 'add '; description = 'add a bare-scope as a remote'; extendedDescription = `supported protocols are [file, http]. @@ -22,7 +23,7 @@ for example: "http://localhost:3000", "file:///tmp/local-scope"`; } } -class RemoteRm implements Command { +export class RemoteRm implements Command { name = 'del '; description = 'remove a tracked bit remote'; alias = ''; @@ -58,17 +59,15 @@ export class RemoteList implements Command { } export class RemoteCmd implements Command { - name = 'remote'; - description = 'manage remote scopes for self-hosted environments'; - extendedDescription = `configure connections to self-hosted remote scopes via HTTP or file protocol. -note: this command is only needed for self-hosted scopes. when using bit.cloud, remote scopes are automatically configured. -remotes are bare scopes that store exported components and enable collaboration across teams.`; - group = 'collaborate'; - helpUrl = 'reference/scope/remote-scopes'; - alias = ''; - loadAspects = false; - options = [['g', 'global', 'see globally configured remotes']] as CommandOptions; - commands = [new RemoteAdd(), new RemoteRm(), new RemoteList()]; + name = remoteCommand.name; + description = remoteCommand.description; + extendedDescription = remoteCommand.extendedDescription; + group = remoteCommand.group; + helpUrl = remoteCommand.helpUrl; + alias = remoteCommand.alias; + loadAspects = remoteCommand.loadAspects; + options = remoteCommand.options; + commands = remoteCommand.commands; async report(args: string[], { global }: { global: boolean }) { return new RemoteList().report(args, { global }); diff --git a/scopes/harmony/graphql/graphql.aspect.ts b/scopes/harmony/graphql/graphql.aspect.ts index ff17a7758835..7a4167884a37 100644 --- a/scopes/harmony/graphql/graphql.aspect.ts +++ b/scopes/harmony/graphql/graphql.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const GraphqlAspect = Aspect.create({ id: 'teambit.harmony/graphql', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./graphql.main.runtime') }, }); export default GraphqlAspect; diff --git a/scopes/harmony/host-initializer/host-initializer.aspect.ts b/scopes/harmony/host-initializer/host-initializer.aspect.ts index a19cfc1dfa80..24530c27bee6 100644 --- a/scopes/harmony/host-initializer/host-initializer.aspect.ts +++ b/scopes/harmony/host-initializer/host-initializer.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const HostInitializerAspect = Aspect.create({ id: 'teambit.harmony/host-initializer', + runtimes: { main: () => import('./host-initializer.main.runtime') }, }); diff --git a/scopes/harmony/ipc-events/ipc-events.aspect.ts b/scopes/harmony/ipc-events/ipc-events.aspect.ts index 16d8fc611724..b1b36dde5dbe 100644 --- a/scopes/harmony/ipc-events/ipc-events.aspect.ts +++ b/scopes/harmony/ipc-events/ipc-events.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const IpcEventsAspect = Aspect.create({ id: 'teambit.harmony/ipc-events', + runtimes: { main: () => import('./ipc-events.main.runtime') }, }); diff --git a/scopes/harmony/logger/logger.aspect.ts b/scopes/harmony/logger/logger.aspect.ts index 6933eeb688eb..4494c339f5f8 100644 --- a/scopes/harmony/logger/logger.aspect.ts +++ b/scopes/harmony/logger/logger.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const LoggerAspect = Aspect.create({ id: 'teambit.harmony/logger', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./logger.main.runtime') }, }); diff --git a/scopes/harmony/node/node.aspect.ts b/scopes/harmony/node/node.aspect.ts index b3fd68234690..d0b85181f611 100644 --- a/scopes/harmony/node/node.aspect.ts +++ b/scopes/harmony/node/node.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const NodeAspect = Aspect.create({ id: 'teambit.harmony/node', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./node.main.runtime') }, }); export default NodeAspect; diff --git a/scopes/harmony/pubsub/pubsub.aspect.ts b/scopes/harmony/pubsub/pubsub.aspect.ts index a8cc1972049a..7056d88e0135 100644 --- a/scopes/harmony/pubsub/pubsub.aspect.ts +++ b/scopes/harmony/pubsub/pubsub.aspect.ts @@ -1,8 +1,11 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PubsubAspect = Aspect.create({ id: 'teambit.harmony/pubsub', - dependencies: [], + runtimes: { + main: () => import('./pubsub.main.runtime'), + ui: () => import('./pubsub.ui.runtime'), + }, }); export default PubsubAspect; diff --git a/scopes/harmony/worker/worker.aspect.ts b/scopes/harmony/worker/worker.aspect.ts index 68c83d23599b..051771e856ec 100644 --- a/scopes/harmony/worker/worker.aspect.ts +++ b/scopes/harmony/worker/worker.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const WorkerAspect = Aspect.create({ id: 'teambit.harmony/worker', + runtimes: { main: () => import('./worker.main.runtime') }, }); diff --git a/scopes/lanes/lanes/index.ts b/scopes/lanes/lanes/index.ts index e3b24c1ccbc2..a2c9c16270d0 100644 --- a/scopes/lanes/lanes/index.ts +++ b/scopes/lanes/lanes/index.ts @@ -2,7 +2,9 @@ import { LanesAspect } from './lanes.aspect'; export type { CreateLaneResult, LanesMain, Lane, SwitchLaneOptions } from './lanes.main.runtime'; export type { LanesQuery } from '@teambit/lanes.ui.models.lanes-model'; -export { LanesModel } from '@teambit/lanes.ui.models.lanes-model'; +// UI value export removed from this barrel: +// - LanesModel (was: '@teambit/lanes.ui.models.lanes-model') +// UI callers should import from that package directly. export type { LanesUI, LaneCompareProps, LaneProviderIgnoreSlot } from './lanes.ui.runtime'; export default LanesAspect; export { LanesAspect }; diff --git a/scopes/lanes/lanes/lane.cmd.ts b/scopes/lanes/lanes/lane.cmd.ts index ad5c9b8b4d54..2ce80f51ae1e 100644 --- a/scopes/lanes/lanes/lane.cmd.ts +++ b/scopes/lanes/lanes/lane.cmd.ts @@ -16,6 +16,7 @@ import { warnSymbol, joinSections, } from '@teambit/cli'; +import { catLaneHistoryCommand } from './lanes.commands'; import type { LaneData } from '@teambit/legacy.scope'; import { serializeLaneData } from '@teambit/legacy.scope'; import { BitError } from '@teambit/bit-error'; @@ -313,13 +314,13 @@ it is useful e.g. when having multiple lanes with the same name, but with differ } export class CatLaneHistoryCmd implements Command { - name = 'cat-lane-history '; - description = 'cat lane-history object by lane-name'; - private = true; - alias = 'clh'; - options = [] as CommandOptions; - loader = true; - group = 'advanced'; + name = catLaneHistoryCommand.name; + description = catLaneHistoryCommand.description; + private = catLaneHistoryCommand.private; + alias = catLaneHistoryCommand.alias; + options = catLaneHistoryCommand.options; + loader = catLaneHistoryCommand.loader; + group = catLaneHistoryCommand.group; constructor(private lanes: LanesMain) {} diff --git a/scopes/lanes/lanes/lanes.aspect.ts b/scopes/lanes/lanes/lanes.aspect.ts index 15ac80cc3ded..3346044bc555 100644 --- a/scopes/lanes/lanes/lanes.aspect.ts +++ b/scopes/lanes/lanes/lanes.aspect.ts @@ -1,7 +1,9 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const LanesAspect = Aspect.create({ id: 'teambit.lanes/lanes', + runtimes: { main: () => import('./lanes.main.runtime') }, + commands: () => import('./lanes.commands').then((m) => [m.catLaneHistoryCommand]), }); export default LanesAspect; diff --git a/scopes/lanes/lanes/lanes.commands.ts b/scopes/lanes/lanes/lanes.commands.ts new file mode 100644 index 000000000000..947403df2847 --- /dev/null +++ b/scopes/lanes/lanes/lanes.commands.ts @@ -0,0 +1,21 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const catLaneHistoryCommand: CommandDescriptor = { + name: 'cat-lane-history ', + alias: 'clh', + description: 'cat lane-history object by lane-name', + group: 'advanced', + private: true, + loader: true, + options: [] as CommandOptions, +}; diff --git a/scopes/lanes/lanes/lanes.main.runtime.ts b/scopes/lanes/lanes/lanes.main.runtime.ts index ff3e16c61962..bc0e48e6d73c 100644 --- a/scopes/lanes/lanes/lanes.main.runtime.ts +++ b/scopes/lanes/lanes/lanes.main.runtime.ts @@ -74,6 +74,7 @@ import { LaneFetchCmd, LaneEjectCmd, } from './lane.cmd'; +import { catLaneHistoryCommand } from './lanes.commands'; import { lanesSchema } from './lanes.graphql'; import { SwitchCmd } from './switch.cmd'; import { LaneSwitcher } from './switch-lanes'; @@ -1381,7 +1382,7 @@ please create a new lane instead, which will include all components of this lane laneCmd.commands.push(new LaneHistoryDiffCmd(lanesMain, workspace, scope, componentCompare)); laneCmd.commands.push(new LaneCheckoutCmd(lanesMain)); laneCmd.commands.push(new LaneRevertCmd(lanesMain)); - cli.register(laneCmd, switchCmd, new CatLaneHistoryCmd(lanesMain)); + cli.register(catLaneHistoryCommand, () => new CatLaneHistoryCmd(lanesMain)); cli.registerOnStart(async () => { await lanesMain.recreateNewLaneIfDeleted(); }); diff --git a/scopes/lanes/merge-lanes/merge-lanes.aspect.ts b/scopes/lanes/merge-lanes/merge-lanes.aspect.ts index 9c059458ee29..5fcec4fb7c0a 100644 --- a/scopes/lanes/merge-lanes/merge-lanes.aspect.ts +++ b/scopes/lanes/merge-lanes/merge-lanes.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MergeLanesAspect = Aspect.create({ id: 'teambit.lanes/merge-lanes', + runtimes: { main: () => import('./merge-lanes.main.runtime') }, }); diff --git a/scopes/mcp/cli-mcp-server/cli-mcp-server.aspect.ts b/scopes/mcp/cli-mcp-server/cli-mcp-server.aspect.ts index b57eff997da0..c0b7bd97319a 100644 --- a/scopes/mcp/cli-mcp-server/cli-mcp-server.aspect.ts +++ b/scopes/mcp/cli-mcp-server/cli-mcp-server.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const CliMcpServerAspect = Aspect.create({ id: 'teambit.mcp/cli-mcp-server', + runtimes: { main: () => import('./cli-mcp-server.main.runtime') }, }); diff --git a/scopes/mdx/mdx/mdx.aspect.ts b/scopes/mdx/mdx/mdx.aspect.ts index 06eea34e0758..e8b6d4e7484b 100644 --- a/scopes/mdx/mdx/mdx.aspect.ts +++ b/scopes/mdx/mdx/mdx.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const MDXAspect = Aspect.create({ id: 'teambit.mdx/mdx', + runtimes: { main: () => import('./mdx.main.runtime') }, }); export default MDXAspect; diff --git a/scopes/mdx/readme/readme.aspect.ts b/scopes/mdx/readme/readme.aspect.ts index 2536d233bcdf..7b787d106531 100644 --- a/scopes/mdx/readme/readme.aspect.ts +++ b/scopes/mdx/readme/readme.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ReadmeAspect = Aspect.create({ id: 'teambit.mdx/readme', + runtimes: { main: () => import('./readme.main.runtime') }, }); diff --git a/scopes/pipelines/builder/builder.aspect.ts b/scopes/pipelines/builder/builder.aspect.ts index 8cc94250c854..178f7042dc37 100644 --- a/scopes/pipelines/builder/builder.aspect.ts +++ b/scopes/pipelines/builder/builder.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const BuilderAspect = Aspect.create({ id: 'teambit.pipelines/builder', + runtimes: { main: () => import('./builder.main.runtime') }, }); diff --git a/scopes/pkg/pkg/index.ts b/scopes/pkg/pkg/index.ts index df73068479fd..0ca8c5dc2b25 100644 --- a/scopes/pkg/pkg/index.ts +++ b/scopes/pkg/pkg/index.ts @@ -9,4 +9,6 @@ export type { PackageDependency, PackageDependencyFactory } from './package-depe export type { PackageEnv } from './package-env-type'; export { PackageGenerator, ModifyPackageJsonFunc } from './package-generator'; export { PkgAspect as default, PkgAspect } from './pkg.aspect'; -export { PkgUI } from './pkg.ui.runtime'; +// PkgUI value export removed — UI callers should import from +// './pkg.ui.runtime' (or the dist subpath) directly. +export type { PkgUI } from './pkg.ui.runtime'; diff --git a/scopes/pkg/pkg/pkg.aspect.ts b/scopes/pkg/pkg/pkg.aspect.ts index 06c8e5629e26..a9ad6130c4fd 100644 --- a/scopes/pkg/pkg/pkg.aspect.ts +++ b/scopes/pkg/pkg/pkg.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PkgAspect = Aspect.create({ id: 'teambit.pkg/pkg', + runtimes: { main: () => import('./pkg.main.runtime') }, }); export default PkgAspect; diff --git a/scopes/preview/preview/preview.aspect.ts b/scopes/preview/preview/preview.aspect.ts index b31992778f4c..2057349fc5a7 100644 --- a/scopes/preview/preview/preview.aspect.ts +++ b/scopes/preview/preview/preview.aspect.ts @@ -1,12 +1,11 @@ -import { Aspect, RuntimeDefinition } from '@teambit/harmony'; +import { RuntimeDefinition } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PreviewRuntime = new RuntimeDefinition('preview'); export const PreviewAspect = Aspect.create({ id: 'teambit.preview/preview', - dependencies: [], - defaultConfig: {}, - declareRuntime: PreviewRuntime, + runtimes: { main: () => import('./preview.main.runtime') }, }); export default PreviewAspect; diff --git a/scopes/react/react/react.aspect.ts b/scopes/react/react/react.aspect.ts index a7b9ab0ea6eb..d28b203821c9 100644 --- a/scopes/react/react/react.aspect.ts +++ b/scopes/react/react/react.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ReactAspect = Aspect.create({ id: 'teambit.react/react', + runtimes: { main: () => import('./react.main.runtime') }, }); export default ReactAspect; diff --git a/scopes/scope/export/export-cmd.ts b/scopes/scope/export/export-cmd.ts index d2a2a19c01fe..a82e79743b96 100644 --- a/scopes/scope/export/export-cmd.ts +++ b/scopes/scope/export/export-cmd.ts @@ -7,61 +7,19 @@ import chalk from 'chalk'; import { isEmpty } from 'lodash'; import type { ComponentID } from '@teambit/component-id'; import type { ExportMain, ExportResult } from './export.main.runtime'; +import { exportCommand } from './export.commands'; export class ExportCmd implements Command { - name = 'export [component-patterns...]'; - description = 'upload components to remote scopes'; - arguments = [ - { - name: 'component-patterns...', - description: `(not recommended) ${COMPONENT_PATTERN_HELP}`, - }, - ]; - extendedDescription = `uploads staged versions (snaps/tags) to remote scopes, making them available for consumption by other workspaces. -without arguments, exports all staged components. when on a lane, exports the lane as well. -exporting is the final step after development and versioning to share components with your team.`; - alias = 'e'; - helpUrl = 'reference/components/exporting-components'; - options = [ - ['e', 'eject', 'after export, remove the components from the workspace and install them as packages'], - [ - 'a', - 'all', - 'export all components, including non-staged (useful when components in the remote scope are corrupted or missing)', - ], - [ - '', - 'all-versions', - 'export not only staged versions but all of them (useful when versions in the remote scope are corrupted or missing)', - ], - [ - '', - 'origin-directly', - 'avoid export to the central hub, instead, export directly to the original scopes. not recommended!', - ], - [ - '', - 'resume ', - 'in case the previous export failed and suggested to resume with an export-id, enter the id', - ], - [ - '', - 'head-only', - 'in case previous export failed and locally it shows exported and only one snap/tag was created, try using this flag', - ], - [ - '', - 'ignore-missing-artifacts', - "don't throw an error when artifact files are missing. not recommended, unless you're sure the artifacts are in the remote", - ], - ['', 'fork-lane-new-scope', 'allow exporting a forked lane into a different scope than the original scope'], - ['', 'open-browser', 'open a browser once the export is completed in the cloud job url'], - ['', 'verbose', 'per exported component, show the versions being exported'], - ['j', 'json', 'show output in json format'], - ] as CommandOptions; - loader = true; - group = 'collaborate'; - remoteOp = true; + name = exportCommand.name; + description = exportCommand.description; + arguments = exportCommand.arguments; + extendedDescription = exportCommand.extendedDescription; + alias = exportCommand.alias; + helpUrl = exportCommand.helpUrl; + options = exportCommand.options; + loader = exportCommand.loader; + group = exportCommand.group; + remoteOp = exportCommand.remoteOp; constructor(private exportMain: ExportMain) {} diff --git a/scopes/scope/export/export.aspect.ts b/scopes/scope/export/export.aspect.ts index 4e9229913a0b..95c5081181e7 100644 --- a/scopes/scope/export/export.aspect.ts +++ b/scopes/scope/export/export.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ExportAspect = Aspect.create({ id: 'teambit.scope/export', + runtimes: { main: () => import('./export.main.runtime') }, + commands: () => import('./export.commands').then((m) => [m.resumeExportCommand, m.exportCommand]), }); diff --git a/scopes/scope/export/export.commands.ts b/scopes/scope/export/export.commands.ts new file mode 100644 index 000000000000..456795c3e311 --- /dev/null +++ b/scopes/scope/export/export.commands.ts @@ -0,0 +1,82 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const resumeExportCommand: CommandDescriptor = { + name: 'resume-export ', + alias: '', + description: 'EXPERIMENTAL. resume failed export', + extendedDescription: `resume failed export to persist the pending objects on the given remotes. + the export-id is the id the client received in the error message during the failure. + alternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id`, + group: 'advanced', + private: true, + remoteOp: true, + loader: true, + options: [] as CommandOptions, +}; + +export const exportCommand: CommandDescriptor = { + name: 'export [component-patterns...]', + alias: 'e', + description: 'upload components to remote scopes', + extendedDescription: `uploads staged versions (snaps/tags) to remote scopes, making them available for consumption by other workspaces. + without arguments, exports all staged components. when on a lane, exports the lane as well. + exporting is the final step after development and versioning to share components with your team.`, + helpUrl: 'reference/components/exporting-components', + group: 'collaborate', + arguments: [ + { + name: 'component-patterns...', + description: `(not recommended) ${COMPONENT_PATTERN_HELP}`, + }, + ], + remoteOp: true, + loader: true, + options: [ + ['e', 'eject', 'after export, remove the components from the workspace and install them as packages'], + [ + 'a', + 'all', + 'export all components, including non-staged (useful when components in the remote scope are corrupted or missing)', + ], + [ + '', + 'all-versions', + 'export not only staged versions but all of them (useful when versions in the remote scope are corrupted or missing)', + ], + [ + '', + 'origin-directly', + 'avoid export to the central hub, instead, export directly to the original scopes. not recommended!', + ], + [ + '', + 'resume ', + 'in case the previous export failed and suggested to resume with an export-id, enter the id', + ], + [ + '', + 'head-only', + 'in case previous export failed and locally it shows exported and only one snap/tag was created, try using this flag', + ], + [ + '', + 'ignore-missing-artifacts', + "don't throw an error when artifact files are missing. not recommended, unless you're sure the artifacts are in the remote", + ], + ['', 'fork-lane-new-scope', 'allow exporting a forked lane into a different scope than the original scope'], + ['', 'open-browser', 'open a browser once the export is completed in the cloud job url'], + ['', 'verbose', 'per exported component, show the versions being exported'], + ['j', 'json', 'show output in json format'], + ] as CommandOptions, +}; diff --git a/scopes/scope/export/export.main.runtime.ts b/scopes/scope/export/export.main.runtime.ts index 975f2a713e45..f0c12222c730 100644 --- a/scopes/scope/export/export.main.runtime.ts +++ b/scopes/scope/export/export.main.runtime.ts @@ -40,6 +40,7 @@ import { getAllVersionHashes } from '@teambit/component.snap-distance'; import { ExportAspect } from './export.aspect'; import { ExportCmd } from './export-cmd'; import { ResumeExportCmd } from './resume-export-cmd'; +import { exportCommand, resumeExportCommand } from './export.commands'; export type OnExportIdTransformer = (id: ComponentID) => ComponentID; @@ -823,7 +824,8 @@ ${localOnlyExportPending.map((c) => c.toString()).join('\n')}`); ]) { const logger = loggerMain.createLogger(ExportAspect.id); const exportMain = new ExportMain(workspace, remove, depResolver, logger, eject); - cli.register(new ResumeExportCmd(scope), new ExportCmd(exportMain)); + cli.register(resumeExportCommand, () => new ResumeExportCmd(scope)); + cli.register(exportCommand, () => new ExportCmd(exportMain)); return exportMain; } } diff --git a/scopes/scope/export/resume-export-cmd.ts b/scopes/scope/export/resume-export-cmd.ts index a532fa3db49f..88640f9d1c10 100644 --- a/scopes/scope/export/resume-export-cmd.ts +++ b/scopes/scope/export/resume-export-cmd.ts @@ -2,19 +2,18 @@ import chalk from 'chalk'; import type { Command, CommandOptions } from '@teambit/cli'; import type { ScopeMain } from '@teambit/scope'; import { resumeExport } from './export-scope-components'; +import { resumeExportCommand } from './export.commands'; export class ResumeExportCmd implements Command { - name = 'resume-export '; - description = 'EXPERIMENTAL. resume failed export'; - extendedDescription = `resume failed export to persist the pending objects on the given remotes. -the export-id is the id the client received in the error message during the failure. -alternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id`; - alias = ''; - options = [] as CommandOptions; - loader = true; - group = 'advanced'; - private = true; - remoteOp = true; + name = resumeExportCommand.name; + description = resumeExportCommand.description; + extendedDescription = resumeExportCommand.extendedDescription; + alias = resumeExportCommand.alias; + options = resumeExportCommand.options; + loader = resumeExportCommand.loader; + group = resumeExportCommand.group; + private = resumeExportCommand.private; + remoteOp = resumeExportCommand.remoteOp; constructor(private scope: ScopeMain) {} diff --git a/scopes/scope/importer/fetch-cmd.ts b/scopes/scope/importer/fetch-cmd.ts index d5a37b8d0e78..4d80f37c21d3 100644 --- a/scopes/scope/importer/fetch-cmd.ts +++ b/scopes/scope/importer/fetch-cmd.ts @@ -5,30 +5,17 @@ import type { ComponentID } from '@teambit/component-id'; import { FileStatus } from '@teambit/component.modules.merge-helper'; import type { ImporterMain } from './importer.main.runtime'; import type { ImportDetails, ImportStatus } from './import-components'; +import { fetchCommand } from './importer.commands'; export class FetchCmd implements Command { - name = 'fetch [ids...]'; - description = `fetch remote objects and store locally`; - extendedDescription = `for lanes, use "/" as a separator between the remote and the lane name, e.g. teambit.ui/fix-button`; - group = 'collaborate'; - alias = ''; - private = true; - options = [ - [ - 'l', - 'lanes', - 'fetch component objects from lanes. note, it does not save the remote lanes objects locally, only the refs', - ], - ['c', 'components', 'fetch components'], - ['', 'all-history', 'for each component, fetch all its versions. by default, only the latest version is fetched'], - ['j', 'json', 'return the output as JSON'], - [ - '', - 'from-original-scopes', - 'fetch indirect dependencies from their original scope as opposed to from their dependents', - ], - ] as CommandOptions; - loader = true; + name = fetchCommand.name; + description = fetchCommand.description; + extendedDescription = fetchCommand.extendedDescription; + group = fetchCommand.group; + alias = fetchCommand.alias; + private = fetchCommand.private; + options = fetchCommand.options; + loader = fetchCommand.loader; constructor(private importer: ImporterMain) {} diff --git a/scopes/scope/importer/import.cmd.ts b/scopes/scope/importer/import.cmd.ts index 1848892fddb0..ef371a712296 100644 --- a/scopes/scope/importer/import.cmd.ts +++ b/scopes/scope/importer/import.cmd.ts @@ -9,6 +9,7 @@ import { errorSymbol, joinSections, } from '@teambit/cli'; +import { importCommand } from './importer.commands'; import chalk from 'chalk'; import { uniq } from 'lodash'; import type { MergeStrategy } from '@teambit/component.modules.merge-helper'; @@ -56,106 +57,16 @@ type ImportFlags = { }; export class ImportCmd implements Command { - name = 'import [component-patterns...]'; - description = 'bring components from remote scopes into your workspace'; - helpUrl = 'reference/components/importing-components'; - arguments = [ - { - name: 'component-patterns...', - description: - 'component IDs or component patterns (separated by space). Use patterns to import groups of components using a common scope or namespace. E.g., "utils/*" (wrap with double quotes)', - }, - ]; - extendedDescription = `brings component source files from remote scopes into your workspace and installs their dependencies as packages. -supports pattern matching for bulk imports, merge strategies for handling conflicts, and various optimization options. -without arguments, fetches all workspace components' latest versions from their remote scopes.`; - group = 'collaborate'; - alias = ''; - options = [ - ['p', 'path ', 'import components into a specific directory (a relative path in the workspace)'], - [ - 'o', - 'objects', - 'import components objects to the local scope without checkout (without writing them to the file system). This is the default behavior for import with no id argument', - ], - ['O', 'override', 'override local changes'], - ['v', 'verbose', 'show verbose output for inspection'], - ['j', 'json', 'return the output as JSON'], - // ['', 'conf', 'write the configuration file (component.json) of the component'], // not working. need to fix once ComponentWriter is moved to Harmony - ['x', 'skip-dependency-installation', 'do not auto-install dependencies of the imported components'], - ['', 'skip-write-config-files', 'do not write config files (such as eslint, tsconfig, prettier, etc...)'], - [ - 'm', - 'merge [strategy]', - 'merge local changes with the imported version. strategy should be "theirs", "ours" or "manual"', - ], - [ - '', - 'dependencies', - 'import all dependencies (bit components only) of imported components and write them to the workspace', - ], - ['', 'dependencies-head', 'same as --dependencies, except it imports the dependencies with their head version'], - [ - '', - 'dependents', - 'import components found while traversing from the imported components upwards to the workspace components', - ], - [ - '', - 'dependents-via ', - 'same as --dependents except the traversal must go through the specified component. to specify multiple components, wrap with quotes and separate by a comma', - ], - [ - '', - 'dependents-all', - 'same as --dependents except not prompting for selecting paths but rather selecting all paths and showing final confirmation before importing', - ], - [ - '', - 'dependents-dry-run', - 'DEPRECATED. (this is the default now). same as --dependents, except it prints the found dependents and wait for confirmation before importing them', - ], - ['', 'silent', 'no prompt for --dependents/--dependents-via flags'], - [ - '', - 'filter-envs ', - 'only import components that have the specified environment (e.g., "teambit.react/react-env")', - ], - [ - '', - 'save-in-lane', - 'when checked out to a lane and the component is not on the remote-lane, save it in the lane (defaults to save on main)', - ], - [ - '', - 'all-history', - 'relevant for fetching all components objects. avoid optimizations, fetch all history versions, always', - ], - [ - '', - 'fetch-deps', - 'fetch dependencies (bit components) objects to the local scope, but dont add to the workspace. Useful to resolve errors about missing dependency data', - ], - [ - '', - 'write-deps ', - 'write all workspace component dependencies to the specified target ("package.json" or "workspace.jsonc"), resolving conflicts by picking the ranges that match the highest versions', - ], - [ - '', - 'track-only', - 'do not write any component files, just create .bitmap entries of the imported components. Useful when the files already exist and just want to re-add the component to the bitmap', - ], - ['', 'include-deprecated', 'when importing with patterns, include deprecated components (default to exclude them)'], - [ - '', - 'lane-only', - 'when using wildcards on a lane, only import components that exist on the lane (never from main)', - ], - ['', 'owner', 'treat the argument as an owner name and import all components from all scopes of that owner'], - ] as CommandOptions; - loader = true; - remoteOp = true; + name = importCommand.name; + description = importCommand.description; + helpUrl = importCommand.helpUrl; + arguments = importCommand.arguments; + extendedDescription = importCommand.extendedDescription; + group = importCommand.group; + alias = importCommand.alias; + options = importCommand.options; + loader = importCommand.loader; + remoteOp = importCommand.remoteOp; _packageManagerArgs: string[]; // gets populated by yargs-adapter.handler(). constructor(private importer: ImporterMain) {} diff --git a/scopes/scope/importer/importer.aspect.ts b/scopes/scope/importer/importer.aspect.ts index 20c53274cba1..636745b1930a 100644 --- a/scopes/scope/importer/importer.aspect.ts +++ b/scopes/scope/importer/importer.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ImporterAspect = Aspect.create({ id: 'teambit.scope/importer', + runtimes: { main: () => import('./importer.main.runtime') }, + commands: () => import('./importer.commands').then((m) => [m.importCommand, m.fetchCommand]), }); diff --git a/scopes/scope/importer/importer.commands.ts b/scopes/scope/importer/importer.commands.ts new file mode 100644 index 000000000000..dad000bf6242 --- /dev/null +++ b/scopes/scope/importer/importer.commands.ts @@ -0,0 +1,139 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const importCommand: CommandDescriptor = { + name: 'import [component-patterns...]', + alias: '', + description: 'bring components from remote scopes into your workspace', + extendedDescription: `brings component source files from remote scopes into your workspace and installs their dependencies as packages. + supports pattern matching for bulk imports, merge strategies for handling conflicts, and various optimization options. + without arguments, fetches all workspace components' latest versions from their remote scopes.`, + helpUrl: 'reference/components/importing-components', + group: 'collaborate', + arguments: [ + { + name: 'component-patterns...', + description: + 'component IDs or component patterns (separated by space). Use patterns to import groups of components using a common scope or namespace. E.g., "utils/*" (wrap with double quotes)', + }, + ], + remoteOp: true, + loader: true, + options: [ + ['p', 'path ', 'import components into a specific directory (a relative path in the workspace)'], + [ + 'o', + 'objects', + 'import components objects to the local scope without checkout (without writing them to the file system). This is the default behavior for import with no id argument', + ], + ['O', 'override', 'override local changes'], + ['v', 'verbose', 'show verbose output for inspection'], + ['j', 'json', 'return the output as JSON'], + // ['', 'conf', 'write the configuration file (component.json) of the component'], // not working. need to fix once ComponentWriter is moved to Harmony + ['x', 'skip-dependency-installation', 'do not auto-install dependencies of the imported components'], + ['', 'skip-write-config-files', 'do not write config files (such as eslint, tsconfig, prettier, etc...)'], + [ + 'm', + 'merge [strategy]', + 'merge local changes with the imported version. strategy should be "theirs", "ours" or "manual"', + ], + [ + '', + 'dependencies', + 'import all dependencies (bit components only) of imported components and write them to the workspace', + ], + ['', 'dependencies-head', 'same as --dependencies, except it imports the dependencies with their head version'], + [ + '', + 'dependents', + 'import components found while traversing from the imported components upwards to the workspace components', + ], + [ + '', + 'dependents-via ', + 'same as --dependents except the traversal must go through the specified component. to specify multiple components, wrap with quotes and separate by a comma', + ], + [ + '', + 'dependents-all', + 'same as --dependents except not prompting for selecting paths but rather selecting all paths and showing final confirmation before importing', + ], + [ + '', + 'dependents-dry-run', + 'DEPRECATED. (this is the default now). same as --dependents, except it prints the found dependents and wait for confirmation before importing them', + ], + ['', 'silent', 'no prompt for --dependents/--dependents-via flags'], + [ + '', + 'filter-envs ', + 'only import components that have the specified environment (e.g., "teambit.react/react-env")', + ], + [ + '', + 'save-in-lane', + 'when checked out to a lane and the component is not on the remote-lane, save it in the lane (defaults to save on main)', + ], + [ + '', + 'all-history', + 'relevant for fetching all components objects. avoid optimizations, fetch all history versions, always', + ], + [ + '', + 'fetch-deps', + 'fetch dependencies (bit components) objects to the local scope, but dont add to the workspace. Useful to resolve errors about missing dependency data', + ], + [ + '', + 'write-deps ', + 'write all workspace component dependencies to the specified target ("package.json" or "workspace.jsonc"), resolving conflicts by picking the ranges that match the highest versions', + ], + [ + '', + 'track-only', + 'do not write any component files, just create .bitmap entries of the imported components. Useful when the files already exist and just want to re-add the component to the bitmap', + ], + ['', 'include-deprecated', 'when importing with patterns, include deprecated components (default to exclude them)'], + [ + '', + 'lane-only', + 'when using wildcards on a lane, only import components that exist on the lane (never from main)', + ], + ['', 'owner', 'treat the argument as an owner name and import all components from all scopes of that owner'], + ] as CommandOptions, +}; + +export const fetchCommand: CommandDescriptor = { + name: 'fetch [ids...]', + alias: '', + description: `fetch remote objects and store locally`, + extendedDescription: `for lanes, use "/" as a separator between the remote and the lane name, e.g. teambit.ui/fix-button`, + group: 'collaborate', + private: true, + loader: true, + options: [ + [ + 'l', + 'lanes', + 'fetch component objects from lanes. note, it does not save the remote lanes objects locally, only the refs', + ], + ['c', 'components', 'fetch components'], + ['', 'all-history', 'for each component, fetch all its versions. by default, only the latest version is fetched'], + ['j', 'json', 'return the output as JSON'], + [ + '', + 'from-original-scopes', + 'fetch indirect dependencies from their original scope as opposed to from their dependents', + ], + ] as CommandOptions, +}; diff --git a/scopes/scope/importer/importer.main.runtime.ts b/scopes/scope/importer/importer.main.runtime.ts index c7c7cbd4fc4a..f69f25f7c4d8 100644 --- a/scopes/scope/importer/importer.main.runtime.ts +++ b/scopes/scope/importer/importer.main.runtime.ts @@ -36,6 +36,7 @@ import type { ImportOptions, ImportResult } from './import-components'; import ImportComponents from './import-components'; import type { ListerMain } from '@teambit/lister'; import { ListerAspect } from '@teambit/lister'; +import { fetchCommand, importCommand } from './importer.commands'; export class ImporterMain { constructor( @@ -443,7 +444,8 @@ export class ImporterMain { install.registerPreLink(async (opts) => { if (opts?.fetchObject) await importerMain.importCurrentObjects(); }); - cli.register(new ImportCmd(importerMain), new FetchCmd(importerMain)); + cli.register(importCommand, () => new ImportCmd(importerMain)); + cli.register(fetchCommand, () => new FetchCmd(importerMain)); return importerMain; } } diff --git a/scopes/scope/objects/objects.aspect.ts b/scopes/scope/objects/objects.aspect.ts index 4a8befe8f1d7..e524c6174aa6 100644 --- a/scopes/scope/objects/objects.aspect.ts +++ b/scopes/scope/objects/objects.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ObjectsAspect = Aspect.create({ id: 'teambit.scope/objects', + runtimes: { main: () => import('./objects.main.runtime') }, }); diff --git a/scopes/scope/scope/index.ts b/scopes/scope/scope/index.ts index 32830f9cd35e..d9ee23b983f8 100644 --- a/scopes/scope/scope/index.ts +++ b/scopes/scope/scope/index.ts @@ -1,10 +1,12 @@ import { ScopeAspect } from './scope.aspect'; export { ComponentNotFound, NoIdMatchPattern } from './exceptions'; -export { ScopeComponentCard } from './ui/scope-overview/scope-overview'; +// UI value exports removed from this barrel: +// - ScopeComponentCard (was: './ui/scope-overview/scope-overview') +// - ScopeContext (was: '@teambit/scope.ui.hooks.scope-context') +// UI callers should import from those paths directly. export type { ScopeMain } from './scope.main.runtime'; export type { ScopeModel } from '@teambit/scope.models.scope-model'; -export { ScopeContext } from '@teambit/scope.ui.hooks.scope-context'; export type { StagedConfig } from './staged-config'; export type { ScopeUI, ScopeBadgeSlot, ScopeOverview, ScopeOverviewSlot, OverviewLineSlot } from './scope.ui.runtime'; export { ScopeAspect }; diff --git a/scopes/scope/scope/scope.aspect.ts b/scopes/scope/scope/scope.aspect.ts index f47722485d39..c31ffa1b6154 100644 --- a/scopes/scope/scope/scope.aspect.ts +++ b/scopes/scope/scope/scope.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ScopeAspect = Aspect.create({ id: 'teambit.scope/scope', + runtimes: { main: () => import('./scope.main.runtime') }, }); export default ScopeAspect; diff --git a/scopes/scope/version-history/cat-version-history-cmd.ts b/scopes/scope/version-history/cat-version-history-cmd.ts index a8ec1a7da53c..0d1622499400 100644 --- a/scopes/scope/version-history/cat-version-history-cmd.ts +++ b/scopes/scope/version-history/cat-version-history-cmd.ts @@ -1,17 +1,15 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { catVersionHistory } from './cat-version-history'; +import { catVersionHistoryCommand } from './version-history.commands'; export class CatVersionHistoryCmd implements Command { - name = 'cat-version-history '; - description = 'cat version-history object by component-id'; - private = true; - alias = 'cvh'; - loadAspects = false; - options = [ - // json is also the default for this command. it's only needed to suppress the logger.console - ['j', 'json', 'json format'], - ] as CommandOptions; - group = 'advanced'; + name = catVersionHistoryCommand.name; + description = catVersionHistoryCommand.description; + private = catVersionHistoryCommand.private; + alias = catVersionHistoryCommand.alias; + loadAspects = catVersionHistoryCommand.loadAspects; + options = catVersionHistoryCommand.options; + group = catVersionHistoryCommand.group; async report([id]: [string]) { const result = await catVersionHistory(id); diff --git a/scopes/scope/version-history/version-history.aspect.ts b/scopes/scope/version-history/version-history.aspect.ts index 4f00ec678615..a6bca04cadc0 100644 --- a/scopes/scope/version-history/version-history.aspect.ts +++ b/scopes/scope/version-history/version-history.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const VersionHistoryAspect = Aspect.create({ id: 'teambit.scope/version-history', + runtimes: { main: () => import('./version-history.main.runtime') }, + commands: () => import('./version-history.commands').then((m) => [m.catVersionHistoryCommand]), }); diff --git a/scopes/scope/version-history/version-history.commands.ts b/scopes/scope/version-history/version-history.commands.ts new file mode 100644 index 000000000000..7fcc1b85d086 --- /dev/null +++ b/scopes/scope/version-history/version-history.commands.ts @@ -0,0 +1,24 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const catVersionHistoryCommand: CommandDescriptor = { + name: 'cat-version-history ', + alias: 'cvh', + description: 'cat version-history object by component-id', + group: 'advanced', + private: true, + loadAspects: false, + options: [ + // json is also the default for this command. it's only needed to suppress the logger.console + ['j', 'json', 'json format'], + ] as CommandOptions, +}; diff --git a/scopes/scope/version-history/version-history.main.runtime.ts b/scopes/scope/version-history/version-history.main.runtime.ts index 7f6578f2e2ff..12ab56486cc0 100644 --- a/scopes/scope/version-history/version-history.main.runtime.ts +++ b/scopes/scope/version-history/version-history.main.runtime.ts @@ -10,6 +10,7 @@ import { VersionHistoryGraphCmd, VersionHistoryShowCmd, } from './version-history-cmd'; +import { catVersionHistoryCommand } from './version-history.commands'; import type { ScopeMain } from '@teambit/scope'; import { ScopeAspect } from '@teambit/scope'; import type { ComponentID } from '@teambit/component-id'; @@ -174,7 +175,7 @@ export class VersionHistoryMain { new VersionHistoryShowCmd(versionHistory), new VersionHistoryBuildCmd(versionHistory), ]; - cli.register(versionHistoryCmd, new CatVersionHistoryCmd()); + cli.register(catVersionHistoryCommand, () => new CatVersionHistoryCmd()); ExternalActions.externalActions.push(new BuildVersionHistoryAction(versionHistory)); return versionHistory; } diff --git a/scopes/semantics/schema/schema.aspect.ts b/scopes/semantics/schema/schema.aspect.ts index 4da4285b7f4c..28daeb025ea0 100644 --- a/scopes/semantics/schema/schema.aspect.ts +++ b/scopes/semantics/schema/schema.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const SchemaAspect = Aspect.create({ id: 'teambit.semantics/schema', + runtimes: { main: () => import('./schema.main.runtime') }, }); diff --git a/scopes/typescript/typescript/typescript.aspect.ts b/scopes/typescript/typescript/typescript.aspect.ts index 5865bc456671..17ba0cdf020d 100644 --- a/scopes/typescript/typescript/typescript.aspect.ts +++ b/scopes/typescript/typescript/typescript.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const TypescriptAspect = Aspect.create({ id: 'teambit.typescript/typescript', + runtimes: { main: () => import('./typescript.main.runtime') }, }); diff --git a/scopes/ui-foundation/harmony-ui-app/harmony-ui-app/harmony-ui-app.aspect.ts b/scopes/ui-foundation/harmony-ui-app/harmony-ui-app/harmony-ui-app.aspect.ts index 5df2128da6b6..2ecb0192c5ce 100644 --- a/scopes/ui-foundation/harmony-ui-app/harmony-ui-app/harmony-ui-app.aspect.ts +++ b/scopes/ui-foundation/harmony-ui-app/harmony-ui-app/harmony-ui-app.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const HarmonyUiAppAspect = Aspect.create({ id: 'teambit.ui-foundation/harmony-ui-app', + runtimes: { main: () => import('./harmony-ui-app.main.runtime') }, }); diff --git a/scopes/ui-foundation/less/less.aspect.ts b/scopes/ui-foundation/less/less.aspect.ts index 2c332556d56c..f16d317b5d9e 100644 --- a/scopes/ui-foundation/less/less.aspect.ts +++ b/scopes/ui-foundation/less/less.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const LessAspect = Aspect.create({ id: 'teambit.ui-foundation/less', + runtimes: { main: () => import('./less.main.runtime') }, }); diff --git a/scopes/ui-foundation/notifications/aspect/notifications.aspect.ts b/scopes/ui-foundation/notifications/aspect/notifications.aspect.ts index d0de7103430c..361574474da0 100644 --- a/scopes/ui-foundation/notifications/aspect/notifications.aspect.ts +++ b/scopes/ui-foundation/notifications/aspect/notifications.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const NotificationsAspect = Aspect.create({ id: 'teambit.ui-foundation/notifications', + runtimes: { ui: () => import('./notification.ui.runtime') }, }); export default NotificationsAspect; diff --git a/scopes/ui-foundation/panels/index.ts b/scopes/ui-foundation/panels/index.ts index f4912b61d292..a0e85940418c 100644 --- a/scopes/ui-foundation/panels/index.ts +++ b/scopes/ui-foundation/panels/index.ts @@ -1,3 +1,3 @@ export type { PanelUIMain } from './panel-ui.main.runtime'; export { PanelUiAspect } from './panel-ui.aspect'; -export { TabContainer, Tab, TabList, TabPanel } from './ui/tabs'; +// UI value exports removed — UI callers should import from './ui/tabs' directly. diff --git a/scopes/ui-foundation/panels/panel-ui.aspect.ts b/scopes/ui-foundation/panels/panel-ui.aspect.ts index 0fe91e0523d5..5b144ad9cade 100644 --- a/scopes/ui-foundation/panels/panel-ui.aspect.ts +++ b/scopes/ui-foundation/panels/panel-ui.aspect.ts @@ -1,7 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const PanelUiAspect = Aspect.create({ id: 'teambit.ui-foundation/panels', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./panel-ui.main.runtime') }, }); diff --git a/scopes/ui-foundation/react-router/react-router/react-router.aspect.ts b/scopes/ui-foundation/react-router/react-router/react-router.aspect.ts index fa2c9b618d57..2ded9c818549 100644 --- a/scopes/ui-foundation/react-router/react-router/react-router.aspect.ts +++ b/scopes/ui-foundation/react-router/react-router/react-router.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ReactRouterAspect = Aspect.create({ id: 'teambit.ui-foundation/react-router', + runtimes: { ui: () => import('./react-router.ui.runtime') }, }); export default ReactRouterAspect; diff --git a/scopes/ui-foundation/sass/sass.aspect.ts b/scopes/ui-foundation/sass/sass.aspect.ts index a31149fd413e..b6f572517e8d 100644 --- a/scopes/ui-foundation/sass/sass.aspect.ts +++ b/scopes/ui-foundation/sass/sass.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const SassAspect = Aspect.create({ id: 'teambit.ui-foundation/sass', + runtimes: { main: () => import('./sass.main.runtime') }, }); diff --git a/scopes/ui-foundation/sidebar/sidebar.aspect.ts b/scopes/ui-foundation/sidebar/sidebar.aspect.ts index 0973bff66d13..eacccf564389 100644 --- a/scopes/ui-foundation/sidebar/sidebar.aspect.ts +++ b/scopes/ui-foundation/sidebar/sidebar.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const SidebarAspect = Aspect.create({ id: 'teambit.ui-foundation/sidebar', + runtimes: { ui: () => import('./sidebar.ui.runtime') }, }); export default SidebarAspect; diff --git a/scopes/ui-foundation/ui/ui.aspect.ts b/scopes/ui-foundation/ui/ui.aspect.ts index 4f49ab141903..9d8a7eacd149 100644 --- a/scopes/ui-foundation/ui/ui.aspect.ts +++ b/scopes/ui-foundation/ui/ui.aspect.ts @@ -1,10 +1,11 @@ -import { Aspect, RuntimeDefinition } from '@teambit/harmony'; +import { RuntimeDefinition } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const UIRuntime = new RuntimeDefinition('ui'); export const UIAspect = Aspect.create({ id: 'teambit.ui-foundation/ui', - declareRuntime: UIRuntime, + runtimes: { main: () => import('./ui.main.runtime') }, }); export default UIAspect; diff --git a/scopes/ui-foundation/user-agent/user-agent.aspect.ts b/scopes/ui-foundation/user-agent/user-agent.aspect.ts index e051962bdc78..3482b3472e54 100644 --- a/scopes/ui-foundation/user-agent/user-agent.aspect.ts +++ b/scopes/ui-foundation/user-agent/user-agent.aspect.ts @@ -1,7 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const UserAgentAspect = Aspect.create({ id: 'teambit.ui-foundation/user-agent', + runtimes: { ui: () => import('./user-agent.ui.runtime') }, }); export default UserAgentAspect; diff --git a/scopes/vue/vue/vue.aspect.ts b/scopes/vue/vue/vue.aspect.ts index a71c6fe28bc1..11c14ae44e95 100644 --- a/scopes/vue/vue/vue.aspect.ts +++ b/scopes/vue/vue/vue.aspect.ts @@ -1,7 +1,11 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const VueAspect = Aspect.create({ id: 'teambit.vue/vue-aspect', + runtimes: { + main: () => import('./vue.main.runtime'), + ui: () => import('./vue.ui.runtime'), + }, }); export default VueAspect; diff --git a/scopes/webpack/module-federation/module-federation.aspect.ts b/scopes/webpack/module-federation/module-federation.aspect.ts index 85341230a4bf..ba837290cd96 100644 --- a/scopes/webpack/module-federation/module-federation.aspect.ts +++ b/scopes/webpack/module-federation/module-federation.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ModuleFederationAspect = Aspect.create({ id: 'teambit.webpack/module-federation', + runtimes: { main: () => import('./module-federation.main.runtime') }, }); diff --git a/scopes/webpack/webpack/webpack.aspect.ts b/scopes/webpack/webpack/webpack.aspect.ts index 86761a87d377..cedcfdc7e58a 100644 --- a/scopes/webpack/webpack/webpack.aspect.ts +++ b/scopes/webpack/webpack/webpack.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const WebpackAspect = Aspect.create({ id: 'teambit.webpack/webpack', + runtimes: { main: () => import('./webpack.main.runtime') }, }); diff --git a/scopes/workspace/clear-cache/clear-cache-cmd.ts b/scopes/workspace/clear-cache/clear-cache-cmd.ts index 91ec7d77f92d..187859703bc5 100644 --- a/scopes/workspace/clear-cache/clear-cache-cmd.ts +++ b/scopes/workspace/clear-cache/clear-cache-cmd.ts @@ -1,17 +1,18 @@ import type { Command, CommandOptions } from '@teambit/cli'; import { formatTitle, formatItem, formatSuccessSummary, errorSymbol, joinSections } from '@teambit/cli'; import type { ClearCacheMain } from './clear-cache.main.runtime'; +import { clearCacheCommand } from './clear-cache.commands'; export default class ClearCacheCmd implements Command { - name = 'clear-cache'; - description = 'remove cached data to resolve stale data issues'; - group = 'system'; + name = clearCacheCommand.name; + description = clearCacheCommand.description; + group = clearCacheCommand.group; extendedDescription: string; - alias = 'cc'; - options = [['r', 'remote ', 'clear memory cache from a remote scope']] as CommandOptions; - loader = false; - skipWorkspace = true; - helpUrl = 'reference/workspace/clearing-cache'; + alias = clearCacheCommand.alias; + options = clearCacheCommand.options; + loader = clearCacheCommand.loader; + skipWorkspace = clearCacheCommand.skipWorkspace; + helpUrl = clearCacheCommand.helpUrl; constructor(private clearCache: ClearCacheMain) { this.extendedDescription = `clears various caches that Bit uses to improve performance. useful when experiencing stale data issues or diff --git a/scopes/workspace/clear-cache/clear-cache.aspect.ts b/scopes/workspace/clear-cache/clear-cache.aspect.ts index c05f46a023b8..f3de357d9fbd 100644 --- a/scopes/workspace/clear-cache/clear-cache.aspect.ts +++ b/scopes/workspace/clear-cache/clear-cache.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ClearCacheAspect = Aspect.create({ id: 'teambit.bit/clear-cache', + runtimes: { main: () => import('./clear-cache.main.runtime') }, + commands: () => import('./clear-cache.commands').then((m) => [m.clearCacheCommand]), }); diff --git a/scopes/workspace/clear-cache/clear-cache.commands.ts b/scopes/workspace/clear-cache/clear-cache.commands.ts new file mode 100644 index 000000000000..52ac13870e9e --- /dev/null +++ b/scopes/workspace/clear-cache/clear-cache.commands.ts @@ -0,0 +1,22 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const clearCacheCommand: CommandDescriptor = { + name: 'clear-cache', + alias: 'cc', + description: 'remove cached data to resolve stale data issues', + helpUrl: 'reference/workspace/clearing-cache', + group: 'system', + skipWorkspace: true, + loader: false, + options: [['r', 'remote ', 'clear memory cache from a remote scope']] as CommandOptions, +}; diff --git a/scopes/workspace/clear-cache/clear-cache.main.runtime.ts b/scopes/workspace/clear-cache/clear-cache.main.runtime.ts index ef7c790a5c44..e9b2caabeaf9 100644 --- a/scopes/workspace/clear-cache/clear-cache.main.runtime.ts +++ b/scopes/workspace/clear-cache/clear-cache.main.runtime.ts @@ -7,6 +7,7 @@ import ClearCacheCmd from './clear-cache-cmd'; import { ClearCacheAspect } from './clear-cache.aspect'; import type { CacheClearResult } from './clear-cache'; import { clearCache } from './clear-cache'; +import { clearCacheCommand } from './clear-cache.commands'; /** * avoid adding `workspace` / `scope` aspects as dependencies to this aspect. @@ -37,7 +38,7 @@ export class ClearCacheMain { static runtime = MainRuntime; static async provider([cli]: [CLIMain]) { const clearCacheMain = new ClearCacheMain(); - cli.register(new ClearCacheCmd(clearCacheMain)); + cli.register(clearCacheCommand, () => new ClearCacheCmd(clearCacheMain)); return clearCacheMain; } } diff --git a/scopes/workspace/config-merger/config-merger.aspect.ts b/scopes/workspace/config-merger/config-merger.aspect.ts index 52c87c6a1110..677d4afa5a32 100644 --- a/scopes/workspace/config-merger/config-merger.aspect.ts +++ b/scopes/workspace/config-merger/config-merger.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ConfigMergerAspect = Aspect.create({ id: 'teambit.workspace/config-merger', + runtimes: { main: () => import('./config-merger.main.runtime') }, }); diff --git a/scopes/workspace/eject/eject-cmd.ts b/scopes/workspace/eject/eject-cmd.ts index 7f7209a6102c..5a40b9895ef7 100644 --- a/scopes/workspace/eject/eject-cmd.ts +++ b/scopes/workspace/eject/eject-cmd.ts @@ -3,33 +3,18 @@ import type { Workspace } from '@teambit/workspace'; import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; import { ejectTemplate } from './eject-template'; import type { EjectMain } from './eject.main.runtime'; +import { ejectCommand } from './eject.commands'; export class EjectCmd implements Command { - name = 'eject '; - description = 'remove component from workspace and install it as npm package'; - extendedDescription = `converts workspace components to external npm packages by removing them from .bitmap and installing via package manager. -by default removes component files from workspace. use --keep-files to preserve source code while converting to package dependency. -useful for components that no longer need active development in current workspace.`; - helpUrl = 'reference/components/exporting-components#ejecting-components'; - arguments = [ - { - name: 'component-pattern', - description: COMPONENT_PATTERN_HELP, - }, - ]; - alias = 'E'; - options = [ - [ - 'f', - 'force', - 'ignore local changes/versions. eject component/s even when they are staged or modified. Note: unexported tags/snaps will be lost', - ], - ['x', 'skip-dependency-installation', 'do not auto-install dependencies'], - ['j', 'json', 'print the results in JSON format'], - ['', 'keep-files', 'keep the component files in the workspace intact'], - ] as CommandOptions; - loader = true; - group = 'dependencies'; + name = ejectCommand.name; + description = ejectCommand.description; + extendedDescription = ejectCommand.extendedDescription; + helpUrl = ejectCommand.helpUrl; + arguments = ejectCommand.arguments; + alias = ejectCommand.alias; + options = ejectCommand.options; + loader = ejectCommand.loader; + group = ejectCommand.group; constructor( private ejectMain: EjectMain, diff --git a/scopes/workspace/eject/eject.aspect.ts b/scopes/workspace/eject/eject.aspect.ts index 84020e340dbb..70ee5d7840c5 100644 --- a/scopes/workspace/eject/eject.aspect.ts +++ b/scopes/workspace/eject/eject.aspect.ts @@ -1,5 +1,7 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const EjectAspect = Aspect.create({ id: 'teambit.workspace/eject', + runtimes: { main: () => import('./eject.main.runtime') }, + commands: () => import('./eject.commands').then((m) => [m.ejectCommand]), }); diff --git a/scopes/workspace/eject/eject.commands.ts b/scopes/workspace/eject/eject.commands.ts new file mode 100644 index 000000000000..f1f8cf782104 --- /dev/null +++ b/scopes/workspace/eject/eject.commands.ts @@ -0,0 +1,40 @@ +import type { CommandDescriptor, CommandOptions } from '@teambit/cli'; +import { COMPONENT_PATTERN_HELP } from '@teambit/legacy.constants'; + +/** + * Declarative command descriptors for this aspect. + * + * Part of the ESM Migration with Lazy-Loaded Aspects RFC + * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single + * source of truth for its command's static fields; the matching handler + * class reads these fields rather than redeclaring them, and + * `cli.register(descriptor, factory)` consumes the pair. + */ + +export const ejectCommand: CommandDescriptor = { + name: 'eject ', + alias: 'E', + description: 'remove component from workspace and install it as npm package', + extendedDescription: `converts workspace components to external npm packages by removing them from .bitmap and installing via package manager. + by default removes component files from workspace. use --keep-files to preserve source code while converting to package dependency. + useful for components that no longer need active development in current workspace.`, + helpUrl: 'reference/components/exporting-components#ejecting-components', + group: 'dependencies', + arguments: [ + { + name: 'component-pattern', + description: COMPONENT_PATTERN_HELP, + }, + ], + loader: true, + options: [ + [ + 'f', + 'force', + 'ignore local changes/versions. eject component/s even when they are staged or modified. Note: unexported tags/snaps will be lost', + ], + ['x', 'skip-dependency-installation', 'do not auto-install dependencies'], + ['j', 'json', 'print the results in JSON format'], + ['', 'keep-files', 'keep the component files in the workspace intact'], + ] as CommandOptions, +}; diff --git a/scopes/workspace/eject/eject.main.runtime.ts b/scopes/workspace/eject/eject.main.runtime.ts index 5ec4801d0add..0f804883f034 100644 --- a/scopes/workspace/eject/eject.main.runtime.ts +++ b/scopes/workspace/eject/eject.main.runtime.ts @@ -11,6 +11,7 @@ import { EjectCmd } from './eject-cmd'; import { EjectAspect } from './eject.aspect'; import type { EjectOptions, EjectResults } from './components-ejector'; import { ComponentsEjector } from './components-ejector'; +import { ejectCommand } from './eject.commands'; export class EjectMain { constructor( @@ -42,7 +43,7 @@ export class EjectMain { static async provider([cli, workspace, loggerMain, install]: [CLIMain, Workspace, LoggerMain, InstallMain]) { const logger = loggerMain.createLogger(EjectAspect.id); const ejectMain = new EjectMain(workspace, install, logger); - cli.register(new EjectCmd(ejectMain, workspace)); + cli.register(ejectCommand, () => new EjectCmd(ejectMain, workspace)); return ejectMain; } diff --git a/scopes/workspace/install/install.aspect.ts b/scopes/workspace/install/install.aspect.ts index 27a19c7fff91..58857bafcc5b 100644 --- a/scopes/workspace/install/install.aspect.ts +++ b/scopes/workspace/install/install.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const InstallAspect = Aspect.create({ id: 'teambit.workspace/install', + runtimes: { main: () => import('./install.main.runtime') }, }); diff --git a/scopes/workspace/scripts/scripts.aspect.ts b/scopes/workspace/scripts/scripts.aspect.ts index 433105b26e03..971394027824 100644 --- a/scopes/workspace/scripts/scripts.aspect.ts +++ b/scopes/workspace/scripts/scripts.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const ScriptsAspect = Aspect.create({ id: 'teambit.workspace/scripts', + runtimes: { main: () => import('./scripts.main.runtime') }, }); diff --git a/scopes/workspace/variants/variants.aspect.ts b/scopes/workspace/variants/variants.aspect.ts index 3720dbc7f5c7..c026f6df5287 100644 --- a/scopes/workspace/variants/variants.aspect.ts +++ b/scopes/workspace/variants/variants.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const VariantsAspect = Aspect.create({ id: 'teambit.workspace/variants', + runtimes: { main: () => import('./variants.main.runtime') }, }); diff --git a/scopes/workspace/watcher/watcher.aspect.ts b/scopes/workspace/watcher/watcher.aspect.ts index 3a5353440a24..6b3f0ea48343 100644 --- a/scopes/workspace/watcher/watcher.aspect.ts +++ b/scopes/workspace/watcher/watcher.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const WatcherAspect = Aspect.create({ id: 'teambit.workspace/watcher', + runtimes: { main: () => import('./watcher.main.runtime') }, }); diff --git a/scopes/workspace/workspace-config-files/workspace-config-files.aspect.ts b/scopes/workspace/workspace-config-files/workspace-config-files.aspect.ts index 4fb5184c6234..60d3d486c67f 100644 --- a/scopes/workspace/workspace-config-files/workspace-config-files.aspect.ts +++ b/scopes/workspace/workspace-config-files/workspace-config-files.aspect.ts @@ -1,5 +1,6 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const WorkspaceConfigFilesAspect = Aspect.create({ id: 'teambit.workspace/workspace-config-files', + runtimes: { main: () => import('./workspace-config-files.main.runtime') }, }); diff --git a/scopes/workspace/workspace/index.ts b/scopes/workspace/workspace/index.ts index 8159e43390ee..1ddf66ff6562 100644 --- a/scopes/workspace/workspace/index.ts +++ b/scopes/workspace/workspace/index.ts @@ -10,8 +10,10 @@ export type { WorkspaceUI } from './workspace.ui.runtime'; export type { SerializableResults, OnComponentLoad, OnComponentEventResult } from './on-component-events'; export { ComponentStatus } from './workspace-component'; export type { WorkspaceModelComponent } from './ui/workspace/workspace-model'; -export { Workspace as WorkspaceModel } from './ui/workspace/workspace-model'; -export { WorkspaceContext } from './ui/workspace/workspace-context'; +// UI value exports removed from this barrel: +// - WorkspaceModel (was: './ui/workspace/workspace-model') +// - WorkspaceContext (was: './ui/workspace/workspace-context') +// UI callers should import from those paths directly. export { OutsideWorkspaceError } from './exceptions/outside-workspace'; export type { WorkspaceComponent, ComponentLoadOptions as WorkspaceComponentLoadOptions } from './workspace-component'; export type { ComponentConfigFile } from './component-config-file'; diff --git a/scopes/workspace/workspace/workspace-aspects-loader.ts b/scopes/workspace/workspace/workspace-aspects-loader.ts index 5e9bfb2dde03..33718ef62513 100644 --- a/scopes/workspace/workspace/workspace-aspects-loader.ts +++ b/scopes/workspace/workspace/workspace-aspects-loader.ts @@ -490,32 +490,8 @@ your workspace.jsonc has this component-id set. you might want to remove/change const component = aspectDef.component; if (!component) return undefined; const requireFunc = async () => { - // Honor the workspace's scope-trust hook (registered on ScopeMain). - // Workspace and scope-aspects-loader take parallel require paths. - const guard = this.scope.getAspectLoadGuard(); - if (guard) await guard(component.id); - - const plugins = this.aspectLoader.getPlugins(component, localPath); - if (plugins.has()) { - return plugins.load(MainRuntime.name); - } - - const isModule = await this.aspectLoader.isEsmModule(localPath); - - const aspect = !isModule - ? // eslint-disable-next-line global-require, import/no-dynamic-require - require(localPath) - : // : await this.aspectLoader.loadEsm(join(localPath, 'dist', 'index.js')); - await this.aspectLoader.loadEsm(localPath); - - // require aspect runtimes - const runtimePath = await this.aspectLoader.getRuntimePath(component, localPath, MainRuntime.name); - if (runtimePath) { - if (isModule) await this.aspectLoader.loadEsm(runtimePath); - // eslint-disable-next-line global-require, import/no-dynamic-require - require(runtimePath); - } - return aspect; + // Delegate to the new Harmony lazy-loader. + return this.harmony.loadExternalAspect(localPath); }; return new RequireableComponent(component, requireFunc); }); diff --git a/scopes/workspace/workspace/workspace.aspect.ts b/scopes/workspace/workspace/workspace.aspect.ts index d2ed37ac6b44..3000037465f6 100644 --- a/scopes/workspace/workspace/workspace.aspect.ts +++ b/scopes/workspace/workspace/workspace.aspect.ts @@ -1,9 +1,8 @@ -import { Aspect } from '@teambit/harmony'; +import { Aspect } from '@teambit/core'; export const WorkspaceAspect = Aspect.create({ id: 'teambit.workspace/workspace', - dependencies: [], - defaultConfig: {}, + runtimes: { main: () => import('./workspace.main.runtime') }, }); export default WorkspaceAspect; diff --git a/scripts/bench-startup.mjs b/scripts/bench-startup.mjs new file mode 100644 index 000000000000..c930035c694d --- /dev/null +++ b/scripts/bench-startup.mjs @@ -0,0 +1,338 @@ +#!/usr/bin/env node +// Bench harness for RFC "ESM Migration with Lazy-Loaded Aspects" — Slice 1. +// See docs/rfc-esm-lazy-aspects.md §8 and §10. +// +// Measures: +// A. Wallclock for 6 startup scenarios (cold + warm). +// B. Per-aspect isolated-import time — each *.main.runtime.js required in a +// fresh Node process, repeated, so we can attribute marginal cost +// without sibling-thread smear (see §11.3 finding #5). +// +// Run: node scripts/bench-startup.mjs [--iters=5] [--json] [--no-warm] [--no-aspects] +// [--bit=] [--small-ws=] [--large-ws=] +// Env: BIT_BENCH_SMALL_WS, BIT_BENCH_LARGE_WS — fixture workspace paths. + +import { spawn } from 'node:child_process'; +import { mkdtempSync, rmSync, existsSync, readFileSync, readdirSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(HERE, '..'); +const repoRequire = createRequire(join(REPO_ROOT, 'package.json')); + +const args = parseArgs(process.argv.slice(2)); +const ITERS = Number(args.iters ?? 5); +const WARMUPS = 2; +const ASPECT_ITERS = Number(args['aspect-iters'] ?? 5); +const BIT_BIN = resolve(args.bit ?? join(REPO_ROOT, 'bin', 'bit.js')); +const SMALL_WS = args['small-ws'] ?? process.env.BIT_BENCH_SMALL_WS; +const LARGE_WS = args['large-ws'] ?? process.env.BIT_BENCH_LARGE_WS; +const DO_WARM = !args['no-warm']; +const DO_ASPECTS = !args['no-aspects']; +const JSON_OUT = !!args.json; + +if (!existsSync(BIT_BIN)) { + console.error(`bit binary not found at ${BIT_BIN}`); + process.exit(1); +} + +const NO_WS_DIR = mkdtempSync(join(tmpdir(), 'bit-bench-no-ws-')); +process.on('exit', () => { + try { rmSync(NO_WS_DIR, { recursive: true, force: true }); } catch {} +}); + +const scenarios = [ + { name: 'bit --version', argv: ['--version'], cwd: NO_WS_DIR }, + { name: 'bit --help', argv: ['--help'], cwd: NO_WS_DIR }, + { name: 'bit ', argv: ['zzz-typo-cmd'], cwd: NO_WS_DIR }, + { name: 'bit status (no ws)', argv: ['status'], cwd: NO_WS_DIR }, +]; +if (SMALL_WS) { + if (existsSync(SMALL_WS)) scenarios.push({ name: 'bit status (small ws)', argv: ['status'], cwd: resolve(SMALL_WS) }); + else console.error(`warning: --small-ws path not found: ${SMALL_WS}`); +} +if (LARGE_WS) { + if (existsSync(LARGE_WS)) scenarios.push({ name: 'bit status (large ws)', argv: ['status'], cwd: resolve(LARGE_WS) }); + else console.error(`warning: --large-ws path not found: ${LARGE_WS}`); +} + +const report = { + meta: { + node: process.version, + platform: process.platform, + arch: process.arch, + bitBin: BIT_BIN, + iters: ITERS, + warmups: WARMUPS, + aspectIters: ASPECT_ITERS, + smallWs: SMALL_WS ?? null, + largeWs: LARGE_WS ?? null, + timestamp: new Date().toISOString(), + }, + scenarios: [], + aspects: [], + aspectsMeta: null, +}; + +if (!JSON_OUT) { + console.log(`bench-startup.mjs — node ${process.version} ${process.platform}/${process.arch}`); + console.log(`bit binary: ${BIT_BIN}`); + console.log(`iters=${ITERS} aspect-iters=${ASPECT_ITERS} warmups=${WARMUPS}`); + console.log(''); +} + +for (const sc of scenarios) { + if (!JSON_OUT) process.stdout.write(`measuring: ${sc.name} ... `); + const cold = await runIterations(sc, ITERS, /*useCache*/ false); + const warm = DO_WARM ? await runWarm(sc, WARMUPS, ITERS) : null; + report.scenarios.push({ name: sc.name, argv: sc.argv, cwd: sc.cwd, cold, warm }); + if (!JSON_OUT) console.log('done'); +} + +if (DO_ASPECTS) { + const aspectPkgs = listAspectPackages(); + const targets = []; + for (const pkg of aspectPkgs) { + const runtimeFile = findMainRuntimeFile(pkg); + if (runtimeFile) targets.push({ pkg, runtimeFile }); + } + report.aspectsMeta = { packages: aspectPkgs.length, withRuntime: targets.length }; + if (!JSON_OUT) console.log(`\nper-aspect isolated import (${targets.length} aspects, n=${ASPECT_ITERS} each)`); + let idx = 0; + for (const t of targets) { + idx += 1; + if (!JSON_OUT) process.stdout.write(` [${idx}/${targets.length}] ${t.pkg} ... `); + const samples = []; + for (let i = 0; i < ASPECT_ITERS; i++) { + const ms = await measureModuleImport(t.runtimeFile); + if (typeof ms === 'number') samples.push(ms); + } + const stats = summarize(samples); + report.aspects.push({ pkg: t.pkg, runtimeFile: t.runtimeFile, samples, ...stats }); + if (!JSON_OUT) console.log(stats.n > 0 ? `min=${stats.min.toFixed(1)}ms p50=${stats.p50.toFixed(1)}ms` : 'FAILED'); + } +} + +if (JSON_OUT) { + console.log(JSON.stringify(report, null, 2)); +} else { + printHumanReport(report); +} + +// ── helpers ──────────────────────────────────────────────────────────────── + +function parseArgs(argv) { + const out = {}; + for (const a of argv) { + if (!a.startsWith('--')) continue; + const eq = a.indexOf('='); + if (eq === -1) out[a.slice(2)] = true; + else out[a.slice(2, eq)] = a.slice(eq + 1); + } + return out; +} + +async function runIterations(sc, n, useCache, cacheDir) { + const samples = []; + let exits = []; + for (let i = 0; i < n; i++) { + const r = await runOnce(sc, useCache, cacheDir); + samples.push(r.ms); + exits.push(r.exitCode); + } + return { ...summarize(samples), samples, exits }; +} + +async function runWarm(sc, warmups, n) { + const cacheDir = mkdtempSync(join(tmpdir(), 'bit-bench-cache-')); + try { + for (let i = 0; i < warmups; i++) await runOnce(sc, true, cacheDir); + return await runIterations(sc, n, true, cacheDir); + } finally { + try { rmSync(cacheDir, { recursive: true, force: true }); } catch {} + } +} + +function runOnce(sc, useCache, cacheDir) { + return new Promise((resolveP) => { + const env = { ...process.env }; + delete env.NODE_OPTIONS; // strip parent NODE_OPTIONS to keep timing comparable + if (useCache && cacheDir) env.NODE_COMPILE_CACHE = cacheDir; + else delete env.NODE_COMPILE_CACHE; + const t0 = process.hrtime.bigint(); + const child = spawn(process.execPath, [BIT_BIN, ...sc.argv], { + cwd: sc.cwd, + env, + stdio: ['ignore', 'ignore', 'ignore'], + }); + child.on('exit', (code) => { + const ms = Number(process.hrtime.bigint() - t0) / 1e6; + resolveP({ ms, exitCode: code }); + }); + child.on('error', (err) => { + resolveP({ ms: NaN, exitCode: -1, error: err.message }); + }); + }); +} + +function listAspectPackages() { + const manifestsPath = require_resolve('@teambit/bit/dist/manifests.js'); + if (!manifestsPath || !existsSync(manifestsPath)) { + console.error(`could not locate @teambit/bit/dist/manifests.js (${manifestsPath})`); + return []; + } + const src = readFileSync(manifestsPath, 'utf8'); + const re = /require\("(@teambit\/[^"]+)"\)/g; + const set = new Set(); + for (const m of src.matchAll(re)) set.add(m[1]); + set.delete('@teambit/harmony'); // not an aspect; framework + return [...set].sort(); +} + +function findMainRuntimeFile(pkg) { + const pkgRoot = packageRoot(pkg); + if (!pkgRoot) return null; + const dist = join(pkgRoot, 'dist'); + if (!existsSync(dist)) return null; + const entries = readdirSync(dist); + const candidates = entries.filter((f) => f.endsWith('.main.runtime.js')); + if (candidates.length === 0) return null; + // If multiple, prefer the one whose basename matches the package's last segment. + const last = pkg.split('/').pop(); + const preferred = candidates.find((f) => f.startsWith(`${last}.`)); + return join(dist, preferred ?? candidates[0]); +} + +function packageRoot(pkg) { + // Some @teambit packages have an "exports" map that catches `./*` → `./*.ts`, + // which breaks `require.resolve('/package.json')`. So resolve the main + // entry instead, then walk up until we find the package.json. + const main = require_resolve(pkg); + if (!main) return null; + let dir = dirname(main); + for (let i = 0; i < 6; i++) { + if (existsSync(join(dir, 'package.json'))) return dir; + const parent = dirname(dir); + if (parent === dir) break; + dir = parent; + } + return null; +} + +function require_resolve(spec) { + try { return repoRequire.resolve(spec); } catch { return null; } +} + +function measureModuleImport(modPath) { + // Spawn a fresh Node process that times require(modPath) and prints the ms. + const code = ` + const t0 = process.hrtime.bigint(); + try { + require(${JSON.stringify(modPath)}); + } catch (e) { + process.stderr.write('IMPORT_ERR: ' + (e && e.message ? e.message : String(e))); + process.exit(2); + } + const ms = Number(process.hrtime.bigint() - t0) / 1e6; + process.stdout.write(ms.toFixed(3)); + `; + return new Promise((resolveP) => { + const env = { ...process.env }; + delete env.NODE_OPTIONS; + delete env.NODE_COMPILE_CACHE; + const child = spawn(process.execPath, ['-e', code], { + env, + stdio: ['ignore', 'pipe', 'pipe'], + }); + let out = ''; + child.stdout.on('data', (d) => { out += d.toString(); }); + child.on('exit', () => { + const v = Number(out); + resolveP(Number.isFinite(v) ? v : null); + }); + child.on('error', () => resolveP(null)); + }); +} + +function summarize(samples) { + const xs = samples.filter((x) => Number.isFinite(x)).slice().sort((a, b) => a - b); + const n = xs.length; + if (n === 0) return { n: 0, min: NaN, p50: NaN, p95: NaN, mean: NaN, max: NaN }; + const min = xs[0]; + const max = xs[n - 1]; + const p50 = percentile(xs, 0.50); + const p95 = percentile(xs, 0.95); + const mean = xs.reduce((a, b) => a + b, 0) / n; + return { n, min, p50, p95, mean, max }; +} + +function percentile(sortedXs, p) { + const n = sortedXs.length; + if (n === 0) return NaN; + if (n === 1) return sortedXs[0]; + const idx = (n - 1) * p; + const lo = Math.floor(idx); + const hi = Math.ceil(idx); + if (lo === hi) return sortedXs[lo]; + return sortedXs[lo] + (sortedXs[hi] - sortedXs[lo]) * (idx - lo); +} + +function printHumanReport(rep) { + console.log('\n══════════════════ Wallclock scenarios ══════════════════'); + const header = ['scenario', 'cold min', 'cold p50', 'cold mean', 'warm min', 'warm p50', 'warm mean']; + const rows = rep.scenarios.map((s) => [ + s.name, + fmt(s.cold.min), fmt(s.cold.p50), fmt(s.cold.mean), + s.warm ? fmt(s.warm.min) : '—', + s.warm ? fmt(s.warm.p50) : '—', + s.warm ? fmt(s.warm.mean) : '—', + ]); + printTable(header, rows); + + if (rep.aspects.length > 0) { + console.log(`\n══════════════════ Per-aspect isolated import (n=${rep.meta.aspectIters}) ══════════════════`); + const sorted = [...rep.aspects].sort((a, b) => (b.min ?? 0) - (a.min ?? 0)); + const aHeader = ['aspect package', 'min (ms)', 'p50 (ms)', 'mean (ms)', 'max (ms)', 'n']; + const aRows = sorted.map((a) => [ + a.pkg, + a.n ? a.min.toFixed(1) : 'FAIL', + a.n ? a.p50.toFixed(1) : '—', + a.n ? a.mean.toFixed(1) : '—', + a.n ? a.max.toFixed(1) : '—', + String(a.n), + ]); + printTable(aHeader, aRows); + + const okStats = rep.aspects.filter((a) => a.n > 0); + if (okStats.length > 0) { + const totalMin = okStats.reduce((acc, a) => acc + a.min, 0); + const totalMedian = okStats.reduce((acc, a) => acc + a.p50, 0); + console.log(`\nsum of per-aspect min: ${totalMin.toFixed(0)} ms across ${okStats.length} aspects`); + console.log(`sum of per-aspect median: ${totalMedian.toFixed(0)} ms`); + console.log('(serial-sum upper bound — actual eager startup overlaps shared deps, so observed cost is lower)'); + } + } +} + +function fmt(x) { + if (!Number.isFinite(x)) return '—'; + return x.toFixed(1); +} + +function printTable(header, rows) { + const cols = header.length; + const widths = new Array(cols).fill(0); + for (let i = 0; i < cols; i++) widths[i] = String(header[i]).length; + for (const row of rows) for (let i = 0; i < cols; i++) widths[i] = Math.max(widths[i], String(row[i]).length); + const fmtRow = (row, padLeft) => row.map((cell, i) => { + const s = String(cell); + return padLeft[i] ? s.padStart(widths[i]) : s.padEnd(widths[i]); + }).join(' '); + const padLeft = header.map((_, i) => i > 0); // first col left-aligned, rest right + console.log(fmtRow(header, padLeft)); + console.log(widths.map((w) => '─'.repeat(w)).join(' ')); + for (const row of rows) console.log(fmtRow(row, padLeft)); +} diff --git a/scripts/build-publish-bundle.mjs b/scripts/build-publish-bundle.mjs new file mode 100644 index 000000000000..e83b0a212266 --- /dev/null +++ b/scripts/build-publish-bundle.mjs @@ -0,0 +1,502 @@ +#!/usr/bin/env node +// Rollup-based publish bundler for @teambit/bit. +// +// Per docs/migration/10-publish-bundling.md, this script collapses the bit +// entrypoint into a single ESM file containing the CLI dispatcher, command +// index, aspect manifests, and the small Harmony core. Each aspect's +// `*.main.runtime.[jt]s` is emitted as its own dynamically-imported chunk. +// +// Usage: +// node scripts/build-publish-bundle.mjs +// node scripts/build-publish-bundle.mjs --visualize # writes stats.html +// node scripts/build-publish-bundle.mjs --no-budget # skip the 5MB gate +// +// Notes +// ----- +// Until chunk 09 (CJS → ESM source migration) lands, the dist files emitted +// by `bit compile` are CJS — Babel rewrites `() => import('./foo')` to +// `() => Promise.resolve().then(() => require('./foo'))`, which Rollup does +// not recognize as a code-split boundary. To preserve code-splitting we drive +// the build from TS sources via `@rollup/plugin-typescript` and resolve +// `@teambit/*` packages by their `source` package.json field (which points +// at the TS entry). + +import { rollup } from 'rollup'; +import { fileURLToPath } from 'node:url'; +import { dirname, join, resolve, relative } from 'node:path'; +import { existsSync, mkdirSync, readFileSync, rmSync, statSync } from 'node:fs'; +import { builtinModules } from 'node:module'; + +import nodeResolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import typescript from '@rollup/plugin-typescript'; +import { transform as esbuildTransform } from 'esbuild'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(HERE, '..'); + +const ENTRY = join(REPO_ROOT, 'scopes/harmony/bit/app.ts'); +const OUT_DIR = join(REPO_ROOT, 'dist/bundle'); +const ENTRY_BUDGET_BYTES = 5 * 1024 * 1024; // 5MB + +const args0 = new Set(process.argv.slice(2)); +const ESM = args0.has('--esm'); +const ENTRY_FILE = ESM ? 'bit.mjs' : 'bit.cjs'; +const CHUNK_EXT = ESM ? 'mjs' : 'cjs'; + +const args = args0; +const VISUALIZE = args.has('--visualize'); +const SKIP_BUDGET = args.has('--no-budget'); +const MINIFY = !args.has('--no-minify'); + +// Native bindings and CJS-only third-party deps that must stay external. +// Rollup cannot inline `.node` files; everything in this list is shipped via +// a regular `dependencies` entry on `@teambit/bit`'s package.json. +const NATIVE_EXTERNALS = new Set([ + 'fsevents', + '@lydell/node-pty', + 'node-pty', + '@swc/css', + '@parcel/css', + 'lightningcss', + '@reflink/reflink', +]); + +const NATIVE_PREFIXES = [ + '@reflink/reflink-', + '@lydell/node-pty-', + '@parcel/css-', + 'lightningcss-', + '@swc/core-', +]; + +// Heavy modules that we deliberately keep external (UI runtime / dev-only). +// Pulling these into the entry bundle blows the size budget and serves no +// startup benefit because they're only loaded when their owning aspect runs. +const HEAVY_EXTERNALS = new Set([ + 'react', + 'react-dom', + 'react-router-dom', + 'monaco-editor', + '@apollo/client', + 'graphql', + '@yarnpkg/cli', + '@yarnpkg/core', + '@yarnpkg/plugin-pack', +]); + +// Legacy-CJS @teambit packages that use the `Object.defineProperty(exports, +// '', { get: ... })` re-export pattern. `@rollup/plugin-commonjs` +// hoists the symbols up but doesn't expose them through the namespace +// object the rest of the bundle references — runtime hits +// `TypeError: Cannot read properties of undefined (reading 'BitError')` +// when consumers do `import { BitError } from '@teambit/bit-error'`. +// Externalising them is fine: they're tiny pure-data packages with no +// transitive heavy deps, and `require('@teambit/bit-error')` at runtime +// returns the real CJS namespace with the symbols accessible. +const CJS_INTEROP_EXTERNALS = new Set([ + '@teambit/bit-error', + '@teambit/legacy.cli.error', + // Legacy non-Bit-component packages with CJS-shape exports that + // `@rollup/plugin-commonjs` re-wraps awkwardly. Externalising them + // makes runtime resolution use Node's require which returns the real + // CJS namespace. + '@teambit/harmony', + // Yargs uses a builder-pattern `default` export + named statics + // (`yargs.help`, `yargs.command`...) that the commonjs plugin + // mangles. Externalising preserves the real prototype chain. + 'yargs', +]); + +const NODE_BUILTINS = new Set([ + ...builtinModules, + ...builtinModules.map((m) => `node:${m}`), +]); + +// Aspects whose main runtime should be inlined into the entry (or one of +// its chunks). Specifically: the small bootstrap aspects we always need. +// Everything else under `@teambit/` is externalised — including all the +// .main.runtime.ts files for individual aspects, which the lazy resolve +// loads via dynamic `import()` at runtime anyway. +const KEEP_INTERNAL = new Set([ + '@teambit/bit', + '@teambit/cli', + '@teambit/core', +]); + +function isExternal(id) { + if (NODE_BUILTINS.has(id)) return true; + if (id.startsWith('node:')) return true; + if (NATIVE_EXTERNALS.has(id)) return true; + if (HEAVY_EXTERNALS.has(id)) return true; + if (CJS_INTEROP_EXTERNALS.has(id)) return true; + // External scoped sub-imports (e.g. `@yarnpkg/cli/lib/foo`). + for (const prefix of [...NATIVE_EXTERNALS, ...HEAVY_EXTERNALS, ...CJS_INTEROP_EXTERNALS]) { + if (id.startsWith(`${prefix}/`)) return true; + } + // Externalise every `@teambit/*` package EXCEPT the bootstrap ones. + // Rollup loses if it tries to bundle the heavy legacy CJS graph; + // `require()`-at-runtime gives Node's normal interop semantics and + // lazy resolve already handles loading per-aspect on demand. + // + // Attempted "bundle everything @teambit/*" — fails two ways: + // (a) cross-chunk lazy `requireXxx()` factories from + // rollup-plugin-commonjs fire before the host chunk finishes + // initialising, e.g. `runtimeEnvironments.Aspect.create is + // undefined` or `requireMinimatch is not a function`; + // (b) externalising the non-@teambit transitives sidesteps (a) but + // trips Node resolution because pnpm-installed transitives aren't + // hoisted to a path the bundle can walk to from `dist/bundle/chunks/`. + if (id.startsWith('@teambit/')) { + const base = id.split('/').slice(0, 2).join('/'); + if (KEEP_INTERNAL.has(base)) return false; + return true; + } + // Native bindings — platform-suffixed packages and raw .node files. Rollup + // can't parse the binary; we ship them via direct `dependencies` instead. + if (id.endsWith('.node')) return true; + for (const prefix of NATIVE_PREFIXES) { + if (id.startsWith(prefix)) return true; + } + if (isBrowserPackage(id)) return true; + return false; +} + +// Browser-only asset extensions that show up in UI runtimes. The Node entry +// never renders them — short-circuit to an empty module so Rollup doesn't try +// to parse them and so the entry chunk stays small. +const STUBBED_EXTENSIONS = /\.(scss|sass|less|css|module\.css|svg|png|jpe?g|gif|webp|woff2?|ttf|eot|mdx)$/i; + +function stubAssetsPlugin() { + return { + name: 'stub-browser-assets', + resolveId(source) { + if (STUBBED_EXTENSIONS.test(source)) { + return { id: source, external: false, moduleSideEffects: false }; + } + return null; + }, + load(id) { + if (STUBBED_EXTENSIONS.test(id)) return 'export default {};'; + return null; + }, + }; +} + +// Browser-only files that should never end up in the Node-CLI bundle. We +// stub them to empty modules so Rollup's static graph walk doesn't error +// on missing exports inside UI-only files (e.g. b808f4cf5's WIP +// barrel-split removed `ComponentModel` from the component barrel, but +// some UI-only callers still import it — those callers never load on +// the CLI path at runtime, but Rollup's static analysis doesn't know +// that and errors). +// +// The aspect's UI runtime is genuinely UI-only — it's only loaded when +// `bit start` runs and the harmony resolver calls `aspect.runtimes.ui()`. +// In the Node bundle we never need it. +// Path-based UI patterns: anything matching is always-UI and stubbed. +const UI_FILE_PATTERNS = [ + // UI runtime files of any aspect. + /\.ui\.runtime\.[mc]?[jt]sx?$/, + /\.preview\.runtime\.[mc]?[jt]sx?$/, + /\.compositions\.[mc]?[jt]sx?$/, + /\.docs\.[mc]?[jt]sx?$/, + // Browser-only @teambit packages identified by their package name + // segment: `.ui.`, `.compositions.`, etc. + /^@teambit\/[\w.-]+\.ui\./, + /^@teambit\/[\w.-]+\.compositions\./, + /^@teambit\/[\w.-]+\.docs\./, + // UI-only repo paths. + /\/components\/ui\//, + /\/components\/hooks\//, + /\/components\/lanes\/ui\//, +]; + +// Content-based detection for `.tsx` files. Many aspects have `.tsx` +// files that aren't UI runtimes but are React components (e.g. +// `scopes/api-reference/api-reference/api-compare.tsx`). Conversely +// some `.tsx` files are non-UI (e.g. `bundler.service.tsx` is a class +// with no JSX). Decide by inspecting imports: if the file imports +// `react` / `react-dom` / `@teambit/*.ui.*`, treat it as UI. +const UI_IMPORT_RE = /from\s+['"](react|react-dom|@apollo\/client|@teambit\/[\w.-]+\.ui\.|@teambit\/[\w.-]+\.compositions\.)/m; + +function isUiPathOnly(id) { + return UI_FILE_PATTERNS.some((re) => re.test(id)); +} + +function stubUiFilesPlugin() { + // Path-cache to avoid re-reading files. + const uiByPath = new Map(); + function isUiContent(id, src) { + if (uiByPath.has(id)) return uiByPath.get(id); + const ui = UI_IMPORT_RE.test(src); + uiByPath.set(id, ui); + return ui; + } + // The stub uses `syntheticNamedExports` so non-UI files that destructure + // a stubbed module — e.g. `import { noPreview } from '...static-error'` + // — still resolve. Each named import gets `undefined`. At runtime + // those imports never execute on the CLI path (they're inside + // express middleware / UI server code). + const STUB = { code: 'export default {};', syntheticNamedExports: 'default', moduleSideEffects: false }; + return { + name: 'stub-ui-files', + resolveId(source) { + if (isUiPathOnly(source)) { + return { id: source, external: false, moduleSideEffects: false }; + } + return null; + }, + load(id) { + if (isUiPathOnly(id)) return STUB; + if (/\.tsx$/.test(id)) { + let src; + try { src = readFileSync(id, 'utf8'); } catch { return null; } + if (isUiContent(id, src)) return STUB; + } + return null; + }, + }; +} + +// esbuild-based minifier; runs at `renderChunk` so each emitted chunk +// (entry + dynamic chunks) is minified. We keep the banner intact so +// `bit.cjs` stays directly executable. +function minifyPlugin() { + return { + name: 'minify-esbuild', + async renderChunk(code, chunk, options) { + const result = await esbuildTransform(code, { + minify: true, + // Keep `#!/usr/bin/env node` etc. at the top of the entry intact. + legalComments: 'inline', + // Don't break `class.name` reflection used by some legacy CJS code + // (e.g. error names checked by `err.constructor.name === 'ReadConfigError'`). + keepNames: true, + sourcemap: Boolean(options.sourcemap), + target: 'node20', + }); + return { code: result.code, map: result.map }; + }, + }; +} + +function redirectDirectAspectImports() { + // `scopes/harmony/bit/manifests.ts` imports each aspect manifest via the + // compiled-JS subpath `@teambit//dist/.aspect.js` — a perf + // shortcut for unbundled runtime (skips the heavy barrel index.ts). + // For the bundle, that subpath points at babel-compiled JS where + // `() => import('./.main.runtime')` has already been rewritten + // to `() => Promise.resolve().then(() => require(...))`, which Rollup + // doesn't recognise as a dynamic-import boundary. Redirect those + // subpath imports back to the package barrel so nodeResolve picks the + // `source` field (TS entry) and Rollup sees the original thunk. + const RE = /^(@teambit\/[\w-]+)\/dist\/[\w-]+\.aspect\.js$/; + return { + name: 'redirect-direct-aspect-imports', + resolveId(source, importer, options) { + const m = source.match(RE); + if (!m) return null; + return this.resolve(m[1], importer, { ...options, skipSelf: true }); + }, + }; +} + +// Browser-only @teambit packages that leak into the dep graph via UI runtime +// files. They never run in the Node entry — externalizing keeps them out of +// the bundle and lets node_modules supply them at runtime if the UI runtime +// actually gets loaded (in `bit start` etc.). +const BROWSER_PACKAGE_PATTERNS = [ + /^@teambit\/mdx\./, + /^@teambit\/documenter\./, +]; + +function isBrowserPackage(id) { + for (const re of BROWSER_PACKAGE_PATTERNS) { + if (re.test(id)) return true; + } + return false; +} + +function chunkForId(id) { + // Aspect main/ui runtimes — one chunk per runtime file. We match both TS + // sources (preferred) and compiled JS so the heuristic still works once + // chunk 09 swaps in ESM dist output. + const main = id.match(/[\\/]([\w.-]+)\.main\.runtime\.[jt]sx?$/); + if (main) return `runtime-${main[1]}`; + const ui = id.match(/[\\/]([\w.-]+)\.ui\.runtime\.[jt]sx?$/); + if (ui) return `runtime-ui-${ui[1]}`; + return undefined; +} + +async function build() { + rmSync(OUT_DIR, { recursive: true, force: true }); + mkdirSync(OUT_DIR, { recursive: true }); + + const plugins = [ + redirectDirectAspectImports(), + stubUiFilesPlugin(), + stubAssetsPlugin(), + nodeResolve({ + exportConditions: ['node', 'source', 'import', 'require', 'default'], + // Prefer `source` (TS entry) over `main` (CJS dist). Bit's per-aspect + // package.json files set `source: index.ts` — picking it lets Rollup + // see the original `() => import(...)` expressions. + mainFields: ['source', 'module', 'main'], + extensions: ['.ts', '.tsx', '.mts', '.mjs', '.js', '.jsx', '.cjs', '.json'], + preferBuiltins: true, + }), + json({ preferConst: true }), + typescript({ + tsconfig: false, + compilerOptions: { + target: 'es2022', + module: 'esnext', + moduleResolution: 'node', + jsx: 'react', + experimentalDecorators: true, + emitDecoratorMetadata: true, + esModuleInterop: true, + allowSyntheticDefaultImports: true, + resolveJsonModule: true, + skipLibCheck: true, + sourceMap: true, + inlineSources: true, + // Don't typecheck — `npm run lint` owns that. Rollup just needs the + // emit. + noEmitOnError: false, + strict: false, + noImplicitAny: false, + }, + include: [ + join(REPO_ROOT, 'scopes/**/*.ts'), + join(REPO_ROOT, 'scopes/**/*.tsx'), + join(REPO_ROOT, 'components/**/*.ts'), + join(REPO_ROOT, 'components/**/*.tsx'), + ], + exclude: [ + '**/node_modules/**', + '**/dist/**', + '**/*.spec.ts', + '**/*.spec.tsx', + '**/*.composition.tsx', + '**/*.docs.mdx', + ], + outputToFilesystem: false, + }), + commonjs({ + transformMixedEsModules: true, + ignoreDynamicRequires: false, + // For CJS modules that look like `module.exports = X`, return X + // directly when imported as a default. Avoids the namespace-wrapping + // that breaks aspect-style re-exports across chunks. + requireReturnsDefault: 'auto', + // Some Bit deps use `require('foo/' + name)`-style; mark them so the + // commonjs plugin doesn't try to bundle the (impossible) wildcard. + dynamicRequireTargets: [], + }), + ]; + + if (VISUALIZE) { + const { visualizer } = await import('rollup-plugin-visualizer'); + plugins.push( + visualizer({ + filename: join(OUT_DIR, 'stats.html'), + gzipSize: true, + brotliSize: true, + template: 'treemap', + }), + ); + } + + if (MINIFY) plugins.push(minifyPlugin()); + + console.log(`[build-publish-bundle] entry: ${relative(REPO_ROOT, ENTRY)}`); + console.log(`[build-publish-bundle] out: ${relative(REPO_ROOT, OUT_DIR)}`); + + const bundle = await rollup({ + input: ENTRY, + external: (id) => isExternal(id), + plugins, + preserveEntrySignatures: 'allow-extension', + treeshake: { moduleSideEffects: 'no-external' }, + onwarn(warning, warn) { + // Suppress noisy circular-dependency warnings from third-party CJS — + // they're unavoidable in the Bit dep graph and not actionable here. + if (warning.code === 'CIRCULAR_DEPENDENCY') return; + if (warning.code === 'THIS_IS_UNDEFINED') return; + warn(warning); + }, + }); + + const { output } = await bundle.write({ + // ESM output via `--esm`. CJS default for now (some @teambit packages' + // `exports.import` points to a non-existent `dist/esm.mjs`). + format: ESM ? 'esm' : 'cjs', + // CJS-only: force `await import(...)` to compile to require() so external + // packages with broken `exports.import` entries don't blow up at runtime. + ...(ESM ? {} : { dynamicImportInCjs: false }), + dir: OUT_DIR, + entryFileNames: ENTRY_FILE, + chunkFileNames: `chunks/[name]-[hash].${CHUNK_EXT}`, + sourcemap: true, + sourcemapExcludeSources: false, + manualChunks(id) { + return chunkForId(id); + }, + // Banner makes the bundle directly executable as `bit`. + banner: '#!/usr/bin/env node', + // For ESM output, `require` isn't a builtin — but a handful of files in + // the Bit graph still call it synchronously (e.g. + // `cli.main.runtime.ts` requires `@teambit/bit/dist/command-index.generated.js` + // inside `registerLazyStubs`, which can't `await import()` because the + // caller is sync). Inject a per-chunk `createRequire(import.meta.url)` + // shim so those calls keep working without a per-file refactor. + intro: ESM + ? "import { createRequire as __cr_makeRequire } from 'module'; const require = __cr_makeRequire(import.meta.url);" + : '', + hoistTransitiveImports: false, + }); + + await bundle.close(); + + return output; +} + +function reportAndAssert(output) { + const entry = output.find((c) => c.type === 'chunk' && c.isEntry); + const chunks = output.filter((c) => c.type === 'chunk' && !c.isEntry); + + const entryPath = join(OUT_DIR, entry.fileName); + const entryBytes = statSync(entryPath).size; + + const fmt = (n) => `${(n / 1024).toFixed(1)} KB`; + console.log(''); + console.log(`[build-publish-bundle] entry ${entry.fileName.padEnd(28)} ${fmt(entryBytes)}`); + for (const c of chunks.sort((a, b) => a.fileName.localeCompare(b.fileName))) { + const size = statSync(join(OUT_DIR, c.fileName)).size; + console.log(`[build-publish-bundle] chunk ${c.fileName.padEnd(28)} ${fmt(size)}`); + } + console.log(''); + console.log(`[build-publish-bundle] ${chunks.length} chunks emitted`); + + if (SKIP_BUDGET) return; + if (entryBytes > ENTRY_BUDGET_BYTES) { + console.error( + `[build-publish-bundle] ERROR: entry chunk ${fmt(entryBytes)} exceeds budget ${fmt(ENTRY_BUDGET_BYTES)}`, + ); + console.error( + `[build-publish-bundle] re-run with --visualize to inspect what landed in the entry`, + ); + process.exit(1); + } +} + +try { + const output = await build(); + reportAndAssert(output); +} catch (err) { + console.error('[build-publish-bundle] failed:', err); + process.exit(1); +} diff --git a/scripts/bulk-migrate-lazy.mjs b/scripts/bulk-migrate-lazy.mjs new file mode 100644 index 000000000000..d92f59a6be40 --- /dev/null +++ b/scripts/bulk-migrate-lazy.mjs @@ -0,0 +1,725 @@ +#!/usr/bin/env node +// Bulk migration script for the ESM Lazy Aspects RFC (Slice 7). +// +// Converts ONE aspect directory at a time: +// 1. Extracts command static fields from `*.cmd.ts` / `*-cmd.ts` files into +// a new `.commands.ts` with `CommandDescriptor` exports. +// 2. Rewrites the matching command class files so each static field reads +// from the descriptor (single source of truth). +// 3. Rewrites `cli.register(new XxxCmd(...))` calls in `*.main.runtime.ts` +// into the descriptor+factory form `cli.register(xxxCommand, () => new XxxCmd(...))` +// and adds an import for the new descriptors. +// 4. Rewrites `.aspect.ts` to import `Aspect` from the harmony +// manifest module and to declare `runtimes` (and `commands` when +// applicable) thunks. +// +// The script aims to handle the common shape. Unusual patterns (nested +// `parent.commands = [...]`, conditional registrations, classes defined in +// the runtime file itself, etc.) are reported and left for manual cleanup +// after the run. +// +// Usage: +// node scripts/bulk-migrate-lazy.mjs +// +// Example: +// node scripts/bulk-migrate-lazy.mjs scopes/harmony/doctor + +import ts from 'typescript'; +import { readFileSync, writeFileSync, readdirSync, existsSync, statSync } from 'node:fs'; +import { join, dirname, basename, relative, resolve, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(HERE, '..'); +const HARMONY_ASPECT_MODULE = resolve(REPO_ROOT, 'scopes/harmony/harmony/aspect'); + +const STATIC_FIELDS = new Set([ + 'name', + 'alias', + 'description', + 'extendedDescription', + 'helpUrl', + 'group', + 'private', + 'loader', + 'loadAspects', + 'options', + 'arguments', + 'commands', + 'remoteOp', + 'skipWorkspace', + 'examples', +]); + +main(process.argv[2]); + +function main(aspectDirArg) { + if (!aspectDirArg) { + fail('usage: node scripts/bulk-migrate-lazy.mjs '); + } + const aspectDir = resolve(REPO_ROOT, aspectDirArg); + if (!existsSync(aspectDir) || !statSync(aspectDir).isDirectory()) { + fail(`not a directory: ${aspectDir}`); + } + + const files = findAspectFiles(aspectDir); + if (!files.aspectFile) fail(`no *.aspect.ts file in ${aspectDir}`); + console.log(`→ migrating ${relative(REPO_ROOT, aspectDir)}`); + + const aspectInfo = parseAspectFile(files.aspectFile); + console.log(` aspect id: ${aspectInfo.aspectId}`); + + if (aspectInfo.hasRuntimesThunk) { + console.log(` aspect.ts already has \`runtimes\` — skipping aspect rewrite, will still update runtimes.`); + } + + // 1. Find which command classes are registered, in which order, by which calls. + const registrations = files.mainRuntimeFile + ? findCommandRegistrations(files.mainRuntimeFile) + : { calls: [], warnings: ['no *.main.runtime.ts file found'] }; + registrations.warnings.forEach((w) => console.warn(` ! ${w}`)); + + // 2. For every distinct class name, locate the file that declares it and + // extract its static fields. + const classNames = uniq(registrations.calls.flatMap((c) => c.classes.map((cls) => cls.className))); + const descriptors = []; + for (const className of classNames) { + const located = findClassDeclaration(className, aspectDir); + if (!located) { + console.warn(` ! could not find class ${className} in ${relative(REPO_ROOT, aspectDir)} — skipping`); + continue; + } + const fields = extractStaticFields(located.sourceFile, located.classNode); + if (fields.size === 0) { + console.warn(` ! class ${className} has no extractable static fields — skipping`); + continue; + } + descriptors.push({ + className, + descriptorName: descriptorVarName(className), + file: located.file, + classNode: located.classNode, + sourceText: located.sourceText, + fields, + }); + } + + // 3. Write .commands.ts. + let commandsModule = null; + if (descriptors.length > 0) { + commandsModule = join(aspectDir, `${aspectInfo.baseName}.commands.ts`); + writeFileSync(commandsModule, renderCommandsFile(descriptors)); + console.log(` + wrote ${relative(REPO_ROOT, commandsModule)} (${descriptors.length} descriptor(s))`); + } else { + console.log(` (no commands registered — skipping ${aspectInfo.baseName}.commands.ts)`); + } + + // 4. Rewrite each command class file to read from its descriptor. + for (const d of descriptors) { + const updated = rewriteCommandClassFile(d, aspectInfo.baseName); + if (updated !== null) { + writeFileSync(d.file, updated); + console.log(` ~ updated ${relative(REPO_ROOT, d.file)} (class ${d.className})`); + } + } + + // 5. Rewrite the runtime's cli.register(...) calls. + if (files.mainRuntimeFile && descriptors.length > 0) { + const updatedRuntime = rewriteRuntimeFile( + files.mainRuntimeFile, + registrations.calls, + descriptors, + aspectInfo.baseName, + ); + if (updatedRuntime !== null) { + writeFileSync(files.mainRuntimeFile, updatedRuntime); + console.log(` ~ updated ${relative(REPO_ROOT, files.mainRuntimeFile)}`); + } + } + + // 6. Rewrite the aspect.ts. + const updatedAspect = rewriteAspectFile(files.aspectFile, aspectInfo, { + hasMain: !!files.mainRuntimeFile, + hasUi: !!files.uiRuntimeFile, + hasCommands: descriptors.length > 0, + }); + if (updatedAspect !== null) { + writeFileSync(files.aspectFile, updatedAspect); + console.log(` ~ updated ${relative(REPO_ROOT, files.aspectFile)}`); + } + + console.log(`✓ done`); +} + +// ── filesystem discovery ─────────────────────────────────────────────────── + +function findAspectFiles(dir) { + const entries = readdirSync(dir, { withFileTypes: true }); + let aspectFile = null; + let mainRuntimeFile = null; + let uiRuntimeFile = null; + for (const e of entries) { + if (!e.isFile()) continue; + if (e.name.endsWith('.aspect.ts')) aspectFile = join(dir, e.name); + else if (e.name.endsWith('.main.runtime.ts')) mainRuntimeFile = join(dir, e.name); + else if (e.name.endsWith('.ui.runtime.ts')) uiRuntimeFile = join(dir, e.name); + } + return { aspectFile, mainRuntimeFile, uiRuntimeFile }; +} + +// ── .aspect.ts parsing ───────────────────────────────────────────────────── + +function parseAspectFile(file) { + const text = readFileSync(file, 'utf8'); + const idMatch = text.match(/id:\s*['"]([^'"]+)['"]/); + if (!idMatch) fail(`could not find \`id:\` in ${file}`); + const baseName = basename(file).replace(/\.aspect\.ts$/, ''); + const exportMatch = text.match(/export\s+const\s+(\w+Aspect)\s*=\s*Aspect\.create/); + if (!exportMatch) fail(`could not find \`export const XxxAspect = Aspect.create\` in ${file}`); + return { + file, + text, + baseName, + aspectId: idMatch[1], + aspectExportName: exportMatch[1], + hasRuntimesThunk: /\bruntimes:\s*{/.test(text), + hasDefaultExport: /export\s+default\s+\w+Aspect/.test(text), + }; +} + +// ── *.main.runtime.ts: find cli.register(...) targets ────────────────────── + +function findCommandRegistrations(runtimeFile) { + const text = readFileSync(runtimeFile, 'utf8'); + const sf = ts.createSourceFile(runtimeFile, text, ts.ScriptTarget.Latest, true); + const calls = []; + const warnings = []; + + // Build a local map: identifier name → `new XxxCmd(...)` if we can prove it. + const localCmdAliases = new Map(); + function collectAliases(node) { + if (ts.isVariableDeclaration(node) && node.initializer && ts.isNewExpression(node.initializer)) { + const className = node.initializer.expression && ts.isIdentifier(node.initializer.expression) + ? node.initializer.expression.text + : null; + if (className && className.endsWith('Cmd') && ts.isIdentifier(node.name)) { + localCmdAliases.set(node.name.text, { className, exprText: node.initializer.getText(sf) }); + } + } + ts.forEachChild(node, collectAliases); + } + collectAliases(sf); + + function visit(node) { + if ( + ts.isCallExpression(node) && + ts.isPropertyAccessExpression(node.expression) && + ts.isIdentifier(node.expression.name) && + node.expression.name.text === 'register' + ) { + const recv = node.expression.expression; + // Match `cli.register(...)` / `cliMain.register(...)` etc. — accept any + // identifier receiver whose name contains "cli" (case-insensitive). + if (ts.isIdentifier(recv) && /cli/i.test(recv.text)) { + const callInfo = analyzeRegisterCall(node, sf, localCmdAliases); + if (callInfo.classes.length > 0) calls.push(callInfo); + else if (callInfo.warnings.length) callInfo.warnings.forEach((w) => warnings.push(w)); + } + } + ts.forEachChild(node, visit); + } + visit(sf); + + return { calls, warnings }; +} + +function analyzeRegisterCall(callNode, sf, localCmdAliases) { + const classes = []; + const warnings = []; + for (const arg of callNode.arguments) { + if (ts.isNewExpression(arg) && arg.expression && ts.isIdentifier(arg.expression)) { + const className = arg.expression.text; + if (className.endsWith('Cmd')) { + classes.push({ className, source: 'new', argText: arg.getText(sf), argNode: arg }); + continue; + } + } + if (ts.isIdentifier(arg)) { + const alias = localCmdAliases.get(arg.text); + if (alias) { + warnings.push( + `register(...) uses local variable \`${arg.text}\` (=> new ${alias.className}). ` + + `Inline the construction at the register site for the migration to rewrite it.`, + ); + continue; + } + warnings.push( + `register(...) argument \`${arg.getText(sf)}\` is not a \`new XxxCmd(...)\` expression — skipping.`, + ); + continue; + } + warnings.push(`register(...) has non-trivial argument: ${arg.getText(sf)} — skipping.`); + } + return { + callNode, + callText: callNode.getText(sf), + callStart: callNode.getStart(sf), + callEnd: callNode.getEnd(), + indent: lineIndent(sf.text, callNode.getStart(sf)), + classes, + warnings, + }; +} + +function lineIndent(text, pos) { + let i = pos; + while (i > 0 && text[i - 1] !== '\n') i--; + let indent = ''; + while (i < text.length && (text[i] === ' ' || text[i] === '\t')) { + indent += text[i]; + i++; + } + return indent; +} + +// ── Find the class declaration for a given Cmd name ──────────────────────── + +function findClassDeclaration(className, dir) { + const candidates = []; + function collect(d) { + const entries = readdirSync(d, { withFileTypes: true }); + for (const e of entries) { + if (e.isSymbolicLink()) continue; + const full = join(d, e.name); + if (e.isDirectory()) { + if (e.name === 'node_modules' || e.name === 'dist') continue; + collect(full); + } else if (e.isFile() && e.name.endsWith('.ts') && !e.name.endsWith('.spec.ts')) { + candidates.push(full); + } + } + } + collect(dir); + + for (const file of candidates) { + const text = readFileSync(file, 'utf8'); + if (!new RegExp(`class\\s+${escapeRegex(className)}\\b`).test(text)) continue; + const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true); + let found = null; + function visit(node) { + if (ts.isClassDeclaration(node) && node.name && node.name.text === className) { + found = node; + } + if (!found) ts.forEachChild(node, visit); + } + visit(sf); + if (found) return { file, sourceFile: sf, sourceText: text, classNode: found }; + } + return null; +} + +// ── Extract static fields from a class node ──────────────────────────────── + +function extractStaticFields(sf, classNode) { + const fields = new Map(); + for (const member of classNode.members) { + if (!ts.isPropertyDeclaration(member)) continue; + if (member.modifiers && member.modifiers.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue; + if (!member.name || !ts.isIdentifier(member.name)) continue; + const name = member.name.text; + if (!STATIC_FIELDS.has(name)) continue; + if (!member.initializer) continue; + fields.set(name, { + initText: member.initializer.getText(sf), + memberStart: member.getStart(sf), + memberEnd: member.getEnd(), + memberFullStart: member.getFullStart(), + memberText: member.getText(sf), + }); + } + return fields; +} + +// ── Render the *.commands.ts module ──────────────────────────────────────── + +function renderCommandsFile(descriptors) { + const usesCommandOptions = descriptors.some((d) => d.fields.has('options')); + const typeImports = ['CommandDescriptor']; + if (usesCommandOptions) typeImports.push('CommandOptions'); + const lines = []; + lines.push(`import type { ${typeImports.join(', ')} } from '@teambit/cli';`); + lines.push(''); + lines.push(`/**`); + lines.push(` * Declarative command descriptors for this aspect.`); + lines.push(` *`); + lines.push(` * Part of the ESM Migration with Lazy-Loaded Aspects RFC`); + lines.push(` * (docs/rfc-esm-lazy-aspects.md §6.2). Each descriptor is the single`); + lines.push(` * source of truth for its command's static fields; the matching handler`); + lines.push(` * class reads these fields rather than redeclaring them, and`); + lines.push(` * \`cli.register(descriptor, factory)\` consumes the pair.`); + lines.push(` */`); + for (let i = 0; i < descriptors.length; i++) { + const d = descriptors[i]; + lines.push(''); + lines.push(`export const ${d.descriptorName}: CommandDescriptor = {`); + for (const key of orderFields(d.fields)) { + const f = d.fields.get(key); + let value = f.initText; + if (key === 'options' && !/\bas\s+CommandOptions\b/.test(value)) { + value = `${value} as CommandOptions`; + } + const indented = indentMultiline(value, ' '); + lines.push(` ${key}: ${indented},`); + } + lines.push(`};`); + } + lines.push(''); + return lines.join('\n'); +} + +function orderFields(fields) { + // A stable, readable ordering that roughly matches the existing pilot. + const preferred = [ + 'name', + 'alias', + 'description', + 'extendedDescription', + 'helpUrl', + 'group', + 'arguments', + 'private', + 'remoteOp', + 'skipWorkspace', + 'loadAspects', + 'loader', + 'options', + 'examples', + 'commands', + ]; + const present = new Set(fields.keys()); + const ordered = preferred.filter((k) => present.has(k)); + for (const k of fields.keys()) if (!ordered.includes(k)) ordered.push(k); + return ordered; +} + +function indentMultiline(text, indent) { + const lines = text.split('\n'); + if (lines.length === 1) return text; + return lines.map((line, i) => (i === 0 ? line : indent + line)).join('\n'); +} + +// ── Rewrite a command class file to read from descriptor ─────────────────── + +function rewriteCommandClassFile(descriptor, aspectBaseName) { + const { file, classNode, sourceText, fields, descriptorName } = descriptor; + const sf = ts.createSourceFile(file, sourceText, ts.ScriptTarget.Latest, true); + // re-find the class in the parsed file to get up-to-date offsets + let target = null; + function visit(node) { + if (ts.isClassDeclaration(node) && node.name && node.name.text === descriptor.className) target = node; + if (!target) ts.forEachChild(node, visit); + } + visit(sf); + if (!target) return null; + + // Replace each field initializer with `.` reference. + // Apply edits from end to start so offsets stay valid. + const edits = []; + for (const member of target.members) { + if (!ts.isPropertyDeclaration(member)) continue; + if (member.modifiers && member.modifiers.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue; + if (!member.name || !ts.isIdentifier(member.name)) continue; + const name = member.name.text; + if (!fields.has(name) || !member.initializer) continue; + edits.push({ + start: member.initializer.getStart(sf), + end: member.initializer.getEnd(), + replacement: `${descriptorName}.${name}`, + memberName: name, + }); + } + edits.sort((a, b) => b.start - a.start); + let updated = sourceText; + for (const edit of edits) { + // also drop any trailing `as XYZ` type assertion if present, e.g. `[...] as CommandOptions` + // since the descriptor field is already typed. + let end = edit.end; + const tail = sourceText.slice(edit.end).match(/^(\s*as\s+\w+(?:<[^>]+>)?)/); + if (tail) end += tail[1].length; + updated = updated.slice(0, edit.start) + edit.replacement + updated.slice(end); + } + + if (edits.length === 0) return null; + + // Add `import { } from './.commands';` if missing. + const importLine = importLineForDescriptor(updated, aspectBaseName, descriptorName); + if (importLine) { + updated = insertImport(updated, importLine); + } + return updated; +} + +function importLineForDescriptor(text, aspectBaseName, descriptorName) { + const importPath = `./${aspectBaseName}.commands`; + const existing = new RegExp(`from\\s+['"]${escapeRegex(importPath)}['"]`).exec(text); + if (!existing) { + return `import { ${descriptorName} } from '${importPath}';`; + } + // already imported from same path — add the symbol if missing. + const line = lineAt(text, existing.index); + if (new RegExp(`\\b${escapeRegex(descriptorName)}\\b`).test(line)) return null; + // augment the existing import in-place (handled in `insertImport`) + return { augment: true, importPath, descriptorName }; +} + +function insertImport(text, importLineOrAugment) { + if (typeof importLineOrAugment === 'object' && importLineOrAugment.augment) { + const { importPath, descriptorName } = importLineOrAugment; + return text.replace(new RegExp(`(import\\s+\\{[^}]*)(\\}\\s+from\\s+['"]${escapeRegex(importPath)}['"];?)`), (_m, head, tail) => { + return `${head.replace(/\s+$/, '')}, ${descriptorName} ${tail}`; + }); + } + // Insert after the last top-level import statement. + const importBlock = /^(?:import[^\n]*\n)+/m.exec(text); + if (importBlock) { + const end = importBlock.index + importBlock[0].length; + return text.slice(0, end) + importLineOrAugment + '\n' + text.slice(end); + } + return importLineOrAugment + '\n' + text; +} + +function lineAt(text, idx) { + const start = text.lastIndexOf('\n', idx) + 1; + const end = text.indexOf('\n', idx); + return text.slice(start, end === -1 ? text.length : end); +} + +// ── Rewrite the *.main.runtime.ts cli.register() calls ───────────────────── + +function rewriteRuntimeFile(file, registerCalls, descriptors, aspectBaseName) { + const text = readFileSync(file, 'utf8'); + const descriptorByClass = new Map(descriptors.map((d) => [d.className, d])); + + // Build replacement text for each register call, then apply end→start. + const edits = []; + for (const call of registerCalls) { + const replacement = buildRegisterReplacement(call, descriptorByClass); + if (replacement === null) continue; + // include the trailing semicolon if it sits on the same line. + let end = call.callEnd; + if (text[end] === ';') end += 1; + edits.push({ start: call.callStart, end, replacement }); + } + if (edits.length === 0) return null; + + edits.sort((a, b) => b.start - a.start); + let updated = text; + for (const edit of edits) { + updated = updated.slice(0, edit.start) + edit.replacement + updated.slice(edit.end); + } + + // Add an import for the descriptors used. + const descriptorNames = uniq( + registerCalls.flatMap((c) => + c.classes + .filter((cls) => descriptorByClass.has(cls.className)) + .map((cls) => descriptorByClass.get(cls.className).descriptorName), + ), + ); + if (descriptorNames.length > 0) { + const importPath = `./${aspectBaseName}.commands`; + updated = ensureNamedImport(updated, importPath, descriptorNames); + } + return updated; +} + +function buildRegisterReplacement(call, descriptorByClass) { + // Each `new XxxCmd(args...)` argument becomes its own register call. + const lines = []; + let i = 0; + const indent = call.indent; + for (const cls of call.classes) { + const d = descriptorByClass.get(cls.className); + if (!d) { + // can't rewrite this argument — keep original call as-is (bail out). + return null; + } + // Re-extract the original receiver text (e.g. `cli.register` or `cliMain.register`). + const receiver = extractReceiverFromCall(call.callText); + const newArg = cls.argText; // e.g. `new StatusCmd(statusMain)` + const line = `${receiver}(${d.descriptorName}, () => ${newArg});`; + lines.push(i === 0 ? line : `${indent}${line}`); + i++; + } + if (lines.length === 0) return null; + return lines.join('\n'); +} + +function extractReceiverFromCall(callText) { + // e.g. "cli.register(...)" → "cli.register" + const m = callText.match(/^([\w.]+)\s*\(/); + return m ? m[1] : 'cli.register'; +} + +function ensureNamedImport(text, importPath, names) { + const re = new RegExp(`import\\s+\\{([^}]*)\\}\\s+from\\s+['"]${escapeRegex(importPath)}['"];?`); + const m = re.exec(text); + if (m) { + const existing = m[1] + .split(',') + .map((s) => s.trim()) + .filter(Boolean); + const merged = uniq([...existing, ...names]).sort(); + return text.slice(0, m.index) + `import { ${merged.join(', ')} } from '${importPath}';` + text.slice(m.index + m[0].length); + } + const line = `import { ${names.sort().join(', ')} } from '${importPath}';`; + return insertImport(text, line); +} + +// ── Rewrite the *.aspect.ts with runtimes/commands thunks ────────────────── + +function rewriteAspectFile(file, aspectInfo, { hasMain, hasUi, hasCommands }) { + const text = aspectInfo.text; + const aspectModuleRel = posixify(relative(dirname(file), HARMONY_ASPECT_MODULE)); + const importRel = aspectModuleRel.startsWith('.') ? aspectModuleRel : `./${aspectModuleRel}`; + + // Replace the Aspect import. + let updated = text; + updated = updated.replace( + /import\s*\{\s*Aspect\s*(?:,\s*[^}]+)?\}\s*from\s*['"]@teambit\/harmony['"];?/, + `import { Aspect } from '${importRel}';`, + ); + + // If the existing import line still has other symbols we need (RuntimeDefinition), + // preserve them on a second import line. + const preserved = preserveHarmonyImports(text); + if (preserved && !/import\s*\{[^}]*RuntimeDefinition[^}]*\}\s*from\s*['"]@teambit\/harmony['"]/.test(updated)) { + updated = updated.replace( + `import { Aspect } from '${importRel}';`, + `import { ${preserved} } from '@teambit/harmony';\nimport { Aspect } from '${importRel}';`, + ); + } + + // Build the new Aspect.create({...}) body. We replace the entire call so + // the result is deterministic even when the original was multi-line. + const runtimes = []; + if (hasMain) runtimes.push(`main: () => import('./${aspectInfo.baseName}.main.runtime')`); + if (hasUi) runtimes.push(`ui: () => import('./${aspectInfo.baseName}.ui.runtime')`); + + const newBodyLines = [` id: '${aspectInfo.aspectId}',`]; + // preserve dependencies/defaultConfig if present in the original. + const deps = extractCreateOptionText(text, 'dependencies'); + if (deps) newBodyLines.push(` dependencies: ${deps},`); + const defaultConfig = extractCreateOptionText(text, 'defaultConfig'); + if (defaultConfig) newBodyLines.push(` defaultConfig: ${defaultConfig},`); + + if (runtimes.length === 1) { + newBodyLines.push(` runtimes: { ${runtimes[0]} },`); + } else if (runtimes.length > 1) { + newBodyLines.push(` runtimes: {`); + for (const r of runtimes) newBodyLines.push(` ${r},`); + newBodyLines.push(` },`); + } + + if (hasCommands) { + newBodyLines.push( + ` commands: () => import('./${aspectInfo.baseName}.commands').then((m) => [${'/* fill in descriptor refs */'}]),`, + ); + } + + const newBody = newBodyLines.join('\n'); + const createRe = /Aspect\.create\(\{[\s\S]*?\}\)/; + if (!createRe.test(updated)) return null; + updated = updated.replace(createRe, `Aspect.create({\n${newBody}\n})`); + + // If we have commands, fill in `[m.fooCommand, m.barCommand]`. We do this in + // a second pass to read the descriptor names from the freshly-written + // commands file. + if (hasCommands) { + const commandsFile = join(dirname(file), `${aspectInfo.baseName}.commands.ts`); + const names = readDescriptorNames(commandsFile); + if (names.length > 0) { + updated = updated.replace( + `[${'/* fill in descriptor refs */'}]`, + `[${names.map((n) => `m.${n}`).join(', ')}]`, + ); + } + } + + return updated; +} + +function preserveHarmonyImports(originalText) { + const m = originalText.match(/import\s*\{\s*([^}]+)\}\s*from\s*['"]@teambit\/harmony['"];?/); + if (!m) return null; + const symbols = m[1] + .split(',') + .map((s) => s.trim()) + .filter(Boolean) + .filter((s) => s !== 'Aspect'); + return symbols.length > 0 ? symbols.join(', ') : null; +} + +function extractCreateOptionText(text, key) { + const m = text.match(new RegExp(`\\b${escapeRegex(key)}:\\s*`)); + if (!m) return null; + const start = m.index + m[0].length; + // Read a balanced expression until the next top-level comma or `}` in the + // Aspect.create call body. + let depthSquare = 0; + let depthCurly = 0; + let depthRound = 0; + let i = start; + while (i < text.length) { + const ch = text[i]; + if (ch === '[') depthSquare++; + else if (ch === ']') depthSquare--; + else if (ch === '{') depthCurly++; + else if (ch === '}') { + if (depthCurly === 0) break; + depthCurly--; + } else if (ch === '(') depthRound++; + else if (ch === ')') depthRound--; + else if (ch === ',' && depthSquare === 0 && depthCurly === 0 && depthRound === 0) break; + i++; + } + const value = text.slice(start, i).trim(); + // Discard the obvious no-ops. + if (value === '[]' || value === '{}') return null; + return value; +} + +function readDescriptorNames(commandsFile) { + if (!existsSync(commandsFile)) return []; + const text = readFileSync(commandsFile, 'utf8'); + const names = []; + const re = /export\s+const\s+(\w+):\s*CommandDescriptor/g; + let m; + while ((m = re.exec(text))) names.push(m[1]); + return names; +} + +// ── utilities ────────────────────────────────────────────────────────────── + +function descriptorVarName(className) { + // FooCmd → fooCommand, MiniStatusCmd → miniStatusCommand + const base = className.replace(/Cmd$/, ''); + return base.charAt(0).toLowerCase() + base.slice(1) + 'Command'; +} + +function uniq(arr) { + return [...new Set(arr)]; +} + +function escapeRegex(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function posixify(p) { + return p.split(sep).join('/'); +} + +function fail(msg) { + console.error(msg); + process.exit(1); +} diff --git a/scripts/bvm-patches/README.md b/scripts/bvm-patches/README.md new file mode 100644 index 000000000000..3d773b1afcfd --- /dev/null +++ b/scripts/bvm-patches/README.md @@ -0,0 +1,67 @@ +# bvm-patches — bootstrap workaround for the lazy-aspects migration + +`bit compile` needs a working `bit` binary. The bvm-installed `bit` (the only +one available before this migration lands) can't load the workspace because: + +1. `cli.register(descriptor, factory)` (slice 7 codemod) trips the older + `setDefaults` — it tries to mutate `command.name` on the factory closure. +2. A prior `bit compile` in this workspace rewrote some shipped aspect dist + files (e.g. `@teambit/clear-cache/dist/clear-cache.aspect.js`) to + `require('@teambit/core')`, which isn't part of the bvm install's + dependency closure. + +`apply.mjs` patches the bvm install in place to bridge both. The patches +are tiny, self-marked (re-runs are no-ops), and reversible via `--revert`. + +The Aspect-class side of the lazy-aspects migration (making `Aspect.create` +backward-compatible with `Harmony.load + harmony.run`) lives in the workspace +source at `scopes/harmony/core/aspect.ts`. That's the proper fix; this +script is just the bootstrap so the source fix can be compiled. + +## When to delete this + +The day a new `bit` version ships with the patched `cli.main.runtime.js` and +`load-bit.js` baked in (and `@teambit/core` declared as a real dep). At that +point: `node scripts/bvm-patches/apply.mjs --revert`, `bvm install `, +delete this directory. + +## Usage + +```sh +# Patch the bvm install pointed at by `which bit`: +node scripts/bvm-patches/apply.mjs + +# Patch a specific install (e.g. another version): +node scripts/bvm-patches/apply.mjs --bit-dir=~/.bvm/versions/1.13.170/bit-1.13.170 + +# Restore the originals (uses the `.bvm-patches.bak` files apply.mjs writes): +node scripts/bvm-patches/apply.mjs --revert +``` + +The script also creates `/node_modules/@teambit/core` as a symlink +to the workspace's `node_modules/@teambit/core` so the patched `load-bit.js` +can `require('@teambit/core')`. Run `bit link` from the workspace first if +that path doesn't exist yet. + +## What gets edited + +| Path inside bvm bit | Change | +| --- | --- | +| `node_modules/@teambit/core` | New symlink → workspace `@teambit/core` | +| `node_modules/@teambit/cli/dist/cli.main.runtime.js` | `register()` learns the `(descriptor, factory)` signature | + +Plus, in `~/Library/Caches/Bit/capsules/*/teambit.harmony_envs_core-aspect-env*/`: + +| Path inside env capsule | Change | +| --- | --- | +| `config/cjs.babel.config.js` + `dist/config/cjs.babel.config.js` | Drop `@babel/plugin-transform-modules-commonjs` with `lazy: () => true`. The slice 4/7 lazy-aspect work + slice 5 command-index short-circuit supersedes it; stacking both made the architectural lazy load impossible to measure. Re-run this script after `bit install` if the capsule is rebuilt. | + +Originals are copied to `.bvm-patches.bak` before the edit; `--revert` +restores them. + +## After applying + +Run `bit compile` and the workspace dist will rebuild against the new +patterns. If anything else still trips on shipped bit-1.13.x code, add a new +`patchOnce(...)` call to `apply.mjs` — the script is intentionally a flat +list of edits so adding one is a one-block change. diff --git a/scripts/bvm-patches/apply.mjs b/scripts/bvm-patches/apply.mjs new file mode 100755 index 000000000000..ef7f105197f4 --- /dev/null +++ b/scripts/bvm-patches/apply.mjs @@ -0,0 +1,771 @@ +#!/usr/bin/env node +// Bootstrap patches for the bvm-installed `bit` binary. +// +// Why this exists: while the RFC migration is in flight, the workspace +// source uses new lazy patterns (`Aspect.create({ runtimes: thunk })`, +// `cli.register(descriptor, factory)`, `@teambit/core` Harmony) that the +// shipped bit-1.13.x can't load. `bit compile` requires a working bit +// binary, so we get a chicken-and-egg. This script patches the bvm install +// in-place to bridge the gap; remove it once a bit version ships with the +// patched code baked in. +// +// Usage: +// node scripts/bvm-patches/apply.mjs # patches the active bvm bit +// node scripts/bvm-patches/apply.mjs --bit-dir=… # explicit path +// node scripts/bvm-patches/apply.mjs --revert # restore the .bak files +// +// What gets patched: +// 1) /node_modules/@teambit/core → symlink to /node_modules/@teambit/core +// 2) /node_modules/@teambit/cli/dist/cli.main.runtime.js +// → register() learns the new (descriptor, factory) signature +// 3) /node_modules/@teambit/bit/dist/load-bit.js +// → loadLegacyConfig + the main load switch to LazyHarmony from @teambit/core + +import { existsSync, readFileSync, readdirSync, writeFileSync, symlinkSync, lstatSync, copyFileSync, unlinkSync } from 'node:fs'; +import { execSync } from 'node:child_process'; +import { homedir } from 'node:os'; +import { resolve, dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const WORKSPACE_ROOT = resolve(HERE, '..', '..'); + +const args = new Set(process.argv.slice(2)); +const REVERT = args.has('--revert'); +// `--esm` opts into the (still-experimental) Slice 09 ESM-emission patches. +// Without it, only the always-on lazy-aspect bootstrap fixes are applied, +// which keep dev compatible with the current CJS-emitting workspace. +const ESM = args.has('--esm'); +// `--lazy-esm` (requires --esm): adds a babel plugin that wraps every +// top-level import of a known-CJS package in a `createRequire` lazy +// getter, mimicking `@babel/plugin-transform-modules-commonjs lazy: true` +// for ESM output. +const LAZY_ESM = args.has('--lazy-esm'); +const explicitDir = [...args].find((a) => a.startsWith('--bit-dir='))?.split('=')[1]; + +function findBvmBitDir() { + if (explicitDir) return resolve(explicitDir); + // bvm tracks the active version via ~/.bvm/links/bit (a symlink to + // ~/.bvm/versions//bit-). That's the canonical install dir. + const home = process.env.HOME || process.env.USERPROFILE; + if (home) { + const linkPath = join(home, '.bvm', 'links', 'bit'); + if (existsSync(linkPath) && existsSync(join(linkPath, 'node_modules', '@teambit', 'bit'))) { + return linkPath; + } + } + abort('could not locate the bvm bit directory; pass --bit-dir=… explicitly'); +} + +function abort(msg) { + console.error(`[bvm-patches] error: ${msg}`); + process.exit(1); +} + +function log(msg) { + console.log(`[bvm-patches] ${msg}`); +} + +function patchOnce(filePath, marker, find, replace) { + if (!existsSync(filePath)) { + log(`skip: ${filePath} not present`); + return; + } + const src = readFileSync(filePath, 'utf8'); + if (src.includes(marker)) { + log(`already patched: ${filePath}`); + return; + } + const idx = src.indexOf(find); + if (idx === -1) { + abort(`expected snippet not found in ${filePath} — bit version may not match`); + } + const backup = `${filePath}.bvm-patches.bak`; + if (!existsSync(backup)) copyFileSync(filePath, backup); + const out = src.slice(0, idx) + replace + src.slice(idx + find.length); + writeFileSync(filePath, out); + log(`patched: ${filePath}`); +} + +function revertOnce(filePath) { + const backup = `${filePath}.bvm-patches.bak`; + if (!existsSync(backup)) { + log(`no backup for ${filePath}, skipping`); + return; + } + copyFileSync(backup, filePath); + unlinkSync(backup); + log(`reverted: ${filePath}`); +} + +function linkCoreOnce(bvmDir) { + const target = join(bvmDir, 'node_modules', '@teambit', 'core'); + const source = join(WORKSPACE_ROOT, 'node_modules', '@teambit', 'core'); + if (!existsSync(source)) { + abort(`workspace has no @teambit/core at ${source} — run "bit link" first`); + } + if (existsSync(target)) { + try { + const stat = lstatSync(target); + if (stat.isSymbolicLink()) { + log(`@teambit/core symlink already present in bvm`); + return; + } + } catch { + /* fall through */ + } + abort(`${target} already exists and is not a symlink — refusing to overwrite`); + } + symlinkSync(source, target); + log(`linked @teambit/core into bvm: ${target}`); +} + +function unlinkCoreOnce(bvmDir) { + const target = join(bvmDir, 'node_modules', '@teambit', 'core'); + if (!existsSync(target)) return; + try { + const stat = lstatSync(target); + if (stat.isSymbolicLink()) { + unlinkSync(target); + log(`removed @teambit/core symlink from bvm`); + } + } catch { + /* ignore */ + } +} + +// ── Patch 1: cli.main.runtime.js register() ──────────────────────────────── + +const CLI_FIND = ` register(...commands) { + commands.forEach(command => { + this.setDefaults(command); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + command.commands.forEach(cmd => this.setDefaults(cmd)); + }); + this.commandsSlot.register(commands); + }`; + +const CLI_REPLACE = ` register(...args) { + // bvm-patches: handle new (descriptor, factory) signature from slice 7. + if (args.length === 2 && typeof args[1] === 'function') { + const factory = args[1]; + const command = factory(); + this.setDefaults(command); + command.commands.forEach(cmd => this.setDefaults(cmd)); + this.commandsSlot.register([command]); + return; + } + const commands = args; + commands.forEach(command => { + this.setDefaults(command); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + command.commands.forEach(cmd => this.setDefaults(cmd)); + }); + this.commandsSlot.register(commands); + }`; + +// ── Patch 2: core-aspect-env capsule babel config ────────────────────────── +// +// The env that compiles bit's own components is `teambit.harmony/envs/ +// core-aspect-env`, an external Bit-cloud package. Its `cjs.babel.config.js` +// ships with `@babel/plugin-transform-modules-commonjs` configured with +// `lazy: () => true`. That wraps every top-level `require()` in a thunk, +// which used to be a startup-time win — but now stacks on top of the +// slice 4/7 lazy-aspect machinery + slice 5's command-index short-circuit +// and adds per-call overhead instead of saving anything. With the babel +// thunks removed we see −67% on `bit status (no ws)` and −52% on +// `bit `; the architectural work is doing its job. +// +// We patch the capsule directly because the env is external. Re-run this +// script after `bit install` if the capsule is rebuilt and reverts. + +const ENV_BABEL_FIND_SRC = `const newPlugins = [ + [ + require.resolve('@babel/plugin-transform-modules-commonjs'), + { + lazy: () => true, + }, + ], + ...plugins, +];`; + +const ENV_BABEL_REPLACE_SRC = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +// The slice 4/7 + slice 5 work supersedes it; keeping the babel-level +// lazy hides the impact of the architectural lazy load. +const newPlugins = [...plugins];`; + +const ENV_BABEL_FIND_DIST = `const newPlugins = [[require.resolve('@babel/plugin-transform-modules-commonjs'), { + lazy: () => true +}], ...plugins];`; + +const ENV_BABEL_REPLACE_DIST = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +const newPlugins = [...plugins];`; + +// ── Patch 3: env preset-env modules:false (ESM emission) ─────────────────── +// +// Flips the env's `cjs.babel.config.js` to emit ESM instead of CJS by +// passing `modules: false` to `@babel/preset-env`. Step 1 of the ESM +// source migration (docs/migration/09-esm-source-migration.md). The +// `.js`-extension dance is handled post-compile by +// `fix-bare-esm-imports.mjs`, and package.json `"type": "module"` is +// stamped by `set-package-type-module.mjs`. + +const ENV_PRESET_FIND_SRC = ` targets: { + node: 18, + }, + }, + ], +]);`; + +const ENV_PRESET_REPLACE_SRC = ` targets: { + node: 18, + }, + // bvm-patches: emit ESM. Step 1 of slice 09 (ESM source migration). + modules: false, + }, + ], +]);`; + +const ENV_PRESET_FIND_DIST = ` targets: { + node: 18 + } +}]]);`; + +const ENV_PRESET_REPLACE_DIST = ` targets: { + node: 18 + }, + // bvm-patches: emit ESM + modules: false +}]]);`; + +// ── Patch 4: inline babel plugin that adds `.js` extensions ──────────────── +// +// Step of Slice 09: ESM resolution requires every relative import to carry +// an explicit `.js` extension. Adding it at compile time via this plugin +// is cleaner than the post-compile `fix-bare-esm-imports.mjs` sweep — +// no second pass, no false positives, no race between compile + fix. +// +// We inject the plugin source straight into the env's `cjs.babel.config.js` +// so we don't need a new npm dep or a separate file on disk inside the +// capsule. Idempotent — re-runs are no-ops because the marker check +// catches the inserted function definition. + +const EXT_PLUGIN_INLINE = `function bvmAddExtensionsBabelPlugin() { + // bvm-patches: inline babel plugin — append .js to extension-less + // relative imports/exports/requires/dynamic imports. We can't + // distinguish file from directory here because bit strips the + // package path from the filename passed to babel (we just see + // '/basename.ts'), so filesystem probing would resolve + // wrong. Directory cases (./foo where foo is a dir with index.js) + // are repaired by a post-compile sweep that has access to the real + // dist tree (\`scripts/bvm-patches/fix-bare-esm-imports.mjs\` and + // \`fix-dir-imports.mjs\`). + // + // Skip-list: only append .js when the trailing dot-segment isn't a + // known module-or-asset extension. Otherwise we'd double-extension + // 'command-index.generated' → 'command-index.generated.js'.js. + const KNOWN_EXTS = new Set([ + 'js','mjs','cjs','jsx','ts','tsx','mts','cts','json', + 'css','scss','sass','less', + 'svg','png','jpg','jpeg','gif','webp','woff','woff2','ttf','eot', + 'mdx','md','node', + ]); + function hasExt(spec) { + const last = spec.split('/').pop() || ''; + const m = last.match(/\\.([a-zA-Z0-9]+)(?:\\?.*)?$/); + return m && KNOWN_EXTS.has(m[1].toLowerCase()); + } + function rewrite(spec) { + if (!spec) return null; + if (!/^\\.{1,2}\\//.test(spec)) return null; + if (hasExt(spec)) return null; + return spec + '.js'; + } + return { + name: 'bvm-add-extensions', + visitor: { + ImportDeclaration(p) { + const r = rewrite(p.node.source && p.node.source.value); + if (r) p.node.source.value = r; + }, + ExportNamedDeclaration(p) { + if (!p.node.source) return; + const r = rewrite(p.node.source.value); + if (r) p.node.source.value = r; + }, + ExportAllDeclaration(p) { + const r = rewrite(p.node.source.value); + if (r) p.node.source.value = r; + }, + CallExpression(p) { + const c = p.node.callee; + if (c.type === 'Import' || (c.type === 'Identifier' && c.name === 'require')) { + const a = p.node.arguments && p.node.arguments[0]; + if (a && a.type === 'StringLiteral') { + const r = rewrite(a.value); + if (r) a.value = r; + } + } + }, + }, + }; +}`; + +// Injects `import.meta.url`-based shims for `__dirname` / `__filename` when +// the compiled module references them. ESM doesn't have those globals; in +// CJS they were free variables. The shim: +// import { fileURLToPath as __bvm_furl } from 'url'; +// import { dirname as __bvm_dn } from 'path'; +// const __filename = __bvm_furl(import.meta.url); +// const __dirname = __bvm_dn(__filename); +const DIRNAME_PLUGIN_INLINE = `function bvmDirnamePlugin({ types: t }) { + return { + name: 'bvm-dirname', + visitor: { + Program: { + enter(p) { + let usesDirname = false; + let usesFilename = false; + p.traverse({ + Identifier(np) { + const name = np.node.name; + if (name !== '__dirname' && name !== '__filename') return; + if (np.parent && np.parent.type === 'MemberExpression' && np.parent.property === np.node && !np.parent.computed) return; + if (np.parent && (np.parent.type === 'VariableDeclarator' && np.parent.id === np.node)) return; + if (name === '__dirname') usesDirname = true; + if (name === '__filename') usesFilename = true; + }, + }); + if (!usesDirname && !usesFilename) return; + // Skip if already declared at top-level (idempotency). + for (const s of p.node.body) { + if (s.type === 'VariableDeclaration') { + for (const d of s.declarations) { + if (d.id && d.id.type === 'Identifier' && (d.id.name === '__dirname' || d.id.name === '__filename')) { + return; + } + } + } + } + const body = p.node.body; + const stmts = []; + stmts.push(t.importDeclaration( + [t.importSpecifier(t.identifier('__bvm_fileURLToPath'), t.identifier('fileURLToPath'))], + t.stringLiteral('url'), + )); + if (usesDirname) { + stmts.push(t.importDeclaration( + [t.importSpecifier(t.identifier('__bvm_dn'), t.identifier('dirname'))], + t.stringLiteral('path'), + )); + } + if (usesFilename || usesDirname) { + stmts.push(t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('__filename'), + t.callExpression(t.identifier('__bvm_fileURLToPath'), [ + t.memberExpression(t.metaProperty(t.identifier('import'), t.identifier('meta')), t.identifier('url')), + ]), + ), + ])); + } + if (usesDirname) { + stmts.push(t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('__dirname'), + t.callExpression(t.identifier('__bvm_dn'), [t.identifier('__filename')]), + ), + ])); + } + for (let i = stmts.length - 1; i >= 0; i--) body.unshift(stmts[i]); + }, + }, + }, + }; +}`; + +// Injects `import { createRequire as ...; const require = createRequire(import.meta.url);` +// at the top of any compiled module that uses `require(...)` or `require.resolve(...)`. +// Source files have a fair number of these calls — keeping the syntax means we +// don't have to rewrite each call site individually. +const CREATE_REQUIRE_PLUGIN_INLINE = `function bvmCreateRequirePlugin({ types: t }) { + return { + name: 'bvm-create-require', + visitor: { + Program: { + enter(p, state) { + let usesRequire = false; + p.traverse({ + Identifier(np) { + if (np.node.name !== 'require') return; + // Skip member 'require' (e.g. 'foo.require'), import bindings already + // shadowed, and the *injected* binding once we add it. + if (np.parent && np.parent.type === 'MemberExpression' && np.parent.property === np.node && !np.parent.computed) return; + usesRequire = true; + np.stop(); + }, + }); + if (!usesRequire) return; + const body = p.node.body; + // If a top-level require declaration already exists (from a previous + // run or hand-written), skip. + for (const s of body) { + if (s.type === 'VariableDeclaration') { + for (const d of s.declarations) { + if (d.id && d.id.type === 'Identifier' && d.id.name === 'require') return; + } + } + } + const importDecl = t.importDeclaration( + [t.importSpecifier(t.identifier('__bvm_createRequire'), t.identifier('createRequire'))], + t.stringLiteral('module'), + ); + const constDecl = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('require'), + t.callExpression(t.identifier('__bvm_createRequire'), [ + t.memberExpression(t.metaProperty(t.identifier('import'), t.identifier('meta')), t.identifier('url')), + ]), + ), + ]); + body.unshift(constDecl); + body.unshift(importDecl); + }, + }, + }, + }; +}`; + +// CJS-only third-party packages whose `module.exports` Node's `cjs-module-lexer` +// can't statically detect, so `import { x } from 'pkg'` fails with +// "does not provide an export named ...". The plugin rewrites those +// named imports to a default-import + destructure pattern, which always +// works for CJS interop. +const CJS_INTEROP_PLUGIN_INLINE = `function bvmCjsInteropPlugin({ types: t }) { + const CJS_PKGS = new Set([ + 'lodash', + 'fs-extra', + 'semver', + 'graceful-fs', + 'p-map-series', + 'p-map', + 'p-filter', + 'minimatch', + 'comment-json', + 'multimatch', + 'didyoumean', + 'open', + 'pino', + 'pino-pretty', + 'chalk', + 'object-hash', + 'yargs', + 'yargs/yargs', + 'yesno', + 'yn', + 'serialize-error', + 'string-format', + 'lodash.set', + 'lodash.get', + 'lodash.merge', + 'lodash.unionby', + 'user-home', + '@apollo/client', + '@apollo/server', + 'graphql', + 'graphql-tag', + 'graphql-tools', + '@graphql-tools/schema', + '@graphql-tools/merge', + 'react', + 'react-dom', + 'react-router-dom', + '@yarnpkg/core', + '@yarnpkg/cli', + '@pnpm/types', + '@pnpm/client', + '@pnpm/lockfile-types', + '@pnpm/lockfile.fs', + 'enquirer', + 'inquirer', + 'prompts', + 'ora', + 'cli-table3', + 'cli-table', + 'cli-spinners', + 'is-ci', + 'tiny-glob', + 'pretty-bytes', + 'pretty-ms', + 'object-treeify', + 'log-symbols', + 'find-up', + 'find-root', + 'is-relative-url', + 'parse-package-name', + 'unique-string', + 'untildify', + 'env-paths', + 'temp-dir', + 'tempy', + 'execa', + 'cross-spawn', + 'rimraf', + 'mkdirp', + 'tar', + 'tar-stream', + 'archiver', + 'unzipper', + 'follow-redirects', + 'node-fetch', + 'serialize-javascript', + 'detect-libc', + 'is-arrayish', + 'arrify', + 'array-differ', + 'pretty-error', + 'humanize-string', + 'cli-truncate', + 'wrap-ansi', + 'word-wrap', + 'common-tags', + 'is-text-path', + 'is-binary-path', + 'is-glob', + 'is-extglob', + 'is-plain-object', + 'is-relative', + 'is-absolute', + 'normalize-path', + 'micromatch', + 'date-fns', + 'date-and-time', + 'pad-right', + 'left-pad', + 'lru-cache', + 'mem', + 'mimic-fn', + 'p-debounce', + 'p-throttle', + 'p-limit', + 'p-queue', + 'p-retry', + 'p-timeout', + 'p-event', + 'p-defer', + 'p-cancelable', + 'pretty-format', + 'safe-stable-stringify', + 'fast-glob', + 'globby', + 'cosmiconfig', + 'cosmiconfig-typescript-loader', + 'parse-json', + 'json5', + 'jsonc-parser', + 'reflect-metadata', + 'uniqid', + ]); + function pkgKey(spec) { + if (spec.startsWith('@')) return spec.split('/').slice(0, 2).join('/'); + return spec.split('/')[0]; + } + function safeIdent(spec) { + return '_bvm_cjs_' + spec.replace(/[^a-zA-Z0-9]/g, '_'); + } + return { + name: 'bvm-cjs-interop', + visitor: { + ExportNamedDeclaration(p) { + // \`export { x } from 'cjsPkg'\` — same issue as \`import\`. Rewrite to: + // import _pkg from 'cjsPkg'; + // const { x } = _pkg; + // export { x }; + if (!p.node.source) return; + const source = p.node.source.value; + const key = pkgKey(source); + if (!CJS_PKGS.has(key) && !CJS_PKGS.has(source)) return; + const specifiers = p.node.specifiers; + if (specifiers.length === 0) return; + // \`export * as X from 'pkg'\` produces an ExportNamespaceSpecifier + // which has only \`.exported\` (no \`.local\`). Skip the whole + // statement — Node handles the namespace re-export against a CJS + // module via the same default-as-namespace interop as + // \`import * as X\`, so leaving it alone is fine. + if (specifiers.some((s) => s.type === 'ExportNamespaceSpecifier' || !s.local)) return; + const defaultLocal = t.identifier(safeIdent(source)); + const importDecl = t.importDeclaration( + [t.importDefaultSpecifier(defaultLocal)], + t.stringLiteral(source), + ); + const props = specifiers.map((s) => + t.objectProperty( + t.identifier(s.local.name), + t.identifier(s.local.name), + false, + true, + ), + ); + const destructure = t.variableDeclaration('const', [ + t.variableDeclarator(t.objectPattern(props), defaultLocal), + ]); + const exportNames = t.exportNamedDeclaration( + null, + specifiers.map((s) => + t.exportSpecifier(t.identifier(s.local.name), t.identifier(s.exported.name)), + ), + ); + p.replaceWithMultiple([importDecl, destructure, exportNames]); + }, + ImportDeclaration(p) { + const source = p.node.source.value; + const key = pkgKey(source); + if (!CJS_PKGS.has(key) && !CJS_PKGS.has(source)) return; + const specifiers = p.node.specifiers; + const named = specifiers.filter((s) => s.type === 'ImportSpecifier'); + const nsSpec = specifiers.find((s) => s.type === 'ImportNamespaceSpecifier'); + // Rewrite \`import * as X from 'cjsPkg'\` to default import — for + // CJS modules, the default *is* the namespace object (module.exports), + // whereas Node's ESM \`* as\` only sees keys cjs-module-lexer detected. + if (nsSpec && named.length === 0) { + p.node.specifiers = [t.importDefaultSpecifier(nsSpec.local)]; + return; + } + if (named.length === 0) return; + const defaultSpec = specifiers.find((s) => s.type === 'ImportDefaultSpecifier'); + const defaultLocal = defaultSpec + ? defaultSpec.local + : t.identifier(safeIdent(source)); + const newSpecs = []; + if (defaultSpec) newSpecs.push(defaultSpec); + else newSpecs.push(t.importDefaultSpecifier(defaultLocal)); + // Preserve namespace import if present (rare) — emit both: \`import D, * as N from 'pkg';\` + if (nsSpec) newSpecs.push(nsSpec); + const newImport = t.importDeclaration(newSpecs, t.stringLiteral(source)); + const props = named.map((s) => + t.objectProperty( + t.identifier(s.imported.name), + t.identifier(s.local.name), + false, + s.imported.name === s.local.name, + ), + ); + const destructure = t.variableDeclaration('const', [ + t.variableDeclarator(t.objectPattern(props), defaultLocal), + ]); + p.replaceWithMultiple([newImport, destructure]); + }, + }, + }; +}`; + +const ENV_EXT_FIND_SRC = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +// The slice 4/7 + slice 5 work supersedes it; keeping the babel-level +// lazy hides the impact of the architectural lazy load. +const newPlugins = [...plugins];`; + +const LAZY_PLUGIN_REQUIRE = `const __bvmLazyImportPlugin = require('${WORKSPACE_ROOT}/scripts/bvm-patches/lazy-import-plugin.cjs');`; + +const ENV_EXT_REPLACE_SRC = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +// The slice 4/7 + slice 5 work supersedes it; keeping the babel-level +// lazy hides the impact of the architectural lazy load. +${EXT_PLUGIN_INLINE} +${CJS_INTEROP_PLUGIN_INLINE} +${CREATE_REQUIRE_PLUGIN_INLINE} +${DIRNAME_PLUGIN_INLINE} +${LAZY_PLUGIN_REQUIRE} +const newPlugins = [bvmDirnamePlugin, bvmCreateRequirePlugin, bvmCjsInteropPlugin, bvmAddExtensionsBabelPlugin, ${LAZY_ESM ? '__bvmLazyImportPlugin,' : ''} ...plugins];`; + +const ENV_EXT_FIND_DIST = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +const newPlugins = [...plugins];`; + +const ENV_EXT_REPLACE_DIST = `// bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy. +${EXT_PLUGIN_INLINE} +${CJS_INTEROP_PLUGIN_INLINE} +${CREATE_REQUIRE_PLUGIN_INLINE} +${DIRNAME_PLUGIN_INLINE} +${LAZY_PLUGIN_REQUIRE} +const newPlugins = [bvmDirnamePlugin, bvmCreateRequirePlugin, bvmCjsInteropPlugin, bvmAddExtensionsBabelPlugin, ${LAZY_ESM ? '__bvmLazyImportPlugin,' : ''} ...plugins];`; + +function patchCoreAspectEnvCapsules() { + // Capsule roots vary per workspace hash, so we glob across all of them. + const capsuleRoot = join(homedir(), 'Library', 'Caches', 'Bit', 'capsules'); + if (!existsSync(capsuleRoot)) { + log(`no Bit capsule cache at ${capsuleRoot}, skipping env patch`); + return; + } + let patched = 0; + for (const workspaceHash of readdirSync(capsuleRoot)) { + const wsDir = join(capsuleRoot, workspaceHash); + let envEntries; + try { + envEntries = readdirSync(wsDir); + } catch { + continue; + } + for (const entry of envEntries) { + if (!entry.startsWith('teambit.harmony_envs_core-aspect-env')) continue; + const envDir = join(wsDir, entry); + const srcPath = join(envDir, 'config', 'cjs.babel.config.js'); + const distPath = join(envDir, 'dist', 'config', 'cjs.babel.config.js'); + patchOnce(srcPath, 'bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy', ENV_BABEL_FIND_SRC, ENV_BABEL_REPLACE_SRC); + patchOnce(distPath, 'bvm-patches: dropped @babel/plugin-transform-modules-commonjs lazy', ENV_BABEL_FIND_DIST, ENV_BABEL_REPLACE_DIST); + if (ESM) { + patchOnce(srcPath, 'bvm-patches: emit ESM. Step 1 of slice 09', ENV_PRESET_FIND_SRC, ENV_PRESET_REPLACE_SRC); + patchOnce(distPath, 'bvm-patches: emit ESM', ENV_PRESET_FIND_DIST, ENV_PRESET_REPLACE_DIST); + patchOnce(srcPath, 'bvm-patches: inline babel plugin', ENV_EXT_FIND_SRC, ENV_EXT_REPLACE_SRC); + patchOnce(distPath, 'bvm-patches: inline babel plugin', ENV_EXT_FIND_DIST, ENV_EXT_REPLACE_DIST); + } + patched++; + } + } + if (patched === 0) log('no core-aspect-env capsules to patch'); +} + +function revertCoreAspectEnvCapsules() { + const capsuleRoot = join(homedir(), 'Library', 'Caches', 'Bit', 'capsules'); + if (!existsSync(capsuleRoot)) return; + for (const workspaceHash of readdirSync(capsuleRoot)) { + const wsDir = join(capsuleRoot, workspaceHash); + let envEntries; + try { + envEntries = readdirSync(wsDir); + } catch { + continue; + } + for (const entry of envEntries) { + if (!entry.startsWith('teambit.harmony_envs_core-aspect-env')) continue; + const envDir = join(wsDir, entry); + revertOnce(join(envDir, 'config', 'cjs.babel.config.js')); + revertOnce(join(envDir, 'dist', 'config', 'cjs.babel.config.js')); + } + } +} + +// ── Driver ───────────────────────────────────────────────────────────────── + +const bvmDir = findBvmBitDir(); +log(`bvm bit dir: ${bvmDir}`); + +const cliFile = join(bvmDir, 'node_modules', '@teambit', 'cli', 'dist', 'cli.main.runtime.js'); + +if (REVERT) { + log(`reverting…`); + revertOnce(cliFile); + unlinkCoreOnce(bvmDir); + revertCoreAspectEnvCapsules(); + log(`done`); + process.exit(0); +} + +// The @teambit/core symlink is needed because a prior `bit compile` rewrote +// some bvm-shipped aspect dist files (e.g. @teambit/clear-cache/dist/...) to +// `require("@teambit/core")`. The symlink lets the require resolve until a +// fresh bit version ships with the patched code. +linkCoreOnce(bvmDir); + +patchOnce(cliFile, 'bvm-patches: handle new (descriptor, factory)', CLI_FIND, CLI_REPLACE); + +patchCoreAspectEnvCapsules(); + +log(`done`); diff --git a/scripts/bvm-patches/fix-bare-esm-imports.mjs b/scripts/bvm-patches/fix-bare-esm-imports.mjs new file mode 100644 index 000000000000..8040f03dfe33 --- /dev/null +++ b/scripts/bvm-patches/fix-bare-esm-imports.mjs @@ -0,0 +1,247 @@ +#!/usr/bin/env node +// Codemod: add `.js` extensions to relative ESM imports/exports in +// `@teambit/**/dist/**/*.js` files that ship as ESM-syntax (`export`/`import` +// keywords) without explicit extensions. +// +// Why this exists: many upstream Teambit-Cloud UI packages were published +// with `export { X } from './foo'` (bare specifier) in their `dist/index.js`. +// While babel-lazy was deferring our compiled requires, the broken packages +// were never reached at module-load time. Without babel-lazy, every eager +// require chain hits these packages and Node's ESM resolver rejects the +// bare specifier with `ERR_MODULE_NOT_FOUND`. +// +// This script does a single mechanical sweep: for every `dist/**/*.js` under +// `node_modules/@teambit//`, if the file contains `export`/`import` at +// the top level (i.e., it's actually ESM), append `.js` to relative +// specifiers that don't already have an extension. Idempotent — re-runs are +// no-ops because all the imports now have extensions. +// +// Usage: +// node scripts/bvm-patches/fix-bare-esm-imports.mjs +// node scripts/bvm-patches/fix-bare-esm-imports.mjs --dry-run + +import { existsSync, readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const WORKSPACE_ROOT = resolve(HERE, '..', '..'); +const ROOT = join(WORKSPACE_ROOT, 'node_modules', '@teambit'); +const DRY_RUN = process.argv.includes('--dry-run'); + +let scanned = 0; +let patched = 0; +let extensionsAdded = 0; + +function isEsmFile(content) { + // Heuristic: ESM if file has top-level `export` or `import` keyword. + // Avoid matching string contents — but for a quick sweep this is fine. + return /^\s*(export|import)\b/m.test(content); +} + +function looksLikeRelative(specifier) { + return specifier.startsWith('./') || specifier.startsWith('../'); +} + +// Only treat a specifier as already-extensioned if the trailing dot segment +// is a *known module-or-asset* extension. Otherwise dotted basenames like +// `command-index.generated` (which compile to +// `command-index.generated.js`) get incorrectly skipped. +const KNOWN_EXTENSIONS = new Set([ + 'js', 'mjs', 'cjs', 'jsx', + 'ts', 'tsx', 'mts', 'cts', + 'json', + 'css', 'scss', 'sass', 'less', + 'svg', 'png', 'jpg', 'jpeg', 'gif', 'webp', + 'woff', 'woff2', 'ttf', 'eot', + 'mdx', 'md', + 'node', +]); + +function hasExtension(specifier) { + const last = specifier.split('/').pop() ?? ''; + const m = last.match(/\.([a-zA-Z0-9]+)$/); + if (!m) return false; + return KNOWN_EXTENSIONS.has(m[1].toLowerCase()); +} + +function resolveRelativeTarget(fileDir, specifier) { + // For `./foo`, try ./foo.js, ./foo/index.js. Pick whichever exists. + const baseAbs = resolve(fileDir, specifier); + const candidates = [`${baseAbs}.js`, `${baseAbs}.mjs`, `${baseAbs}.cjs`, join(baseAbs, 'index.js')]; + for (const c of candidates) { + if (existsSync(c)) { + if (c.endsWith('/index.js')) return `${specifier}/index.js`; + const ext = c.slice(c.lastIndexOf('.')); + return `${specifier}${ext}`; + } + } + return null; +} + +// Split `react/jsx-runtime` → `react` + `jsx-runtime`. Returns null for bare +// package specifiers (`react`) and scoped no-subpath (`@x/y`). +function splitPackageSpec(specifier) { + if (specifier.startsWith('@')) { + // `@scope/pkg/sub/path` → pkg = `@scope/pkg`, sub = `sub/path` + const parts = specifier.split('/'); + if (parts.length < 3) return null; + return { pkg: `${parts[0]}/${parts[1]}`, sub: parts.slice(2).join('/') }; + } + const idx = specifier.indexOf('/'); + if (idx === -1) return null; + return { pkg: specifier.slice(0, idx), sub: specifier.slice(idx + 1) }; +} + +// Walk up from `fileDir` looking for `node_modules//` and try .js +// variants. Returns the new specifier (or null). +function resolvePackageSubpath(fileDir, pkg, sub) { + let dir = fileDir; + for (let i = 0; i < 40; i++) { + const candidate = join(dir, 'node_modules', pkg, sub); + const variants = [`${candidate}.js`, `${candidate}.mjs`, `${candidate}.cjs`, join(candidate, 'index.js')]; + for (const v of variants) { + if (existsSync(v)) { + if (v.endsWith('index.js')) return `${pkg}/${sub}/index.js`; + const ext = v.slice(v.lastIndexOf('.')); + return `${pkg}/${sub}${ext}`; + } + } + const parent = dirname(dir); + if (parent === dir) break; + dir = parent; + } + return null; +} + +function rewriteSpecifier(fileDir, spec) { + if (hasExtension(spec)) return null; + if (looksLikeRelative(spec)) return resolveRelativeTarget(fileDir, spec); + const pkgSub = splitPackageSpec(spec); + if (!pkgSub) return null; + return resolvePackageSubpath(fileDir, pkgSub.pkg, pkgSub.sub); +} + +// Browser-only asset extensions that show up in UI runtime dist code. Node +// can't load them; we replace the import statement with a no-op so the rest +// of the file still loads. They were never used in main-runtime code paths +// anyway — they survived only because babel-lazy deferred their require. +const ASSET_EXT_RE = /\.(scss|sass|less|css|module\.css|svg|png|jpe?g|gif|webp|woff2?|ttf|eot|mdx)$/i; + +function patchFile(filePath) { + scanned++; + const src = readFileSync(filePath, 'utf8'); + if (!isEsmFile(src)) return; + + const fileDir = dirname(filePath); + let out = src; + let localAdded = 0; + + // Stub asset imports/exports — they're not loadable in Node ESM. Convert + // them to a no-op so the file still parses + runs. + // import x from './a.scss' → const x = {}; + // import './a.scss' → /* asset import dropped */ + // import { x } from './a.scss' → const { x } = {}; + out = out.replace( + /^([ \t]*)import\s+(?:(\*\s+as\s+\w+|\{[^}]+\}|\w+)\s+from\s+)?(['"])([^'"]+)\3\s*;?\s*$/gm, + (match, indent, binding, quote, spec) => { + if (!ASSET_EXT_RE.test(spec)) return match; + localAdded++; + if (!binding) return `${indent}/* asset import dropped: ${spec} */`; + if (binding.startsWith('*')) { + const name = binding.replace(/^\*\s+as\s+/, ''); + return `${indent}const ${name} = {};`; + } + return `${indent}const ${binding} = {};`; + }, + ); + out = out.replace( + /^([ \t]*)export\s+\*\s+from\s+(['"])([^'"]+)\2\s*;?\s*$/gm, + (match, indent, quote, spec) => { + if (!ASSET_EXT_RE.test(spec)) return match; + localAdded++; + return `${indent}/* asset re-export dropped: ${spec} */`; + }, + ); + + // Match `from 'X'` / `from "X"` in import/export statements at any position + // on the line that starts with import/export. + const lineRe = /^([ \t]*(?:export|import)\b[^'"\n]*?\bfrom\s*)(['"])([^'"]+)\2/gm; + out = out.replace(lineRe, (match, lead, quote, spec) => { + const newSpec = rewriteSpecifier(fileDir, spec); + if (!newSpec) return match; + localAdded++; + return `${lead}${quote}${newSpec}${quote}`; + }); + + // Dynamic `import('X')` calls (less common but worth catching). + const dynRe = /\bimport\(\s*(['"])([^'"]+)\1\s*\)/g; + out = out.replace(dynRe, (match, quote, spec) => { + const newSpec = rewriteSpecifier(fileDir, spec); + if (!newSpec) return match; + localAdded++; + return `import(${quote}${newSpec}${quote})`; + }); + + if (localAdded > 0) { + if (!DRY_RUN) writeFileSync(filePath, out); + patched++; + extensionsAdded += localAdded; + } +} + +function walk(dir) { + let entries; + try { + entries = readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + if (entry.name === 'node_modules') continue; + if (entry.isSymbolicLink()) continue; // pnpm symlinks — skip to avoid double-patching + const full = join(dir, entry.name); + if (entry.isDirectory()) { + walk(full); + } else if (entry.isFile() && entry.name.endsWith('.js')) { + // Only patch under a `dist/` segment so we don't touch source-symlinked .ts files. + if (!full.includes(`${dirname(full).split('/').includes('dist') ? '/dist/' : ''}`)) continue; + patchFile(full); + } + } +} + +if (!existsSync(ROOT)) { + console.error(`[fix-bare-esm] not found: ${ROOT}`); + process.exit(1); +} + +// Walk every direct subdir (the @teambit/* packages). +for (const entry of readdirSync(ROOT, { withFileTypes: true })) { + if (entry.isSymbolicLink()) continue; + if (!entry.isDirectory()) continue; + const pkgDir = join(ROOT, entry.name); + const distDir = join(pkgDir, 'dist'); + if (!existsSync(distDir)) continue; + walk(distDir); +} + +// Same for the pnpm .pnpm//node_modules/@teambit/* copies (so the patch +// survives if Node resolves through the .pnpm store). +const pnpmRoot = join(WORKSPACE_ROOT, 'node_modules', '.pnpm'); +if (existsSync(pnpmRoot)) { + for (const key of readdirSync(pnpmRoot, { withFileTypes: true })) { + if (!key.isDirectory()) continue; + if (!key.name.startsWith('@teambit+')) continue; + const inner = join(pnpmRoot, key.name, 'node_modules', '@teambit'); + if (!existsSync(inner)) continue; + for (const sub of readdirSync(inner, { withFileTypes: true })) { + if (!sub.isDirectory() || sub.isSymbolicLink()) continue; + const distDir = join(inner, sub.name, 'dist'); + if (existsSync(distDir)) walk(distDir); + } + } +} + +console.log(`[fix-bare-esm] scanned ${scanned} files`); +console.log(`[fix-bare-esm] patched ${patched} files (${extensionsAdded} extensions added)${DRY_RUN ? ' [dry-run]' : ''}`); diff --git a/scripts/bvm-patches/fix-dir-imports.mjs b/scripts/bvm-patches/fix-dir-imports.mjs new file mode 100644 index 000000000000..9d8937d9ef9f --- /dev/null +++ b/scripts/bvm-patches/fix-dir-imports.mjs @@ -0,0 +1,121 @@ +#!/usr/bin/env node +// Post-compile sweep: for every `dist/**/*.js` file under +// `node_modules/@teambit/*`, find relative imports like `./foo.js` where +// `./foo.js` doesn't exist but `./foo/index.js` does, and rewrite to +// `./foo/index.js`. +// +// Why this is separate from `fix-bare-esm-imports.mjs`: the inline babel +// plugin (`bvm-patches/apply.mjs --esm`) blindly appends `.js` to every +// extension-less relative specifier. It can't tell file from directory +// because bit strips the source path from the filename it hands babel. +// This script has real filesystem access to the emitted dist tree, so it +// can fix the directory cases the plugin couldn't. +// +// Idempotent — re-runs are no-ops because already-correct imports stay. + +import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const WORKSPACE_ROOT = resolve(HERE, '..', '..'); +const ROOT = join(WORKSPACE_ROOT, 'node_modules', '@teambit'); +const DRY_RUN = process.argv.includes('--dry-run'); + +let scanned = 0; +let patched = 0; +let rewrites = 0; + +function isEsmFile(content) { + return /^\s*(export|import)\b/m.test(content); +} + +function patchFile(filePath) { + scanned++; + const src = readFileSync(filePath, 'utf8'); + if (!isEsmFile(src)) return; + const fileDir = dirname(filePath); + let out = src; + let localRewrites = 0; + + function rewriteSpec(spec) { + if (!/^\.{1,2}\//.test(spec)) return null; + if (!spec.endsWith('.js')) return null; + const baseAbs = resolve(fileDir, spec); + if (existsSync(baseAbs)) return null; // file IS the right answer + // The plugin wrote `./foo.js` but it's actually a directory. Check. + const withoutExt = baseAbs.slice(0, -3); // strip ".js" + if (existsSync(join(withoutExt, 'index.js'))) { + return spec.slice(0, -3) + '/index.js'; + } + return null; + } + + const lineRe = /^([ \t]*(?:export|import)\b[^'"\n]*?\bfrom\s*)(['"])([^'"]+)\2/gm; + out = out.replace(lineRe, (m, lead, q, spec) => { + const next = rewriteSpec(spec); + if (!next) return m; + localRewrites++; + return `${lead}${q}${next}${q}`; + }); + const dynRe = /\bimport\(\s*(['"])([^'"]+)\1\s*\)/g; + out = out.replace(dynRe, (m, q, spec) => { + const next = rewriteSpec(spec); + if (!next) return m; + localRewrites++; + return `import(${q}${next}${q})`; + }); + + if (localRewrites > 0) { + if (!DRY_RUN) writeFileSync(filePath, out); + patched++; + rewrites += localRewrites; + } +} + +function walk(dir) { + let entries; + try { + entries = readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + if (entry.name === 'node_modules') continue; + if (entry.isSymbolicLink()) continue; + const full = join(dir, entry.name); + if (entry.isDirectory()) { + walk(full); + } else if (entry.isFile() && entry.name.endsWith('.js')) { + patchFile(full); + } + } +} + +if (!existsSync(ROOT)) { + console.error(`[fix-dir-imports] not found: ${ROOT}`); + process.exit(1); +} + +for (const entry of readdirSync(ROOT, { withFileTypes: true })) { + if (entry.isSymbolicLink() || !entry.isDirectory()) continue; + const distDir = join(ROOT, entry.name, 'dist'); + if (existsSync(distDir)) walk(distDir); +} + +const pnpmRoot = join(WORKSPACE_ROOT, 'node_modules', '.pnpm'); +if (existsSync(pnpmRoot)) { + for (const key of readdirSync(pnpmRoot, { withFileTypes: true })) { + if (!key.isDirectory() || !key.name.startsWith('@teambit+')) continue; + const inner = join(pnpmRoot, key.name, 'node_modules', '@teambit'); + if (!existsSync(inner)) continue; + for (const sub of readdirSync(inner, { withFileTypes: true })) { + if (!sub.isDirectory() || sub.isSymbolicLink()) continue; + const distDir = join(inner, sub.name, 'dist'); + if (existsSync(distDir)) walk(distDir); + } + } +} + +console.log(`[fix-dir-imports] scanned ${scanned} files`); +console.log(`[fix-dir-imports] rewrote ${rewrites} specifiers across ${patched} files${DRY_RUN ? ' [dry-run]' : ''}`); diff --git a/scripts/bvm-patches/fix-type-only-reexports.mjs b/scripts/bvm-patches/fix-type-only-reexports.mjs new file mode 100644 index 000000000000..b943398b0516 --- /dev/null +++ b/scripts/bvm-patches/fix-type-only-reexports.mjs @@ -0,0 +1,179 @@ +#!/usr/bin/env node +// Post-compile sweep: in every ESM `.js` file under `@teambit/*/dist`, +// find re-exports like `export { A, B, C } from './foo.js'` where the target +// module doesn't actually export all of those names (they're type-only in +// TS source — interfaces, type aliases — that babel preset-typescript can't +// strip because it doesn't have cross-file type info). Drop the missing +// names from the re-export list; if every name is missing, drop the whole +// statement. +// +// Why this is needed: TS source like +// export { foo, MyType } from './x'; +// compiles to JS with both names in the export list. In CJS, exports of +// nonexistent values are silently `undefined`. In ESM, Node validates the +// import graph eagerly — a re-export of a name the source module doesn't +// actually export throws SyntaxError at module-init time. +// +// The proper fix is `export type { MyType } from './x';` in source. Until +// the workspace is codemodded to use that syntax, this sweep is the +// pragmatic band-aid. +// +// Idempotent. + +import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const WORKSPACE_ROOT = resolve(HERE, '..', '..'); +const ROOT = join(WORKSPACE_ROOT, 'node_modules', '@teambit'); +const DRY_RUN = process.argv.includes('--dry-run'); + +let scanned = 0; +let patched = 0; +let removedNames = 0; +let droppedStatements = 0; + +const exportCache = new Map(); + +function getExportedNames(modulePath) { + if (exportCache.has(modulePath)) return exportCache.get(modulePath); + let src; + try { + src = readFileSync(modulePath, 'utf8'); + } catch { + exportCache.set(modulePath, null); + return null; + } + const names = new Set(); + // `export const x =`, `export let x =`, `export var x =`, `export function x`, + // `export class x`, `export async function x`, `export default class X`. + const declRe = /export\s+(?:async\s+)?(?:const|let|var|function|class)\s+([A-Za-z_$][\w$]*)/g; + for (const m of src.matchAll(declRe)) names.add(m[1]); + // `export { a, b as c }` (single-line; we don't care about multi-line for now). + const namedRe = /export\s*\{\s*([^}]+)\s*\}\s*(?:from\s*['"][^'"]+['"]\s*)?;/g; + for (const m of src.matchAll(namedRe)) { + for (const piece of m[1].split(',')) { + const trimmed = piece.trim(); + if (!trimmed) continue; + const asMatch = trimmed.match(/^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/); + if (asMatch) names.add(asMatch[2]); + else if (/^[A-Za-z_$][\w$]*$/.test(trimmed)) names.add(trimmed); + } + } + // `export default ...` → contributes 'default'. + if (/\bexport\s+default\b/.test(src)) names.add('default'); + // Re-exports from other modules add transitively — for the heuristic we + // accept them too (we'd over-strip otherwise). + const transRe = /export\s+\*\s+from\s*['"]([^'"]+)['"]/g; + for (const _ of src.matchAll(transRe)) { + // mark unknown — we don't recurse, but a bare `export *` means we can't + // know what names are exported, so we'd skip filtering for this file. + exportCache.set(modulePath, null); + return null; + } + exportCache.set(modulePath, names); + return names; +} + +function isEsmFile(content) { + return /^\s*(export|import)\b/m.test(content); +} + +function resolveLocal(fileDir, spec) { + if (!spec.startsWith('./') && !spec.startsWith('../')) return null; + const abs = resolve(fileDir, spec); + if (existsSync(abs)) return abs; + return null; +} + +function patchFile(filePath) { + scanned++; + const src = readFileSync(filePath, 'utf8'); + if (!isEsmFile(src)) return; + const fileDir = dirname(filePath); + let out = src; + let touched = false; + + // Match: `export { A, B, C } from "./x.js";` (single-line) + const re = /export\s*\{\s*([^}]+)\s*\}\s*from\s*(['"])([^'"]+)\2;?/g; + out = out.replace(re, (match, listText, q, spec) => { + const targetPath = resolveLocal(fileDir, spec); + if (!targetPath) return match; + const targetExports = getExportedNames(targetPath); + if (!targetExports) return match; // unknown → leave alone + const items = listText + .split(',') + .map((s) => s.trim()) + .filter(Boolean); + const kept = []; + let drops = 0; + for (const item of items) { + // Handle `A as B` — check that source export A exists. + const asMatch = item.match(/^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/); + const sourceName = asMatch ? asMatch[1] : item; + if (targetExports.has(sourceName)) kept.push(item); + else drops++; + } + if (drops === 0) return match; + touched = true; + removedNames += drops; + if (kept.length === 0) { + droppedStatements++; + return `// bvm-patches: dropped type-only re-export from ${spec}`; + } + return `export { ${kept.join(', ')} } from ${q}${spec}${q};`; + }); + + if (touched) { + if (!DRY_RUN) writeFileSync(filePath, out); + patched++; + } +} + +function walk(dir) { + let entries; + try { + entries = readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + if (entry.name === 'node_modules') continue; + if (entry.isSymbolicLink()) continue; + const full = join(dir, entry.name); + if (entry.isDirectory()) { + walk(full); + } else if (entry.isFile() && entry.name.endsWith('.js')) { + patchFile(full); + } + } +} + +if (!existsSync(ROOT)) { + console.error(`[fix-type-reexports] not found: ${ROOT}`); + process.exit(1); +} + +for (const entry of readdirSync(ROOT, { withFileTypes: true })) { + if (entry.isSymbolicLink() || !entry.isDirectory()) continue; + const distDir = join(ROOT, entry.name, 'dist'); + if (existsSync(distDir)) walk(distDir); +} + +const pnpmRoot = join(WORKSPACE_ROOT, 'node_modules', '.pnpm'); +if (existsSync(pnpmRoot)) { + for (const key of readdirSync(pnpmRoot, { withFileTypes: true })) { + if (!key.isDirectory() || !key.name.startsWith('@teambit+')) continue; + const inner = join(pnpmRoot, key.name, 'node_modules', '@teambit'); + if (!existsSync(inner)) continue; + for (const sub of readdirSync(inner, { withFileTypes: true })) { + if (!sub.isDirectory() || sub.isSymbolicLink()) continue; + const distDir = join(inner, sub.name, 'dist'); + if (existsSync(distDir)) walk(distDir); + } + } +} + +console.log(`[fix-type-reexports] scanned ${scanned} files`); +console.log(`[fix-type-reexports] patched ${patched} files (${removedNames} names removed, ${droppedStatements} statements dropped)${DRY_RUN ? ' [dry-run]' : ''}`); diff --git a/scripts/bvm-patches/lazy-import-plugin.cjs b/scripts/bvm-patches/lazy-import-plugin.cjs new file mode 100644 index 000000000000..f26e6d90c31a --- /dev/null +++ b/scripts/bvm-patches/lazy-import-plugin.cjs @@ -0,0 +1,296 @@ +// Babel plugin: convert ESM static imports to lazy `createRequire` wrappers. +// +// The CJS side of the workspace gets `@babel/plugin-transform-modules-commonjs +// { lazy: () => true }` which wraps every top-level `require()` in a getter +// that fires on first access. ESM has no native equivalent — `import` is +// static and eager, so every module in the import graph is materialised at +// boot. This plugin mimics babel-lazy for ESM output: +// +// import { capitalize } from 'lodash'; +// capitalize('hi'); +// +// becomes (roughly): +// +// import { createRequire as __bvm_lazy_createRequire } from 'module'; +// const __bvm_lazy_r = __bvm_lazy_createRequire(import.meta.url); +// let __bvm_lazy_lodash; +// function _bvm_lodash() { +// return __bvm_lazy_lodash || (__bvm_lazy_lodash = __bvm_lazy_r('lodash')); +// } +// _bvm_lodash().capitalize('hi'); +// +// Constraints / caveats: +// - Only safe for *CJS* packages (ESM-only packages can't be require()'d +// synchronously). We use an allowlist + a heuristic that any module +// specifier already in our `CJS_PKGS` set in apply.mjs is fair game. +// - Side-effect-only imports (`import 'foo'`) MUST stay eager. +// - We don't touch `export ... from 'pkg'` re-exports because ESM +// `export` is structurally static. +// - Default-import interop matches what babel's `_interopRequireDefault` +// does (wraps non-`__esModule` modules in `{ default: m }`). + +// Default allowlist — same set as the CJS-interop plugin in apply.mjs, +// plus a few obviously-CJS Node-builtins we don't bother lazifying (they're +// cheap and the createRequire shim depends on `module`). +const DEFAULT_CJS_PACKAGES = [ + 'lodash', 'fs-extra', 'semver', 'graceful-fs', + 'p-map-series', 'p-map', 'p-filter', 'p-limit', 'p-queue', 'p-retry', + 'p-timeout', 'p-event', 'p-defer', 'p-cancelable', 'p-debounce', 'p-throttle', + 'minimatch', 'multimatch', 'micromatch', 'comment-json', + 'didyoumean', 'open', 'pino', 'pino-pretty', 'chalk', 'object-hash', + 'yargs', 'yargs/yargs', 'yesno', 'yn', 'serialize-error', 'string-format', + 'lodash.set', 'lodash.get', 'lodash.merge', 'lodash.unionby', + 'user-home', '@apollo/client', '@apollo/server', + 'graphql', 'graphql-tag', 'graphql-tools', + '@graphql-tools/schema', '@graphql-tools/merge', + 'react', 'react-dom', 'react-router-dom', + '@yarnpkg/core', '@yarnpkg/cli', + '@pnpm/types', '@pnpm/client', '@pnpm/lockfile-types', '@pnpm/lockfile.fs', + 'enquirer', 'inquirer', 'prompts', 'ora', + 'cli-table3', 'cli-table', 'cli-spinners', + 'is-ci', 'tiny-glob', 'pretty-bytes', 'pretty-ms', 'object-treeify', + 'log-symbols', 'find-up', 'find-root', 'is-relative-url', + 'parse-package-name', 'unique-string', 'untildify', 'env-paths', + 'temp-dir', 'tempy', 'execa', 'cross-spawn', + 'rimraf', 'mkdirp', 'tar', 'tar-stream', 'archiver', 'unzipper', + 'follow-redirects', 'node-fetch', 'serialize-javascript', + 'detect-libc', 'is-arrayish', 'arrify', 'array-differ', + 'pretty-error', 'humanize-string', 'cli-truncate', 'wrap-ansi', 'word-wrap', + 'common-tags', 'is-text-path', 'is-binary-path', 'is-glob', 'is-extglob', + 'is-plain-object', 'is-relative', 'is-absolute', 'normalize-path', + 'date-fns', 'date-and-time', 'pad-right', 'left-pad', + 'lru-cache', 'mem', 'mimic-fn', + 'pretty-format', 'safe-stable-stringify', + 'fast-glob', 'globby', + 'cosmiconfig', 'cosmiconfig-typescript-loader', + 'parse-json', 'json5', 'jsonc-parser', + 'reflect-metadata', 'uniqid', +]; + +module.exports = function bvmLazyImportPlugin({ types: t }, opts) { + const list = opts && opts.cjsPackages ? opts.cjsPackages : DEFAULT_CJS_PACKAGES; + const allowlist = new Set(list); + // Lazify every `@teambit/*` import too. Node 22.12+ supports + // `require()` of ESM modules synchronously, so the dist files (which are + // ESM-shaped after Slice 09) work fine through the createRequire shim. + // This is the lion's share of the import graph — making it lazy is the + // closest we get to the CJS-with-babel-lazy behaviour for ESM output. + const lazifyTeambit = opts && opts.lazifyTeambit !== false; + function pkgKey(spec) { + if (spec.startsWith('@')) return spec.split('/').slice(0, 2).join('/'); + return spec.split('/')[0]; + } + function isAllowed(spec) { + if (allowlist.has(spec)) return true; + if (allowlist.has(pkgKey(spec))) return true; + if (lazifyTeambit && spec.startsWith('@teambit/')) return true; + return false; + } + function safeId(spec) { + return spec.replace(/[^a-zA-Z0-9]/g, '_'); + } + return { + name: 'bvm-lazy-import', + visitor: { + Program(programPath) { + const body = programPath.node.body; + const lazies = []; // { local, kind, imported, source } + const sources = new Map(); // source -> { cacheId, getterId, hasDefault } + const removeNodes = new Set(); + for (const node of body) { + if (node.type !== 'ImportDeclaration') continue; + if (node.specifiers.length === 0) continue; + const source = node.source.value; + if (!isAllowed(source)) continue; + let entry = sources.get(source); + if (!entry) { + const id = safeId(source); + entry = { + cacheId: t.identifier('__bvm_lazy_' + id), + getterId: t.identifier('_bvm_lazy_get_' + id), + hasDefault: false, + }; + sources.set(source, entry); + } + for (const spec of node.specifiers) { + if (spec.type === 'ImportDefaultSpecifier') { + entry.hasDefault = true; + lazies.push({ local: spec.local.name, kind: 'default', source }); + } else if (spec.type === 'ImportNamespaceSpecifier') { + lazies.push({ local: spec.local.name, kind: 'ns', source }); + } else if (spec.type === 'ImportSpecifier') { + lazies.push({ + local: spec.local.name, + imported: spec.imported.name, + kind: 'named', + source, + }); + } + } + removeNodes.add(node); + } + if (lazies.length === 0) return; + + // Validate: don't lazify if any locals collide with the scope's + // already-bound names (e.g. someone shadowed an import name). + const scope = programPath.scope; + for (const l of lazies) { + const binding = scope.getBinding(l.local); + if (!binding) continue; + if (binding.kind !== 'module') { + // Local is not an import binding — skip lazifying to avoid + // accidentally rewriting unrelated identifiers. + return; + } + } + + // Build the prologue: createRequire shim + cache vars + getters. + const prologue = []; + prologue.push( + t.importDeclaration( + [ + t.importSpecifier( + t.identifier('__bvm_lazy_createRequire'), + t.identifier('createRequire'), + ), + ], + t.stringLiteral('module'), + ), + ); + prologue.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('__bvm_lazy_r'), + t.callExpression(t.identifier('__bvm_lazy_createRequire'), [ + t.memberExpression( + t.metaProperty(t.identifier('import'), t.identifier('meta')), + t.identifier('url'), + ), + ]), + ), + ]), + ); + // `interopRequireDefault` shim — used when the imported module has + // a default specifier. CJS `module.exports = X` should yield + // `{ default: X }` to imports that expect ESM-style default. + prologue.push( + t.functionDeclaration( + t.identifier('__bvm_lazy_interopDefault'), + [t.identifier('m')], + t.blockStatement([ + t.returnStatement( + t.conditionalExpression( + t.logicalExpression( + '&&', + t.identifier('m'), + t.memberExpression(t.identifier('m'), t.identifier('__esModule')), + ), + t.identifier('m'), + t.objectExpression([ + t.objectProperty(t.identifier('default'), t.identifier('m')), + ]), + ), + ), + ]), + ), + ); + + for (const [source, entry] of sources) { + prologue.push( + t.variableDeclaration('let', [t.variableDeclarator(entry.cacheId)]), + ); + // function _bvm_lazy_get_pkg() { + // return __bvm_lazy_pkg || (__bvm_lazy_pkg = (hasDefault ? __bvm_lazy_interopDefault : (x => x))(__bvm_lazy_r('pkg'))) + // } + const requireCall = t.callExpression(t.identifier('__bvm_lazy_r'), [ + t.stringLiteral(source), + ]); + const requireWrapped = entry.hasDefault + ? t.callExpression(t.identifier('__bvm_lazy_interopDefault'), [requireCall]) + : requireCall; + prologue.push( + t.functionDeclaration( + entry.getterId, + [], + t.blockStatement([ + t.returnStatement( + t.logicalExpression( + '||', + entry.cacheId, + t.assignmentExpression('=', entry.cacheId, requireWrapped), + ), + ), + ]), + ), + ); + } + + // TS type-context node kinds where bare identifier references must + // stay bare (a `MemberExpression` would be ungrammatical there). + // Walking up the parent chain catches nested cases like `Foo.Bar` + // inside `let x: Foo.Bar` (TSQualifiedName → TSTypeReference). + const TYPE_PARENTS = new Set([ + 'TSTypeReference', + 'TSQualifiedName', + 'TSTypeQuery', + 'TSImportType', + 'TSExpressionWithTypeArguments', + 'TSTypeAnnotation', + 'TSTypeParameterInstantiation', + 'TSInterfaceHeritage', + 'TSEnumMember', + 'TSDeclareFunction', + 'TSDeclareMethod', + 'TSModuleBlock', + 'TSModuleDeclaration', + 'TSTypeAliasDeclaration', + 'TSInterfaceDeclaration', + 'JSXMemberExpression', + 'JSXOpeningElement', + 'JSXClosingElement', + ]); + function inTypeContext(refPath) { + let p = refPath.parentPath; + while (p) { + if (TYPE_PARENTS.has(p.node.type)) return true; + // Once we leave declaration-level scopes, the chain is fully + // value-context — stop walking. + if (p.node.type === 'BlockStatement' || p.node.type === 'Program' || + p.node.type === 'FunctionDeclaration' || p.node.type === 'FunctionExpression' || + p.node.type === 'ArrowFunctionExpression' || p.node.type === 'ClassDeclaration' || + p.node.type === 'ClassBody') { + return false; + } + p = p.parentPath; + } + return false; + } + + // Rewrite use-sites. For each lazy local, replace every value-level + // reference with the appropriate accessor expression. Skip references + // in TS type / JSX-element-name positions where bare identifiers + // are structurally required. + for (const l of lazies) { + const binding = scope.getBinding(l.local); + if (!binding) continue; + const entry = sources.get(l.source); + for (const ref of binding.referencePaths) { + if (inTypeContext(ref)) continue; + const replaceWith = (function () { + const get = t.callExpression(entry.getterId, []); + if (l.kind === 'ns') return get; + if (l.kind === 'default') return t.memberExpression(get, t.identifier('default')); + // named + return t.memberExpression(get, t.identifier(l.imported)); + })(); + ref.replaceWith(replaceWith); + } + } + + // Drop the original import declarations and prepend prologue. + const newBody = body.filter((n) => !removeNodes.has(n)); + programPath.node.body = [...prologue, ...newBody]; + }, + }, + }; +}; diff --git a/scripts/bvm-patches/set-package-type-module.mjs b/scripts/bvm-patches/set-package-type-module.mjs new file mode 100644 index 000000000000..1ef3bdd367d2 --- /dev/null +++ b/scripts/bvm-patches/set-package-type-module.mjs @@ -0,0 +1,121 @@ +#!/usr/bin/env node +// Stamps `"type": "module"` into every `node_modules/@teambit//package.json` +// whose dist actually emits ESM (i.e. contains top-level `import` / `export` +// keywords in any of its `dist/**/*.js` files). +// +// Step 2 of the ESM source migration (docs/migration/09-esm-source-migration.md). +// Bit's package-json generator currently hardcodes a CJS-shaped package.json +// (`"main": "dist/index.js"`, no `"type"` field). Without `"type": "module"`, +// Node parses `.js` files as CJS regardless of whether they contain `import` +// keywords — breaking every ESM consumer of those packages. +// +// This script is the temporary band-aid while we wait for the package-json +// generator to be updated. It's idempotent (re-runs are no-ops) and reversible +// (.bak file). +// +// Usage: +// node scripts/bvm-patches/set-package-type-module.mjs [--dry-run] + +import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, copyFileSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const WORKSPACE_ROOT = resolve(HERE, '..', '..'); +const ROOT = join(WORKSPACE_ROOT, 'node_modules', '@teambit'); +const DRY_RUN = process.argv.includes('--dry-run'); + +let scanned = 0; +let stamped = 0; +let skippedCjs = 0; + +function fileLooksEsm(filePath) { + try { + const src = readFileSync(filePath, 'utf8'); + return /^\s*(export|import)\b/m.test(src); + } catch { + return false; + } +} + +function mainEntryIsEsm(pkgDir, pkg) { + // Probe the *CJS* entry (`require` / `main`) rather than `import`. The + // `import` entry is often a dedicated `esm.mjs` shim that re-exports + // from a CJS index — looking ESM regardless of the underlying package's + // module shape. The `require` entry tells us what consumers without + // ESM-shim plumbing actually load, which is what determines whether + // `"type": "module"` is safe to set on the package. + const candidates = []; + const dot = pkg.exports?.['.']; + if (dot?.require) candidates.push(dot.require); + if (dot?.node?.require) candidates.push(dot.node.require); + if (pkg.exports?.node?.require) candidates.push(pkg.exports.node.require); + if (pkg.exports?.require) candidates.push(pkg.exports.require); + if (pkg.main) candidates.push(pkg.main); + candidates.push('dist/index.js'); + for (const rel of candidates) { + const abs = join(pkgDir, rel); + if (!existsSync(abs)) continue; + return fileLooksEsm(abs); + } + return false; +} + +function processPackage(pkgDir) { + const pkgJsonP = join(pkgDir, 'package.json'); + if (!existsSync(pkgJsonP)) return; + scanned++; + let pkg; + try { pkg = JSON.parse(readFileSync(pkgJsonP, 'utf8')); } catch { return; } + if (pkg.type === 'module') return; // already stamped + if (!mainEntryIsEsm(pkgDir, pkg)) { skippedCjs++; return; } + if (!DRY_RUN) { + const backup = `${pkgJsonP}.pre-type-module.bak`; + if (!existsSync(backup)) copyFileSync(pkgJsonP, backup); + pkg.type = 'module'; + // Re-point `exports.import` away from the now-broken `esm.mjs` shim. + // Those shims look like `import cjsModule from './index.js'; export const + // X = cjsModule.X;` — they were valid when `index.js` was CJS, but now + // `index.js` is itself ESM with named exports and no default, so the + // shim fails to load. Pointing at the dist file the shim was wrapping + // gives the direct, working ESM entry point. + const normalize = (p) => (p && !p.startsWith('./') ? `./${p}` : p); + const rawRequire = pkg.exports?.['.']?.require ?? pkg.main ?? 'dist/index.js'; + const requireEntry = normalize(rawRequire); + if (pkg.exports?.['.']?.import) pkg.exports['.'].import = requireEntry; + if (pkg.exports?.['.']?.node?.import) pkg.exports['.'].node.import = requireEntry; + if (pkg.exports?.node?.import) pkg.exports.node.import = normalize(pkg.exports.node.require) ?? requireEntry; + if (pkg.exports?.import) pkg.exports.import = normalize(pkg.exports.require) ?? requireEntry; + writeFileSync(pkgJsonP, JSON.stringify(pkg, null, 2)); + } + stamped++; +} + +if (!existsSync(ROOT)) { + console.error(`[type-module] not found: ${ROOT}`); + process.exit(1); +} + +for (const entry of readdirSync(ROOT, { withFileTypes: true })) { + if (entry.isSymbolicLink() || !entry.isDirectory()) continue; + processPackage(join(ROOT, entry.name)); +} + +// Same sweep for the pnpm .pnpm//node_modules/@teambit/* copies so +// Node sees the patched flag regardless of which path resolution takes. +const pnpmRoot = join(WORKSPACE_ROOT, 'node_modules', '.pnpm'); +if (existsSync(pnpmRoot)) { + for (const key of readdirSync(pnpmRoot, { withFileTypes: true })) { + if (!key.isDirectory() || !key.name.startsWith('@teambit+')) continue; + const inner = join(pnpmRoot, key.name, 'node_modules', '@teambit'); + if (!existsSync(inner)) continue; + for (const sub of readdirSync(inner, { withFileTypes: true })) { + if (!sub.isDirectory() || sub.isSymbolicLink()) continue; + processPackage(join(inner, sub.name)); + } + } +} + +console.log(`[type-module] scanned ${scanned} package.json files`); +console.log(`[type-module] stamped ${stamped} with "type": "module"${DRY_RUN ? ' [dry-run]' : ''}`); +console.log(`[type-module] left ${skippedCjs} CJS-shaped packages alone`); diff --git a/scripts/codemod-aspect-imports.mjs b/scripts/codemod-aspect-imports.mjs new file mode 100644 index 000000000000..8af267b15c1a --- /dev/null +++ b/scripts/codemod-aspect-imports.mjs @@ -0,0 +1,179 @@ +#!/usr/bin/env node +// Rewrites `import { XAspect, ... } from '@teambit/'` so XAspect comes +// from `@teambit//dist/.aspect.js` directly instead of the heavy +// barrel index.ts. Other named imports (including types) stay on the barrel. +// +// The barrel evaluates every transitive re-export eagerly once babel-lazy is +// off, so this is a free perf win for any source file that only needed the +// aspect manifest from the barrel. +// +// Run: node scripts/codemod-aspect-imports.mjs [--dry] [--scope=scopes] +// Idempotent. + +import { readFileSync, writeFileSync, readdirSync, statSync, existsSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(HERE, '..'); +const NODE_MODULES = join(REPO_ROOT, 'node_modules'); + +const DRY = process.argv.includes('--dry'); +const ROOTS = ['scopes', 'components']; +const SKIP_DIRS = new Set([ + 'node_modules', + 'dist', + '__fixtures__', + '__snapshots__', + '.git', + 'artifacts', + // e2e-helper fixtures emulate user-authored aspect code; keep them as + // someone unaware of the codemod would write them. + 'excluded-fixtures', +]); + +// pkg → aspect file name (e.g. `pnpm.aspect.js`), populated lazily from node_modules. +const aspectFileCache = new Map(); + +function findAspectFile(pkg) { + if (aspectFileCache.has(pkg)) return aspectFileCache.get(pkg); + const dist = join(NODE_MODULES, pkg, 'dist'); + if (!existsSync(dist)) { + aspectFileCache.set(pkg, null); + return null; + } + let files; + try { + files = readdirSync(dist).filter((f) => f.endsWith('.aspect.js') && !f.endsWith('.map')); + } catch { + aspectFileCache.set(pkg, null); + return null; + } + if (files.length !== 1) { + aspectFileCache.set(pkg, null); + return null; + } + aspectFileCache.set(pkg, files[0]); + return files[0]; +} + +function* walkSourceFiles(root) { + const stack = [root]; + while (stack.length) { + const dir = stack.pop(); + let entries; + try { entries = readdirSync(dir, { withFileTypes: true }); } catch { continue; } + for (const e of entries) { + const full = join(dir, e.name); + if (e.isSymbolicLink()) continue; + if (e.isDirectory()) { + if (SKIP_DIRS.has(e.name)) continue; + stack.push(full); + continue; + } + if (!e.isFile()) continue; + if (!/\.(ts|tsx|mts|cts)$/.test(e.name)) continue; + if (e.name.endsWith('.d.ts')) continue; + yield full; + } + } +} + +// Parse a single `import` statement starting at `start` in `src`. +// Returns { end, kind: 'value'|'type', names: Array<{ original, alias, isType }>, raw, pkg } +// or null if not a parseable `import { ... } from '@teambit/';` line. +function parseImport(src, start) { + // Match the prefix + const prefix = src.slice(start, start + 7); + if (prefix !== 'import ') return null; + // Find the `from '...'` end of the statement + // Allow multi-line. Stop at the matching closing quote + semicolon/newline. + const m = src.slice(start).match(/^import\s+(type\s+)?(\{[^}]*\})\s+from\s+['"]([^'"]+)['"];?/); + if (!m) return null; + const stmt = m[0]; + const isTypeOnly = !!m[1]; + const namedBlock = m[2]; + const spec = m[3]; + if (!/^@teambit\/[\w-]+$/.test(spec)) return null; + const inside = namedBlock.slice(1, -1).trim(); + if (!inside) return null; + // Split by commas at top level + const parts = inside.split(',').map((s) => s.trim()).filter(Boolean); + const names = parts.map((p) => { + const isType = /^type\s+/.test(p); + const body = p.replace(/^type\s+/, ''); + const asMatch = body.match(/^([\w$]+)(\s+as\s+([\w$]+))?$/); + if (!asMatch) return { original: body, alias: body, isType }; + return { original: asMatch[1], alias: asMatch[3] || asMatch[1], isType }; + }); + return { end: start + stmt.length, kind: isTypeOnly ? 'type' : 'value', names, raw: stmt, pkg: spec }; +} + +function rewriteFile(filename) { + const src = readFileSync(filename, 'utf8'); + // Quick reject if no @teambit imports + if (!src.includes("from '@teambit/") && !src.includes('from "@teambit/')) return false; + + let out = ''; + let i = 0; + let changed = false; + + while (i < src.length) { + // Find next "import " at start of line + if ((i === 0 || src[i - 1] === '\n') && src.startsWith('import ', i)) { + const parsed = parseImport(src, i); + if (parsed) { + const { end, kind, names, pkg } = parsed; + if (kind === 'value') { + // Find the aspect symbol among value names (one named XAspect, isType: false) + const aspectIdx = names.findIndex((n) => !n.isType && /Aspect$/.test(n.original) && n.original !== 'Aspect'); + if (aspectIdx !== -1) { + const aspectFile = findAspectFile(pkg); + if (aspectFile) { + const aspectName = names[aspectIdx]; + const rest = names.filter((_, idx) => idx !== aspectIdx); + const aspectSpec = aspectName.alias === aspectName.original + ? aspectName.original + : `${aspectName.original} as ${aspectName.alias}`; + const aspectLine = `import { ${aspectSpec} } from '${pkg}/dist/${aspectFile}';`; + let replacement; + if (rest.length === 0) { + replacement = aspectLine; + } else { + const restSpecs = rest.map((n) => { + const tprefix = n.isType ? 'type ' : ''; + return n.alias === n.original ? `${tprefix}${n.original}` : `${tprefix}${n.original} as ${n.alias}`; + }); + replacement = `${aspectLine}\nimport { ${restSpecs.join(', ')} } from '${pkg}';`; + } + out += replacement; + i = end; + changed = true; + continue; + } + } + } + } + } + out += src[i]; + i += 1; + } + if (!changed) return false; + if (!DRY) writeFileSync(filename, out); + return true; +} + +let scanned = 0; +let rewritten = 0; +for (const root of ROOTS) { + const abs = join(REPO_ROOT, root); + if (!existsSync(abs)) continue; + for (const file of walkSourceFiles(abs)) { + scanned += 1; + if (rewriteFile(file)) { + rewritten += 1; + if (rewritten <= 20) console.log((DRY ? '[dry] ' : '') + 'rewrote', file.slice(REPO_ROOT.length + 1)); + } + } +} +console.log(`\nscanned ${scanned} files; ${DRY ? 'would rewrite' : 'rewrote'} ${rewritten}`); diff --git a/scripts/generate-command-index.mjs b/scripts/generate-command-index.mjs new file mode 100644 index 000000000000..02098b49c073 --- /dev/null +++ b/scripts/generate-command-index.mjs @@ -0,0 +1,301 @@ +#!/usr/bin/env node +// Codegen for: +// - `scopes/harmony/bit/command-index.generated.ts` (Slice 2) +// - `scopes/harmony/core/slot-index.generated.ts` (Slot Type → Aspect ID[]) +// +// The command index is built by eagerly loading Bit and snapshotting +// `cli.commandsByAspect()`. The slot index is built by static analysis of +// `*.main.runtime.ts` files because slot type parameters are erased at runtime. +// +// Run: npm run generate-command-index + +import { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createRequire } from 'node:module'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(HERE, '..'); +const COMMAND_INDEX_FILE = join(REPO_ROOT, 'scopes/harmony/bit/command-index.generated.ts'); +const SLOT_INDEX_FILE = join(REPO_ROOT, 'scopes/harmony/core/slot-index.generated.ts'); + +const SLOT_SEARCH_ROOTS = ['scopes', 'components']; +const SLOT_SKIP_DIRS = new Set([ + 'node_modules', + 'dist', + 'excluded-fixtures', + '__fixtures__', + '__snapshots__', + '.git', +]); + +// While regenerating, the committed file may be stale or empty — don't let +// the bootstrap assertion fail mid-run. +process.env.BIT_SKIP_COMMAND_INDEX_ASSERT = '1'; +// Eager mode loads every aspect's provider, so the live slot contains the +// real Command instances (with their full pattern + descriptor fields like +// `loadAspects: false`). The lazy path leaves uninvoked aspects as bare +// stubs, which would drop descriptor metadata from the generated index. +process.env.BIT_EAGER_LOAD = '1'; + +const repoRequire = createRequire(join(REPO_ROOT, 'package.json')); +// Install the require-hook (.scss/.css/etc → {}) BEFORE importing @teambit/bit. +// @teambit/bit's index.ts re-exports from ./manifests, which eagerly loads +// every core aspect; without the hook in place first, asset imports inside +// UI-adjacent aspects (e.g. @teambit/api-reference's *.module.scss) crash Node. +repoRequire('@teambit/bit/dist/hook-require.js'); +const { loadBit } = repoRequire('@teambit/bit'); +const { CLIAspect } = repoRequire('@teambit/cli'); + +const harmony = await loadBit(REPO_ROOT); +const cli = harmony.get(CLIAspect.id); + +const entries = []; +for (const [aspectId, commands] of cli.commandsByAspect()) { + for (const cmd of commands) entries.push(toEntry(aspectId, cmd)); +} +sortEntries(entries); + +writeFileSync(COMMAND_INDEX_FILE, renderCommandIndex(entries)); +console.log(`wrote ${entries.length} top-level commands to ${COMMAND_INDEX_FILE}`); + +const slotIndex = buildSlotIndex(); +writeFileSync(SLOT_INDEX_FILE, renderSlotIndex(slotIndex)); +const totalSlotTypes = Object.keys(slotIndex).length; +const totalSlotProducers = Object.values(slotIndex).reduce((n, ids) => n + ids.length, 0); +console.log( + `wrote ${totalSlotTypes} slot types (${totalSlotProducers} producer entries) to ${SLOT_INDEX_FILE}`, +); + +process.exit(0); + +// ── command-index helpers ────────────────────────────────────────────────── + +function commandName(name) { + return String(name).split(' ')[0].trim(); +} + +function toEntry(aspectId, cmd) { + // Preserve the field order from the interface in command-index.generated.ts + // — JS object insertion order is what JSON.stringify emits. + const bare = commandName(cmd.name); + const full = String(cmd.name).trim(); + const entry = { name: bare, aspectId }; + if (full !== bare) entry.pattern = full; + if (cmd.alias) entry.alias = String(cmd.alias); + if (cmd.description) entry.description = String(cmd.description); + if (cmd.group) entry.group = String(cmd.group); + if (cmd.private) entry.private = true; + if (cmd.loader === false) entry.loader = false; + if (cmd.loadAspects === false) entry.loadAspects = false; + if (cmd.remoteOp) entry.remoteOp = true; + if (cmd.skipWorkspace) entry.skipWorkspace = true; + if (Array.isArray(cmd.commands) && cmd.commands.length > 0) { + const subs = cmd.commands.map((sub) => toEntry(aspectId, sub)); + sortEntries(subs); + entry.subCommands = subs; + } + return entry; +} + +function sortEntries(arr) { + arr.sort((a, b) => a.name.localeCompare(b.name) || a.aspectId.localeCompare(b.aspectId)); +} + +function renderCommandIndex(allEntries) { + return `// AUTO-GENERATED — DO NOT EDIT BY HAND. +// Generated by scripts/generate-command-index.mjs +// (RFC: ESM Migration with Lazy-Loaded Aspects, Slice 2) +// To regenerate, run: npm run generate-command-index + +export interface CommandIndexEntry { + /** Command name (first word of \`Command.name\` — strips the \`\` / \`[arg]\` parts). */ + name: string; + /** Full \`Command.name\` (including positional patterns like \`\` / \`[arg...]\`), only set when it differs from \`name\`. The lazy stub trampoline uses this so yargs accepts positional arguments. */ + pattern?: string; + /** Aspect id that registered the command. */ + aspectId: string; + alias?: string; + description?: string; + group?: string; + private?: boolean; + loader?: boolean; + loadAspects?: boolean; + remoteOp?: boolean; + skipWorkspace?: boolean; + /** Sub-command entries (same shape, inherits aspectId from parent). */ + subCommands?: CommandIndexEntry[]; +} + +export const COMMAND_INDEX: CommandIndexEntry[] = ${JSON.stringify(allEntries, null, 2)}; +`; +} + +// ── slot-index helpers ───────────────────────────────────────────────────── + +function buildSlotIndex() { + // type name → Set of aspect ids (Set keeps emission deterministic + dedupes) + const typeToAspects = new Map(); + // aspectId cache per directory to avoid re-reading sibling .aspect.ts files + const aspectIdCache = new Map(); + + for (const root of SLOT_SEARCH_ROOTS) { + const absRoot = join(REPO_ROOT, root); + walkRuntimeFiles(absRoot, (filePath) => { + const types = extractSlotTypes(filePath); + if (types.length === 0) return; + const aspectId = resolveAspectId(dirname(filePath), aspectIdCache); + if (!aspectId) return; + for (const type of types) { + const set = typeToAspects.get(type) ?? new Set(); + set.add(aspectId); + typeToAspects.set(type, set); + } + }); + } + + const result = {}; + for (const type of [...typeToAspects.keys()].sort((a, b) => a.localeCompare(b))) { + result[type] = [...typeToAspects.get(type)].sort((a, b) => a.localeCompare(b)); + } + return result; +} + +function walkRuntimeFiles(dir, visit) { + let entries; + try { + entries = readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + if (entry.isSymbolicLink()) continue; + const full = join(dir, entry.name); + if (entry.isDirectory()) { + if (SLOT_SKIP_DIRS.has(entry.name)) continue; + walkRuntimeFiles(full, visit); + continue; + } + if (!entry.isFile()) continue; + if (entry.name.endsWith('.main.runtime.ts')) visit(full); + } +} + +function extractSlotTypes(filePath) { + const src = readFileSync(filePath, 'utf8'); + const startIdx = src.search(/static\s+slots\s*=\s*\[/); + if (startIdx === -1) return []; + const openBracket = src.indexOf('[', startIdx); + const closeBracket = matchBracket(src, openBracket, '[', ']'); + if (closeBracket === -1) return []; + const block = src.slice(openBracket + 1, closeBracket); + return extractWithTypeArgs(block); +} + +// Walks a string with balanced-bracket awareness (skips strings + line comments). +function matchBracket(src, openIdx, openCh, closeCh) { + let depth = 0; + let i = openIdx; + while (i < src.length) { + const ch = src[i]; + if (ch === '/' && src[i + 1] === '/') { + i = src.indexOf('\n', i); + if (i === -1) return -1; + continue; + } + if (ch === '/' && src[i + 1] === '*') { + const end = src.indexOf('*/', i + 2); + if (end === -1) return -1; + i = end + 2; + continue; + } + if (ch === '"' || ch === "'" || ch === '`') { + i = skipString(src, i); + continue; + } + if (ch === openCh) depth++; + else if (ch === closeCh) { + depth--; + if (depth === 0) return i; + } + i++; + } + return -1; +} + +function skipString(src, startIdx) { + const quote = src[startIdx]; + let i = startIdx + 1; + while (i < src.length) { + const ch = src[i]; + if (ch === '\\') { + i += 2; + continue; + } + if (ch === quote) return i + 1; + i++; + } + return src.length; +} + +// Extracts the type arg from each `Slot.withType<...>()` occurrence, +// handling nested angle brackets (e.g. `EnvService`). +function extractWithTypeArgs(block) { + const types = []; + const re = /Slot\s*\.\s*withType\s* 0) { + const ch = block[i]; + if (ch === '<') depth++; + else if (ch === '>') depth--; + if (depth === 0) break; + i++; + } + if (depth !== 0) continue; + const type = block.slice(start, i).trim(); + if (type) types.push(type); + re.lastIndex = i + 1; + } + return types; +} + +function resolveAspectId(dir, cache) { + if (cache.has(dir)) return cache.get(dir); + let aspectId = null; + let entries; + try { + entries = readdirSync(dir, { withFileTypes: true }); + } catch { + cache.set(dir, null); + return null; + } + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith('.aspect.ts')) continue; + const src = readFileSync(join(dir, entry.name), 'utf8'); + const m = src.match(/id:\s*['"]([^'"]+)['"]/); + if (m) { + aspectId = m[1]; + break; + } + } + cache.set(dir, aspectId); + return aspectId; +} + +function renderSlotIndex(slotIndex) { + return `// AUTO-GENERATED — DO NOT EDIT BY HAND. +// Generated by scripts/generate-command-index.mjs +// (RFC: ESM Migration with Lazy-Loaded Aspects — slot producer index) +// To regenerate, run: npm run generate-command-index +// +// Map of slot type-parameter name → list of aspect ids whose \`*.main.runtime.ts\` +// declares a \`static slots = [Slot.withType()]\` of that type. Built by +// static analysis; the type name is the literal source text inside \`<...>\`. + +export const SLOT_INDEX: Record = ${JSON.stringify(slotIndex, null, 2)}; +`; +} diff --git a/scripts/generate-missing-esm-shims.mjs b/scripts/generate-missing-esm-shims.mjs new file mode 100644 index 000000000000..24f23a1c9b62 --- /dev/null +++ b/scripts/generate-missing-esm-shims.mjs @@ -0,0 +1,140 @@ +#!/usr/bin/env node +// Walks every `@teambit/*` package in `node_modules` and creates a synthetic +// `dist/esm.mjs` shim for the ones whose package.json declares +// `exports.import: "./dist/esm.mjs"` but ships no such file. +// +// The Bit per-package compile pipeline ships an `esm.mjs` shim alongside +// `dist/index.js` for component packages that opt into ESM consumption. +// For ~75 workspace components the shim never made it to disk, which means +// Node's ESM resolver fails the moment anything tries to +// `import '@teambit/foo'` from an ESM context (e.g. the rollup bundle when +// emitted as ESM). +// +// This is a runtime-only band-aid: it generates the file inside +// `node_modules/@teambit//dist/esm.mjs`. The proper fix is in the +// Bit package.json generator (omit `exports.import` when the shim is +// missing) and the per-component `esm.mjs` source file, both out of scope +// here. +// +// Usage: node scripts/generate-missing-esm-shims.mjs + +import { readdirSync, statSync, existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = dirname(HERE); +const TEAMBIT_DIR = join(REPO_ROOT, 'node_modules/@teambit'); + +function* eachTeambitPkg() { + for (const ent of readdirSync(TEAMBIT_DIR)) { + const p = join(TEAMBIT_DIR, ent); + try { + if (statSync(p).isDirectory()) yield p; + } catch {} + } +} + +function resolveImportEntry(pkg) { + // Handles three common shapes: + // "exports": { ".": { "import": "..." } } + // "exports": { ".": { "node": { "import": "..." } } } + // "exports": { "node": { "import": "..." } } + const root = pkg.exports; + if (!root) return null; + const dot = root['.']; + if (dot?.import) return dot.import; + if (dot?.node?.import) return dot.node.import; + if (root.node?.import) return root.node.import; + if (root.import) return root.import; + return null; +} + +function resolveRequireEntry(pkg) { + const root = pkg.exports; + const dot = root?.['.']; + return ( + dot?.require ?? + dot?.node?.require ?? + root?.node?.require ?? + root?.require ?? + pkg.main ?? + 'dist/index.js' + ); +} + +// Detect which named exports a CJS bundle exposes by lexing +// `Object.defineProperty(exports, 'NAME', ...)` / `exports.NAME = ...` / +// `module.exports.NAME = ...`. Conservative but correct for the +// babel-emitted dist files Bit produces. +function detectCjsNamedExports(distIndexJs) { + const names = new Set(); + const src = readFileSync(distIndexJs, 'utf8'); + const patterns = [ + /Object\.defineProperty\(\s*exports\s*,\s*['"]([A-Za-z_$][\w$]*)['"]/g, + /exports\.([A-Za-z_$][\w$]*)\s*=/g, + /module\.exports\.([A-Za-z_$][\w$]*)\s*=/g, + ]; + for (const re of patterns) { + for (const m of src.matchAll(re)) { + if (m[1] === 'default') continue; + if (m[1] === '__esModule') continue; + names.add(m[1]); + } + } + return [...names].sort(); +} + +function makeShim(names, cjsBasename) { + const lines = [ + '// AUTO-GENERATED — synthetic ESM shim for a CJS dist.', + '// Created by scripts/generate-missing-esm-shims.mjs because the', + "// owning component's package.json declares `exports.import`", + '// but no `esm.mjs` was emitted by the compile pipeline.', + `import cjsModule from './${cjsBasename}';`, + '', + ]; + for (const n of names) lines.push(`export const ${n} = cjsModule.${n};`); + lines.push(''); + lines.push('export default cjsModule;'); + lines.push(''); + return lines.join('\n'); +} + +let created = 0; +let skipped_existing = 0; +let skipped_no_index = 0; +let skipped_no_import = 0; +const created_pkgs = []; +for (const pkgDir of eachTeambitPkg()) { + const pkgJsonP = join(pkgDir, 'package.json'); + if (!existsSync(pkgJsonP)) continue; + let pkg; + try { pkg = JSON.parse(readFileSync(pkgJsonP, 'utf8')); } catch { continue; } + const importEntry = resolveImportEntry(pkg); + if (!importEntry) { skipped_no_import++; continue; } + const importPath = join(pkgDir, importEntry); + if (existsSync(importPath)) { skipped_existing++; continue; } + const requireEntry = resolveRequireEntry(pkg); + const distCjs = join(pkgDir, requireEntry); + if (!existsSync(distCjs)) { skipped_no_index++; continue; } + const names = detectCjsNamedExports(distCjs); + // The shim sits in the same `dist/` dir as the CJS file, so import by + // basename (e.g. `./constants.js` for `dist/constants.js`). + const cjsBasename = requireEntry.split('/').pop(); + const code = makeShim(names, cjsBasename); + mkdirSync(dirname(importPath), { recursive: true }); + writeFileSync(importPath, code); + created++; + created_pkgs.push(pkg.name); +} + +console.log(`created: ${created}`); +console.log(`skipped (already had esm.mjs): ${skipped_existing}`); +console.log(`skipped (no dist/index.js): ${skipped_no_index}`); +console.log(`skipped (no exports.import): ${skipped_no_import}`); +if (created > 0) { + console.log('\nfirst 10 created:'); + for (const n of created_pkgs.slice(0, 10)) console.log(` ${n}`); + if (created_pkgs.length > 10) console.log(` ... and ${created_pkgs.length - 10} more`); +} diff --git a/workspace.jsonc b/workspace.jsonc index 2831722abf5c..1d5edb8b587e 100644 --- a/workspace.jsonc +++ b/workspace.jsonc @@ -83,6 +83,10 @@ "@pnpm/worker": "1000.6.7", "@pnpm/workspace.pkgs-graph": "1000.0.39", "@react-hook/latest": "1.0.3", + "@rollup/plugin-commonjs": "^29.0.2", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-typescript": "^12.3.0", "@rspack/core": "^1.7.7", "@rspack/dev-server": "1.2.1", "@rspack/plugin-react-refresh": "1.6.0", @@ -615,6 +619,8 @@ "resolve-url-loader": "5.0.0", "rewire": "7.0.0", "rimraf": "3.0.2", + "rollup": "^4.60.4", + "rollup-plugin-visualizer": "^7.0.1", "rspack-manifest-plugin": "^5.2.1", "sass": "1.63.6", "semver": "7.7.1",