diff --git a/client/components/Sidebar.css b/client/components/Sidebar.css index 88901b32..7898c8e6 100644 --- a/client/components/Sidebar.css +++ b/client/components/Sidebar.css @@ -1,5 +1,3 @@ -@value toggleTime: 200ms; - .container { background: var(--bg-primary); border: none; @@ -21,7 +19,7 @@ bottom: 0; position: absolute; top: 0; - transition: transform toggleTime ease; + transition: transform 200ms ease; } .container.pinned { diff --git a/package-lock.json b/package-lock.json index 414098ff..ad9a77ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,6 @@ "autoprefixer": "10.2.5", "babel-eslint": "10.1.0", "babel-loader": "9.2.1", - "babel-plugin-lodash": "3.3.4", "classnames": "2.3.1", "core-js": "3.12.1", "css-loader": "5.2.5", @@ -49,21 +48,17 @@ "eslint-config-th0r-react": "2.0.1", "eslint-plugin-react": "7.23.2", "filesize": "^6.3.0", - "globby": "11.0.3", "jest": "^30.2.0", - "lodash.memoize": "^4.1.2", - "lodash.merge": "^4.6.2", - "lodash.partial": "^4.2.1", "mobx": "5.15.7", "mobx-react": "6.3.1", "postcss": "8.3.0", - "postcss-icss-values": "2.0.2", "postcss-loader": "5.3.0", "preact": "10.5.13", "prettier": "^3.8.0", "puppeteer": "^24.30.0", "style-loader": "2.0.0", "terser-webpack-plugin": "5.1.2", + "tinyglobby": "^0.2.15", "webpack": "5.98.0", "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.0" @@ -4510,19 +4505,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/babel-plugin-lodash": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", - "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0-beta.49", - "@babel/types": "^7.0.0-beta.49", - "glob": "^7.1.1", - "lodash": "^4.17.10", - "require-package-name": "^2.0.1" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", @@ -9894,18 +9876,6 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.partial": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-4.2.1.tgz", - "integrity": "sha512-qsiGr0kiA31O7chhmKSUiEGtxXnYtwmaJF00TPAUW79C5PCfaVeLTUN3sLT+rEPcqZooPtiFcGhnphQzFhkqmg==", - "dev": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -11127,127 +11097,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-icss-values": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-icss-values/-/postcss-icss-values-2.0.2.tgz", - "integrity": "sha512-IgT4VHFDJJZ0c4Ma3A6fuM7hkJO4tTISdm35sBQWAZKIP4oUMn//KjbkzklfiGVs3QWk1K1oE5b3Vh1dFK0lCQ==", - "dev": true, - "dependencies": { - "icss-utils": "^3.0.1", - "lodash": "^4.17.4", - "postcss": "^6.0.2", - "postcss-value-parser": "^3.3.0" - } - }, - "node_modules/postcss-icss-values/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-icss-values/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-icss-values/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-icss-values/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/postcss-icss-values/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/postcss-icss-values/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-icss-values/node_modules/icss-utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-3.0.1.tgz", - "integrity": "sha1-7nDTroysOMa+XtkehRsn7tNDrQ8=", - "dev": true, - "dependencies": { - "postcss": "^6.0.2" - } - }, - "node_modules/postcss-icss-values/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-icss-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-icss-values/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-icss-values/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-loader": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", @@ -12218,12 +12067,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-package-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", - "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -13638,6 +13481,55 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", diff --git a/package.json b/package.json index b213c922..625a7309 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,6 @@ "autoprefixer": "10.2.5", "babel-eslint": "10.1.0", "babel-loader": "9.2.1", - "babel-plugin-lodash": "3.3.4", "classnames": "2.3.1", "core-js": "3.12.1", "css-loader": "5.2.5", @@ -81,21 +80,17 @@ "eslint-config-th0r-react": "2.0.1", "eslint-plugin-react": "7.23.2", "filesize": "^6.3.0", - "globby": "11.0.3", "jest": "^30.2.0", - "lodash.memoize": "^4.1.2", - "lodash.merge": "^4.6.2", - "lodash.partial": "^4.2.1", "mobx": "5.15.7", "mobx-react": "6.3.1", "postcss": "8.3.0", - "postcss-icss-values": "2.0.2", "postcss-loader": "5.3.0", "preact": "10.5.13", "prettier": "^3.8.0", "puppeteer": "^24.30.0", "style-loader": "2.0.0", "terser-webpack-plugin": "5.1.2", + "tinyglobby": "^0.2.15", "webpack": "5.98.0", "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.0" diff --git a/test/helpers.js b/test/helpers.js index 3503484e..fe4b8cc8 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,8 +1,5 @@ const { readdirSync } = require("fs"); const webpack = require("webpack"); -const memoize = require("lodash.memoize"); -const partial = require("lodash.partial"); -const merge = require("lodash.merge"); global.webpackCompile = webpackCompile; global.makeWebpackConfig = makeWebpackConfig; @@ -10,6 +7,35 @@ global.forEachWebpackVersion = forEachWebpackVersion; const BundleAnalyzerPlugin = require("../lib/BundleAnalyzerPlugin"); +/** + * @template T + * @typedef {() => T} FunctionReturning + */ + +/** + * @template T + * @param {FunctionReturning} fn memorized function + * @returns {FunctionReturning} new function + */ +const memoize = (fn) => { + let cache = false; + /** @type {T | undefined} */ + let result; + return () => { + if (cache) { + return /** @type {T} */ (result); + } + + result = fn(); + cache = true; + // Allow to clean up memory for fn + // and all dependent resources + /** @type {FunctionReturning | undefined} */ + (fn) = undefined; + return /** @type {T} */ (result); + }; +}; + const getAvailableWebpackVersions = memoize(() => readdirSync(`${__dirname}/webpack-versions`, { withFileTypes: true }) .filter((entry) => entry.isDirectory()) @@ -51,7 +77,7 @@ function forEachWebpackVersion(versions, cb) { cb({ it: itFn, version, - webpackCompile: partial(webpackCompile, partial.placeholder, version), + webpackCompile: (config) => webpackCompile(config, version), }); } } @@ -95,19 +121,18 @@ async function webpackCompile(config, version) { await wait(1); } -function makeWebpackConfig(opts) { - opts = merge( - { - analyzerOpts: { - analyzerMode: "static", - openAnalyzer: false, - logLevel: "error", - }, - minify: false, - multipleChunks: false, +function makeWebpackConfig(opts = {}) { + opts = { + ...opts, + minify: false, + multipleChunks: false, + analyzerOpts: { + analyzerMode: "static", + openAnalyzer: false, + logLevel: "error", + ...(opts.analyzerOpts || {}), }, - opts, - ); + }; return { context: __dirname, diff --git a/test/statsUtils.js b/test/statsUtils.js index 9bf09b08..1a59551c 100644 --- a/test/statsUtils.js +++ b/test/statsUtils.js @@ -1,6 +1,6 @@ const path = require("path"); const { readFileSync } = require("fs"); -const globby = require("globby"); +const { globSync } = require("tinyglobby"); const { StatsSerializeStream } = require("../lib/statsUtils"); @@ -56,7 +56,7 @@ describe("StatsSerializeStream", () => { }); }); - globby.sync("stats/**/*.json", { cwd: __dirname }).forEach((filepath) => { + globSync("stats/**/*.json", { cwd: __dirname }).forEach((filepath) => { it(`should properly stringify JSON from "${filepath}"`, function () { const content = readFileSync(path.resolve(__dirname, filepath), "utf8"); const json = JSON.parse(content); diff --git a/webpack.config.js b/webpack.config.js index a7154931..dcf078b5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -69,7 +69,6 @@ module.exports = { ], ], plugins: [ - "lodash", ["@babel/plugin-proposal-decorators", { legacy: true }], ["@babel/plugin-transform-class-properties", { loose: true }], [ @@ -99,7 +98,6 @@ module.exports = { options: { postcssOptions: { plugins: [ - require("postcss-icss-values"), require("autoprefixer"), ...(!isDev ? [require("cssnano")()] : []), ],