diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e4c6a6a9..1aac2d9b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,20 @@ ## [Unreleased] +### Added + +- **Added supplemental npm packages `shakapacker-webpack` and `shakapacker-rspack`**. [PR #1096](https://github.com/shakacode/shakapacker/pull/1096) by [justin808](https://github.com/justin808). Optional packages that lockstep with core and bundle the managed-build stack as direct `dependencies` (so a single `yarn add shakapacker-webpack` pulls in `shakapacker`, `webpack`, `webpack-cli`, and `webpack-assets-manifest`; the rspack package bundles `shakapacker`, `@rspack/core`, `@rspack/cli`, and `rspack-manifest-plugin`). Optional features (transpilers, dev-server, CSS preprocessors, react-refresh) remain as opt-in `peerDependencies` so SCSS/native-binding bloat isn't forced on every install. The wrappers emit structured warnings (`SHAKAPACKER_BUNDLER_MISMATCH`, `SHAKAPACKER_NO_TRANSPILER`) when `config.assets_bundler` or `javascript_transpiler` doesn't match the installed peers. See the [v10.1 migration guide](docs/migration/v10.1-supplemental-packages.md) for adoption steps and [`docs/dependency-strategy.md`](docs/dependency-strategy.md) for the design rationale and v11 roadmap. + +### Migration Notes + +- **Simplify your `package.json` by adopting a supplemental package**. Existing apps can drop the explicit managed-build deps from `devDependencies` and rely on the bundled stack: + - **Rspack apps** can replace `shakapacker` + `@rspack/core` + `@rspack/cli` + `rspack-manifest-plugin` with a single `shakapacker-rspack`. See `packages/shakapacker-rspack/README.md` §"Simplifying an existing rspack install" for the before/after. + - **Webpack apps** can replace `shakapacker` + `webpack` + `webpack-cli` + `webpack-assets-manifest` with a single `shakapacker-webpack`. See `packages/shakapacker-webpack/README.md` §"Simplifying an existing webpack install" for the before/after. + - Optional peers (transpilers, `webpack-dev-server`, CSS preprocessors, react-refresh) stay only if your app uses those features. + - Adoption is opt-in: leaving your `package.json` untouched on v10.1 also continues to work. + +- **Adopting `shakapacker-webpack` requires `webpack-assets-manifest@^6.0.0`**. Core `shakapacker` still accepts both v5 and v6 (`^5.0.6 || ^6.0.0`), but `shakapacker-webpack` pins `~6.5.1`. Apps still on `webpack-assets-manifest@5.x` must upgrade when switching to the supplemental package; v6 fixed an ENOENT crash on clean builds with `merge: true` and dropped a Node 14 install path. See [the v5→v6 release notes](https://github.com/webdeveric/webpack-assets-manifest/releases) and `packages/shakapacker-webpack/README.md` for details. + ### ⚠️ Breaking Changes - **Breaking: tightened `package.json` `engines.node` to `^20.19.0 || >=22.12.0`**. [PR #1099](https://github.com/shakacode/shakapacker/pull/1099) by [justin808](https://github.com/justin808). Raised from `>= 20`, dropping support for Node 20.0.0–20.18.x and Node 21.x to match `@rspack/core@2.0.0-rc.0`. Consumers on those versions will hit an engine error with `--engine-strict` or yarn workspaces and need to upgrade. The PR also bumps `.node-version` to `22.20.0` and updates `conductor-setup.sh` to enforce the same disjoint range up front, so contributors get a clear error before `yarn install` fails with a confusing engine mismatch. diff --git a/docs/blog/2026-05-10-shakapacker-10-1-supplemental-packages.md b/docs/blog/2026-05-10-shakapacker-10-1-supplemental-packages.md new file mode 100644 index 000000000..28fc2937f --- /dev/null +++ b/docs/blog/2026-05-10-shakapacker-10-1-supplemental-packages.md @@ -0,0 +1,75 @@ +# Shakapacker 10.1: One-Package Installs with `shakapacker-rspack` and `shakapacker-webpack` + +**Date:** 2026-05-10 +**Author:** Justin Gordon + +Shakapacker 10.1 ships two new optional npm packages — `shakapacker-rspack` and `shakapacker-webpack` — that turn a four-or-five-package install into one. Same Shakapacker, simpler `package.json`. + +## The 30-second pitch + +If you're starting a new app today: + +```sh +yarn add --dev shakapacker-rspack +``` + +That's it. You get `shakapacker`, `@rspack/core`, `@rspack/cli`, and `rspack-manifest-plugin` together, all pinned to the exact versions Shakapacker is tested against. Webpack users get the same shape with `shakapacker-webpack`. + +If you're already on Shakapacker 10.0, you can drop the now-bundled deps from your `devDependencies` and rely on the supplemental package to bring them along. Nothing breaks if you don't. + +## What changed + +Until now, a typical Shakapacker install meant listing the gem, the npm package, the bundler, the bundler's CLI, the manifest plugin, and your transpiler — all as direct dependencies. That worked, but it pushed the version-matching problem onto every user. Were you on a tested combination? You had to read the changelog to find out. + +10.1 shifts that responsibility to the supplemental packages. Each one declares the bundler stack as direct `dependencies` with patch-tolerant `~X.Y.Z` ranges: + +- `shakapacker-rspack` bundles `shakapacker`, `@rspack/core`, `@rspack/cli`, `rspack-manifest-plugin`. +- `shakapacker-webpack` bundles `shakapacker`, `webpack`, `webpack-cli`, `webpack-assets-manifest`. + +Optional features — transpilers (swc / babel / esbuild for webpack), CSS preprocessors, dev-server, react-refresh — stay as opt-in `peerDependencies` so you only download what you actually use. (Bundling sass into every install would force a 10MB native-binding download on apps that don't even import a `.scss` file. We're not doing that.) + +## Adopting in an existing app + +Replace the explicit deps with the supplemental package: + +```diff + { + "devDependencies": { +- "shakapacker": "^10.0.0", +- "@rspack/core": "^2.0.0", +- "@rspack/cli": "^2.0.0", +- "rspack-manifest-plugin": "^5.0.0" ++ "shakapacker-rspack": "~10.1.0" + } + } +``` + +Run `yarn install`. No changes to `config/shakapacker.yml`, `bin/shakapacker`, or your bundler config are required. The full step-by-step (including the webpack flow and the optional-peer cheatsheet) lives in [`docs/migration/v10.1-supplemental-packages.md`](../migration/v10.1-supplemental-packages.md). + +## What if I don't want to migrate? + +Don't. Adoption is opt-in for the entire 10.x line. Apps that keep their existing `package.json` will continue to work exactly as they did on 10.0. The supplemental packages are the recommended path for new projects and a cleanup for existing ones, not a forced upgrade. + +## Runtime safety net + +The supplemental packages emit two structured warnings (via Node's built-in `process.emitWarning`) when your config and your installed peers disagree: + +- `SHAKAPACKER_BUNDLER_MISMATCH` — you installed `shakapacker-webpack` but `config/shakapacker.yml` says `assets_bundler: rspack` (or vice versa). +- `SHAKAPACKER_NO_TRANSPILER` — the configured `javascript_transpiler:` doesn't have its loader pair installed (e.g., `swc` configured but `@swc/core`/`swc-loader` aren't resolvable). + +Both are visible by default in dev and CI, suppressible with `--no-warnings`, and fire before your bundler throws a confusing module-not-found error. + +## Looking ahead to v11 + +v11 will make the supplemental packages required for managed builds — core `shakapacker` will stop declaring bundler peer deps and apps that haven't adopted a supplemental package will need to switch. Custom-build users (apps that produce their own `manifest.json` from Vite, esbuild, or a hand-rolled webpack config) keep using bare `shakapacker` and aren't affected. + +There's no firm v11 date yet. The 10.1 line is intentionally a soak period — we want real-world adoption signal on the supplemental packages before locking the design in. The full design rationale and roadmap lives in [`docs/dependency-strategy.md`](../dependency-strategy.md). + +## Try it + +- Migration guide: [`docs/migration/v10.1-supplemental-packages.md`](../migration/v10.1-supplemental-packages.md) +- `shakapacker-rspack` README: [`packages/shakapacker-rspack/README.md`](../../packages/shakapacker-rspack/README.md) +- `shakapacker-webpack` README: [`packages/shakapacker-webpack/README.md`](../../packages/shakapacker-webpack/README.md) +- Design rationale: [`docs/dependency-strategy.md`](../dependency-strategy.md) + +Bug reports, feedback, and "this didn't work for me" stories all welcome on [GitHub issues](https://github.com/shakacode/shakapacker/issues) — we're using the 10.1 soak window to find rough edges before v11 closes the door. diff --git a/docs/dependency-strategy.md b/docs/dependency-strategy.md new file mode 100644 index 000000000..4aad61b79 --- /dev/null +++ b/docs/dependency-strategy.md @@ -0,0 +1,462 @@ +# Dependency Strategy + +**Status:** v10.1 phase shipped (supplemental packages additive). v11 phase is the working roadmap, not a scheduled release. +**Original RFC date:** 2026-03-28 (revised 2026-05-10) +**Author:** Justin Gordon + +> **Looking for the user-facing migration steps?** See [`docs/migration/v10.1-supplemental-packages.md`](migration/v10.1-supplemental-packages.md). This doc captures the design rationale, alternatives considered, and the v11 roadmap — read it if you want to understand _why_ the dependency surface looks the way it does. + +## Summary + +Shakapacker is split into **three npm packages** to cleanly separate concerns: + +1. **`shakapacker`** — core package (config loading, manifest reading, dev server proxy, CLI). Zero bundler-specific peer deps. +2. **`shakapacker-webpack`** — managed webpack build. **Bundles `webpack`, `webpack-cli`, etc. as direct dependencies** so a single install brings the full stack. +3. **`shakapacker-rspack`** — managed rspack build. **Bundles `@rspack/core`, `@rspack/cli`, etc. as direct dependencies** so a single install brings the full stack. + +The rollout is phased: + +- **v10.1.0 (shipped, non-breaking)** — supplemental packages are published as additive. Existing peer deps remain in core. Adopters opt in whenever they're ready. +- **v11.0.0 (planned, no firm date)** — supplemental packages become required for managed builds; core no longer declares bundler peer deps. Older bundler/loader versions and EOL Ruby/Rails versions get dropped. Specifics are sketched in §"Phase 2" below but the timing depends on adoption signal from v10.1. + +## Motivation + +### The Current Problem + +Shakapacker v10 has **23 optional peer dependencies** with extremely broad version ranges: + +- `esbuild`: 14 separate version ranges (`^0.14.0 || ^0.15.0 || ... || ^0.27.0`) +- `webpack-cli`: 4 major versions (`^4.9.2 || ^5.0.0 || ^6.0.0 || ^7.0.0`) +- `sass-loader`: 4 major versions (`^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0`) +- `babel-loader`: 3 major versions (`^8.2.4 || ^9.0.0 || ^10.0.0`) + +On the Ruby side, the gem supports Rails 5.2+ and Ruby 2.7+ — both well past end-of-life. + +This creates: + +1. **Confusing install experience** — users see walls of peer dependency warnings and don't know which packages they actually need +2. **Enormous test/support matrix** — every version combination is a potential bug surface +3. **No clear "happy path"** — new users have to make too many decisions upfront +4. **Stale compatibility claims** — we can't realistically test webpack-cli 4.x anymore, yet we claim to support it +5. **No way to express conditional requirements** — `package.json` peer deps are either optional or required for everyone; there's no "required if you picked webpack" semantic + +### How Modern Frameworks Handle This + +**Next.js** has only **4 peer dependencies** (react, react-dom, sass, @opentelemetry/api — the latter two optional). Webpack is **vendored internally** — users never install or manage it. All loaders are pre-compiled into `next/dist/compiled/`. Their philosophy: users shouldn't think about build tooling. + +**Vite** has **5 regular dependencies** and **12 peer dependencies** (ALL optional). Only things users directly configure in their code (sass, less, stylus, terser) are peer deps. Most implementation dependencies (60+) are bundled into Vite's dist at build time. Note: Vite's bundler (previously esbuild/rollup, now rolldown) has historically used caret ranges — the current pinned rolldown version is because rolldown is still pre-release. + +**The key pattern:** both frameworks minimize their peer dependency surface. Peer dependencies are reserved for things users directly interact with in their own source code. + +## Proposal + +### Phase 1: v10.1.0 (Non-Breaking, Additive) + +Add the two supplemental packages. **No changes to the core `shakapacker` package's peer deps.** Existing users who do not adopt a supplemental package are unaffected. Early adopters of the supplemental packages opt into their exact managed stack pins so compatibility is explicit and updated with each Shakapacker package release. + +What ships: + +- Create `packages/shakapacker-webpack/` and `packages/shakapacker-rspack/` +- Core `package/` directory stays in place (NOT moved to `packages/shakapacker/`) +- Do not enable root `workspaces` yet: the root `package.json` is also the publishable `shakapacker` package, and Yarn Classic requires workspace roots to be `private: true` +- Publish core `shakapacker` 10.1.0 first, then publish supplemental packages at v10.1.0 so their core peer deps resolve +- Update docs and installer to recommend the new pattern for new projects +- Core `shakapacker` still declares all existing peer deps (nothing removed) +- Supplemental packages use exact peer pins for managed dependencies, rather than inheriting the broad optional ranges from core +- `shakapacker-webpack` early adopters move to `webpack-dev-server` 5.x with the supplemental package; webpack-dev-server 4.x remains tolerated only through the legacy core optional peer range during the v10.x compatibility window + +Moving `package/` to `packages/shakapacker/` is deferred to v11.0.0 because it changes the published npm package layout (potential deep-import breakage for `shakapacker/package/*` paths) and requires resolving how `lib/install/config/shakapacker.yml` is included in the npm publish. + +This gives the supplemental packages real-world usage before they become the required path, while making the "known good" dependency set visible immediately. + +### Phase 2: v11.0.0 (Breaking) + +Remove bundler-specific peer deps from core `shakapacker`. Tighten version ranges. Drop EOL runtimes. + +What ships: + +- Core `shakapacker` no longer declares webpack/rspack peer deps +- Users must install `shakapacker-webpack` or `shakapacker-rspack` +- Drop old major versions (webpack-cli v4/v5, sass-loader v13-15, etc.) +- Collapse esbuild from 14 ranges to `>=0.24.0 <1.0.0` (caret on 0.x locks to the minor in npm semver, so a literal `<1.0.0` ceiling is required to keep esbuild 0.25+ in scope) +- Ruby 3.4+, Rails 7.2+ (Ruby 3.1/3.2 are EOL; Ruby 3.3 reaches EOL 2027-03; Rails 7.0/7.1 are unsupported) + +### Three npm Packages + +The fundamental insight (credit: [G-Rath's feedback](https://github.com/shakacode/shakapacker/issues/1030#issuecomment-4150937493)) is that `package.json` cannot express conditional peer dependencies. Making all bundler deps required bloats everyone's install. Keeping them all optional provides no guardrails. **Separate packages solve this cleanly.** + +#### `shakapacker` (core) + +The base package that all users install. Contains: + +- Config loading (`shakapacker.yml` parsing, defaults) +- Manifest reading and asset lookup +- Dev server proxy client +- CLI entry points (`shakapacker`, `shakapacker-dev-server`) +- View helper support (Ruby gem reads manifest generated by any build) +- Shared utilities (`webpack-merge`, config merging) + +**Dependencies (v10.1.0 — no change from today):** + +| Package | Version | Type | +| --------------------- | ----------- | ----------------- | +| js-yaml | `^4.1.0` | dependency | +| path-complete-extname | `^1.0.0` | dependency | +| webpack-merge | `^5.8.0` | dependency | +| yargs | `^17.7.2` | dependency | +| All current peer deps | (unchanged) | optional peer dep | + +**Dependencies (v11.0.0 — stripped down):** + +| Package | Version | Type | +| --------------------- | --------- | ----------------- | +| js-yaml | `^4.1.0` | dependency | +| path-complete-extname | `^1.0.0` | dependency | +| webpack-merge | `^5.8.0` | dependency | +| yargs | `^17.7.2` | dependency | +| @types/webpack | `^5.0.0` | optional peer dep | +| @types/babel\_\_core | `^7.0.0` | optional peer dep | + +**No bundler or transpiler peer deps in v11.** This package works standalone for custom build users. + +The `@types/*` packages remain as optional peer deps because they are referenced by Shakapacker's exported TypeScript types. Users who consume the types need them; others don't. + +#### `shakapacker-webpack` (managed webpack build) + +Supplemental package for the standard webpack managed build experience. + +> The version columns below show the exact release Shakapacker tests against. `package.json` ships these as patch-tolerant `~X.Y.Z` ranges (see [Version Pinning Philosophy](#version-pinning-philosophy)) — e.g. `webpack` is enforced as `~5.106.2`, not pinned to `5.106.2`. + +**Dependencies (bundled — installed automatically):** + +| Package | Tested at | +| ----------------------- | --------- | +| shakapacker | `~10.1.0` | +| webpack | `5.106.2` | +| webpack-cli | `7.0.2` | +| webpack-assets-manifest | `6.5.1` | + +The required managed-build stack ships as `dependencies` so a single `yarn add shakapacker-webpack` (or npm/pnpm equivalent) pulls in everything an app needs to start building. npm hoisting keeps a single instance of webpack at the top level so plugin `instanceof` checks behave correctly. + +**Peer dependencies (optional):** + +| Package | Tested at | When needed | +| ------------------------------------ | --------- | ----------------------- | +| webpack-dev-server | `5.2.3` | Dev mode with HMR | +| mini-css-extract-plugin | `2.10.2` | CSS extraction | +| terser-webpack-plugin | `5.5.0` | Production minification | +| webpack-subresource-integrity | `5.1.0` | SRI hashes | +| @pmmmwh/react-refresh-webpack-plugin | `0.6.2` | React HMR | + +**Peer dependencies (optional — transpiler, pick one):** + +| Package | Tested at | When needed | +| -------------- | --------- | ---------------------------------------- | +| @swc/core | `1.15.33` | `javascript_transpiler: "swc"` (default) | +| swc-loader | `0.2.7` | Paired with @swc/core | +| @babel/core | `7.29.0` | `javascript_transpiler: "babel"` | +| babel-loader | `10.1.1` | Paired with @babel/core | +| esbuild | `0.27.7` | `javascript_transpiler: "esbuild"` | +| esbuild-loader | `4.4.3` | Paired with esbuild | + +**Peer dependencies (optional — CSS preprocessors):** + +| Package | Tested at | When needed | +| ----------- | --------- | ---------------- | +| css-loader | `7.1.4` | CSS processing | +| sass | `1.99.0` | SCSS/Sass files | +| sass-loader | `16.0.7` | Paired with sass | + +#### `shakapacker-rspack` (managed rspack build) + +Supplemental package for the rspack managed build experience. + +**Dependencies (bundled — installed automatically):** + +| Package | Tested at | +| ---------------------- | --------- | +| shakapacker | `~10.1.0` | +| @rspack/core | `2.0.1` | +| @rspack/cli | `2.0.1` | +| rspack-manifest-plugin | `5.2.1` | + +The required managed-build stack ships as `dependencies` so a single `yarn add shakapacker-rspack` (or npm/pnpm equivalent) pulls in everything an app needs to start building. + +**Peer dependencies (optional):** + +| Package | Tested at | When needed | +| ---------------------------- | --------- | ---------------- | +| @rspack/plugin-react-refresh | `2.0.1` | React HMR | +| css-loader | `7.1.4` | CSS processing | +| sass | `1.99.0` | SCSS/Sass files | +| sass-loader | `16.0.7` | Paired with sass | + +Note: rspack has built-in SWC transpilation, so no external transpiler deps are needed. + +Rspack v2 is stable, so the supplemental rspack package pins to the current v2 GA line. Older Rspack v1 and v2 pre-releases remain allowed only through the legacy optional peer ranges in core `shakapacker` during the v10.x compatibility window. + +### Version Pinning Philosophy + +The core `shakapacker` package keeps its broad optional peer ranges during v10.x so existing applications are not broken by an additive release. The supplemental packages use a different policy. The version numbers above are the versions Shakapacker is tested against; bundled `dependencies` and optional `peerDependencies` alike ship as patch-tolerant `~X.Y.Z` ranges so a consumer's routine patch bump does not trigger an npm 7+ peer-conflict warning until the next Shakapacker release. + +- **Patch-tolerant pins (`~X.Y.Z`) for bundled deps and optional peers alike.** Patch releases are accepted across the managed stack — webpack, Rspack, loaders, transpilers, and CSS preprocessors. Major and minor bumps still wait for a coordinated Shakapacker release. +- **Update pins with Shakapacker package releases.** When webpack, Rspack, loaders, or managed plugins move, release a new lockstep Shakapacker package version with updated pins. +- **Keep the maintenance signal honest.** A version outside the supplemental package pins is not claimed as supported until the pins are updated. +- **Avoid pre-release pins unless deliberately testing a pre-release line.** For example, `webpack-subresource-integrity` stays on the latest stable 5.1.x release even though its npm `latest` dist-tag currently points at a release candidate. + +### What Each User Type Installs (v11+) + +The supplemental packages bundle the required managed-build stack as `dependencies`, so users only declare the wrapper and the optional feature peers they actually use. + +**Webpack + SWC (default happy path):** + +```json +{ + "devDependencies": { + "shakapacker-webpack": "^11.0.0", + "webpack-dev-server": "5.2.3", + "@swc/core": "1.15.33", + "swc-loader": "0.2.7", + "css-loader": "7.1.4", + "mini-css-extract-plugin": "2.10.2" + } +} +``` + +`shakapacker`, `webpack`, `webpack-cli`, and `webpack-assets-manifest` come along automatically as deps of `shakapacker-webpack`. + +**Rspack (SWC is built-in):** + +```json +{ + "devDependencies": { + "shakapacker-rspack": "^11.0.0", + "css-loader": "7.1.4" + } +} +``` + +`shakapacker`, `@rspack/core`, `@rspack/cli`, and `rspack-manifest-plugin` come along automatically as deps of `shakapacker-rspack`. + +**Custom build (manifest-only):** + +```json +{ + "devDependencies": { + "shakapacker": "^11.0.0" + } +} +``` + +### Monorepo Structure + +All three npm packages live in the existing `shakacode/shakapacker` repository. The Ruby gem also stays in this repo. + +**Phase 1 (v10.1.0) — core stays in place:** + +```text +shakapacker/ +├── package/ # core npm package source (unchanged) +│ └── ... +├── packages/ +│ ├── shakapacker-webpack/ # supplemental webpack package +│ │ ├── package.json +│ │ └── index.js # re-exports shakapacker root (per-bundler subpath split deferred to Phase 2) +│ └── shakapacker-rspack/ # supplemental rspack package +│ ├── package.json +│ └── index.js # re-exports shakapacker/rspack +├── lib/ # Ruby gem (unchanged) +├── spec/ # Ruby specs +├── test/ # JS tests +├── shakapacker.gemspec +└── package.json # core npm package +``` + +**Phase 2 (v11.0.0) — core moves into packages/:** + +```text +shakapacker/ +├── packages/ +│ ├── shakapacker/ # core npm package (moved from package/) +│ │ ├── package.json +│ │ └── ... +│ ├── shakapacker-webpack/ # supplemental webpack package +│ │ ├── package.json +│ │ └── index.js +│ └── shakapacker-rspack/ # supplemental rspack package +│ ├── package.json +│ └── index.js +├── lib/ # Ruby gem (unchanged) +├── spec/ # Ruby specs +├── test/ # JS tests +├── shakapacker.gemspec +└── package.json # workspace root +``` + +The supplemental packages are thin — primarily: + +- `package.json` with the correct peer dependencies declared +- Re-exports of the bundler-specific config generation from the core `shakapacker` package +- Bundler-specific loader rules and plugin configurations + +The core `shakapacker` package retains all the shared logic. The supplemental packages are essentially "dependency declarations + bundler-specific glue." + +**Why monorepo, not separate repos:** + +- Core changes almost always affect supplemental packages (config loading, loader rule composition, plugin wiring). Separate repos would mean coordinating releases constantly. +- Atomic commits — a single PR can update core + both supplemental packages + tests. +- One CI pipeline tests all three packages together. +- The supplemental packages are too thin to justify independent repos. + +### Versioning Strategy: Lockstep + +All three npm packages share the same version number, always. The Ruby gem version tracks independently (it already has its own versioning). + +**Rules:** + +1. **Same version, always.** When any package is released, all three are released at the same version. If a release only changes core, the supplemental packages still get the version bump. +2. **Patch-tolerant peer dep on core.** `shakapacker-webpack` and `shakapacker-rspack` declare `"shakapacker": "~10.1.0"` as a peer dep. This pins the supplemental packages to the exact minor of core they were tested against — a user on `shakapacker@10.2.x` must also upgrade their supplemental package to a `10.2.x` release. Patch flexibility is preserved (`10.1.0`–`10.1.x` all satisfy the range). Caret (`^10.1.0`) was rejected because it would allow `shakapacker@10.2.0` + `shakapacker-webpack@10.1.0`, an untested combination that defeats the lockstep value proposition. +3. **Start at v10.1.0.** All three packages begin at the same version. No separate versioning at any point. +4. **Defer workspace tooling until the root can be private.** During Phase 1, the root `package.json` remains the publishable core package, so root workspaces are not enabled under Yarn Classic. + +**Why lockstep:** + +- The supplemental packages are tightly coupled to core — independent versioning would create a compatibility matrix nightmare. +- Precedent: Next.js (`next`, `@next/env`, `@next/swc-*`), Angular (`@angular/core`, `@angular/compiler`, etc.), and Babel (`@babel/core`, `@babel/preset-env`, etc.) all use lockstep versioning across their package families. +- Users see `"shakapacker": "~10.2.0"` and `"shakapacker-webpack": "~10.2.0"` — easy to reason about compatibility. +- "Empty bumps" (a supplemental package gets a version bump with no code change) are a tiny cost compared to the coordination headache of independent versions. + +**Initial v10.1.0 release process:** + +> **Sequencing is load-bearing.** Both supplemental packages declare `"shakapacker": "~10.1.0"` as a direct dependency. Core `shakapacker` 10.1.0 must be published _before_ either supplemental, otherwise installers cannot resolve the dep. + +```bash +# Releases the gem AND all three npm packages. The rake task bumps every +# package.json to the target version, commits + tags + pushes via release-it, +# then invokes scripts/publish-packages.sh to publish all three to npm in +# lockstep (core first, then supplementals). +bundle exec rake "release[10.1.0]" +``` + +Under the hood, the rake task: + +1. Bumps `lib/shakapacker/version.rb` (`gem bump`). +2. Runs `npm version --no-git-tag-version` in `packages/shakapacker-webpack` and `packages/shakapacker-rspack`, then rewrites their `dependencies.shakapacker` constraint to `~` so a minor/major bump (e.g. `10.1.0` → `10.2.0`) doesn't ship supplementals declaring a stale `~10.1.0` core dep that cannot resolve `10.2.0`. +3. Invokes `release-it` with `--no-npm.publish` so it handles the core version bump, commit, tag, and push — but defers npm publishing. +4. Calls `./scripts/publish-packages.sh`, which re-validates lockstep across all three `package.json` files (both `version` AND each supplemental's `dependencies.shakapacker`) and publishes them in the required core-first order. Pre-release versions (e.g. `10.1.0-beta.1`) automatically get the matching `--tag` (`beta`, `rc`, etc.). +5. Runs `gem release` for RubyGems and syncs the GitHub release from `CHANGELOG.md`. + +> **Why npm for publishing despite Yarn 1 for development.** The project pins `packageManager: yarn@1.22.22` and uses Yarn for all development scripts, but Yarn Classic does not have a workspace-aware publish command (and `yarn workspaces version` is not available in v1). We invoke `npm publish` per package directly until v11 picks a dedicated release tool — see Open Question #5. + +For later Phase 1 releases, the same `rake "release[]"` invocation handles all three packages. A dedicated workspace or release tool remains an open question for v11, when the core package can move under `packages/shakapacker/` and the repository root can become private. + +The existing `bundle exec rake update_changelog` task should be updated to handle the monorepo structure, noting which packages were affected in each release. + +### Ruby gemspec (v11.0.0) + +| Dependency | Current | v11 Proposed | Reason | +| ----------------------- | ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `required_ruby_version` | `>= 2.7.0` | `>= 3.4.0` | Ruby 3.1 (EOL 2025-03-26) and 3.2 (EOL 2026-04-01) are EOL; Ruby 3.3 (EOL 2027-03-31) leaves little headroom for v11. Ruby 3.4 (EOL ~2027-12) gives v11 a longer active-support window. | +| `activesupport` | `>= 5.2` | `>= 7.2` | Rails 7.0/7.1 are unsupported (only 7.2.x, 8.0.x, 8.1.x receive security fixes) | +| `railties` | `>= 5.2` | `>= 7.2` | Match activesupport | + +**Ruby 3.3 was considered and rejected.** Setting `>= 3.3` would still drop the clearly-EOL 3.1 and 3.2, and would give Ruby 3.3 users a longer migration window. It was rejected because Ruby 3.3's EOL is 2027-03-31, only ~5 months after a likely v11 GA in late 2026 — meaning v11 would land already supporting an EOL Ruby. Choosing 3.4 aligns the support window with the v11 active-support lifetime. If user data shows a meaningful population still on 3.3 at v11 release time, this can be relaxed. + +### Node.js engines + +Core `shakapacker` was tightened to `^20.19.0 || >=22.12.0` in v10.1 (PR #1099, driven by `@rspack/core` 2.0.x). Supplemental packages must not declare a more permissive `engines.node` than core, because a user who satisfies the supplemental's range but not core's would pass the supplemental's install gate and then hit core's engine error. Both supplementals therefore mirror core: + +| Package | Node engine | Reason | +| ------------------- | ------------------------- | -------------------------------------------------------------------------------- | +| shakapacker-webpack | `^20.19.0 \|\| >=22.12.0` | Mirror of core's `engines.node`; cannot be more permissive than core | +| shakapacker-rspack | `^20.19.0 \|\| >=22.12.0` | Required by `@rspack/core` 2.0.1; same as core's range, so no further tightening | + +### Installer Changes + +The `shakapacker:install` rake task should be updated to: + +1. Ask which bundler (webpack or rspack) — **default: rspack**. Rspack ships SWC transpilation built in, so the recommended path is the lowest-friction install. +2. **If the user picked webpack**, ask which transpiler (swc, babel, esbuild, none) — default: swc. **Skip this question entirely for rspack** — rspack uses its built-in SWC and we don't want to expand the support burden by exposing transpiler swap-out for rspack users who don't need it. +3. Install the appropriate `shakapacker-*` package (it bundles `shakapacker` and the bundler stack) +4. Install **only** the optional peer dependencies for the features the app actually uses + +## Migration Path + +### v10.x → v10.1.0 (shipped) + +User-facing migration steps live in [`docs/migration/v10.1-supplemental-packages.md`](migration/v10.1-supplemental-packages.md). Adoption is opt-in; nothing breaks for users who don't change anything. + +### v10.x → v11.0.0 (planned, no firm date) + +When v11 lands, the migration path will look roughly like: + +- **Webpack and rspack users on the managed build path** adopt the matching supplemental package (or rely on v10.1 adoption already done) and update any stale loader/plugin versions to the pins enforced by the wrapper. +- **Custom-build users** (apps that output their own `manifest.json`) keep using bare `shakapacker` — no supplemental package needed. +- **Babel users** can stay on Babel but `babel-loader` will be v9+ only. Migration to SWC is recommended for build speed; see [`docs/transpiler-migration.md`](transpiler-migration.md). + +The exact list of dropped versions and the Ruby/Rails floor will be confirmed once v11 has a release target. The driving factors are EOL dates for the runtimes we still support and adoption signal from the v10.1 supplemental packages. + +## Alternatives Considered + +### Single package with all optional peer deps (current approach) + +The status quo. Rejected because: + +- `package.json` cannot express "required if you chose webpack" — deps are either optional or required for everyone +- 23 optional peer deps provide no guardrails for new users +- Silenced warnings (`peerDependenciesMeta: optional`) don't help users make correct choices + +### Single package with required peer deps for the default bundler + +Rejected because it would force webpack dependencies on rspack users and vice versa, bloating everyone's dependency tree. + +### Bundle webpack/rspack as a regular dependency (Next.js model) + +Rejected because: + +- Shakapacker supports **both** webpack and rspack — we can't bundle both +- Users need direct access to webpack/rspack for custom config files +- Vendoring would make it harder for users to apply webpack security patches independently + +### Separate repos for supplemental packages + +Rejected because: + +- Core changes almost always affect both supplemental packages — separate repos mean cross-repo PRs for routine changes +- Testing a core change against both supplemental packages requires coordination across repos +- More CI pipelines to maintain, more places for things to drift out of sync +- Independent versioning creates a compatibility matrix problem that lockstep avoids +- The supplemental packages are too thin (mostly `package.json` + re-exports) to justify standalone repos + +### Full monorepo split (separate gem per bundler) + +Rejected because: + +- The Ruby gem logic is shared across both bundlers +- Would double our release/maintenance burden on the gem side +- The npm-only split achieves the same dependency isolation without touching the gem + +### Big bang v11 (no phased rollout) + +Rejected because: + +- v10 just shipped — bumping to v11 immediately feels rushed +- Phased rollout lets supplemental packages get real-world usage before they become required +- v10.1 is zero-risk for existing users + +## Resolved Decisions + +- **Package naming**: `shakapacker-webpack` / `shakapacker-rspack` (unscoped) +- **Repo structure**: Monorepo in existing `shakacode/shakapacker` repo, all packages under `packages/` +- **Versioning**: Lockstep — all three npm packages share the same version number +- **Rollout**: Phased — v10.1.0 (additive), v11.0.0 (breaking) +- **Supplemental dependency policy**: exact peer pins for managed stacks; update pins through lockstep Shakapacker package releases + +## References + +- [Community discussion](https://github.com/shakacode/shakapacker/issues/1030) — feedback that shaped this RFC +- [Current peer-dependencies docs](peer-dependencies.md) +- [Current optional-peer-dependencies docs](optional-peer-dependencies.md) +- [Next.js package.json](https://github.com/vercel/next.js/blob/canary/packages/next/package.json) — 4 peer deps, webpack vendored +- [Vite package.json](https://github.com/vitejs/vite/blob/main/packages/vite/package.json) — 5 deps, 12 optional peers +- [Transpiler migration guide](transpiler-migration.md) diff --git a/docs/migration/v10.1-supplemental-packages.md b/docs/migration/v10.1-supplemental-packages.md new file mode 100644 index 000000000..48841fd26 --- /dev/null +++ b/docs/migration/v10.1-supplemental-packages.md @@ -0,0 +1,88 @@ +# Migrating to Shakapacker 10.1 Supplemental Packages + +Shakapacker 10.1 introduces two optional npm packages — `shakapacker-webpack` and `shakapacker-rspack` — that bundle the managed-build stack as direct `dependencies`. Adopting one of them lets you replace four explicit deps (`shakapacker` + bundler + CLI + manifest plugin) with a single package. + +**This is opt-in.** Apps that don't change anything keep working on 10.1 exactly as they did on 10.0. Adopt at your own pace. + +## Why migrate + +- **One install command instead of four or five.** `yarn add --dev shakapacker-rspack` (or `shakapacker-webpack`) pulls in the whole tested stack. +- **Tighter version pinning.** The supplemental packages declare `~X.Y.Z` ranges for the exact versions Shakapacker is tested against, so a routine patch bump in your lockfile can no longer drift you off the supported set without warning. +- **Sets you up for v11.** v11 will require the supplemental packages for managed builds (custom-build users keep using bare `shakapacker`). Adopting now means there's no migration step when v11 lands. + +## Migration steps + +### Rspack apps + +Replace your bundler-related dev dependencies with a single package: + +**Before (10.0):** + +```json +{ + "devDependencies": { + "shakapacker": "^10.0.0", + "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.0.0", + "rspack-manifest-plugin": "^5.0.0" + } +} +``` + +**After (10.1+):** + +```json +{ + "devDependencies": { + "shakapacker-rspack": "~10.1.0" + } +} +``` + +Run `yarn install` (or the npm/pnpm equivalent). The lockfile collapses to the bundled stack; no Ruby or shakapacker.yml changes are required. + +Optional peers — `@rspack/plugin-react-refresh`, `css-loader`, `sass`, `sass-loader` — stay in your `package.json` only if your app actually uses those features. + +See [`packages/shakapacker-rspack/README.md`](../../packages/shakapacker-rspack/README.md) for the canonical install reference. + +### Webpack apps + +**Before (10.0):** + +```json +{ + "devDependencies": { + "shakapacker": "^10.0.0", + "webpack": "^5.0.0", + "webpack-cli": "^6.0.0", + "webpack-assets-manifest": "^5.0.6" + } +} +``` + +**After (10.1+):** + +```json +{ + "devDependencies": { + "shakapacker-webpack": "~10.1.0" + } +} +``` + +Optional peers — transpilers (swc / babel / esbuild), `webpack-dev-server`, `mini-css-extract-plugin`, CSS preprocessors, `@pmmmwh/react-refresh-webpack-plugin`, etc. — stay in your `package.json` only if your app uses them. + +There is one breaking-version note: `shakapacker-webpack` pins `webpack-assets-manifest` to `~6.5.1`. If your app is still on `webpack-assets-manifest@5.x`, you'll need to upgrade to v6 when adopting `shakapacker-webpack`. v6 fixed an ENOENT crash on clean builds with `merge: true` and dropped a Node 14 install path. See the [v5→v6 release notes](https://github.com/webdeveric/webpack-assets-manifest/releases) and [`packages/shakapacker-webpack/README.md`](../../packages/shakapacker-webpack/README.md) for details. + +### Custom-build apps + +If you provide your own webpack/rspack/Vite/etc. setup and only use Shakapacker to read `manifest.json`, **don't install a supplemental package**. Continue using bare `shakapacker` — that's the supported "custom build" path and it doesn't change in v10.1 or v11. + +## What you'll see after migration + +- The runtime emits structured warnings (`SHAKAPACKER_BUNDLER_MISMATCH`, `SHAKAPACKER_NO_TRANSPILER`) if your `config/shakapacker.yml` settings disagree with the supplemental package you installed. They surface through Node's built-in warning system, so they're visible in dev and CI but suppressible with `--no-warnings`. +- Your existing `config/shakapacker.yml`, `bin/shakapacker`, and webpack/rspack configs continue to work without changes. + +## Need the design rationale? + +For the "why this shape" — alternatives considered, comparison to Vite/Next.js, and the v11 roadmap — see [`docs/dependency-strategy.md`](../dependency-strategy.md). diff --git a/package.json b/package.json index 4004a8e2b..904827ecd 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "./configExporter": "./package/configExporter/index.js", "./package.json": "./package.json", "./package/babel/preset.js": "./package/babel/preset.js", + "./package/config": "./package/config.js", "./package/*": "./package/*" }, "files": [ @@ -50,11 +51,12 @@ "yargs": "^17.7.2" }, "devDependencies": { + "@babel/core": "7.29.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.37.0", - "@rspack/cli": "2.0.0-rc.0", - "@rspack/core": "2.0.0-rc.0", - "@swc/core": "^1.3.0", + "@rspack/cli": "2.0.1", + "@rspack/core": "2.0.1", + "@swc/core": "1.15.33", "@types/babel__core": "^7.20.5", "@types/js-yaml": "^4.0.9", "@types/node": "^24.5.2", @@ -65,10 +67,10 @@ "@types/yargs": "^17.0.33", "@typescript-eslint/eslint-plugin": "^8.46.0", "@typescript-eslint/parser": "^8.46.0", - "babel-loader": "^8.2.4", + "babel-loader": "10.1.1", "compression-webpack-plugin": "^9.0.0", - "css-loader": "^7.1.2", - "esbuild-loader": "^2.18.0", + "css-loader": "7.1.4", + "esbuild-loader": "4.4.3", "eslint": "^9.37.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^10.1.8", @@ -82,18 +84,18 @@ "knip": "^5.64.2", "lint-staged": "^15.2.10", "memory-fs": "^0.5.0", - "mini-css-extract-plugin": "^2.9.4", + "mini-css-extract-plugin": "2.10.2", "prettier": "^3.6.2", - "rspack-manifest-plugin": "^5.0.3", - "sass-loader": "^16.0.5", - "swc-loader": "^0.1.15", + "rspack-manifest-plugin": "5.2.1", + "sass-loader": "16.0.7", + "swc-loader": "0.2.7", "thenify": "^3.3.1", "ts-jest": "^29.4.5", "typescript": "^5.9.2", - "webpack": "5.101.3", - "webpack-assets-manifest": "^5.0.6", - "webpack-cli": "^7.0.0", - "webpack-subresource-integrity": "^5.1.0" + "webpack": "5.106.2", + "webpack-assets-manifest": "6.5.1", + "webpack-cli": "7.0.2", + "webpack-subresource-integrity": "5.1.0" }, "peerDependencies": { "@babel/core": "^7.17.9", diff --git a/packages/shakapacker-rspack/LICENSE b/packages/shakapacker-rspack/LICENSE new file mode 100644 index 000000000..6c01112b0 --- /dev/null +++ b/packages/shakapacker-rspack/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2016-2026 Justin Gordon, ShakaCode + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/shakapacker-rspack/README.md b/packages/shakapacker-rspack/README.md new file mode 100644 index 000000000..a6b5ddd70 --- /dev/null +++ b/packages/shakapacker-rspack/README.md @@ -0,0 +1,51 @@ +# shakapacker-rspack + +`shakapacker-rspack` is the supplemental package for Shakapacker's managed Rspack build path. It pairs `shakapacker` with the exact Rspack packages and related loader versions that Shakapacker currently supports. + +## Install + +`shakapacker-rspack` ships `shakapacker`, `@rspack/core`, `@rspack/cli`, and `rspack-manifest-plugin` as direct dependencies, so a single install pulls in the full managed build stack: + +```sh +# yarn +yarn add --dev shakapacker-rspack + +# npm +npm install --save-dev shakapacker-rspack + +# pnpm +pnpm add --save-dev shakapacker-rspack +``` + +`@rspack/cli` is bundled because `bin/shakapacker` (Shakapacker's standard build/dev-server entrypoint) shells out to the `rspack` CLI binary rather than driving Rspack via the JS API. + +Rspack includes SWC transpilation, so no separate JavaScript transpiler package is required. Install optional peers such as `@rspack/plugin-react-refresh@~2.0.1`, `css-loader@~7.1.4`, `sass@~1.99.0`, and `sass-loader@~16.0.7` only when your app uses those features. + +### Simplifying an existing rspack install + +If your app already runs Shakapacker on Rspack, you can drop the managed-build deps from your `package.json` — they come along with `shakapacker-rspack`: + +**Before (v10.0):** + +```json +{ + "devDependencies": { + "shakapacker": "^10.0.0", + "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.0.0", + "rspack-manifest-plugin": "^5.0.0" + } +} +``` + +**After (v10.1+ with `shakapacker-rspack`):** + +```json +{ + "devDependencies": { + "shakapacker-rspack": "~10.1.0" + } +} +``` + +Optional peers (`@rspack/plugin-react-refresh`, `css-loader`, `sass`, `sass-loader`) stay only if your app uses those features. Run `yarn install` (or the npm/pnpm equivalent) and the lockfile collapses to the bundled stack. diff --git a/packages/shakapacker-rspack/index.js b/packages/shakapacker-rspack/index.js new file mode 100644 index 000000000..1c7d94fdc --- /dev/null +++ b/packages/shakapacker-rspack/index.js @@ -0,0 +1,63 @@ +// Thin wrapper around the core `shakapacker/rspack` entrypoint. The value of +// this package is in its tighter peer-dependency declarations (see +// packages/shakapacker-rspack/package.json), not the runtime surface. +// +// The compiled core is built by the upstream `shakapacker` package's +// `prepublishOnly`; for local monorepo development run `yarn build` in the +// repository root before consuming this package against the source tree. + +// Keep this string in sync with packages/shakapacker-webpack/index.js. +// Both packages emit the same warning code; a regression test asserts they +// match (test/packages/warning-codes.test.js). +const BUNDLER_MISMATCH_CODE = "SHAKAPACKER_BUNDLER_MISMATCH" + +// Read config through the explicit `shakapacker/package/config` subpath +// export, which loads the YAML config without pulling in webpack/rspack +// rule modules. This lets the bundler-mismatch preflight run even when +// the root `shakapacker` export (which transitively touches bundler +// peers) fails to load. Falls back to `require("shakapacker").config` for +// older core versions that predate the explicit subpath export, then to +// `undefined` if both fail. +// +// This helper is intentionally duplicated verbatim in +// packages/shakapacker-webpack/index.js. The two supplemental packages +// ship as separate npm packages, so a shared module isn't possible +// without vendoring at publish time. Keep the two implementations in +// sync when changing this logic. +const readShakapackerConfig = () => { + try { + // eslint-disable-next-line global-require + return require("shakapacker/package/config") + } catch { + try { + // eslint-disable-next-line global-require + return require("shakapacker")?.config + } catch { + return undefined + } + } +} + +const shakapackerConfig = readShakapackerConfig() +const bundlerSetting = shakapackerConfig?.assets_bundler + +// Detect the misconfiguration where shakapacker-rspack is installed but the +// app is configured to use webpack (or left unset, which defaults to webpack). +// The rspack entrypoint always loads rspack-specific rules/plugins, so the +// warning points users at the config change before they hit downstream module +// resolution errors. +const effectiveBundler = bundlerSetting ?? "webpack" +if (shakapackerConfig !== undefined && effectiveBundler !== "rspack") { + const bundlerDescription = + bundlerSetting === undefined + ? 'unset, which defaults to "webpack"' + : `"${bundlerSetting}"` + + process.emitWarning( + `[shakapacker-rspack] config.assets_bundler is ${bundlerDescription} but this package only supports rspack.\n` + + `Install shakapacker-webpack and require it instead, or set \`assets_bundler: rspack\` in config/shakapacker.yml.`, + { code: BUNDLER_MISMATCH_CODE } + ) +} + +module.exports = require("shakapacker/rspack") diff --git a/packages/shakapacker-rspack/package.json b/packages/shakapacker-rspack/package.json new file mode 100644 index 000000000..3af6e81ae --- /dev/null +++ b/packages/shakapacker-rspack/package.json @@ -0,0 +1,60 @@ +{ + "name": "shakapacker-rspack", + "version": "10.1.0", + "description": "Managed rspack build support for Shakapacker", + "homepage": "https://github.com/shakacode/shakapacker", + "bugs": { + "url": "https://github.com/shakacode/shakapacker/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/shakacode/shakapacker.git", + "directory": "packages/shakapacker-rspack" + }, + "license": "MIT", + "author": "Justin Gordon ", + "keywords": [ + "shakapacker", + "rspack", + "rails", + "webpacker" + ], + "main": "index.js", + "files": [ + "index.js", + "LICENSE", + "README.md" + ], + "dependencies": { + "shakapacker": "~10.1.0", + "@rspack/core": "~2.0.1", + "@rspack/cli": "~2.0.1", + "rspack-manifest-plugin": "~5.2.1" + }, + "peerDependencies": { + "@rspack/plugin-react-refresh": "~2.0.1", + "css-loader": "~7.1.4", + "sass": "~1.99.0", + "sass-loader": "~16.0.7" + }, + "peerDependenciesMeta": { + "@rspack/plugin-react-refresh": { + "optional": true + }, + "css-loader": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-loader": { + "optional": true + } + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/shakapacker-webpack/LICENSE b/packages/shakapacker-webpack/LICENSE new file mode 100644 index 000000000..fbe118c3c --- /dev/null +++ b/packages/shakapacker-webpack/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2026 Justin Gordon, ShakaCode + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/shakapacker-webpack/README.md b/packages/shakapacker-webpack/README.md new file mode 100644 index 000000000..dde203584 --- /dev/null +++ b/packages/shakapacker-webpack/README.md @@ -0,0 +1,53 @@ +# shakapacker-webpack + +`shakapacker-webpack` is the supplemental package for Shakapacker's managed webpack build path. It pairs `shakapacker` with the exact webpack, loader, and plugin versions that Shakapacker currently supports for the standard webpack setup. + +## Install + +`shakapacker-webpack` ships `shakapacker`, `webpack`, `webpack-cli`, and `webpack-assets-manifest` as direct dependencies, so a single install pulls in the full managed build stack: + +```sh +# yarn +yarn add --dev shakapacker-webpack + +# npm +npm install --save-dev shakapacker-webpack + +# pnpm +pnpm add --save-dev shakapacker-webpack +``` + +**At least one JavaScript transpiler pair is required** — the runtime emits `SHAKAPACKER_NO_TRANSPILER` if none resolves. For the default SWC path, install `@swc/core@1.15.33` and `swc-loader@0.2.7`. Babel (`@babel/core@7.29.0` + `babel-loader@10.1.1`) and esbuild (`esbuild@0.27.7` + `esbuild-loader@4.4.3`) are also supported when set via `javascript_transpiler:` in `config/shakapacker.yml`. For dev-server/HMR usage, install `webpack-dev-server@5.2.3`; webpack-dev-server 4.x remains part of the legacy core compatibility window, not the supplemental package's managed stack. + +### Simplifying an existing webpack install + +If your app already runs Shakapacker on webpack, you can drop the managed-build deps from your `package.json` — they come along with `shakapacker-webpack`: + +**Before (v10.0):** + +```json +{ + "devDependencies": { + "shakapacker": "^10.0.0", + "webpack": "^5.0.0", + "webpack-cli": "^6.0.0", + "webpack-assets-manifest": "^5.0.6" + } +} +``` + +**After (v10.1+ with `shakapacker-webpack`):** + +```json +{ + "devDependencies": { + "shakapacker-webpack": "~10.1.0" + } +} +``` + +Optional peers (transpilers, `webpack-dev-server`, `mini-css-extract-plugin`, CSS preprocessors, etc.) stay only if your app uses those features. Run `yarn install` (or the npm/pnpm equivalent) and the lockfile collapses to the bundled stack. + +### Migrating from core's webpack peer set + +Core `shakapacker` accepts both `webpack-assets-manifest` v5 and v6 (`^5.0.6 || ^6.0.0`). `shakapacker-webpack` pins `~6.5.1`. Apps still on `webpack-assets-manifest@5.x` must upgrade to v6 when adopting `shakapacker-webpack` — the v6 release fixed an ENOENT crash on clean builds with `merge: true` and dropped a Node 14 install path; see [the v5→v6 release notes](https://github.com/webdeveric/webpack-assets-manifest/releases) for details. diff --git a/packages/shakapacker-webpack/index.js b/packages/shakapacker-webpack/index.js new file mode 100644 index 000000000..d6c193fa6 --- /dev/null +++ b/packages/shakapacker-webpack/index.js @@ -0,0 +1,179 @@ +// Thin wrapper around the core `shakapacker` package. The value of this +// package is in its tighter peer-dependency declarations (see +// packages/shakapacker-webpack/package.json), not the runtime surface. +// +// Re-exporting the shakapacker root (rather than a `shakapacker/webpack` +// subpath, which doesn't exist) is intentional: webpack is the default +// codepath in core. shakapacker-rspack/index.js, by contrast, re-exports +// the bundler-specific `shakapacker/rspack` entrypoint. +// +// The compiled core is built by the upstream `shakapacker` package's +// `prepublishOnly`; for local monorepo development run `yarn build` in the +// repository root first. + +// Warn when the configured transpiler pair isn't resolvable. The three +// transpiler pairs are keyed by the `javascript_transpiler` value they +// satisfy so the check can be scoped to whichever one the app actually +// uses. Checking "any pair" would silence the warning when, for example, +// an app configured for swc still has Babel leftovers installed — and +// then webpack would fail later with a cryptic loader error. +const transpilerGroups = { + swc: ["@swc/core", "swc-loader"], + babel: ["@babel/core", "babel-loader"], + esbuild: ["esbuild", "esbuild-loader"] +} + +// Keep this string in sync with packages/shakapacker-rspack/index.js. +// Both packages emit the same warning code; a regression test asserts they +// match (test/packages/warning-codes.test.js). +const BUNDLER_MISMATCH_CODE = "SHAKAPACKER_BUNDLER_MISMATCH" +const NO_TRANSPILER_CODE = "SHAKAPACKER_NO_TRANSPILER" + +// Resolve from the consuming app's working directory rather than from +// inside `node_modules/shakapacker-webpack/`. Webpack itself runs from the +// project root, so peer deps are resolvable from `process.cwd()` even +// under pnpm strict mode and Yarn PnP, where they aren't hoisted into the +// wrapper's own folder. The narrow assumption is that the build process +// invokes Node from the project root; a script that `cd`s elsewhere +// before requiring this package can produce a false-negative warning, +// which we accept as a known limitation in exchange for handling the +// common pnpm/PnP case correctly. +const canResolve = (mod) => { + try { + require.resolve(mod, { paths: [process.cwd()] }) + return true + } catch { + return false + } +} + +// Read the YAML config via the lightweight `shakapacker/package/config` +// subpath. This avoids triggering core's bundler-specific module loading +// (which transitively requires webpack/rspack peers), so the warnings can +// fire even when `require("shakapacker")` would throw — e.g., a user +// configured `assets_bundler: rspack` but installed shakapacker-webpack +// without @rspack/core. Falls back to `require("shakapacker").config` if +// the subpath isn't available (older core versions or future +// reorganizations); if both fail, the wrapper still emits a generic +// transpiler warning before re-raising the load error from the final +// require below. +// +// This helper is intentionally duplicated verbatim in +// packages/shakapacker-rspack/index.js. The two supplemental packages +// ship as separate npm packages, so a shared module isn't possible +// without vendoring at publish time. Keep the two implementations in +// sync when changing this logic. +const readShakapackerConfig = () => { + try { + // eslint-disable-next-line global-require + return require("shakapacker/package/config") + } catch { + try { + // eslint-disable-next-line global-require + return require("shakapacker")?.config + } catch { + return undefined + } + } +} + +const shakapackerConfig = readShakapackerConfig() +const shakapackerLoadFailed = shakapackerConfig === undefined +const bundlerSetting = shakapackerConfig?.assets_bundler +const transpilerSetting = shakapackerConfig?.javascript_transpiler + +// Detect the misconfiguration where shakapacker-webpack is installed but +// the app is configured to use a non-webpack bundler. Surfacing a +// structured warning is cheaper than the cryptic loader errors that follow +// when the wrong rules/plugins try to load. Skipped when config loading +// failed entirely (we don't know what the user configured) or when the +// bundler is webpack/unset (webpack is the default). +const bundlerMismatch = + !shakapackerLoadFailed && + bundlerSetting !== undefined && + bundlerSetting !== "webpack" + +if (bundlerMismatch) { + process.emitWarning( + `[shakapacker-webpack] config.assets_bundler is "${bundlerSetting}" but this package only supports webpack.\n` + + `Install shakapacker-rspack and require it instead, or set \`assets_bundler: webpack\` in config/shakapacker.yml.`, + { code: BUNDLER_MISMATCH_CODE } + ) +} + +// Intentionally not gated on `!shakapackerLoadFailed` (unlike the bundler +// mismatch block above): when config loading fails, `transpilerSetting` is +// undefined and we still want the missing-transpiler warning to fire so the +// user isn't silently left with no transpiler. The shakapackerLoadFailed +// branch below shapes the message to surface the load failure first. +// +// Skip the transpiler check entirely when a bundler mismatch was detected: +// rspack ships SWC transpilation built in, so a user with +// `assets_bundler: rspack` deliberately has no webpack-stack transpilers +// installed. The bundler mismatch is the actionable problem; an additional +// NO_TRANSPILER warning would just be misleading noise. +if (!bundlerMismatch && transpilerSetting?.toLowerCase() !== "none") { + // When the config names a known transpiler, only that pair counts — + // unrelated transpilers being installed shouldn't mask a missing peer. + // When the setting is missing (config load failed) or unrecognized + // (e.g. "custom"), fall back to "any pair resolves" since we genuinely + // don't know what the user configured. Defaulting to a specific pair + // would produce false positives — e.g., the install template ships + // `javascript_transpiler: "swc"`, so a user with that standard install + // plus a transient config load failure has SWC installed, not Babel. + const expectedGroup = transpilerSetting + ? transpilerGroups[transpilerSetting] + : null + const hasExpectedTranspiler = expectedGroup + ? expectedGroup.every(canResolve) + : Object.values(transpilerGroups).some((group) => group.every(canResolve)) + + if (!hasExpectedTranspiler) { + // process.emitWarning surfaces through Node's structured warning system — + // visible by default in stderr (including CI), suppressible with + // --no-warnings or `process.removeAllListeners("warning")` for users who + // know what they're doing. + let message + if (shakapackerLoadFailed) { + // When config can't be read, surface the load failure as the + // primary problem before the (necessarily speculative) transpiler + // advice, so users fix the root cause first instead of chasing + // package-install messages. + // Don't recommend a single "default" pair here: the install template + // ships `javascript_transpiler: "swc"`, but the *code* default in + // `package/config.ts` is `"babel"` for webpack (legacy backward + // compat). A user who installs SWC per a single-default message and + // then creates a config without setting `javascript_transpiler:` + // would still trip the "babel-loader missing" warning. Pointing at + // the supported pairs and prompting an explicit + // `javascript_transpiler:` value avoids that whiplash. + message = `[shakapacker-webpack] shakapacker config could not be loaded — resolve that first; the config file may be missing. +Once the config exists, install one of the supported transpiler pairs and set \`javascript_transpiler:\` to match: + - @swc/core + swc-loader → javascript_transpiler: "swc" (recommended; matches the install template) + - @babel/core + babel-loader → javascript_transpiler: "babel" + - esbuild + esbuild-loader → javascript_transpiler: "esbuild" +Or set \`javascript_transpiler: "none"\` if you provide your own loader.` + } else if (expectedGroup) { + message = `[shakapacker-webpack] javascript_transpiler is "${transpilerSetting}" but ${expectedGroup.join( + " + " + )} is not installed in the application's node_modules. +Install: ${expectedGroup.join(" ")} +Or set \`javascript_transpiler: "none"\` in config/shakapacker.yml if you provide your own loader.` + } else { + message = `[shakapacker-webpack] No JavaScript transpiler is installed. Install one of: + - @swc/core + swc-loader (recommended) + - @babel/core + babel-loader + - esbuild + esbuild-loader +Or set \`javascript_transpiler: "none"\` in config/shakapacker.yml if you provide your own loader.` + } + + process.emitWarning(message, { code: NO_TRANSPILER_CODE }) + } +} + +// Re-require shakapacker for the actual export. Node caches successful +// loads, so on the happy path this returns the same instance that +// `readShakapackerConfig` already touched. Failed requires are not +// cached, so on the error path this call retries and throws after the +// warnings have already fired — the ordering the tests pin. +module.exports = require("shakapacker") diff --git a/packages/shakapacker-webpack/package.json b/packages/shakapacker-webpack/package.json new file mode 100644 index 000000000..e3f54b30b --- /dev/null +++ b/packages/shakapacker-webpack/package.json @@ -0,0 +1,100 @@ +{ + "name": "shakapacker-webpack", + "version": "10.1.0", + "description": "Managed webpack build support for Shakapacker", + "homepage": "https://github.com/shakacode/shakapacker", + "bugs": { + "url": "https://github.com/shakacode/shakapacker/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/shakacode/shakapacker.git", + "directory": "packages/shakapacker-webpack" + }, + "license": "MIT", + "author": "Justin Gordon ", + "keywords": [ + "shakapacker", + "webpack", + "rails", + "webpacker" + ], + "main": "index.js", + "files": [ + "index.js", + "LICENSE", + "README.md" + ], + "dependencies": { + "shakapacker": "~10.1.0", + "webpack": "~5.106.2", + "webpack-cli": "~7.0.2", + "webpack-assets-manifest": "~6.5.1" + }, + "peerDependencies": { + "webpack-dev-server": "~5.2.3", + "mini-css-extract-plugin": "~2.10.2", + "terser-webpack-plugin": "~5.5.0", + "webpack-subresource-integrity": "~5.1.0", + "@pmmmwh/react-refresh-webpack-plugin": "~0.6.2", + "@swc/core": "~1.15.33", + "swc-loader": "~0.2.7", + "@babel/core": "~7.29.0", + "babel-loader": "~10.1.1", + "esbuild": "~0.27.7", + "esbuild-loader": "~4.4.3", + "css-loader": "~7.1.4", + "sass": "~1.99.0", + "sass-loader": "~16.0.7" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + }, + "mini-css-extract-plugin": { + "optional": true + }, + "terser-webpack-plugin": { + "optional": true + }, + "webpack-subresource-integrity": { + "optional": true + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "swc-loader": { + "optional": true + }, + "@babel/core": { + "optional": true + }, + "babel-loader": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "esbuild-loader": { + "optional": true + }, + "css-loader": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-loader": { + "optional": true + } + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/rakelib/release.rake b/rakelib/release.rake index ddc47481e..394480903 100644 --- a/rakelib/release.rake +++ b/rakelib/release.rake @@ -5,6 +5,7 @@ require "shellwords" require "open3" require "tempfile" require "tmpdir" +require "json" class RaisingMessageHandler def add_error(error) @@ -455,6 +456,26 @@ def release_staged_files ] end +def supplemental_package_dirs + [ + "packages/shakapacker-webpack", + "packages/shakapacker-rspack" + ] +end + +# Rewrites `dependencies.shakapacker` in a supplemental package.json to +# `~` while preserving JSON formatting (2-space indent, +# trailing newline) so the diff stays minimal. +def bump_supplemental_core_dep(full_pkg_dir, npm_version) + pkg_json_path = File.join(full_pkg_dir, "package.json") + pkg_json = JSON.parse(File.read(pkg_json_path)) + unless pkg_json.dig("dependencies", "shakapacker") + abort "❌ Expected dependencies.shakapacker in #{pkg_json_path} but found none." + end + pkg_json["dependencies"]["shakapacker"] = "~#{npm_version}" + File.write(pkg_json_path, "#{JSON.pretty_generate(pkg_json)}\n") +end + def print_release_summary(release_result) released_gem_version = release_result[:released_gem_version] released_npm_version = release_result[:released_npm_version] @@ -471,6 +492,7 @@ def print_release_summary(release_result) puts "\nFiles that would be updated:" staged_files.each { |file| puts " - #{file}" } puts " - package.json (updated by release-it)" + supplemental_package_dirs.each { |dir| puts " - #{dir}/package.json" } if changelog_section_found puts "\nChangelog: ✓ CHANGELOG.md section found for v#{released_npm_version}" else @@ -482,6 +504,8 @@ def print_release_summary(release_result) puts "Published to npmjs.org:" puts " - shakapacker@#{released_npm_version}" + puts " - shakapacker-webpack@#{released_npm_version}" + puts " - shakapacker-rspack@#{released_npm_version}" puts "" puts "Ruby Gem (RubyGems.org):" puts " - shakapacker #{released_gem_version}" @@ -578,18 +602,52 @@ def perform_release( abort "❌ Expected gem bump to produce #{resolved_target_gem_version}, but found #{resolved_gem_version}." end + # Bump the supplemental packages to match core. publish-packages.sh enforces + # version lockstep across all three packages, but release-it only knows about + # the root package.json — so we pre-bump the supplementals and stage them. + # release-it picks up the staged files when it commits the version bump. + # + # `npm version` only rewrites the `version` field. The supplementals also + # declare `"shakapacker": "~X.Y.Z"` as a regular dependency; without + # rewriting that constraint here, a 10.1.0 → 10.2.0 bump would publish + # supplementals declaring `~10.1.0` (resolves to >=10.1.0 <10.2.0 — unable + # to install the new core). publish-packages.sh re-asserts both the + # version AND the dependency constraint as a defense-in-depth check. + supplemental_package_dirs.each do |pkg_dir| + full_pkg_dir = File.join(release_root, pkg_dir) + Shakapacker::Utils::Misc.sh_in_dir( + full_pkg_dir, + "npm version #{Shellwords.escape(npm_version)} --no-git-tag-version --allow-same-version" + ) + bump_supplemental_core_dep(full_pkg_dir, npm_version) + end + supplemental_package_jsons = supplemental_package_dirs.map { |d| "#{d}/package.json" } + Shakapacker::Utils::Misc.sh_in_dir(release_root, "git add #{Shellwords.join(supplemental_package_jsons)}") + # Use npx so maintainers don't need a globally installed `release-it` binary. # This avoids failures from shim managers (e.g. mise) when `release-it` isn't configured. + # `--no-npm.publish` defers npm publishing to publish-packages.sh below, which + # enforces lockstep across all three packages and publishes in the required + # core-first order. release_it_command = +"npx --yes release-it #{Shellwords.escape(npm_version)}" - release_it_command << " --npm.publish --no-git.requireCleanWorkingDir" + release_it_command << " --no-npm.publish --no-git.requireCleanWorkingDir" release_it_command << " --dry-run --verbose" if dry_run npm_dist_tag = npm_dist_tag_for_version(npm_version) puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" - puts "NPM target: shakapacker@#{npm_version} (dist-tag: #{npm_dist_tag})" - puts "Use the OTP for NPM!" + puts "NPM target (lockstep): shakapacker, shakapacker-webpack, shakapacker-rspack @ #{npm_version} (dist-tag: #{npm_dist_tag})" + puts "release-it: bump versions, tag, push. publish-packages.sh: publish all three to npm." + puts "Use the OTP for NPM! (one prompt per package)" puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" Shakapacker::Utils::Misc.sh_in_dir(release_root, release_it_command) + # Publish all three npm packages in lockstep (core first, then supplementals). + # publish-packages.sh re-validates version equality and skips packages that + # are already on the registry, so it's safe to retry after a partial failure. + publish_command = +"./scripts/publish-packages.sh" + publish_command << " --tag #{Shellwords.escape(npm_dist_tag)}" unless npm_dist_tag == "latest" + publish_command << " --dry-run" if dry_run + Shakapacker::Utils::Misc.sh_in_dir(release_root, publish_command) + puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" puts "Use the OTP for RubyGems!" puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" diff --git a/scripts/publish-packages.sh b/scripts/publish-packages.sh new file mode 100755 index 000000000..10dc243b5 --- /dev/null +++ b/scripts/publish-packages.sh @@ -0,0 +1,222 @@ +#!/usr/bin/env bash +# Publish core shakapacker first, then the supplemental packages. +# +# Sequencing is load-bearing: shakapacker-webpack and shakapacker-rspack both +# declare "shakapacker": "~X.Y.Z" as a regular dependency. Publishing a +# supplemental before core leaves `npm install shakapacker-webpack` unable to +# resolve the dependency tree until core is published. +# +# Normal usage is via `bundle exec rake "release[X.Y.Z]"`, which wraps this +# script after release-it bumps versions and pushes the release commit. Direct +# invocation below is supported for manual recovery (e.g. retrying after a +# partial publish) or for CI workflows that publish without bumping. +# +# Usage: +# ./scripts/publish-packages.sh # publish to default dist-tag (latest) +# ./scripts/publish-packages.sh --dry-run # preview without publishing +# ./scripts/publish-packages.sh --tag next # publish under a non-default dist-tag +# ./scripts/publish-packages.sh --tag=beta --dry-run # flags can appear in any order +# +# Pre-release versions (e.g. 10.1.0-beta.1) MUST be published with --tag (next, +# beta, rc, etc.) so they don't auto-promote to `latest` and become the default +# `npm install shakapacker` resolution. +# +# Supply-chain provenance: when run from GitHub Actions with `id-token: write`, +# the script auto-detects the environment and adds `--provenance` to the publish +# call. This generates an SLSA-2 provenance attestation that links each +# published artifact to the workflow run that built it. Local publishes skip +# the flag (publishing without an OIDC token fails fast otherwise). + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$REPO_ROOT" + +DRY_RUN=() +TAG=() +PROVENANCE=() +# GitHub Actions sets ACTIONS_ID_TOKEN_REQUEST_URL when `id-token: write` +# permission is granted. Use that as the signal — outside CI the env var +# is absent and `npm publish --provenance` would fail with a clearer +# "Missing OIDC token" error than we'd want to surface here. +if [[ -n "${ACTIONS_ID_TOKEN_REQUEST_URL:-}" ]]; then + PROVENANCE=(--provenance) +fi +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) + DRY_RUN=(--dry-run) + shift + ;; + --tag=*) + tag_value="${1#--tag=}" + if [[ -z "$tag_value" ]]; then + echo "Error: --tag requires a value (e.g., --tag next, --tag beta)" >&2 + exit 1 + fi + TAG=(--tag "$tag_value") + shift + ;; + --tag) + if [[ -z "${2:-}" ]]; then + echo "Error: --tag requires a value (e.g., --tag next, --tag beta)" >&2 + exit 1 + fi + TAG=(--tag "$2") + shift 2 + ;; + *) + echo "Error: Unknown argument: $1" >&2 + echo "Usage: $0 [--dry-run] [--tag ]" >&2 + exit 1 + ;; + esac +done + +CORE_VERSION="$(node -p "require('./package.json').version")" +WEBPACK_VERSION="$(node -p "require('./packages/shakapacker-webpack/package.json').version")" +RSPACK_VERSION="$(node -p "require('./packages/shakapacker-rspack/package.json').version")" + +if [[ "$CORE_VERSION" != "$WEBPACK_VERSION" || "$WEBPACK_VERSION" != "$RSPACK_VERSION" ]]; then + echo "Version mismatch — all three packages must share the same version (lockstep):" >&2 + echo " shakapacker = $CORE_VERSION" >&2 + echo " shakapacker-webpack = $WEBPACK_VERSION" >&2 + echo " shakapacker-rspack = $RSPACK_VERSION" >&2 + exit 1 +fi + +# Supplementals declare `"shakapacker": "~X.Y.Z"` as a regular dependency. +# `npm version` (run by the release rake task) bumps only the `version` +# field — without a parallel bump of this constraint, a 10.1.0 → 10.2.0 +# release would publish supplementals declaring `~10.1.0` (which resolves +# to >=10.1.0 <10.2.0 — unable to install the new core). The rake task +# does that rewrite; this check is the publish-time guard that catches +# any path that bypassed the rake flow. +WEBPACK_CORE_DEP="$(node -p "require('./packages/shakapacker-webpack/package.json').dependencies.shakapacker")" +RSPACK_CORE_DEP="$(node -p "require('./packages/shakapacker-rspack/package.json').dependencies.shakapacker")" +EXPECTED_CORE_DEP="~$CORE_VERSION" +if [[ "$WEBPACK_CORE_DEP" != "$EXPECTED_CORE_DEP" || "$RSPACK_CORE_DEP" != "$EXPECTED_CORE_DEP" ]]; then + echo "Core-dependency mismatch — supplementals must declare 'shakapacker': '$EXPECTED_CORE_DEP':" >&2 + echo " shakapacker-webpack -> $WEBPACK_CORE_DEP" >&2 + echo " shakapacker-rspack -> $RSPACK_CORE_DEP" >&2 + echo " expected -> $EXPECTED_CORE_DEP" >&2 + exit 1 +fi + +# Soft-warn (don't fail) if the Ruby gem version drifts from the npm +# version. The gem is published independently via `gem push`, so this +# script can't enforce gem alignment, but a mismatch usually means +# `lib/shakapacker/version.rb` was missed in the version bump commit. +# +# Compare in npm syntax (10.1.0-beta.1) rather than gem syntax +# (10.1.0.beta.1) — a raw string compare would false-warn on every +# prerelease release because the two syntaxes differ on the prerelease +# separator (`-` vs `.`). +GEM_VERSION_NPM="$(ruby -r ./lib/shakapacker/utils/version_syntax_converter -e 'puts Shakapacker::Utils::VersionSyntaxConverter.new.rubygem_to_npm' 2>/dev/null || true)" +if [[ -n "$GEM_VERSION_NPM" && "$GEM_VERSION_NPM" != "$CORE_VERSION" ]]; then + GEM_VERSION_RAW="$(ruby -r ./lib/shakapacker/version -e 'puts Shakapacker::VERSION' 2>/dev/null || true)" + echo "Warning: Ruby gem version ($GEM_VERSION_RAW → $GEM_VERSION_NPM in npm syntax) does not match npm version ($CORE_VERSION)." >&2 + echo " Update lib/shakapacker/version.rb before publishing the gem." >&2 +fi + +# Guardrail: prerelease versions (containing a hyphen, per semver) must not be +# published to the default `latest` dist-tag, where they would become the +# version `npm install shakapacker` picks up. +if [[ "$CORE_VERSION" == *-* && ${#TAG[@]} -eq 0 ]]; then + echo "Refusing to publish prerelease $CORE_VERSION without --tag." >&2 + echo "Pass an explicit dist-tag, e.g.: $0 --tag next" >&2 + exit 1 +fi + +if [[ ${#DRY_RUN[@]} -eq 0 ]]; then + CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" + if [[ "$CURRENT_BRANCH" != "main" ]]; then + echo "Error: Must publish from main (currently on '$CURRENT_BRANCH')." >&2 + echo "Switch to main and re-run, or pass --dry-run to preview from another branch." >&2 + exit 1 + fi + + if [[ -n "$(git status --porcelain)" ]]; then + echo "Error: Uncommitted changes detected. Commit or stash before publishing." >&2 + exit 1 + fi + + if ! npm whoami --registry https://registry.npmjs.org >/dev/null 2>&1; then + echo "Error: not logged in to npm. Run 'npm login' first." >&2 + exit 1 + fi + + # `npm whoami` only confirms credentials, not org membership. A maintainer + # with general npm auth but missing shakacode org access would pass the + # whoami gate and then fail mid-run at `npm publish`, leaving partial + # state (the same scenario `is_published` recovers from on retry — but + # only after access is granted). When npm access list is available, fail + # fast for any already-published package the caller can't write to. + # + # `npm access list packages` is unreliable for unscoped packages on some + # npm versions: it can return an empty result even when the caller has + # full publish rights. When the response is empty (registry blip, + # unsupported subcommand, or unscoped-package limitation) we soft-warn + # rather than hard-fail; an actual access failure still surfaces as a + # clear 403 from `npm publish`, and the `is_published` idempotency guard + # makes retrying after access is granted safe. + echo "Verifying npm publish access…" + NPM_ACCESS_JSON="$(npm access list packages --json --registry https://registry.npmjs.org 2>/dev/null || true)" + if [[ -z "$NPM_ACCESS_JSON" ]]; then + echo "Warning: could not fetch npm access list (registry error or unscoped-package limitation)." >&2 + echo " If publish fails with 403, ask a shakacode npm org owner to grant access." >&2 + else + for pkg in shakapacker shakapacker-webpack shakapacker-rspack; do + if npm view "$pkg" version --registry https://registry.npmjs.org >/dev/null 2>&1; then + if ! echo "$NPM_ACCESS_JSON" | grep -Eq "\"$pkg\"[[:space:]]*:[[:space:]]*\"read-write\""; then + echo "Error: missing read-write access to existing package '$pkg'." >&2 + echo " Ask a shakacode npm org owner to grant publish access before retrying." >&2 + exit 1 + fi + else + echo " $pkg is not yet on the registry — first publish will create it." + fi + done + fi +fi + +# Idempotency: if a previous run published `shakapacker` but failed before +# the supplementals (network blip, OTP timeout), retrying would hit `403 +# Cannot publish over the previously published versions` on core and abort +# under `set -e`, leaving the supplementals stranded. `is_published` lets +# the script skip already-published packages and continue. Skipped under +# --dry-run since dry-runs never mutate the registry. +is_published() { + # Best-effort: `npm view` returns non-zero for both "not published yet" + # (expected) and "registry unreachable" (transient). On the transient + # path we fall through to `npm publish`, which will surface the + # underlying error itself; a follow-up run is safe because the next + # `is_published` check skips anything that did publish. + npm view "$1@$2" version --registry https://registry.npmjs.org >/dev/null 2>&1 +} + +publish_package() { + local pkg="$1" + local version="$2" + local dir="${3:-.}" + if [[ ${#DRY_RUN[@]} -eq 0 ]] && is_published "$pkg" "$version"; then + echo " $pkg@$version already on registry — skipping." + return + fi + # Pin the publish target to npmjs.org explicitly so the script doesn't + # accidentally follow a maintainer's `.npmrc` to a private registry. All + # pre-flight checks above already pass `--registry`; matching that here + # keeps validation and publish targeting the same registry. + (cd "$dir" && npm publish --registry=https://registry.npmjs.org ${DRY_RUN[@]+"${DRY_RUN[@]}"} ${TAG[@]+"${TAG[@]}"} ${PROVENANCE[@]+"${PROVENANCE[@]}"}) +} + +echo "Publishing shakapacker @ ${CORE_VERSION} (core first)…" +publish_package shakapacker "$CORE_VERSION" . + +echo "Publishing shakapacker-webpack @ ${WEBPACK_VERSION}…" +publish_package shakapacker-webpack "$WEBPACK_VERSION" packages/shakapacker-webpack + +echo "Publishing shakapacker-rspack @ ${RSPACK_VERSION}…" +publish_package shakapacker-rspack "$RSPACK_VERSION" packages/shakapacker-rspack + +echo "Done." diff --git a/test/packages/shakapacker-rspack/index.test.js b/test/packages/shakapacker-rspack/index.test.js new file mode 100644 index 000000000..3b205261e --- /dev/null +++ b/test/packages/shakapacker-rspack/index.test.js @@ -0,0 +1,208 @@ +const { + mkdtempSync, + mkdirSync, + writeFileSync, + copyFileSync, + symlinkSync, + rmSync +} = require("fs") +const { tmpdir } = require("os") +const { join, resolve } = require("path") +const { spawnSync } = require("child_process") + +const repoRoot = resolve(__dirname, "../../..") +const wrapperSource = join(repoRoot, "packages/shakapacker-rspack/index.js") + +const dirsToClean = [] + +const writeModule = (root, name, source) => { + const moduleDir = join(root, "node_modules", ...name.split("/")) + mkdirSync(moduleDir, { recursive: true }) + writeFileSync(join(moduleDir, "index.js"), source) +} + +const createPnpmLikeApp = (options = {}) => { + const configBundler = Object.prototype.hasOwnProperty.call( + options, + "configBundler" + ) + ? options.configBundler + : "rspack" + const { + // When false, omit the shakapacker/package/config module so the wrapper's + // first require throws and the fallback to `require("shakapacker")?.config` + // is exercised. The default writes both entries, matching real installs. + writePackageConfig = true, + shakapackerRootSource = `module.exports = { config: require("./package/config") }`, + shakapackerRspackSource = `module.exports = { config: require("../package/config"), rspackEntrypoint: true }` + } = options + + const appRoot = mkdtempSync(join(tmpdir(), "shakapacker-rspack-test-")) + const appNodeModules = join(appRoot, "node_modules") + const storeRoot = mkdtempSync(join(tmpdir(), "shakapacker-rspack-store-")) + dirsToClean.push(appRoot, storeRoot) + const virtualNodeModules = join(storeRoot, "node_modules") + const wrapperDir = join(virtualNodeModules, "shakapacker-rspack") + + mkdirSync(wrapperDir, { recursive: true }) + copyFileSync(wrapperSource, join(wrapperDir, "index.js")) + mkdirSync(appNodeModules, { recursive: true }) + symlinkSync(wrapperDir, join(appNodeModules, "shakapacker-rspack"), "dir") + + const configEntries = [] + if (configBundler !== undefined) { + configEntries.push(`assets_bundler: ${JSON.stringify(configBundler)}`) + } + + if (writePackageConfig) { + writeModule( + storeRoot, + "shakapacker/package/config", + `module.exports = { ${configEntries.join(", ")} }` + ) + } + writeModule(storeRoot, "shakapacker", shakapackerRootSource) + writeModule(storeRoot, "shakapacker/rspack", shakapackerRspackSource) + + return { appRoot } +} + +const requireWrapper = (appRoot) => { + const script = ` + const warnings = [] + process.on("warning", (warning) => { + warnings.push({ code: warning.code, message: warning.message }) + }) + + let loadError + let exportedConfig + let rspackEntrypoint + try { + const wrapper = require("shakapacker-rspack") + exportedConfig = wrapper.config + rspackEntrypoint = wrapper.rspackEntrypoint + } catch (error) { + loadError = { code: error.code, message: error.message } + } + + setImmediate(() => { + console.log(JSON.stringify({ + warnings, + loadError, + exportedConfig, + rspackEntrypoint + })) + }) + ` + + // 5 s timeout keeps a stuck child from hanging the entire suite in CI; + // every passing run completes in well under a second. + const result = spawnSync(process.execPath, ["--no-warnings", "-e", script], { + cwd: appRoot, + encoding: "utf8", + timeout: 5000 + }) + + if (result.status !== 0) { + throw new Error(result.stderr || result.stdout) + } + + return JSON.parse(result.stdout) +} + +describe("shakapacker-rspack package wrapper", () => { + afterEach(() => { + for (const dir of dirsToClean.splice(0)) { + rmSync(dir, { recursive: true, force: true }) + } + }) + + test("does not warn when assets_bundler is set to rspack", () => { + const { appRoot } = createPnpmLikeApp({ configBundler: "rspack" }) + + const result = requireWrapper(appRoot) + + expect(result.rspackEntrypoint).toBe(true) + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_BUNDLER_MISMATCH" }) + ]) + ) + }) + + test("warns when assets_bundler is set to webpack", () => { + const { appRoot } = createPnpmLikeApp({ configBundler: "webpack" }) + + const result = requireWrapper(appRoot) + + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain('assets_bundler is "webpack"') + expect(bundlerWarning.message).toContain("shakapacker-webpack") + expect(bundlerWarning.message).toContain("assets_bundler: rspack") + }) + + test("warns when assets_bundler is unset", () => { + const { appRoot } = createPnpmLikeApp({ configBundler: undefined }) + + const result = requireWrapper(appRoot) + + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain( + 'assets_bundler is unset, which defaults to "webpack"' + ) + expect(bundlerWarning.message).toContain("assets_bundler: rspack") + }) + + test("warns before the rspack entrypoint throws", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: "webpack", + shakapackerRootSource: + "throw Object.assign(new Error('root load failed'), { code: 'ROOT_LOAD_FAILED' })", + shakapackerRspackSource: + "throw Object.assign(new Error('rspack load failed'), { code: 'RSPACK_LOAD_FAILED' })" + }) + + const result = requireWrapper(appRoot) + + expect(result.loadError).toStrictEqual( + expect.objectContaining({ code: "RSPACK_LOAD_FAILED" }) + ) + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain('assets_bundler is "webpack"') + }) + + // The wrapper reads `shakapacker/package/config` first because that + // subpath loads the YAML config without dragging in webpack/rspack + // rules. Older core versions (predating the explicit subpath export) + // and any future reorganization that moves `package/` need to keep + // working via the fallback `require("shakapacker").config`. This test + // pins that fallback so a silent regression — wrapper stops emitting + // the bundler-mismatch warning — would fail CI. + test("falls back to shakapacker.config when the package/config subpath is unresolvable", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: "webpack", + writePackageConfig: false, + shakapackerRootSource: + 'module.exports = { config: { assets_bundler: "webpack" } }', + shakapackerRspackSource: "module.exports = { rspackEntrypoint: true }" + }) + + const result = requireWrapper(appRoot) + + expect(result.rspackEntrypoint).toBe(true) + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain('assets_bundler is "webpack"') + }) +}) diff --git a/test/packages/shakapacker-webpack/index.test.js b/test/packages/shakapacker-webpack/index.test.js new file mode 100644 index 000000000..6a6b0bf86 --- /dev/null +++ b/test/packages/shakapacker-webpack/index.test.js @@ -0,0 +1,409 @@ +const { + mkdtempSync, + mkdirSync, + writeFileSync, + copyFileSync, + symlinkSync, + rmSync +} = require("fs") +const { tmpdir } = require("os") +const { join, resolve } = require("path") +const { spawnSync } = require("child_process") + +const repoRoot = resolve(__dirname, "../../..") +const wrapperSource = join(repoRoot, "packages/shakapacker-webpack/index.js") + +// Track every temp dir mkdtempSync hands out so we can rm them between +// tests. Without this, each test case leaks an app root + a virtual store +// root, which adds up across CI runs. +const dirsToClean = [] + +const writeModule = (root, name, source) => { + const moduleDir = join(root, "node_modules", ...name.split("/")) + mkdirSync(moduleDir, { recursive: true }) + writeFileSync(join(moduleDir, "index.js"), source) +} + +const createPnpmLikeApp = (options = {}) => { + const { configTranspiler = "swc", transpilers = [] } = options + const configBundler = Object.prototype.hasOwnProperty.call( + options, + "configBundler" + ) + ? options.configBundler + : "webpack" + // When false, omit the shakapacker/package/config module so the wrapper + // exercises the fallback to `require("shakapacker").config`. Default + // matches real installs. + const { writePackageConfig = true } = options + + const appRoot = mkdtempSync(join(tmpdir(), "shakapacker-webpack-test-")) + const appNodeModules = join(appRoot, "node_modules") + const storeRoot = mkdtempSync(join(tmpdir(), "shakapacker-webpack-store-")) + dirsToClean.push(appRoot, storeRoot) + const virtualNodeModules = join(storeRoot, "node_modules") + const wrapperDir = join(virtualNodeModules, "shakapacker-webpack") + + mkdirSync(wrapperDir, { recursive: true }) + copyFileSync(wrapperSource, join(wrapperDir, "index.js")) + mkdirSync(appNodeModules, { recursive: true }) + symlinkSync(wrapperDir, join(appNodeModules, "shakapacker-webpack"), "dir") + + const shakapackerPath = join(virtualNodeModules, "shakapacker/index.js") + const configEntries = [ + `javascript_transpiler: ${JSON.stringify(configTranspiler)}` + ] + if (configBundler !== undefined) { + configEntries.push(`assets_bundler: ${JSON.stringify(configBundler)}`) + } + + if (writePackageConfig) { + writeModule( + storeRoot, + "shakapacker/package/config", + `module.exports = { ${configEntries.join(", ")} }` + ) + } + writeModule( + storeRoot, + "shakapacker", + `module.exports = { config: { ${configEntries.join(", ")} } }` + ) + + for (const transpiler of transpilers) { + writeModule(appRoot, transpiler, "module.exports = {}") + } + + return { appRoot, shakapackerPath } +} + +const requireWrapper = (appRoot) => { + const script = ` + const warnings = [] + process.on("warning", (warning) => { + warnings.push({ code: warning.code, message: warning.message }) + }) + + let loadError + let exportedConfig + try { + exportedConfig = require("shakapacker-webpack").config + } catch (error) { + loadError = { code: error.code, message: error.message } + } + + setImmediate(() => { + console.log(JSON.stringify({ warnings, loadError, exportedConfig })) + }) + ` + + // --no-warnings stops Node from printing warnings on stderr by default, + // but `process.on("warning", ...)` listeners still receive them. That's + // why the structured-warning capture above works while keeping test + // output free of the loud SHAKAPACKER_NO_TRANSPILER banner. + // 5 s timeout keeps a stuck child from hanging the entire suite in CI; + // every passing run completes in well under a second. + const result = spawnSync(process.execPath, ["--no-warnings", "-e", script], { + cwd: appRoot, + encoding: "utf8", + timeout: 5000 + }) + + if (result.status !== 0) { + throw new Error(result.stderr || result.stdout) + } + + return JSON.parse(result.stdout) +} + +describe("shakapacker-webpack package wrapper", () => { + afterEach(() => { + for (const dir of dirsToClean.splice(0)) { + rmSync(dir, { recursive: true, force: true }) + } + }) + + test("warns when the configured transpiler pair is not resolvable", () => { + const { appRoot } = createPnpmLikeApp({ transpilers: [] }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("resolves the configured transpiler pair from the application cwd", () => { + const { appRoot } = createPnpmLikeApp({ + transpilers: ["@swc/core", "swc-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("warns when an unrelated transpiler is installed but the configured one is not", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "swc", + transpilers: ["@babel/core", "babel-loader"] + }) + + const result = requireWrapper(appRoot) + + const transpilerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_NO_TRANSPILER" + ) + expect(transpilerWarning).toBeDefined() + expect(transpilerWarning.message).toContain( + 'javascript_transpiler is "swc"' + ) + expect(transpilerWarning.message).toContain("@swc/core + swc-loader") + }) + + test("respects javascript_transpiler: babel", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "babel", + transpilers: ["@babel/core", "babel-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("respects javascript_transpiler: esbuild", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "esbuild", + transpilers: ["esbuild", "esbuild-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("does not warn when javascript_transpiler is none", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "none", + transpilers: [] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).toStrictEqual([]) + }) + + test("emits a load-failure-first transpiler warning when shakapacker config cannot be read", () => { + const { appRoot, shakapackerPath } = createPnpmLikeApp({ + transpilers: [], + writePackageConfig: false + }) + writeFileSync( + shakapackerPath, + "throw Object.assign(new Error('load failed'), { code: 'LOAD_FAILED' })" + ) + + const result = requireWrapper(appRoot) + + expect(result.loadError).toStrictEqual( + expect.objectContaining({ code: "LOAD_FAILED" }) + ) + const transpilerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_NO_TRANSPILER" + ) + expect(transpilerWarning).toBeDefined() + // Load failure is surfaced first so users fix the root cause before + // chasing transpiler installs. + expect(transpilerWarning.message).toContain( + "shakapacker config could not be loaded" + ) + // Recommendation lists the supported transpiler pairs alongside the + // matching `javascript_transpiler:` value the user must set, so a + // user who installs SWC per the message and then defaults + // `javascript_transpiler:` to the code-fallback (babel) doesn't trip + // a follow-on babel-loader warning. + expect(transpilerWarning.message).toContain("@swc/core + swc-loader") + expect(transpilerWarning.message).toContain('javascript_transpiler: "swc"') + expect(transpilerWarning.message).toContain("@babel/core + babel-loader") + }) + + test("does not warn when shakapacker config cannot be read but a valid transpiler pair is installed", () => { + const { appRoot, shakapackerPath } = createPnpmLikeApp({ + transpilers: ["@swc/core", "swc-loader"], + writePackageConfig: false + }) + writeFileSync( + shakapackerPath, + "throw Object.assign(new Error('load failed'), { code: 'LOAD_FAILED' })" + ) + + const result = requireWrapper(appRoot) + + expect(result.loadError).toStrictEqual( + expect.objectContaining({ code: "LOAD_FAILED" }) + ) + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("warns when only one module of the configured transpiler pair is installed", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "swc", + transpilers: ["@swc/core"] + }) + + const result = requireWrapper(appRoot) + + const transpilerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_NO_TRANSPILER" + ) + expect(transpilerWarning).toBeDefined() + expect(transpilerWarning.message).toContain("@swc/core + swc-loader") + }) + + test("emits generic transpiler warning for unrecognized javascript_transpiler value", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "custom", + transpilers: [] + }) + + const result = requireWrapper(appRoot) + + const transpilerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_NO_TRANSPILER" + ) + expect(transpilerWarning).toBeDefined() + expect(transpilerWarning.message).toContain( + "No JavaScript transpiler is installed" + ) + }) + + test("does not emit transpiler warning when an unrecognized transpiler value sees any pair installed", () => { + const { appRoot } = createPnpmLikeApp({ + configTranspiler: "custom", + transpilers: ["@babel/core", "babel-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("warns when assets_bundler is set to a non-webpack value", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: "rspack", + transpilers: ["@swc/core", "swc-loader"] + }) + + const result = requireWrapper(appRoot) + + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain('assets_bundler is "rspack"') + expect(bundlerWarning.message).toContain("shakapacker-rspack") + }) + + test("does not double-warn with NO_TRANSPILER when bundler is mismatched", () => { + // Rspack ships SWC built in, so a real rspack user with no + // webpack-stack transpilers would otherwise hit both + // SHAKAPACKER_BUNDLER_MISMATCH and SHAKAPACKER_NO_TRANSPILER. Only the + // bundler mismatch is actionable; the transpiler warning would be + // misleading noise. + const { appRoot } = createPnpmLikeApp({ + configBundler: "rspack", + configTranspiler: "swc", + transpilers: [] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_BUNDLER_MISMATCH" }) + ]) + ) + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_NO_TRANSPILER" }) + ]) + ) + }) + + test("does not warn about assets_bundler when set to webpack", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: "webpack", + transpilers: ["@swc/core", "swc-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_BUNDLER_MISMATCH" }) + ]) + ) + }) + + test("does not warn about assets_bundler when unset", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: undefined, + transpilers: ["@swc/core", "swc-loader"] + }) + + const result = requireWrapper(appRoot) + + expect(result.warnings).not.toStrictEqual( + expect.arrayContaining([ + expect.objectContaining({ code: "SHAKAPACKER_BUNDLER_MISMATCH" }) + ]) + ) + }) + + // The wrapper reads `shakapacker/package/config` first because that + // subpath loads the YAML config without dragging in webpack-specific + // rule modules. Older core versions (predating the explicit subpath + // export) and any future reorganization that moves `package/` need to + // keep working via the fallback `require("shakapacker").config`. This + // test pins that fallback so a silent regression — wrapper stops + // emitting bundler-mismatch warnings — would fail CI. Mirrors the same + // assertion in test/packages/shakapacker-rspack/index.test.js. + test("falls back to shakapacker.config when the package/config subpath is unresolvable", () => { + const { appRoot } = createPnpmLikeApp({ + configBundler: "rspack", + transpilers: ["@swc/core", "swc-loader"], + writePackageConfig: false + }) + + const result = requireWrapper(appRoot) + + const bundlerWarning = result.warnings.find( + (warning) => warning.code === "SHAKAPACKER_BUNDLER_MISMATCH" + ) + expect(bundlerWarning).toBeDefined() + expect(bundlerWarning.message).toContain('assets_bundler is "rspack"') + }) +}) diff --git a/test/packages/subpath-exports.test.js b/test/packages/subpath-exports.test.js new file mode 100644 index 000000000..0c7f5e172 --- /dev/null +++ b/test/packages/subpath-exports.test.js @@ -0,0 +1,27 @@ +const { resolve } = require("path") + +// Catch the regression where `shakapacker/package/config` resolves only +// via the wildcard subpath export `"./package/*": "./package/*"` — that +// path does not append `.js`, so production installs hit MODULE_NOT_FOUND +// while the wrapper tests (which build virtual modules without an +// `exports` field) still pass. Requiring the real installed package +// catches it. + +const repoRoot = resolve(__dirname, "../..") + +describe("shakapacker subpath exports", () => { + test("require('shakapacker/package/config') resolves against the real package", () => { + // Resolve from the repo root so Node walks up node_modules from a + // location that has the package installed (the real shakapacker is + // the workspace itself). + const resolved = require.resolve("shakapacker/package/config", { + paths: [repoRoot] + }) + expect(resolved).toMatch(/package[/\\]config\.js$/) + + // eslint-disable-next-line import/no-dynamic-require + const config = require(resolved) + expect(config).toBeDefined() + expect(typeof config).toBe("object") + }) +}) diff --git a/test/packages/warning-codes.test.js b/test/packages/warning-codes.test.js new file mode 100644 index 000000000..e8baf826e --- /dev/null +++ b/test/packages/warning-codes.test.js @@ -0,0 +1,81 @@ +const { readFileSync } = require("fs") +const { join, resolve } = require("path") + +// Both wrapper packages emit `SHAKAPACKER_BUNDLER_MISMATCH` independently. +// Each package needs its own copy at install time (they ship as +// independent npm packages, so a shared module isn't possible without +// vendoring at publish time). This test fails if the strings drift. + +const repoRoot = resolve(__dirname, "../..") +const webpackWrapperPath = join( + repoRoot, + "packages/shakapacker-webpack/index.js" +) +const rspackWrapperPath = join( + repoRoot, + "packages/shakapacker-rspack/index.js" +) + +const extractCodes = (path) => { + const source = readFileSync(path, "utf8") + // Scope to assignment lines (e.g. `const NAME = "SHAKAPACKER_..."`) + // so a future comment containing one of the literal strings doesn't + // accidentally pass the "declares X" assertions or break the "does + // not declare Y" assertions. Multiline (`m`) anchors `^` to each + // line; require leading whitespace + `const`/`let` so only real + // declarations match. + return Array.from( + source.matchAll(/^\s*(?:const|let)\s+\w+\s*=\s*"(SHAKAPACKER_[A-Z_]+)"/gm) + ) + .map((match) => match[1]) + .sort() +} + +const extractReadConfigHelper = (path) => { + const source = readFileSync(path, "utf8") + // Match the full `const readShakapackerConfig = () => { ... }` block so + // we can assert byte-for-byte parity between the two duplicated copies. + // The block ends at the first line containing only `}` at column 0; + // both wrappers use that style. + const match = source.match(/^const readShakapackerConfig =[\s\S]*?^\}/m) + if (!match) { + throw new Error(`Could not locate readShakapackerConfig in ${path}`) + } + return match[0] +} + +describe("warning codes are consistent across wrapper packages", () => { + test("bundler mismatch code matches between webpack and rspack wrappers", () => { + const webpackCodes = extractCodes(webpackWrapperPath) + const rspackCodes = extractCodes(rspackWrapperPath) + + expect(webpackCodes).toContain("SHAKAPACKER_BUNDLER_MISMATCH") + expect(rspackCodes).toContain("SHAKAPACKER_BUNDLER_MISMATCH") + }) + + test("rspack wrapper does not declare SHAKAPACKER_NO_TRANSPILER", () => { + // SHAKAPACKER_NO_TRANSPILER is a webpack-only concept (rspack ships + // SWC built in). Asserting absence here documents intent and prevents + // a future refactor from accidentally adding the code to the rspack + // wrapper, which would then need its own gating to avoid spurious + // warnings. + const rspackCodes = extractCodes(rspackWrapperPath) + + expect(rspackCodes).not.toContain("SHAKAPACKER_NO_TRANSPILER") + }) +}) + +describe("readShakapackerConfig parity across wrapper packages", () => { + // The helper is intentionally duplicated verbatim in both wrappers + // (they ship as independent npm packages, so sharing a module isn't + // possible without vendoring at publish time). A textual identity + // check is cheaper and stronger than a behavioral fixture: it catches + // any drift, including renames, comment edits, and reordered branches + // that would silently leave one wrapper behind the other. + test("readShakapackerConfig is byte-for-byte identical in both wrappers", () => { + const webpackHelper = extractReadConfigHelper(webpackWrapperPath) + const rspackHelper = extractReadConfigHelper(rspackWrapperPath) + + expect(webpackHelper).toBe(rspackHelper) + }) +}) diff --git a/yarn.lock b/yarn.lock index 3fa9ec928..66918b377 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,11 +11,46 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.27.2": version "7.28.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz#96fdf1af1b8859c8474ab39c295312bfb7c24b04" integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== +"@babel/compat-data@^7.28.6": + version "7.29.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz#e3f5347f0589596c91d227ccb6a541d37fb1307b" + integrity sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg== + +"@babel/core@7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4": version "7.28.4" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" @@ -48,6 +83,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" @@ -59,6 +105,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-globals@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" @@ -72,6 +129,14 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== + dependencies: + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" + "@babel/helper-module-transforms@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" @@ -81,6 +146,15 @@ "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.28.3" +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== + dependencies: + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" @@ -96,6 +170,11 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" @@ -109,6 +188,14 @@ "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" +"@babel/helpers@^7.28.6": + version "7.29.2" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== + dependencies: + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": version "7.28.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" @@ -116,6 +203,13 @@ dependencies: "@babel/types" "^7.28.4" +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" + integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== + dependencies: + "@babel/types" "^7.29.0" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -244,6 +338,15 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": version "7.28.4" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" @@ -257,6 +360,19 @@ "@babel/types" "^7.28.4" debug "^4.3.1" +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.3.3": version "7.28.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" @@ -265,21 +381,32 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@discoveryjs/json-ext@^0.5.7": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - "@discoveryjs/json-ext@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.0.0.tgz#f75c08f88cfd9eb8d9b062284d5bbcc60c41bf2a" integrity sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ== +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + "@emnapi/core@^1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz#85cd84537ec989cebb2343606a1ee663ce4edaf0" @@ -288,6 +415,13 @@ "@emnapi/wasi-threads" "1.1.0" tslib "^2.4.0" +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + "@emnapi/runtime@^1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz#9aebfcb9b17195dce3ab53c86787a6b7d058db73" @@ -302,115 +436,142 @@ dependencies: tslib "^2.4.0" -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + +"@esbuild/aix-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz#82b74f92aa78d720b714162939fb248c90addf53" + integrity sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg== + +"@esbuild/android-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz#f78cb8a3121fc205a53285adb24972db385d185d" + integrity sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ== + +"@esbuild/android-arm@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz#593e10a1450bbfcac6cb321f61f468453bac209d" + integrity sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ== + +"@esbuild/android-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz#453143d073326033d2d22caf9e48de4bae274b07" + integrity sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg== + +"@esbuild/darwin-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz#6f23000fb9b40b7e04b7d0606c0693bd0632f322" + integrity sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw== + +"@esbuild/darwin-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz#27393dd18bb1263c663979c5f1576e00c2d024be" + integrity sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ== + +"@esbuild/freebsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz#22e4638fa502d1c0027077324c97640e3adf3a62" + integrity sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w== + +"@esbuild/freebsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz#9224b8e4fea924ce2194e3efc3e9aebf822192d6" + integrity sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ== + +"@esbuild/linux-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz#4f5d1c27527d817b35684ae21419e57c2bda0966" + integrity sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A== + +"@esbuild/linux-arm@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz#b9e9d070c8c1c0449cf12b20eac37d70a4595921" + integrity sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA== + +"@esbuild/linux-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz#3f80fb696aa96051a94047f35c85b08b21c36f9e" + integrity sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg== + +"@esbuild/linux-loong64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz#9be1f2c28210b13ebb4156221bba356fe1675205" + integrity sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q== + +"@esbuild/linux-mips64el@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz#4ab5ee67a3dfcbcb5e8fd7883dae6e735b1163b8" + integrity sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw== + +"@esbuild/linux-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz#dac78c689f6499459c4321e5c15032c12307e7ea" + integrity sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ== + +"@esbuild/linux-riscv64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz#050f7d3b355c3a98308e935bc4d6325da91b0027" + integrity sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ== + +"@esbuild/linux-s390x@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz#d61f715ce61d43fe5844ad0d8f463f88cbe4fef6" + integrity sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw== + +"@esbuild/linux-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz#ca8e1aa478fc8209257bf3ac8f79c4dc2982f32a" + integrity sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA== + +"@esbuild/netbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz#1650f2c1b948deeb3ef948f2fc30614723c09690" + integrity sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w== + +"@esbuild/netbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz#65772ab342c4b3319bf0705a211050aac1b6e320" + integrity sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw== + +"@esbuild/openbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz#37ed7cfa66549d7955852fce37d0c3de4e715ea1" + integrity sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A== + +"@esbuild/openbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz#01bf3d385855ef50cb33db7c4b52f957c34cd179" + integrity sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg== + +"@esbuild/openharmony-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz#6c1f94b34086599aabda4eac8f638294b9877410" + integrity sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw== + +"@esbuild/sunos-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz#4b0dd17ae0a6941d2d0fd35a906392517071a90d" + integrity sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA== + +"@esbuild/win32-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz#34193ab5565d6ff68ca928ac04be75102ccb2e77" + integrity sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA== + +"@esbuild/win32-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz#eb67f0e4482515d8c1894ede631c327a4da9fc4d" + integrity sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw== + +"@esbuild/win32-x64@0.27.7": + version "0.27.7" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz#8fe30b3088b89b4873c3a6cc87597ae3920c0a8b" + integrity sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg== "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": version "4.9.0" @@ -802,10 +963,10 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@napi-rs/wasm-runtime@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" - integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== +"@napi-rs/wasm-runtime@1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" + integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow== dependencies: "@tybys/wasm-util" "^0.10.1" @@ -936,88 +1097,87 @@ resolved "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.9.0.tgz#3e8127b5c225cb2d99b991f251768188efbda25f" integrity sha512-gE3QJvhh0Yj9cSAkkHjRLKPmC7BTJeiaB5YyhVKVUwbnWQgTszV92lZ9pvZtNPEghP7jPbhEs4c6983A0ojQwA== -"@rspack/binding-darwin-arm64@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.0-rc.0.tgz#7624bc790ab45928f72c4166479f3f356605fa4d" - integrity sha512-F1phoByw5bMZ44TVJevn7Yw1mn1dWQ6Z3dxMQrkXoFsxwUPSNOHBX1TSkQ3rmhw2CZpFinbLL6aYjDWM6aHO5A== - -"@rspack/binding-darwin-x64@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.0-rc.0.tgz#33855ab324625a1a6b0c8a5e8edeed45ce68865a" - integrity sha512-oVzDuXwtn1uM9ovV12gTwkTHCwN1q0U0oxfclJjEjb1EhE/a/UGGABUsLl84wSbIW1fvcd9UwAr7vBqPWsjB4Q== - -"@rspack/binding-linux-arm64-gnu@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.0-rc.0.tgz#3804f7f904c8128b6d33114cd9b755714a4971be" - integrity sha512-f0EQ0uBWXmknhZ7HR8ud+AhEtLSKbMK9IFHNkhMH3rN4J6wMI+uCPAs+ZlIrNk076bv8YB/z2Amx1ByDLjOBRA== - -"@rspack/binding-linux-arm64-musl@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.0-rc.0.tgz#867bca6d0d800363d5df3ac4b43ae8bdd2f39f78" - integrity sha512-+OiO3x6biWU+z/H/rBzgCJuhvZj7YkGz4w7zQk2ZEHnL8nB5pzPqFiEZesbRp+WIseAONzitn7R0qk102hBi5g== - -"@rspack/binding-linux-x64-gnu@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.0-rc.0.tgz#96d908edf99f7dbf1a614e883ca0f732f5d3626c" - integrity sha512-n1XXXjTcPyCUoV+t3BPfBoF16CgsBxXI7WQuajIgQ33ifm7AEkRi8OVC2ci6908/MnYJSBFHlZvuDE42EwEstQ== - -"@rspack/binding-linux-x64-musl@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.0-rc.0.tgz#a3b4c39f007bb1b56bcf92e27808596f97d4c482" - integrity sha512-EQK7SGu7FWFf1HPPvcahsk2pNL326GQY+jIg3FxGdiAWl1DtSCPrTo/eBKT3nSnXItWta1N80pN5wWVlfs/Liw== - -"@rspack/binding-wasm32-wasi@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.0-rc.0.tgz#9f6b87e4a636e5c9529d2ebfbeeae436dbb12fee" - integrity sha512-zu+iW0kEYJd2AEEqYMSU64f98RMOXVwevnQuPtMg3WhVL79FOfkfXOlf16ZYzB8di8hpMRss7m4traGEUEyjZA== - dependencies: - "@napi-rs/wasm-runtime" "1.1.2" - -"@rspack/binding-win32-arm64-msvc@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.0-rc.0.tgz#9e5f8a70f09408b12078acf6bf35a4e68131a11e" - integrity sha512-QDOVpN0SdjrW4OicHmkuj8T7PWSqEbUs20FX2pTRBw4ReU7BABAp7wwGdtQzZIaPKDv3CTNz/1DygmInbiNgJg== - -"@rspack/binding-win32-ia32-msvc@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.0-rc.0.tgz#25805594fe72d024c1a557edf2cf19e83add7cc7" - integrity sha512-89CNtgzs67FRHB+lBQoNZmjVqrrd3i+cNCqn0MzCH6Xe12XrO/2eC41gbl69mfYWIYWHpKuySkSTgOOGp0PqNQ== - -"@rspack/binding-win32-x64-msvc@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.0-rc.0.tgz#d05382086717e38952bc6bf0d4da58060a24a980" - integrity sha512-OaxuI+WHzSNoCtv0FfIw41yjCFvwt/aCoEodBSObzm8PH5YbmiYL/FfTeAOVAJbDoEmkA8qYH+gws7vOzgQzSw== - -"@rspack/binding@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.0-rc.0.tgz#6c1edf35a2125e6246f2fcab841533d0d34a9308" - integrity sha512-zWjMryvt8J8H/Z/sa0MHWfblUTHNCwXhw2x13Yz9Nw2P8JjZ/k/h3ni0xBBl/QubIVoA1IfN2OaiNCtFlVmDrQ== +"@rspack/binding-darwin-arm64@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.1.tgz#7deea2cbb632c797d72fab94d5d4070e01818b74" + integrity sha512-CGFO5zmajD1Itch1lxAI7+gvKiagzyqXopHv/jHG9Su2WWQ2/Nhn2/rkSpdp6ptE9ri6+6tCOOahf099/v/Xog== + +"@rspack/binding-darwin-x64@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.1.tgz#cfe05a88be013feb4cb4c9f7c360d6482fa9d830" + integrity sha512-2vvBNBoS09/PurupBwSrlTZd8283o00B8v20ncsNUdEff41uCR/hzIrYoTIVWnVST+Gt5O1+cfcfORp397lajg== + +"@rspack/binding-linux-arm64-gnu@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.1.tgz#3d49905d210a97f2922ff907a6587759cf8c3082" + integrity sha512-uvNXk6ahE3AH3h2avnd1Mgno68YQpS4cfX1OkOGWIC/roL+NrOP2XVXV4yfVAoydPALDO7AfbIfN0QdmBK3rsA== + +"@rspack/binding-linux-arm64-musl@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.1.tgz#30319362fee889b653d53c2ee6159a05e61b193a" + integrity sha512-S/a6uN9PiZ5O/PjSqyIXhuRC1lVzeJkJV69NeLk5sIEUiDQ/aQGZG97uN+tluwpbo1tPbLJkdHYETfjspOX4Pg== + +"@rspack/binding-linux-x64-gnu@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.1.tgz#2f57131a01f32a4057dce55b37c9dc8344613558" + integrity sha512-C13Kk0OkZiocZVj187Sf753UH6pDXnuEu6vzUvi3qv9ltibG1ki0H2Y8isXBYL2cHQOV+hk0g1S6/4z3TTB97A== + +"@rspack/binding-linux-x64-musl@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.1.tgz#e46dc49c384b0ba592b09caae76f11b891af0cab" + integrity sha512-TQsiBFpEDGkuvK9tNdGj/Uc+AIytzqhxXH/1jKU6M24cWB1DTw/Cx7DdrkCBDyq3129K3POLdujvbWCGqBzQUw== + +"@rspack/binding-wasm32-wasi@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.1.tgz#2bc20cebe164108121245506c26424ee666f2361" + integrity sha512-wk3gyUgBW/ayP49bI54bkY8+EQnfBHxdoe9dz3oobSTZQc8AOWwmUUDEPltW8rUvPOM6dfHECTOUMnfaf2f5yA== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "1.1.4" + +"@rspack/binding-win32-arm64-msvc@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.1.tgz#023ca20136ee7f185bdca5d72bfd6dd270f1c3d1" + integrity sha512-rHjLcy3VcAC3+x+PxH+gwhwv6tPe0JdXTNT5eAOs9wgZIM6T9p4wre49+K4Qy98+Fb7TTbLX0ObUitlOkGwTSA== + +"@rspack/binding-win32-ia32-msvc@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.1.tgz#ac885e6fb0240983061ed55b7315221fd9559c43" + integrity sha512-Ad1vVqMBBnd4T8rsORngu9sl2kyRTlS4kMlvFudjzl1X2UFArEDBe0YVGNN7ZvahM12CErUx2WiN8Sd8pb+qXQ== + +"@rspack/binding-win32-x64-msvc@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.1.tgz#e4ca91dfcad897aaf7af44328a32b4c9f6061e63" + integrity sha512-oPM2Jtm7HOlmxl/aBfleAVlL6t9VeHx6WvEets7BBJMInemFXAQd4CErRqybf7rXutACzLeUWBOue4Jpd1/ykw== + +"@rspack/binding@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.1.tgz#20046a6cf7d2f58298d6e46f6f9e959bf9c8a476" + integrity sha512-ynV1gw4KqFtQ0P+ZZh76SUj49wBb2FuHW3zSmHverHWuxBhzvrZS6/dZ+fCFQG8bTTPtrPz0RQUTN3uEDbPVBQ== optionalDependencies: - "@rspack/binding-darwin-arm64" "2.0.0-rc.0" - "@rspack/binding-darwin-x64" "2.0.0-rc.0" - "@rspack/binding-linux-arm64-gnu" "2.0.0-rc.0" - "@rspack/binding-linux-arm64-musl" "2.0.0-rc.0" - "@rspack/binding-linux-x64-gnu" "2.0.0-rc.0" - "@rspack/binding-linux-x64-musl" "2.0.0-rc.0" - "@rspack/binding-wasm32-wasi" "2.0.0-rc.0" - "@rspack/binding-win32-arm64-msvc" "2.0.0-rc.0" - "@rspack/binding-win32-ia32-msvc" "2.0.0-rc.0" - "@rspack/binding-win32-x64-msvc" "2.0.0-rc.0" - -"@rspack/cli@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/cli/-/cli-2.0.0-rc.0.tgz#55f280d27f87cef4289332e417db9fd7c671e95b" - integrity sha512-cNYf5/uZVbdksfybusWg03D+/YyU8qRFJwWq3q3j4AsanspyY1yVT+QhFHgYq1QLw0FGxwlQNlMSXGH0vPa6Tw== - dependencies: - "@discoveryjs/json-ext" "^0.5.7" - exit-hook "^4.0.0" - -"@rspack/core@2.0.0-rc.0": - version "2.0.0-rc.0" - resolved "https://registry.npmjs.org/@rspack/core/-/core-2.0.0-rc.0.tgz#f727543c74805aa0929c3b74d7872d8e37fa7152" - integrity sha512-hFc2284m/075etKLLNsECAwOcyNQ8NHUaBhwJCQJQ3J9iqjDoZisefGC8I457u2iieoc1KNSANB9hxZ0ZOHuJg== - dependencies: - "@rspack/binding" "2.0.0-rc.0" + "@rspack/binding-darwin-arm64" "2.0.1" + "@rspack/binding-darwin-x64" "2.0.1" + "@rspack/binding-linux-arm64-gnu" "2.0.1" + "@rspack/binding-linux-arm64-musl" "2.0.1" + "@rspack/binding-linux-x64-gnu" "2.0.1" + "@rspack/binding-linux-x64-musl" "2.0.1" + "@rspack/binding-wasm32-wasi" "2.0.1" + "@rspack/binding-win32-arm64-msvc" "2.0.1" + "@rspack/binding-win32-ia32-msvc" "2.0.1" + "@rspack/binding-win32-x64-msvc" "2.0.1" + +"@rspack/cli@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/cli/-/cli-2.0.1.tgz#0cfe847f551445decf604a3d97eee05e95b1e850" + integrity sha512-UwqLnShg6ui3LOsJfJvyGNfHtgkGd/Cjjm2T7jR6lTkoX9Jj7YKl55gkPqNw34et8+gp/5Ehso6tsga8bqZi5Q== + +"@rspack/core@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@rspack/core/-/core-2.0.1.tgz#92119b19d00276472370b8d2607370cbf0fc938f" + integrity sha512-lgfZiExh8kDR/3obgi3RQKwKG5av1Xf5qDN1aVde777W9pbmx0Pqvrww1qtNvJ+gobEjbrrn5HEZWYGe0VLmcA== + dependencies: + "@rspack/binding" "2.0.1" "@rspack/lite-tapable@^1.0.1": version "1.0.1" @@ -1048,84 +1208,96 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/core-darwin-arm64@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz#7638c073946f9297753ed9a2eb198d07b2336a24" - integrity sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ== - -"@swc/core-darwin-x64@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz#18061167378f0fb285e17818494bc6c89dd07551" - integrity sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng== - -"@swc/core-linux-arm-gnueabihf@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz#4c8062bd598049b5b9b0beb762e075e76b4c23c3" - integrity sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ== - -"@swc/core-linux-arm64-gnu@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz#7222d321197ea9304e387933e87d775849fc1ae6" - integrity sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw== - -"@swc/core-linux-arm64-musl@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz#51e7958deaf37edc212bd9dc0ea1476f151d2bea" - integrity sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ== - -"@swc/core-linux-x64-gnu@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz#3476beab93ab03e92844d955ca9d9289aa4a5993" - integrity sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA== - -"@swc/core-linux-x64-musl@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz#f4934b1e77e2a297909bb3ab977836205c36e5e0" - integrity sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q== - -"@swc/core-win32-arm64-msvc@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz#5084c107435cfc82d4d901bfb388dc319d38a236" - integrity sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw== - -"@swc/core-win32-ia32-msvc@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz#f8b2e28bc51b30467e316ed736a130c1324b9880" - integrity sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw== - -"@swc/core-win32-x64-msvc@1.13.5": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz#13883cf3c63bf11b787e28dcdf75ca0cc49efa83" - integrity sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q== - -"@swc/core@^1.3.0": - version "1.13.5" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz#93874b831d3bd121560e6fcd688972b7fc7baa26" - integrity sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ== +"@swc/core-darwin-arm64@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz#d84134fb80417d41128739f0b9014542e3ed9dd3" + integrity sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA== + +"@swc/core-darwin-x64@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz#0badb9834071f1c6005986571d4a96359c1d7cd0" + integrity sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA== + +"@swc/core-linux-arm-gnueabihf@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz#b7577a825b59d98b6a9a5c991d842046efe1c34a" + integrity sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ== + +"@swc/core-linux-arm64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz#304c48321494a18c67b2913c273b08674ee70d8c" + integrity sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw== + +"@swc/core-linux-arm64-musl@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz#d116cbc04ccb4f4ee810da6bca79d4423605dbcd" + integrity sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og== + +"@swc/core-linux-ppc64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz#f5354dba36db9414305bab344c817d57b8b457c2" + integrity sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog== + +"@swc/core-linux-s390x-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz#016df9f4c9d7fd65b85ca9c558c5aec341f06da0" + integrity sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA== + +"@swc/core-linux-x64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz#49f36558ede072e71999aa37f123367daed2a662" + integrity sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw== + +"@swc/core-linux-x64-musl@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz#b096665f5cfeee2612325f301da5c1590b10d8f3" + integrity sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ== + +"@swc/core-win32-arm64-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz#f3101263a0dbaa173ec47638c9719d0b89838bd2" + integrity sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g== + +"@swc/core-win32-ia32-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz#eb981ef5613d42c9220559bdb0c8bc58cf6c3eb9" + integrity sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ== + +"@swc/core-win32-x64-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz#a2fed9956933027ceb368857bac4bb4ee203d47c" + integrity sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg== + +"@swc/core@1.15.33": + version "1.15.33" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz#2a6571c8aca961925f14beae52b3f43c18370fc6" + integrity sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ== dependencies: "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.24" + "@swc/types" "^0.1.26" optionalDependencies: - "@swc/core-darwin-arm64" "1.13.5" - "@swc/core-darwin-x64" "1.13.5" - "@swc/core-linux-arm-gnueabihf" "1.13.5" - "@swc/core-linux-arm64-gnu" "1.13.5" - "@swc/core-linux-arm64-musl" "1.13.5" - "@swc/core-linux-x64-gnu" "1.13.5" - "@swc/core-linux-x64-musl" "1.13.5" - "@swc/core-win32-arm64-msvc" "1.13.5" - "@swc/core-win32-ia32-msvc" "1.13.5" - "@swc/core-win32-x64-msvc" "1.13.5" + "@swc/core-darwin-arm64" "1.15.33" + "@swc/core-darwin-x64" "1.15.33" + "@swc/core-linux-arm-gnueabihf" "1.15.33" + "@swc/core-linux-arm64-gnu" "1.15.33" + "@swc/core-linux-arm64-musl" "1.15.33" + "@swc/core-linux-ppc64-gnu" "1.15.33" + "@swc/core-linux-s390x-gnu" "1.15.33" + "@swc/core-linux-x64-gnu" "1.15.33" + "@swc/core-linux-x64-musl" "1.15.33" + "@swc/core-win32-arm64-msvc" "1.15.33" + "@swc/core-win32-ia32-msvc" "1.15.33" + "@swc/core-win32-x64-msvc" "1.15.33" "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/types@^0.1.24": - version "0.1.25" - resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" - integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== +"@swc/types@^0.1.26": + version "0.1.26" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz#2a976a1870caef1992316dda1464150ee36968b5" + integrity sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw== dependencies: "@swc/counter" "^0.1.3" @@ -1302,7 +1474,7 @@ resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -1688,6 +1860,11 @@ acorn@^8.15.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -1695,11 +1872,6 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" @@ -1707,7 +1879,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1939,15 +2111,12 @@ babel-jest@^29.7.0: graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^8.2.4: - version "8.4.1" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" - integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== +babel-loader@10.1.1: + version "10.1.1" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz#ce9748e85b7071eb88006e3cfa9e6cf14eeb97c5" + integrity sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg== dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.4" - make-dir "^3.1.0" - schema-utils "^2.6.5" + find-up "^5.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" @@ -2004,6 +2173,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +baseline-browser-mapping@^2.10.12: + version "2.10.25" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.25.tgz#183b45c0d3bdd12addb352426555fb3627eb022a" + integrity sha512-QO/VHsXCQdnzADMfmkeOPvHdIAkoB7i0/rGjINPJEetLx75hNttVWGQ/jycHUDP9zZ9rupbm60WRxcwViB0MiA== + baseline-browser-mapping@^2.8.9: version "2.8.15" resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz#78d795047dcd878e29c0c0f7a916c782fb96e062" @@ -2083,6 +2257,17 @@ browserslist@^4.24.0, browserslist@^4.26.3: node-releases "^2.0.21" update-browserslist-db "^1.1.3" +browserslist@^4.28.1: + version "4.28.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" + integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== + dependencies: + baseline-browser-mapping "^2.10.12" + caniuse-lite "^1.0.30001782" + electron-to-chromium "^1.5.328" + node-releases "^2.0.36" + update-browserslist-db "^1.2.3" + bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -2160,7 +2345,12 @@ caniuse-lite@^1.0.30001746: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz#21a43b923577932097fe32bcaabb6da7f4677632" integrity sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q== -chalk@^4.0.0, chalk@^4.1.2: +caniuse-lite@^1.0.30001782: + version "1.0.30001791" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz#dfb93d85c40ad380c57123e72e10f3c575786b51" + integrity sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ== + +chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2283,11 +2473,6 @@ commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - compressible@~2.0.18: version "2.0.18" resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -2385,19 +2570,19 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -css-loader@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" - integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== +css-loader@7.1.4: + version "7.1.4" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz#8f6bf9f8fc8cbef7d2ef6e80acc6545eaefa90b1" + integrity sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw== dependencies: icss-utils "^5.1.0" - postcss "^8.4.33" + postcss "^8.4.40" postcss-modules-extract-imports "^3.1.0" postcss-modules-local-by-default "^4.0.5" postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.5.4" + semver "^7.6.3" cssesc@^3.0.0: version "3.0.0" @@ -2571,6 +2756,11 @@ electron-to-chromium@^1.5.227: resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz#d895b6dba84269f4e83b3a1149dcc55e27848c30" integrity sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg== +electron-to-chromium@^1.5.328: + version "1.5.349" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz#9b9c6a6d84d1107557c18a9336099ce0ee890e5b" + integrity sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A== + emittery@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -2614,6 +2804,14 @@ enhanced-resolve@^5.17.3: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.20.0: + version "5.21.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz#bb8e6fabaf74930de70e61397798750429e5b1ae" + integrity sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.3" + envinfo@^7.14.0: version "7.17.0" resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.17.0.tgz#4a9cb6fe0c91e27b5be5fcca61f681894f88db14" @@ -2735,6 +2933,11 @@ es-module-lexer@^1.2.1: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== +es-module-lexer@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz#1dfcbb5ea3bbfb63f28e1fc3676c3676d1c9624c" + integrity sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ== + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -2768,45 +2971,47 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild-loader@^2.18.0: - version "2.21.0" - resolved "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-2.21.0.tgz#2698a3e565b0db2bb19a3dd91c2b6c9aad526c80" - integrity sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g== +esbuild-loader@4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.4.3.tgz#0d0f302e3260b2318d1256c17807dfea4bc449ed" + integrity sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg== dependencies: - esbuild "^0.16.17" - joycon "^3.0.1" - json5 "^2.2.0" - loader-utils "^2.0.0" - tapable "^2.2.0" - webpack-sources "^1.4.3" + esbuild "^0.27.1" + get-tsconfig "^4.10.1" + loader-utils "^2.0.4" + webpack-sources "^3.3.4" -esbuild@^0.16.17: - version "0.16.17" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== +esbuild@^0.27.1: + version "0.27.7" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz#bcadce22b2f3fd76f257e3a64f83a64986fea11f" + integrity sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w== optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" + "@esbuild/aix-ppc64" "0.27.7" + "@esbuild/android-arm" "0.27.7" + "@esbuild/android-arm64" "0.27.7" + "@esbuild/android-x64" "0.27.7" + "@esbuild/darwin-arm64" "0.27.7" + "@esbuild/darwin-x64" "0.27.7" + "@esbuild/freebsd-arm64" "0.27.7" + "@esbuild/freebsd-x64" "0.27.7" + "@esbuild/linux-arm" "0.27.7" + "@esbuild/linux-arm64" "0.27.7" + "@esbuild/linux-ia32" "0.27.7" + "@esbuild/linux-loong64" "0.27.7" + "@esbuild/linux-mips64el" "0.27.7" + "@esbuild/linux-ppc64" "0.27.7" + "@esbuild/linux-riscv64" "0.27.7" + "@esbuild/linux-s390x" "0.27.7" + "@esbuild/linux-x64" "0.27.7" + "@esbuild/netbsd-arm64" "0.27.7" + "@esbuild/netbsd-x64" "0.27.7" + "@esbuild/openbsd-arm64" "0.27.7" + "@esbuild/openbsd-x64" "0.27.7" + "@esbuild/openharmony-arm64" "0.27.7" + "@esbuild/sunos-x64" "0.27.7" + "@esbuild/win32-arm64" "0.27.7" + "@esbuild/win32-ia32" "0.27.7" + "@esbuild/win32-x64" "0.27.7" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -3116,11 +3321,6 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -exit-hook@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz#c1e16ebd03d3166f837b1502dac755bb5c460d58" - integrity sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ== - exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -3265,15 +3465,6 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -3437,6 +3628,13 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-tsconfig@^4.10.1: + version "4.14.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4464,11 +4662,6 @@ jiti@^2.6.0: resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== -joycon@^3.0.1: - version "3.1.1" - resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" - integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4526,7 +4719,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: +json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4652,7 +4845,12 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== -loader-utils@^2.0.0, loader-utils@^2.0.4: +loader-runner@^4.3.1: + version "4.3.2" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9" + integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== + +loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -4675,23 +4873,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lockfile@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.has@^4.5.2: - version "4.5.2" - resolved "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g== - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4727,13 +4908,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -4855,10 +5029,10 @@ mimic-function@^5.0.0: resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -mini-css-extract-plugin@^2.9.4: - version "2.9.4" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz#cafa1a42f8c71357f49cd1566810d74ff1cb0200" - integrity sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ== +mini-css-extract-plugin@2.10.2: + version "2.10.2" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz#5c85ec9450c05d26e32531b465a15a08c3a57253" + integrity sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" @@ -4945,6 +5119,11 @@ node-releases@^2.0.21: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz#2ecf3d7ba571ece05c67c77e5b7b1b6fb9e18cea" integrity sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg== +node-releases@^2.0.36: + version "2.0.38" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz#791569b9e4424a044e12c3abfad418ed83ce9947" + integrity sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5262,7 +5441,7 @@ pirates@^4.0.4: resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -5315,10 +5494,10 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.33: - version "8.5.6" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== +postcss@^8.4.40: + version "8.5.13" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz#6cfaf647f2e7ef69850208eccd849e0d3f65d420" + integrity sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" @@ -5365,6 +5544,15 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5526,6 +5714,11 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve.exports@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" @@ -5557,6 +5750,11 @@ restore-cursor@^5.0.0: onetime "^7.0.0" signal-exit "^4.1.0" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -5572,10 +5770,10 @@ rfdc@^1.4.1: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rspack-manifest-plugin@^5.0.3: - version "5.1.0" - resolved "https://registry.npmjs.org/rspack-manifest-plugin/-/rspack-manifest-plugin-5.1.0.tgz#09621d32d290a6de32e13aa10feb7f593dc15ae5" - integrity sha512-XAt1VOfRt6gcNlekB7rpiYK0MuC8VuWRrM2F33Eu83B/fmEVJUNVMDxZJhqJ0NMDJNxq80404j+NAfzlYQCjrw== +rspack-manifest-plugin@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/rspack-manifest-plugin/-/rspack-manifest-plugin-5.2.1.tgz#e685c228ec60c65efec8f6bcf93e701c7efb9eee" + integrity sha512-H3qyCumiEiWy9zhcPIYPr3J3SWyvypVJJY5wxjG5L8gYny6dfNHfk0gyICg1tGO+g4uQzvVHER875ek/I/J8UA== dependencies: "@rspack/lite-tapable" "^1.0.1" @@ -5634,32 +5832,14 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@^16.0.5: - version "16.0.5" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz#257bc90119ade066851cafe7f2c3f3504c7cda98" - integrity sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw== +sass-loader@16.0.7: + version "16.0.7" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz#d1f8723b795805831d41b5825e3d9cd72cb939e7" + integrity sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA== dependencies: neo-async "^2.6.2" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.2, schema-utils@^4.3.3: +schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: version "4.3.3" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== @@ -5682,7 +5862,7 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -5692,6 +5872,11 @@ semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.3: resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +semver@^7.6.3: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + send@0.19.0: version "0.19.0" resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -5896,11 +6081,6 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -5922,7 +6102,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6156,16 +6336,23 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swc-loader@^0.1.15: - version "0.1.16" - resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.1.16.tgz#4c718d698e518f3e6ceb9f7872c1855cdb187066" - integrity sha512-NKIm8aJjK/z/yfzk+v7YGwJMjBKaLaUs9ZKI2zoaIGKAjtkwjO92ZLI0fiTZuwzRqVLQl/29fBdSgFCBzquR0w== +swc-loader@0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz#2d1611ab314c5d8342d74aa5e5901b3fbf490de2" + integrity sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w== + dependencies: + "@swc/counter" "^0.1.3" -tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1, tapable@^2.3.0: +tapable@^2.2.0, tapable@^2.2.1, tapable@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== +tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== + terser-webpack-plugin@^5.3.11: version "5.3.14" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" @@ -6177,6 +6364,16 @@ terser-webpack-plugin@^5.3.11: serialize-javascript "^6.0.2" terser "^5.31.1" +terser-webpack-plugin@^5.3.17: + version "5.5.0" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz#d92b8e2c892dd09c683c38120394267e8d8660ef" + integrity sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + terser "^5.31.1" + terser@^5.31.1: version "5.44.0" resolved "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" @@ -6388,6 +6585,14 @@ update-browserslist-db@^1.1.3: escalade "^3.2.0" picocolors "^1.1.1" +update-browserslist-db@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -6436,7 +6641,7 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.1, watchpack@^2.4.4: +watchpack@^2.4.4: version "2.4.4" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== @@ -6444,6 +6649,14 @@ watchpack@^2.4.1, watchpack@^2.4.4: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watchpack@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -6451,20 +6664,17 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webpack-assets-manifest@^5.0.6: - version "5.2.1" - resolved "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-5.2.1.tgz#7ebe4c882efdc343029ed2f54a6f7ce990406f08" - integrity sha512-MsEcXVio1GY6R+b4dVfTHIDMB0RB90KajQG8neRbH92vE2S1ClGw9mNa9NPlratYBvZOhExmN0qqMNFTaCTuIg== +webpack-assets-manifest@6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-6.5.1.tgz#a0a2d8eefcad4f9cb1dd9f0829c3cb0a051d4230" + integrity sha512-aMuOF9+UB4oHyKxi0ixQpKiI52nZ2onHFgqOmLlyIFgBh/lU7hcy+zPryaoHrBR1polqTPE3atz/SZ7xFc2QSQ== dependencies: - chalk "^4.1.2" deepmerge "^4.3.1" - lockfile "^1.0.4" - lodash.get "^4.4.2" - lodash.has "^4.5.2" - schema-utils "^3.3.0" - tapable "^2.2.1" + proper-lockfile "^4.1.2" + schema-utils "^4.3.3" + tapable "^2.3.0" -webpack-cli@^7.0.0: +webpack-cli@7.0.2: version "7.0.2" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.2.tgz#c916e324acc7c14f895226ed351020924900db12" integrity sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g== @@ -6543,30 +6753,27 @@ webpack-merge@^5.8.0: flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-sources@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== -webpack-subresource-integrity@^5.1.0: +webpack-sources@^3.3.4: + version "3.4.1" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz#009d110999ebd9fb3a6fa8d32eec6f84d940e65d" + integrity sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A== + +webpack-subresource-integrity@5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== dependencies: typed-assert "^1.0.8" -webpack@5.101.3: - version "5.101.3" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz#3633b2375bb29ea4b06ffb1902734d977bc44346" - integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== +webpack@5.106.2: + version "5.106.2" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz#ca8174b4fd80f055cc5a45fcc5577d6db76c8ac5" + integrity sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -6574,25 +6781,24 @@ webpack@5.101.3: "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" + acorn "^8.16.0" acorn-import-phases "^1.0.3" - browserslist "^4.24.0" + browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.3" - es-module-lexer "^1.2.1" + enhanced-resolve "^5.20.0" + es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" + loader-runner "^4.3.1" + mime-db "^1.54.0" neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" + schema-utils "^4.3.3" + tapable "^2.3.0" + terser-webpack-plugin "^5.3.17" + watchpack "^2.5.1" + webpack-sources "^3.3.4" webpack@^5: version "5.102.1"