diff --git a/OPTIONS.md b/OPTIONS.md index e5e5978f794..85c3cbff7c5 100644 --- a/OPTIONS.md +++ b/OPTIONS.md @@ -9,6 +9,7 @@ Options: --config-name Name(s) of particular configuration(s) to use if configuration file exports an array of multiple configurations. -m, --merge Merge two or more configurations using 'webpack-merge'. --disable-interpret Disable interpret for loading the config file. + --env-file Load environment variables from .env files for access within the configuration. --env Environment variables passed to the configuration when it is a function, e.g. "myvar" or "myvar=myval". --node-env Sets process.env.NODE_ENV to the specified value for access within the configuration.(Deprecated: Use '--config-node-env' instead) --config-node-env Sets process.env.NODE_ENV to the specified value for access within the configuration. diff --git a/packages/dotenv-webpack-plugin.md b/packages/dotenv-webpack-plugin.md new file mode 100644 index 00000000000..a9d3cff044c --- /dev/null +++ b/packages/dotenv-webpack-plugin.md @@ -0,0 +1,98 @@ +# Dotenv Webpack Plugin + +`DotenvWebpackPlugin` is a webpack plugin to allow consumers to load environment variables from `.env` files. It does a text replace in the resulting bundle for any instances of `process.env` and `import.meta.env`. + +## Installation + +```bash +npm install dotenv-webpack-plugin --save-dev +``` + +```bash +yarn add dotenv-webpack-plugin --dev +``` + +```bash +pnpm add dotenv-webpack-plugin -D +``` + +## Basic Usage + +`DotenvWebpackPlugin` exposes env variables under `process.env` and `import.meta.env` objects as strings automatically. + +To prevent accidentally leaking env variables to the client, only variables prefixed with `WEBPACK_` are exposed to Webpack-bundled code. e.g. for the following `.env` file: + +```bash +WEBPACK_SOME_KEY=1234567890 +SECRET_KEY=abcdefg +``` + +Only `WEBPACK_SOME_KEY` is exposed to Webpack-bundled code as `import.meta.env.WEBPACK_SOME_KEY` and `process.env.WEBPACK_SOME_KEY`, but `SECRET_KEY` is not. + +```javascript +const DotenvWebpackPlugin = require("dotenv-webpack-plugin"); + +module.exports = { + // Existing configuration options... + plugins: [new DotenvWebpackPlugin()], +}; +``` + +## `.env` Files + +Environment variables are loaded from the following files in your [environment directory](): + +``` +.env # loaded in all cases +.env.local # loaded in all cases, ignored by git +.env.[mode] # only loaded in specified mode +.env.[mode].local # only loaded in specified mode, ignored by git +``` + +> Mode-specific env variables (e.g., `.env.production`) will override conflicting variables from generic environment files (e.g., `.env`). Variables that are only defined in `.env` or `.env.local` will remain available to the client. + +## Using a configuration + +You can pass a configuration object to `dotenv-webpack-plugin` to customize its behavior. + +### `dir` + +Type: + +```ts +type dir = string; +``` + +Default: `""` + +Specifies the directory where the plugin should look for environment files. By default, it looks in the root directory. + +```js +new DotenvWebpackPlugin({ + dir: "./config/env", +}); +``` + +### `prefix` + +Type: + +```ts +type prefix = string | string[]; +``` + +Default: `undefined` + +Defines which environment variables should be exposed to the client code based on their prefix. This is a critical security feature to prevent sensitive information from being exposed. + +```js +// Single prefix +new DotenvWebpackPlugin({ + prefix: "PUBLIC_", +}); + +// Multiple prefixes +new DotenvWebpackPlugin({ + prefix: ["PUBLIC_", "SHARED_"], +}); +``` diff --git a/packages/webpack-cli/src/plugins/dotenv-webpack-plugin.ts b/packages/webpack-cli/src/plugins/dotenv-webpack-plugin.ts new file mode 100644 index 00000000000..b04d9fd9218 --- /dev/null +++ b/packages/webpack-cli/src/plugins/dotenv-webpack-plugin.ts @@ -0,0 +1,50 @@ +import { Compiler, DefinePlugin } from "webpack"; +import type { DotenvPluginOptions } from "../types"; +import { EnvLoader } from "../utils/env-loader"; + +export class DotenvPlugin { + logger!: ReturnType; + options: DotenvPluginOptions; + + constructor(options: DotenvPluginOptions = {}) { + this.options = options; + } + apply(compiler: Compiler) { + this.logger = compiler.getInfrastructureLogger("DotenvPlugin"); + + try { + const env = EnvLoader.loadEnvFiles({ + mode: process.env.NODE_ENV, + prefix: this.options.prefix, + dir: this.options.dir, + }); + const envObj = JSON.stringify(env); + + const runtimeEnvObject = `(() => { + const env = ${envObj}; + // Make it read-only + return Object.freeze(env); + })()`; + + const definitions = { + "process.env": envObj, + ...Object.fromEntries( + Object.entries(env).map(([key, value]) => [`process.env.${key}`, JSON.stringify(value)]), + ), + "import.meta.env": runtimeEnvObject, + ...Object.fromEntries( + Object.entries(env).map(([key, value]) => [ + `import.meta.env.${key}`, + JSON.stringify(value), + ]), + ), + }; + + new DefinePlugin(definitions).apply(compiler); + } catch (error) { + this.logger.error(error); + } + } +} + +module.exports = DotenvPlugin; diff --git a/packages/webpack-cli/src/types.ts b/packages/webpack-cli/src/types.ts index e5008bea2d8..c89b6bfb2a1 100644 --- a/packages/webpack-cli/src/types.ts +++ b/packages/webpack-cli/src/types.ts @@ -177,6 +177,7 @@ type WebpackDevServerOptions = DevServerConfig & disableInterpret?: boolean; extends?: string[]; argv: Argv; + envFile?: boolean; }; type Callback = (...args: T) => void; @@ -239,6 +240,11 @@ interface CLIPluginOptions { analyze?: boolean; } +interface DotenvPluginOptions { + prefix?: string | string[]; + dir?: string; +} + type BasicPrimitive = string | boolean | number; type Instantiable = { new (...args: ConstructorParameters): InstanceType; @@ -318,6 +324,7 @@ export { CallableWebpackConfiguration, Callback, CLIPluginOptions, + DotenvPluginOptions, CommandAction, CommanderOption, CommandOptions, diff --git a/packages/webpack-cli/src/utils/env-loader.ts b/packages/webpack-cli/src/utils/env-loader.ts new file mode 100644 index 00000000000..cab7406872e --- /dev/null +++ b/packages/webpack-cli/src/utils/env-loader.ts @@ -0,0 +1,54 @@ +import path from "path"; +import { normalize } from "path"; +// eslint-disable-next-line +import { loadEnvFile } from "process"; + +export interface EnvLoaderOptions { + mode?: string; + dir?: string; + prefix?: string | string[]; +} + +export class EnvLoader { + static getEnvFilePaths(mode = "development", envDir = process.cwd()): string[] { + return [ + `.env`, // default file + `.env.local`, // local file + `.env.${mode}`, // mode file + `.env.${mode}.local`, // mode local file + ].map((file) => normalize(path.join(envDir, file))); + } + + static loadEnvFiles(options: EnvLoaderOptions = {}): Record { + const { mode = process.env.NODE_ENV, dir = process.cwd(), prefix } = options; + + const normalizedPrefixes = prefix ? (Array.isArray(prefix) ? prefix : [prefix]) : ["WEBPACK_"]; + + if (mode === "local") { + throw new Error( + '"local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.', + ); + } + + const envFiles = this.getEnvFilePaths(mode, dir); + const env: Record = {}; + + // Load all env files + envFiles.forEach((filePath) => { + try { + loadEnvFile(filePath); + } catch { + // Skip if file doesn't exist + } + }); + + // Filter env vars based on prefix + for (const [key, value] of Object.entries(process.env)) { + if (normalizedPrefixes.some((prefix) => key.startsWith(prefix))) { + env[key] = value as string; + } + } + + return env; + } +} diff --git a/packages/webpack-cli/src/webpack-cli.ts b/packages/webpack-cli/src/webpack-cli.ts index b8ce02c8c6e..7acbb4b67eb 100644 --- a/packages/webpack-cli/src/webpack-cli.ts +++ b/packages/webpack-cli/src/webpack-cli.ts @@ -39,6 +39,7 @@ import type { RechoirError, Argument, Problem, + DotenvPluginOptions, } from "./types"; import type webpackMerge from "webpack-merge"; @@ -55,6 +56,8 @@ import { type stringifyChunked } from "@discoveryjs/json-ext"; import { type Help, type ParseOptions } from "commander"; import { type CLIPlugin as CLIPluginClass } from "./plugins/cli-plugin"; +import { type DotenvPlugin as DotenvPluginClass } from "./plugins/dotenv-webpack-plugin"; +import { EnvLoader } from "./utils/env-loader"; const fs = require("fs"); const { Readable } = require("stream"); @@ -1019,6 +1022,18 @@ class WebpackCLI implements IWebpackCLI { description: "Print compilation progress during build.", helpLevel: "minimum", }, + { + name: "env-file", + configs: [ + { + type: "enum", + values: [true], + }, + ], + description: + "Load environment variables from .env files for access within the configuration.", + helpLevel: "minimum", + }, // Output options { @@ -1791,6 +1806,10 @@ class WebpackCLI implements IWebpackCLI { } async loadConfig(options: Partial) { + if (options.envFile) { + EnvLoader.loadEnvFiles(); + } + const disableInterpret = typeof options.disableInterpret !== "undefined" && options.disableInterpret; @@ -2170,6 +2189,10 @@ class WebpackCLI implements IWebpackCLI { "./plugins/cli-plugin", ); + const DotenvPlugin = await this.tryRequireThenImport< + Instantiable + >("./plugins/dotenv-webpack-plugin"); + const internalBuildConfig = (item: WebpackConfiguration) => { const originalWatchValue = item.watch; @@ -2343,6 +2366,9 @@ class WebpackCLI implements IWebpackCLI { analyze: options.analyze, isMultiCompiler: Array.isArray(config.options), }), + new DotenvPlugin({ + prefixes: ["WEBPACK_"], + }), ); } }; diff --git a/yarn.lock b/yarn.lock index 6586a366e98..e3f30409d39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1603,13 +1603,13 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@inquirer/core@^10.1.9": - version "10.1.9" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.9.tgz#9ab672a2d9ca60c5d45c7fa9b63e4fe9e038a02e" - integrity sha512-sXhVB8n20NYkUBfDYgizGHlpRVaCRjtuzNZA6xpALIUbkgfd2Hjz+DfEN6+h1BRnuxw0/P4jCIMjMsEOAMwAJw== +"@inquirer/core@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.10.tgz#222a374e3768536a1eb0adf7516c436d5f4a291d" + integrity sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw== dependencies: "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.5" + "@inquirer/type" "^3.0.6" ansi-escapes "^4.3.2" cli-width "^4.1.0" mute-stream "^2.0.0" @@ -1618,12 +1618,12 @@ yoctocolors-cjs "^2.1.2" "@inquirer/expand@^4.0.3": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.11.tgz#d898b2d028def42064eee15f34e2c0bdc4a1ad2c" - integrity sha512-OZSUW4hFMW2TYvX/Sv+NnOZgO8CHT2TU1roUCUIF2T+wfw60XFRRp9MRUPCT06cRnKL+aemt2YmTWwt7rOrNEA== + version "4.0.12" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.12.tgz#1e4554f509a435f966e2b91395a503d77df35c17" + integrity sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw== dependencies: - "@inquirer/core" "^10.1.9" - "@inquirer/type" "^3.0.5" + "@inquirer/core" "^10.1.10" + "@inquirer/type" "^3.0.6" yoctocolors-cjs "^2.1.2" "@inquirer/figures@^1.0.11", "@inquirer/figures@^1.0.3": @@ -1632,20 +1632,20 @@ integrity sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw== "@inquirer/select@^4.0.3": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.1.0.tgz#e99f483cb004c0247ced597f2c6015f084223dfb" - integrity sha512-z0a2fmgTSRN+YBuiK1ROfJ2Nvrpij5lVN3gPDkQGhavdvIVGHGW29LwYZfM/j42Ai2hUghTI/uoBuTbrJk42bA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.1.1.tgz#0496b913514149171cf6351f0acb6d4243a39fdf" + integrity sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q== dependencies: - "@inquirer/core" "^10.1.9" + "@inquirer/core" "^10.1.10" "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.5" + "@inquirer/type" "^3.0.6" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/type@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.5.tgz#fe00207e57d5f040e5b18e809c8e7abc3a2ade3a" - integrity sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg== +"@inquirer/type@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.6.tgz#2500e435fc2014c5250eec3279f42b70b64089bd" + integrity sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1945,10 +1945,10 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@lerna/create@8.2.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.2.1.tgz#b9c34b9fbd75035418244e33cf197523a2e10a6e" - integrity sha512-Cz2u/fwc03D1EE6VFZCLMmI8FIUtGmxHQ3ECeNblsxv9i0YSKWe4Xm18sjO1xltG/K5ByiH8/HMeY9dlyAv22A== +"@lerna/create@8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.2.2.tgz#4c62f57eb74d335f908132dcc01828e53e6515bd" + integrity sha512-1yn1MvWn2Yz0SFgTTQnef2m1YedF7KwqLLVIOrGkgQrkVHzsveAIk1A1RcRa2yyUh+siKI1YcJ7lUZIEt+qQ3Q== dependencies: "@npmcli/arborist" "7.5.4" "@npmcli/package-json" "5.2.0" @@ -2921,61 +2921,61 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^8.6.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz#151c4878700a5ad229ce6713d2674d58b626b3d9" - integrity sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ== + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz#593639d9bb5239b2d877d65757b7e2c9100a2e84" + integrity sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.29.0" - "@typescript-eslint/type-utils" "8.29.0" - "@typescript-eslint/utils" "8.29.0" - "@typescript-eslint/visitor-keys" "8.29.0" + "@typescript-eslint/scope-manager" "8.29.1" + "@typescript-eslint/type-utils" "8.29.1" + "@typescript-eslint/utils" "8.29.1" + "@typescript-eslint/visitor-keys" "8.29.1" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^2.0.1" "@typescript-eslint/parser@^8.6.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.29.0.tgz#b98841e0a8099728cb8583da92326fcb7f5be1d2" - integrity sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g== - dependencies: - "@typescript-eslint/scope-manager" "8.29.0" - "@typescript-eslint/types" "8.29.0" - "@typescript-eslint/typescript-estree" "8.29.0" - "@typescript-eslint/visitor-keys" "8.29.0" + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.29.1.tgz#10bf37411be0a199c27b6515726e22fe8d3df8d0" + integrity sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg== + dependencies: + "@typescript-eslint/scope-manager" "8.29.1" + "@typescript-eslint/types" "8.29.1" + "@typescript-eslint/typescript-estree" "8.29.1" + "@typescript-eslint/visitor-keys" "8.29.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz#8fd9872823aef65ff71d3f6d1ec9316ace0b6bf3" - integrity sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw== +"@typescript-eslint/scope-manager@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz#cfdfd4144f20c38b9d3e430efd6480e297ef52f6" + integrity sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA== dependencies: - "@typescript-eslint/types" "8.29.0" - "@typescript-eslint/visitor-keys" "8.29.0" + "@typescript-eslint/types" "8.29.1" + "@typescript-eslint/visitor-keys" "8.29.1" -"@typescript-eslint/type-utils@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz#98dcfd1193cb4e2b2d0294a8656ce5eb58c443a9" - integrity sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q== +"@typescript-eslint/type-utils@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz#653dfff5c1711bc920a6a46a5a2c274899f00179" + integrity sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw== dependencies: - "@typescript-eslint/typescript-estree" "8.29.0" - "@typescript-eslint/utils" "8.29.0" + "@typescript-eslint/typescript-estree" "8.29.1" + "@typescript-eslint/utils" "8.29.1" debug "^4.3.4" ts-api-utils "^2.0.1" -"@typescript-eslint/types@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.29.0.tgz#65add70ab4ef66beaa42a5addf87dab2b05b1f33" - integrity sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg== +"@typescript-eslint/types@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.29.1.tgz#984ed1283fedbfb41d3993a9abdcb7b299971500" + integrity sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ== -"@typescript-eslint/typescript-estree@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz#d201a4f115327ec90496307c9958262285065b00" - integrity sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow== +"@typescript-eslint/typescript-estree@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz#4ac085665ed5390d11c0e3426427978570e3b747" + integrity sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g== dependencies: - "@typescript-eslint/types" "8.29.0" - "@typescript-eslint/visitor-keys" "8.29.0" + "@typescript-eslint/types" "8.29.1" + "@typescript-eslint/visitor-keys" "8.29.1" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -2983,22 +2983,22 @@ semver "^7.6.0" ts-api-utils "^2.0.1" -"@typescript-eslint/utils@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.29.0.tgz#d6d22b19c8c4812a874f00341f686b45b9fe895f" - integrity sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA== +"@typescript-eslint/utils@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.29.1.tgz#3d206c8c8def3527a8eb0588e94e3e60f7e167c9" + integrity sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.29.0" - "@typescript-eslint/types" "8.29.0" - "@typescript-eslint/typescript-estree" "8.29.0" + "@typescript-eslint/scope-manager" "8.29.1" + "@typescript-eslint/types" "8.29.1" + "@typescript-eslint/typescript-estree" "8.29.1" -"@typescript-eslint/visitor-keys@8.29.0": - version "8.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz#2356336c9efdc3597ffcd2aa1ce95432852b743d" - integrity sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg== +"@typescript-eslint/visitor-keys@8.29.1": + version "8.29.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz#9b74e5098c71138d42bbf2178fbe4dfad45d6b9a" + integrity sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg== dependencies: - "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/types" "8.29.1" eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": @@ -6943,11 +6943,11 @@ launch-editor@^2.6.1: shell-quote "^1.8.1" lerna@^8.1.8: - version "8.2.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.2.1.tgz#30ddc192130dc50cff68951c1e63a74a391c178d" - integrity sha512-Xwjv9/4ixp7fpBWhtvp7dz4NoQT8DEf7hzibHKCgu/8kmZUHeXsTn+TKspHqhI+p4YDmdkDnkg8xmymz73kVOg== + version "8.2.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.2.2.tgz#ba38e8ffe31cf69222832838f282c7607b09c2a3" + integrity sha512-GkqBELTG4k7rfzAwRok2pKBvhNo046Hfwcj7TuhDah3q58/BBBAqvIFLfqEI5fglnNOs6maMSn6/MWjccQE55A== dependencies: - "@lerna/create" "8.2.1" + "@lerna/create" "8.2.2" "@npmcli/arborist" "7.5.4" "@npmcli/package-json" "5.2.0" "@npmcli/run-script" "8.1.0" @@ -9058,9 +9058,9 @@ sass-loader@^16.0.2: neo-async "^2.6.2" sass@^1.54.9: - version "1.86.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.2.tgz#be41534cbe1ed3f72eae2f1290a4211682be88e3" - integrity sha512-Rpfn0zAIDqvnSb2DihJTDFjbhqLHu91Wqac9rxontWk7R+2txcPjuujMqu1eeoezh5kAblVCS5EdFdyr0Jmu+w== + version "1.86.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.3.tgz#0a0d9ea97cb6665e73f409639f8533ce057464c9" + integrity sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -9957,9 +9957,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== "typescript@>=3 < 6", typescript@^5.0.4: - version "5.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" - integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== uglify-js@^3.1.4: version "3.19.3" @@ -10241,10 +10241,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.94.0: - version "5.98.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.98.0.tgz#44ae19a8f2ba97537978246072fb89d10d1fbd17" - integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== +webpack@^5.99.1: + version "5.99.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.99.5.tgz#86e3b3a5a03377ea5da271c929934003f5ac5dd8" + integrity sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6"