diff --git a/packages/loader/README.md b/packages/loader/README.md
new file mode 100644
index 0000000..6359e21
--- /dev/null
+++ b/packages/loader/README.md
@@ -0,0 +1,93 @@
+# @srcset/loader
+
+[![ESM-only package][package]][package-url]
+[![NPM version][npm]][npm-url]
+[![Node version][node]][node-url]
+[![Dependencies status][deps]][deps-url]
+[![Install size][size]][size-url]
+[![Build status][build]][build-url]
+[![Coverage status][coverage]][coverage-url]
+
+[package]: https://img.shields.io/badge/package-ESM--only-ffe536.svg
+[package-url]: https://nodejs.org/api/esm.html
+
+[npm]: https://img.shields.io/npm/v/%40srcset%2Floader.svg
+[npm-url]: https://npmjs.com/package/@srcset/loader
+
+[node]: https://img.shields.io/node/v/%40srcset%2Floader.svg
+[node-url]: https://nodejs.org
+
+[deps]: https://img.shields.io/librariesio/release/npm/%40srcset%2Floader
+[deps-url]: https://libraries.io/npm/%40srcset%2Floader
+
+[size]: https://packagephobia.com/badge?p=%40srcset%2Floader
+[size-url]: https://packagephobia.com/result?p=%40srcset%2Floader
+
+[build]: https://img.shields.io/github/actions/workflow/status/TrigenSoftware/srcset/tests.yml?branch=main
+[build-url]: https://github.com/TrigenSoftware/srcset/actions
+
+[coverage]: https://img.shields.io/codecov/c/github/TrigenSoftware/srcset.svg
+[coverage-url]: https://app.codecov.io/gh/TrigenSoftware/srcset
+
+[Webpack](https://webpack.js.org/) and [Rspack](https://rspack.rs/) loader for generating responsive images.
+
+- 🧩 Image imports are processed by default - no query markers required
+- 🌳 Tree-shakable image modules: unused exports are dropped from the bundle
+- 🌫 Blur-up placeholders inlined as data-urls
+- 🌐 Pluggable backends: encode with [sharp](https://sharp.pixelplumbing.com/) or build [imgproxy](https://npmjs.com/package/@srcset/imgproxy) / [Cloudflare](https://npmjs.com/package/@srcset/cloudflare) urls
+
+## Install
+
+```bash
+# pnpm
+pnpm add -D @srcset/loader @srcset/runtime
+# yarn
+yarn add -D @srcset/loader @srcset/runtime
+# npm
+npm i -D @srcset/loader @srcset/runtime
+```
+
+## Usage
+
+```js
+// webpack.config.js / rspack.config.js
+export default {
+ module: {
+ rules: [
+ {
+ test: /\.jpe?g$/i,
+ use: {
+ loader: '@srcset/loader',
+ options: {
+ rules: [
+ {
+ width: [1, 0.5],
+ format: ['avif', 'webp', 'jpg']
+ }
+ ],
+ placeholder: true
+ }
+ }
+ }
+ ]
+ }
+}
+```
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+
+// url - url of the selected variant, e.g. '/assets/photo.f37e2d3a.jpg'
+// src - selected variant: { id: 'jpg1200', format: 'jpg', type: 'image/jpeg', width: 1200, height: 800, url }
+// srcSet - array of all generated variants
+// srcMap - id-to-url map, e.g. srcMap.webp600
+// placeholder - blur-up data-url, when the `placeholder` option is enabled
+
+const img = `
`
+```
+
+The module is tree-shakable: import only what you use - the rest is dropped from the bundle.
+
+## Documentation
+
+For more details, guides and API references, check out the [documentation website](https://srcset.js.org/integrations/loader/).
diff --git a/packages/loader/client.d.ts b/packages/loader/client.d.ts
new file mode 100644
index 0000000..7909d34
--- /dev/null
+++ b/packages/loader/client.d.ts
@@ -0,0 +1,79 @@
+/* oxlint-disable trigen/import-order */
+/**
+ * Ambient module declarations for image imports handled by @srcset/loader.
+ *
+ * Usage: add to tsconfig `types` or reference directly:
+ * ///
+ */
+
+declare module '*.jpg' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
+
+declare module '*.jpeg' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
+
+declare module '*.png' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
+
+declare module '*.webp' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
+
+declare module '*.avif' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
+
+declare module '*.gif' {
+ import type { SrcSetEntry } from '@srcset/runtime'
+
+ const url: string
+
+ export const src: SrcSetEntry
+ export const srcSet: SrcSetEntry[]
+ export const srcMap: Record
+ export const placeholder: string | undefined
+ export default url
+}
diff --git a/packages/loader/oxlint.config.ts b/packages/loader/oxlint.config.ts
new file mode 100644
index 0000000..4eba28c
--- /dev/null
+++ b/packages/loader/oxlint.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from '@trigen/oxlint'
+import testConfig from '@trigen/oxlint-config/test'
+import tsTypeCheckedConfig from '@trigen/oxlint-config/typescript-type-checked'
+import rootConfig from '../../oxlint.config.ts'
+
+export default defineConfig({
+ extends: [
+ rootConfig,
+ tsTypeCheckedConfig,
+ testConfig
+ ]
+})
diff --git a/packages/loader/package.json b/packages/loader/package.json
new file mode 100644
index 0000000..5cefc92
--- /dev/null
+++ b/packages/loader/package.json
@@ -0,0 +1,101 @@
+{
+ "name": "@srcset/loader",
+ "type": "module",
+ "version": "1.0.0",
+ "description": "Webpack and Rspack loader for generating responsive images.",
+ "author": {
+ "name": "Dan Onoshko",
+ "email": "danon0404@gmail.com",
+ "url": "https://github.com/dangreen"
+ },
+ "license": "MIT",
+ "homepage": "https://srcset.js.org/integrations/loader/",
+ "funding": "https://ko-fi.com/dangreen",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/TrigenSoftware/srcset.git",
+ "directory": "packages/loader"
+ },
+ "bugs": {
+ "url": "https://github.com/TrigenSoftware/srcset/issues"
+ },
+ "keywords": [
+ "srcset",
+ "image",
+ "picture",
+ "responsive",
+ "webpack",
+ "rspack",
+ "loader",
+ "webpack-loader"
+ ],
+ "engines": {
+ "node": ">=22"
+ },
+ "sideEffects": false,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts",
+ "./client": {
+ "types": "./client.d.ts"
+ }
+ },
+ "publishConfig": {
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "./client": {
+ "types": "./client.d.ts"
+ }
+ },
+ "directory": "package",
+ "linkDirectory": false
+ },
+ "files": [
+ "dist",
+ "client.d.ts"
+ ],
+ "scripts": {
+ "clear:package": "del ./package",
+ "clear:dist": "del ./dist",
+ "clear": "del ./package ./dist ./coverage",
+ "prepublishOnly": "run build clear:package clean-publish",
+ "postpublish": "pnpm clear:package",
+ "build": "tsc -p ./tsconfig.build.json",
+ "lint": "oxlint",
+ "format": "oxlint --fix",
+ "test:unit": "vitest run --coverage",
+ "test:unit:watch": "vitest watch",
+ "test:types": "tsc --noEmit",
+ "test": "run -p lint test:unit test:types"
+ },
+ "peerDependencies": {
+ "@rspack/core": ">=1",
+ "@srcset/runtime": "workspace:^",
+ "webpack": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "@srcset/bundler-utils": "workspace:^",
+ "@srcset/core": "workspace:^",
+ "p-limit": "^7.3.0"
+ },
+ "devDependencies": {
+ "@rspack/core": "^2.1.4",
+ "@srcset/runtime": "workspace:^",
+ "@types/node": "^22.0.0",
+ "memfs": "^4.64.0",
+ "sharp": "^0.35.3",
+ "webpack": "^5.108.4"
+ }
+}
diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts
new file mode 100644
index 0000000..9741116
--- /dev/null
+++ b/packages/loader/src/index.ts
@@ -0,0 +1,13 @@
+/* oxlint-disable import/no-default-export */
+export {
+ default,
+ raw
+} from './loader.ts'
+export type * from './types.ts'
+export type {
+ SrcSetRule,
+ SrcSetEntrySelect,
+ SrcSetModuleEntry,
+ ResourceIdFormatter,
+ PlaceholderOptions
+} from '@srcset/bundler-utils'
diff --git a/packages/loader/src/limit.ts b/packages/loader/src/limit.ts
new file mode 100644
index 0000000..9831c00
--- /dev/null
+++ b/packages/loader/src/limit.ts
@@ -0,0 +1,21 @@
+import { availableParallelism } from 'node:os'
+import type { LimitFunction } from 'p-limit'
+import pLimit from 'p-limit'
+
+const limits = new Map()
+
+/**
+ * Get concurrency limit shared between loader runs.
+ * @param concurrency - Concurrency limit.
+ * @returns p-limit's limit function.
+ */
+export function getSharedLimit(concurrency?: number) {
+ let limit = limits.get(concurrency)
+
+ if (!limit) {
+ limit = pLimit(concurrency ?? availableParallelism())
+ limits.set(concurrency, limit)
+ }
+
+ return limit
+}
diff --git a/packages/loader/src/loader.spec.ts b/packages/loader/src/loader.spec.ts
new file mode 100644
index 0000000..d0ab9e2
--- /dev/null
+++ b/packages/loader/src/loader.spec.ts
@@ -0,0 +1,350 @@
+import {
+ describe,
+ it,
+ expect
+} from 'vitest'
+import sharp from 'sharp'
+import webpack from 'webpack'
+import { rspack } from '@rspack/core'
+import {
+ type CompilerLike,
+ createFixtureProject,
+ compile,
+ bundleUsage,
+ imageWidth,
+ imageHeight
+} from '../test/bundler.mock.ts'
+
+const defaultEntry = `import url, { src, srcSet, srcMap, placeholder } from './image.jpg'
+export { url as default, src, srcSet, srcMap, placeholder }
+`
+const ruleEntry = `import url, { src, srcSet, srcMap } from './image.jpg?{ "width": [0.5, 1], "format": ["webp", "jpg"] }'
+export { url as default, src, srcSet, srcMap }
+`
+const selectEntry = `import url, { srcMap } from './image.jpg?{ "width": [0.5, 1], "format": ["webp", "jpg"] }&format=webp&width=320'
+export { url as default, srcMap }
+`
+// Multiple formats and widths, so the module has distinctive markers:
+// `image/webp` (a `type` field) only lives inside `srcSet` variant objects,
+// so its presence tracks whether `srcSet` survived tree-shaking.
+const treeShakeOptions = {
+ skipOptimization: true,
+ rules: [
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp']
+ }
+ ]
+}
+
+function usageEntry(imports: string) {
+ return `import { ${imports} } from './image.jpg'\nglobalThis.__srcsetOutput = { ${imports} }\n`
+}
+
+type CreateCompiler = (config: object) => CompilerLike
+
+const bundlers = [
+ ['webpack', webpack as unknown as CreateCompiler],
+ ['rspack', rspack as unknown as CreateCompiler]
+] as const
+
+describe('loader', () => {
+ describe('srcSetLoader', () => {
+ describe.each(bundlers)('%s', (_name, createCompiler) => {
+ it('should build module with default options', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ skipOptimization: true
+ })
+
+ expect(exports.default).toMatch(/^\/assets\/image\.[0-9a-f]{8}\.jpg$/)
+ expect(exports.src).toEqual({
+ id: `jpg${imageWidth}`,
+ format: 'jpg',
+ type: 'image/jpeg',
+ width: imageWidth,
+ height: imageHeight,
+ url: exports.default
+ })
+ expect(exports.srcSet).toEqual([exports.src])
+ expect(exports.srcMap).toEqual({
+ [`jpg${imageWidth}`]: exports.default
+ })
+ expect(assets).toEqual([exports.default.replace('/assets/', '')])
+ })
+
+ it('should apply rule from import query', async () => {
+ const dir = await createFixtureProject(ruleEntry)
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ skipOptimization: true
+ })
+ const halfWidth = imageWidth / 2
+
+ expect(exports.srcSet.length).toBe(4)
+ expect(Object.keys(exports.srcMap).sort()).toEqual([
+ `jpg${halfWidth}`,
+ `jpg${imageWidth}`,
+ `webp${halfWidth}`,
+ `webp${imageWidth}`
+ ])
+ expect(exports.default).toBe(exports.srcMap[`jpg${imageWidth}`])
+ expect(assets.length).toBe(4)
+ })
+
+ it('should select default export variant from query', async () => {
+ const dir = await createFixtureProject(selectEntry)
+ const { exports } = await compile(createCompiler, dir, {
+ skipOptimization: true
+ })
+
+ expect(exports.default).toBe(exports.srcMap[`webp${imageWidth / 2}`])
+ expect(exports.default).toMatch(/\.webp$/)
+ })
+
+ it('should apply rules option with matching', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const { exports } = await compile(createCompiler, dir, {
+ skipOptimization: true,
+ rules: [
+ {
+ match: '**/*.jpg',
+ width: [0.5, 1]
+ },
+ {
+ match: '**/*.png',
+ width: [0.25]
+ }
+ ]
+ })
+
+ expect(exports.srcSet.length).toBe(2)
+ expect(exports.default).toBe(exports.srcMap[`jpg${imageWidth}`])
+ })
+
+ it('should use hashless file names in development mode', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ skipOptimization: true
+ }, 'development')
+
+ expect(exports.default).toBe('/assets/image.jpg')
+ expect(assets).toEqual(['image.jpg'])
+ })
+
+ it('should export placeholder data-url when enabled', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const { exports } = await compile(createCompiler, dir, {
+ skipOptimization: true,
+ placeholder: true
+ })
+
+ expect(exports.placeholder).toMatch(/^data:image\/webp;base64,/)
+
+ const decoded = Buffer.from((exports.placeholder as string).split(',')[1], 'base64')
+ const metadata = await sharp(decoded).metadata()
+
+ expect(metadata.width).toBe(16)
+ })
+
+ it('should export placeholder together with only rule', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const { exports } = await compile(createCompiler, dir, {
+ skipOptimization: true,
+ placeholder: true,
+ rules: [
+ {
+ match: '**/*.jpg',
+ only: true,
+ width: [0.5]
+ }
+ ]
+ })
+
+ expect(exports.placeholder).toMatch(/^data:image\/webp;base64,/)
+ expect(exports.srcSet.length).toBe(1)
+ })
+
+ it('should export undefined placeholder by default', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const { exports } = await compile(createCompiler, dir, {
+ skipOptimization: true
+ })
+
+ expect(exports.placeholder).toBeUndefined()
+ })
+
+ it('should not emit files when emitFile is disabled', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ skipOptimization: true,
+ emitFile: false
+ })
+
+ expect(assets).toEqual([])
+ expect(exports.default).toMatch(/^\/assets\/image\./)
+ })
+
+ it('should use url variants from custom backend without emitting', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ backend: () => ({
+ * generate(_source: unknown, metadata: {
+ format: string
+ width: number
+ height: number
+ }) {
+ yield {
+ format: metadata.format,
+ width: metadata.width,
+ height: metadata.height,
+ originMultiplier: 1,
+ url: `https://proxy.test/w:${metadata.width}/f:${metadata.format}`
+ }
+ }
+ })
+ })
+
+ expect(assets).toEqual([])
+ expect(exports.default).toBe(`https://proxy.test/w:${imageWidth}/f:jpg`)
+ expect(exports.srcMap[`jpg${imageWidth}`]).toBe(exports.default)
+ })
+
+ it('should emit the original for a backend enforcing public path', async () => {
+ const dir = await createFixtureProject(defaultEntry)
+ const urlBackend = (
+ _options: unknown,
+ emitImage: (image: unknown) => {
+ outputPath: string
+ publicPath: string | null
+ }
+ ) => ({
+ * generate(source: {
+ path: string
+ contents: Buffer
+ }, metadata: {
+ format: string
+ width: number
+ height: number
+ }) {
+ const { publicPath: publicUrl } = emitImage({
+ path: source.path,
+ contents: source.contents,
+ format: metadata.format,
+ width: metadata.width,
+ height: metadata.height,
+ postfix: '',
+ originMultiplier: 1
+ })
+
+ yield {
+ format: metadata.format,
+ width: metadata.width,
+ height: metadata.height,
+ originMultiplier: 1,
+ url: `https://proxy.test/plain/${publicUrl ?? ''}`
+ }
+ }
+ })
+ const {
+ assets,
+ exports
+ } = await compile(createCompiler, dir, {
+ publicPath: 'https://static.example.com/assets/',
+ backend: urlBackend
+ })
+
+ expect(assets).toEqual([expect.stringMatching(/^image\.[0-9a-f]{8}\.jpg$/) as string])
+ expect(exports.default).toBe(`https://proxy.test/plain/https://static.example.com/assets/${assets[0]}`)
+ })
+
+ describe('tree shaking', () => {
+ it('should keep only src when only src is used', async () => {
+ const dir = await createFixtureProject(usageEntry('src'))
+ const {
+ code,
+ usedExports
+ } = await bundleUsage(createCompiler, dir, treeShakeOptions)
+
+ expect(usedExports).toEqual(['src'])
+ // src is jpg, so its type stays, while srcSet variant objects (with the
+ // webp type) and the srcMap keys are dropped.
+ expect(code).toContain('image/jpeg')
+ expect(code).not.toContain('image/webp')
+ expect(code).not.toContain(`webp${imageWidth / 2}`)
+ })
+
+ it('should drop srcMap when only srcSet is used', async () => {
+ const dir = await createFixtureProject(usageEntry('srcSet'))
+ const {
+ code,
+ usedExports
+ } = await bundleUsage(createCompiler, dir, treeShakeOptions)
+ // Id of a non-default variant: it lives in the srcSet object as an `id`
+ // field and, if kept, in the srcMap as a key. srcMap and srcSet share the
+ // same data, so a duplicate-count is the only way to tell them apart.
+ const variantId = `webp${imageWidth / 2}`
+ const occurrences = code.split(variantId).length - 1
+
+ expect(usedExports).toEqual(['srcSet'])
+ // srcSet keeps every variant object, so the webp type stays.
+ expect(code).toContain('image/webp')
+ // A single occurrence proves srcMap (the second reference) was dropped.
+ expect(occurrences).toBe(1)
+ })
+
+ it('should drop placeholder when unused', async () => {
+ const dir = await createFixtureProject(usageEntry('src'))
+ const { code } = await bundleUsage(createCompiler, dir, {
+ ...treeShakeOptions,
+ placeholder: true
+ })
+
+ expect(code).not.toContain('data:image/')
+ })
+
+ it('should keep placeholder when used', async () => {
+ const dir = await createFixtureProject(usageEntry('placeholder'))
+ const {
+ code,
+ usedExports
+ } = await bundleUsage(createCompiler, dir, {
+ ...treeShakeOptions,
+ placeholder: true
+ })
+
+ expect(usedExports).toEqual(['placeholder'])
+ expect(code).toContain('data:image/webp;base64,')
+ })
+
+ it('should drop src and srcSet objects when only srcMap is used', async () => {
+ const dir = await createFixtureProject(usageEntry('srcMap'))
+ const {
+ code,
+ usedExports
+ } = await bundleUsage(createCompiler, dir, treeShakeOptions)
+
+ expect(usedExports).toEqual(['srcMap'])
+ // srcMap has no variant objects, so no `type` field survives, but its keys do.
+ expect(code).not.toContain('image/jpeg')
+ expect(code).not.toContain('image/webp')
+ expect(code).toContain(`webp${imageWidth / 2}`)
+ })
+ })
+ })
+ })
+})
diff --git a/packages/loader/src/loader.ts b/packages/loader/src/loader.ts
new file mode 100644
index 0000000..97edeab
--- /dev/null
+++ b/packages/loader/src/loader.ts
@@ -0,0 +1,83 @@
+/* oxlint-disable import/no-default-export */
+import type { LoaderContext } from 'webpack'
+import type { SrcSetImage } from '@srcset/core'
+import {
+ parseResourceQuery,
+ generateSrcSetModule
+} from '@srcset/bundler-utils'
+import type { SrcSetLoaderOptions } from './types.ts'
+import {
+ interpolateName,
+ getDefaultName
+} from './template.ts'
+import {
+ resolveOutputPath,
+ resolvePublicPath
+} from './paths.ts'
+import { getSharedLimit } from './limit.ts'
+
+async function generateModule(ctx: LoaderContext, contents: Buffer) {
+ const options = ctx.getOptions()
+ const {
+ context = ctx.rootContext,
+ emitFile = true,
+ name = getDefaultName(ctx.mode),
+ concurrency,
+ outputPath,
+ publicPath
+ } = options
+ const source = {
+ path: ctx.resourcePath,
+ contents
+ }
+ const query = parseResourceQuery(ctx.resourceQuery)
+ const limit = getSharedLimit(concurrency)
+ const emitImage = (image: SrcSetImage) => {
+ const url = interpolateName(name, {
+ contents: image.contents,
+ resourcePath: ctx.resourcePath,
+ context,
+ postfix: image.postfix,
+ format: image.format
+ })
+ const imageOutputPath = resolveOutputPath(outputPath, url, ctx.resourcePath, context)
+ const imagePublicPath = resolvePublicPath(publicPath, url, ctx.resourcePath, context)
+
+ if (emitFile) {
+ ctx.emitFile(imageOutputPath, image.contents)
+ }
+
+ return {
+ outputPath: imageOutputPath,
+ publicPath: imagePublicPath,
+ publicPathExpression: '__webpack_public_path__'
+ }
+ }
+
+ return generateSrcSetModule(
+ source,
+ query,
+ options,
+ emitImage,
+ limit
+ )
+}
+
+/**
+ * Webpack and Rspack loader for generating responsive images.
+ * @param contents - Source image contents.
+ */
+export default function srcSetLoader(this: LoaderContext, contents: Buffer) {
+ const callback = this.async()
+
+ generateModule(this, contents).then(
+ (module) => {
+ callback(null, module)
+ },
+ (error: Error) => {
+ callback(error)
+ }
+ )
+}
+
+export const raw = true
diff --git a/packages/loader/src/paths.ts b/packages/loader/src/paths.ts
new file mode 100644
index 0000000..46e1983
--- /dev/null
+++ b/packages/loader/src/paths.ts
@@ -0,0 +1,52 @@
+import path from 'node:path'
+import type { PathResolver } from './types.ts'
+
+/**
+ * Resolve output path for the emitted file.
+ * @param outputPath - Output path option.
+ * @param url - Image variant url.
+ * @param resourcePath - Source image file path.
+ * @param context - Context directory path.
+ * @returns Output path.
+ */
+export function resolveOutputPath(
+ outputPath: string | PathResolver | undefined,
+ url: string,
+ resourcePath: string,
+ context: string
+) {
+ if (!outputPath) {
+ return url
+ }
+
+ if (typeof outputPath === 'function') {
+ return outputPath(url, resourcePath, context)
+ }
+
+ return path.posix.join(outputPath, url)
+}
+
+/**
+ * Resolve public path for the url.
+ * @param publicPath - Public path option.
+ * @param url - Image variant url.
+ * @param resourcePath - Source image file path.
+ * @param context - Context directory path.
+ * @returns Public path, or `null` to use the compiler public path.
+ */
+export function resolvePublicPath(
+ publicPath: string | PathResolver | undefined,
+ url: string,
+ resourcePath: string,
+ context: string
+) {
+ if (!publicPath) {
+ return null
+ }
+
+ if (typeof publicPath === 'function') {
+ return publicPath(url, resourcePath, context)
+ }
+
+ return `${publicPath}${publicPath.endsWith('/') ? '' : '/'}${url}`
+}
diff --git a/packages/loader/src/template.spec.ts b/packages/loader/src/template.spec.ts
new file mode 100644
index 0000000..3fcf81c
--- /dev/null
+++ b/packages/loader/src/template.spec.ts
@@ -0,0 +1,66 @@
+import {
+ describe,
+ it,
+ expect
+} from 'vitest'
+import {
+ interpolateName,
+ getDefaultName,
+ defaultProductionName,
+ defaultDevelopmentName
+} from './template.ts'
+
+const context = {
+ contents: Buffer.from('image contents'),
+ resourcePath: '/project/src/images/photo.jpg',
+ context: '/project/src',
+ postfix: '@320w',
+ format: 'webp'
+}
+
+describe('loader', () => {
+ describe('template', () => {
+ describe('interpolateName', () => {
+ it('should replace name, postfix and ext tokens', () => {
+ expect(interpolateName('[name][postfix].[ext]', context)).toBe('photo@320w.webp')
+ })
+
+ it('should replace path token with directory relative to context', () => {
+ expect(interpolateName('[path][name].[ext]', context)).toBe('images/photo.webp')
+ })
+
+ it('should replace path token with empty string for context directory', () => {
+ expect(interpolateName('[path][name].[ext]', {
+ ...context,
+ resourcePath: '/project/src/photo.jpg'
+ })).toBe('photo.webp')
+ })
+
+ it('should replace contenthash token with given length', () => {
+ const name = interpolateName('[contenthash:12].[ext]', context)
+
+ expect(name).toMatch(/^[0-9a-f]{12}\.webp$/)
+ })
+
+ it('should replace hash token with default length', () => {
+ expect(interpolateName('[hash].[ext]', context)).toMatch(/^[0-9a-f]{8}\.webp$/)
+ })
+
+ it('should produce same hash for same contents', () => {
+ expect(interpolateName('[contenthash]', context)).toBe(interpolateName('[hash]', context))
+ })
+ })
+
+ describe('getDefaultName', () => {
+ it('should return hashless template for development mode', () => {
+ expect(getDefaultName('development')).toBe(defaultDevelopmentName)
+ })
+
+ it('should return content hash template otherwise', () => {
+ expect(getDefaultName('production')).toBe(defaultProductionName)
+ expect(getDefaultName('none')).toBe(defaultProductionName)
+ expect(getDefaultName(undefined)).toBe(defaultProductionName)
+ })
+ })
+ })
+})
diff --git a/packages/loader/src/template.ts b/packages/loader/src/template.ts
new file mode 100644
index 0000000..c61f34f
--- /dev/null
+++ b/packages/loader/src/template.ts
@@ -0,0 +1,78 @@
+import { createHash } from 'node:crypto'
+import {
+ isAbsolute,
+ parse,
+ relative,
+ sep
+} from 'node:path'
+
+export interface TemplateContext {
+ /**
+ * Image variant contents.
+ */
+ contents: Buffer
+ /**
+ * Source image file path.
+ */
+ resourcePath: string
+ /**
+ * Context directory path.
+ */
+ context: string
+ /**
+ * Image variant postfix.
+ */
+ postfix: string
+ /**
+ * Image variant format.
+ */
+ format: string
+}
+
+export const defaultProductionName = '[name][postfix].[contenthash:8].[ext]'
+export const defaultDevelopmentName = '[path][name][postfix].[ext]'
+
+/**
+ * Get default output file name template for the compilation mode.
+ * Development template skips the content hash: readable and stable names,
+ * cache busting is not needed there. Uniqueness comes from the `[path]` prefix.
+ * @param mode - Compilation mode.
+ * @returns File name template.
+ */
+export function getDefaultName(mode: string | undefined) {
+ return mode === 'development' ? defaultDevelopmentName : defaultProductionName
+}
+
+const defaultHashLength = 8
+const hashPattern = /\[(?:content)?hash(?::(\d+))?\]/g
+
+/**
+ * Interpolate output file name template.
+ * @param template - File name template with `[name]`, `[postfix]`, `[ext]`, `[path]`, `[hash]`/`[contenthash]` tokens.
+ * @param context - Template context.
+ * @returns Interpolated file name.
+ */
+export function interpolateName(template: string, context: TemplateContext) {
+ const {
+ dir,
+ name
+ } = parse(context.resourcePath)
+ const relativeDir = relative(context.context, dir)
+ // Resources outside the context get no path prefix: no parent
+ // traversals or windows cross-drive paths in emitted names.
+ const dirPath = relativeDir && !relativeDir.startsWith('..') && !isAbsolute(relativeDir)
+ ? `${relativeDir.replaceAll(sep, '/')}/`
+ : ''
+ let hash: string | null = null
+
+ return template
+ .replaceAll('[path]', dirPath)
+ .replaceAll('[name]', name)
+ .replaceAll('[postfix]', context.postfix)
+ .replaceAll('[ext]', context.format)
+ .replace(hashPattern, (_, length: string | undefined) => {
+ hash ??= createHash('sha256').update(context.contents).digest('hex')
+
+ return hash.slice(0, length ? Number(length) : defaultHashLength)
+ })
+}
diff --git a/packages/loader/src/types.ts b/packages/loader/src/types.ts
new file mode 100644
index 0000000..7c979b9
--- /dev/null
+++ b/packages/loader/src/types.ts
@@ -0,0 +1,34 @@
+import type { SrcSetModuleOptions } from '@srcset/bundler-utils'
+
+/**
+ * Path resolver function.
+ * @param url - Image variant url.
+ * @param resourcePath - Source image file path.
+ * @param context - Context directory path.
+ * @returns Resolved path.
+ */
+export type PathResolver = (url: string, resourcePath: string, context: string) => string
+
+export interface SrcSetLoaderOptions extends SrcSetModuleOptions {
+ /**
+ * Output file name template.
+ * Supports `[name]`, `[postfix]`, `[ext]`, `[path]` and `[hash]`/`[contenthash]` (with optional `:length`) tokens.
+ */
+ name?: string
+ /**
+ * Context directory path. Defaults to the compiler root context.
+ */
+ context?: string
+ /**
+ * Directory or resolver function for emitted files.
+ */
+ outputPath?: string | PathResolver
+ /**
+ * Public path or resolver function for urls. Defaults to the compiler public path.
+ */
+ publicPath?: string | PathResolver
+ /**
+ * Emit generated files. Disable e.g. for SSR builds.
+ */
+ emitFile?: boolean
+}
diff --git a/packages/loader/test/bundler.mock.ts b/packages/loader/test/bundler.mock.ts
new file mode 100644
index 0000000..e0c7cbc
--- /dev/null
+++ b/packages/loader/test/bundler.mock.ts
@@ -0,0 +1,273 @@
+import {
+ mkdtemp,
+ writeFile
+} from 'node:fs/promises'
+import { tmpdir } from 'node:os'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+import sharp from 'sharp'
+import {
+ Volume,
+ createFsFromVolume
+} from 'memfs'
+import type { SrcSetEntry } from '@srcset/runtime'
+
+// Bundlers load the loader shim with plain Node.js module resolution, outside of the
+// Vite pipeline. It works without a build step: Node natively strips types from the
+// TS sources, and relative imports use explicit `.ts` extensions.
+export const loaderPath = fileURLToPath(new URL('./loader.shim.mjs', import.meta.url))
+
+export const imageWidth = 640
+export const imageHeight = 480
+
+const channels = 3
+const colorDepth = 256
+
+/**
+ * Create a temporary project directory with a noise image and an entry file.
+ * @param entrySource - Entry file source code.
+ * @returns Project directory path.
+ */
+export async function createFixtureProject(entrySource: string) {
+ const dir = await mkdtemp(path.join(tmpdir(), 'srcset-loader-'))
+ const raw = Buffer.alloc(imageWidth * imageHeight * channels)
+
+ for (let i = 0; i < raw.length; i++) {
+ raw[i] = Math.floor(Math.random() * colorDepth)
+ }
+
+ const image = await sharp(raw, {
+ raw: {
+ width: imageWidth,
+ height: imageHeight,
+ channels
+ }
+ }).jpeg({
+ quality: 90
+ }).toBuffer()
+
+ await writeFile(path.join(dir, 'image.jpg'), image)
+ await writeFile(path.join(dir, 'entry.js'), entrySource)
+
+ return dir
+}
+
+export interface ModuleExports {
+ default: string
+ src: SrcSetEntry | null
+ srcSet: SrcSetEntry[]
+ srcMap: Record
+ placeholder: string | undefined
+}
+
+export interface BuildResult {
+ assets: string[]
+ exports: ModuleExports
+}
+
+interface StatsModule {
+ name?: string
+ usedExports?: string[] | boolean | null
+ modules?: StatsModule[]
+}
+
+interface StatsJson {
+ modules?: StatsModule[]
+}
+
+interface StatsLike {
+ hasErrors(): boolean
+ toString(options?: unknown): string
+ toJson(options?: unknown): StatsJson
+}
+
+export interface CompilerLike {
+ outputFileSystem: unknown
+ run(callback: (error: Error | null, stats?: StatsLike) => void): void
+}
+
+/**
+ * Compile the fixture project and evaluate the bundle exports.
+ * @param createCompiler - Bundler factory, accepts the config.
+ * @param dir - Project directory path.
+ * @param loaderOptions - Loader options.
+ * @returns Emitted asset names and evaluated bundle exports.
+ */
+export async function compile(
+ createCompiler: (config: object) => CompilerLike,
+ dir: string,
+ loaderOptions: object = {},
+ mode: 'production' | 'development' = 'production'
+): Promise {
+ const volume = new Volume()
+ const outputFileSystem = createFsFromVolume(volume)
+ const compiler = createCompiler({
+ context: dir,
+ mode,
+ devtool: false,
+ target: 'node',
+ entry: './entry.js',
+ experiments: {
+ outputModule: true
+ },
+ output: {
+ path: '/dist',
+ publicPath: '/assets/',
+ filename: 'main.mjs',
+ library: {
+ type: 'module'
+ }
+ },
+ module: {
+ rules: [
+ {
+ test: /\.jpe?g$/i,
+ use: [
+ {
+ loader: loaderPath,
+ options: loaderOptions
+ }
+ ]
+ }
+ ]
+ }
+ })
+
+ compiler.outputFileSystem = outputFileSystem
+
+ const stats = await new Promise((resolve, reject) => {
+ compiler.run((error, runStats) => {
+ if (error) {
+ reject(error)
+ } else {
+ resolve(runStats)
+ }
+ })
+ })
+
+ if (stats?.hasErrors()) {
+ throw new Error(stats.toString({
+ errors: true
+ }))
+ }
+
+ const code = volume.readFileSync('/dist/main.mjs', 'base64') as string
+ const moduleExports = await import(
+ /* @vite-ignore */
+ `data:text/javascript;base64,${code}`
+ ) as ModuleExports
+ const assets = Object.keys(volume.toJSON())
+ .map(assetPath => path.posix.basename(assetPath))
+ .filter(assetName => assetName !== 'main.mjs')
+
+ return {
+ assets,
+ exports: moduleExports
+ }
+}
+
+export interface UsageResult {
+ /**
+ * Minified production bundle code.
+ */
+ code: string
+ /**
+ * Exports of the image module the bundler determined are used.
+ */
+ usedExports: string[] | null
+}
+
+function findImageModule(modules: StatsModule[] = []): StatsModule | undefined {
+ for (const module of modules) {
+ if ((module.name ?? '').includes('image.jpg')) {
+ return module
+ }
+
+ const nested = findImageModule(module.modules)
+
+ if (nested) {
+ return nested
+ }
+ }
+
+ return undefined
+}
+
+/**
+ * Bundle a fixture that uses a subset of the image module exports and report
+ * what survives tree-shaking. Unlike `compile`, this is a plain (non-library) build,
+ * so unused exports of the image module are actually eliminated.
+ * @param createCompiler - Bundler factory, accepts the config.
+ * @param dir - Project directory path.
+ * @param loaderOptions - Loader options.
+ * @returns Minified bundle code and the image module used exports.
+ */
+export async function bundleUsage(
+ createCompiler: (config: object) => CompilerLike,
+ dir: string,
+ loaderOptions: object = {}
+): Promise {
+ const volume = new Volume()
+ const compiler = createCompiler({
+ context: dir,
+ mode: 'production',
+ devtool: false,
+ target: 'node',
+ entry: './entry.js',
+ output: {
+ path: '/dist',
+ publicPath: '/assets/',
+ filename: 'main.js'
+ },
+ optimization: {
+ usedExports: true
+ },
+ module: {
+ rules: [
+ {
+ test: /\.jpe?g$/i,
+ use: [
+ {
+ loader: loaderPath,
+ options: loaderOptions
+ }
+ ]
+ }
+ ]
+ }
+ })
+
+ compiler.outputFileSystem = createFsFromVolume(volume)
+
+ const stats = await new Promise((resolve, reject) => {
+ compiler.run((error, runStats) => {
+ if (error) {
+ reject(error)
+ } else {
+ resolve(runStats)
+ }
+ })
+ })
+
+ if (stats?.hasErrors()) {
+ throw new Error(stats.toString({
+ errors: true
+ }))
+ }
+
+ const code = volume.readFileSync('/dist/main.js', 'utf8') as string
+ const json = stats?.toJson({
+ usedExports: true,
+ modules: true,
+ nestedModules: true
+ })
+ const imageModule = findImageModule(json?.modules)
+ const usedExports = Array.isArray(imageModule?.usedExports)
+ ? [...imageModule.usedExports].sort()
+ : null
+
+ return {
+ code,
+ usedExports
+ }
+}
diff --git a/packages/loader/test/loader.shim.mjs b/packages/loader/test/loader.shim.mjs
new file mode 100644
index 0000000..3d676c6
--- /dev/null
+++ b/packages/loader/test/loader.shim.mjs
@@ -0,0 +1,5 @@
+// oxlint-disable import/no-default-export
+export {
+ default,
+ raw
+} from '../src/index.ts'
diff --git a/packages/loader/tsconfig.build.json b/packages/loader/tsconfig.build.json
new file mode 100644
index 0000000..977c689
--- /dev/null
+++ b/packages/loader/tsconfig.build.json
@@ -0,0 +1,17 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "dist",
+ "rootDir": "src",
+ "types": [
+ "node"
+ ]
+ },
+ "include": [
+ "src"
+ ],
+ "exclude": [
+ "**/*.config.ts",
+ "**/*.spec.ts"
+ ]
+}
diff --git a/packages/loader/tsconfig.json b/packages/loader/tsconfig.json
new file mode 100644
index 0000000..2783c96
--- /dev/null
+++ b/packages/loader/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "extends": "./tsconfig.build.json",
+ "compilerOptions": {
+ "rootDir": "../../",
+ "allowJs": true
+ },
+ "include": [
+ "src",
+ "test",
+ "*.js",
+ "*.ts"
+ ],
+ "exclude": []
+}
diff --git a/packages/loader/vite.config.js b/packages/loader/vite.config.js
new file mode 100644
index 0000000..418f84b
--- /dev/null
+++ b/packages/loader/vite.config.js
@@ -0,0 +1,11 @@
+import { defineConfig } from 'vite'
+
+export default defineConfig({
+ test: {
+ testTimeout: 60000,
+ coverage: {
+ reporter: ['lcovonly', 'text'],
+ include: ['src/**/*']
+ }
+ }
+})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 587898a..68d369b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -63,10 +63,10 @@ importers:
version: 7.0.2
vite:
specifier: ^8.1.0
- version: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)
+ version: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
vitest:
specifier: ^4.1.9
- version: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1))
+ version: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
packages/bundler-utils:
dependencies:
@@ -131,6 +131,38 @@ importers:
version: 4.0.3
publishDirectory: package
+ packages/loader:
+ dependencies:
+ '@srcset/bundler-utils':
+ specifier: workspace:^
+ version: link:../bundler-utils
+ '@srcset/core':
+ specifier: workspace:^
+ version: link:../core
+ p-limit:
+ specifier: ^7.3.0
+ version: 7.3.0
+ devDependencies:
+ '@rspack/core':
+ specifier: ^2.1.4
+ version: 2.1.4
+ '@srcset/runtime':
+ specifier: workspace:^
+ version: link:../runtime
+ '@types/node':
+ specifier: ^22.0.0
+ version: 22.20.1
+ memfs:
+ specifier: ^4.64.0
+ version: 4.64.0
+ sharp:
+ specifier: ^0.35.3
+ version: 0.35.3(@types/node@22.20.1)
+ webpack:
+ specifier: ^5.108.4
+ version: 5.108.4(esbuild@0.28.1)
+ publishDirectory: package
+
packages/runtime:
devDependencies:
'@size-limit/preset-small-lib':
@@ -267,6 +299,9 @@ packages:
'@emnapi/core@1.11.1':
resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
+ '@emnapi/core@1.11.2':
+ resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==}
+
'@emnapi/runtime@1.11.1':
resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
@@ -613,16 +648,142 @@ packages:
'@types/node':
optional: true
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@jsonjoy.com/base64@1.1.2':
+ resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/base64@17.67.0':
+ resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/buffers@1.2.1':
+ resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/buffers@17.67.0':
+ resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/codegen@1.0.0':
+ resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/codegen@17.67.0':
+ resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-core@4.64.0':
+ resolution: {integrity: sha512-zs2TAq7Six5jgMuoMNjpspAvOP3mhtgq/k1UyQodEzCtQi/N83y2/y+zcvnZSGp/Rxq96DBN+bValOBQAyn/ew==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-fsa@4.64.0':
+ resolution: {integrity: sha512-nMWOVbkLFyEgmXZih3wyvxA9XpgyyqyfrINMHvEFqhi7uqfRl7c9ERJt6yX7vgMPrB9Uo+OJO+Spa0cFzPD01w==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-node-builtins@4.64.0':
+ resolution: {integrity: sha512-/o7WRFhUWaM/fOrslwLZGnzn4RmRILykn+lAL+mNObqqRNw+CQSiij6hpCeZ+C7buhdoVo7go/OYqzaSUfDYmA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-node-to-fsa@4.64.0':
+ resolution: {integrity: sha512-WDD9WVs0hb7UAEKTgZW2f66WDrbj7gIIWwpP3spbLyXa0rghtUaFTB8L4gdR3ZCWwiKIsj38/CNijpVmpnuPUw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-node-utils@4.64.0':
+ resolution: {integrity: sha512-k5Indsx9hWW9xSF7Y6oSKKwtCUNhzZxadub3owhIlitc+iMRVlPPdX2duTKQWBL3qNWpXya8jykgaaWpheeS4w==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-node@4.64.0':
+ resolution: {integrity: sha512-dO+NNkODbUli4uV42bcNrrLvq5rE7SNpdZ5TNd0dtbLsAaNK3MDiIC9lUi+brboGoIjW6vd2fB1qao60nrk5xA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-print@4.64.0':
+ resolution: {integrity: sha512-PHZFccchvkhWrwPWHjmVAhbC3vSHCtyZvlZfJJ3ho2bnzl450hXri6/8e6pbkWdH+SkmLXNml0sV8e5HDAfxKw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-snapshot@4.64.0':
+ resolution: {integrity: sha512-oM7UDeL83q6NBzzsfKAsYKXKVXlykKFqqOLh4xZZKAzzROTlInkPbc6LTDGThEOnPiFiUzA7tYziHG9xavd76Q==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pack@1.21.0':
+ resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pack@17.67.0':
+ resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pointer@1.0.2':
+ resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pointer@17.67.0':
+ resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/util@1.9.0':
+ resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/util@17.67.0':
+ resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
'@napi-rs/wasm-runtime@1.1.6':
resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==}
peerDependencies:
@@ -922,6 +1083,86 @@ packages:
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+ '@rspack/binding-darwin-arm64@2.1.4':
+ resolution: {integrity: sha512-3Xcs01iw48F4WeE4SHga6bCNb/UEFvtQX4P4eMIaJfGPjTQuxfabGE8yCPm9e3tpLZ5uo+IBnJ6nh5r6tIDOXQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rspack/binding-darwin-x64@2.1.4':
+ resolution: {integrity: sha512-bz/AsCplLs+3fXULPQU9d4r8H4PdeljgHFyItvVIrA/NKZqzQ8sX0topf/zJVZAOtPH7GNnrKjq0/F0U2DHikQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rspack/binding-linux-arm64-gnu@2.1.4':
+ resolution: {integrity: sha512-x0HQTLU1MusCtNamuXxf3ayEPkvh9uuaq4wVyBqveRkn4FznSOoHUsxTAKMnjGARX+vdLV/y/SwWJRDp2RI4zw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rspack/binding-linux-arm64-musl@2.1.4':
+ resolution: {integrity: sha512-SEYCQD9UflKJMkYGnG5nt2gcsqdkgJsQmryBC/jxo+bOuY9gUSReU99FqCt7WRQrsHLbGeAFeTWs1QzItWG/Bw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rspack/binding-linux-riscv64-gnu@2.1.4':
+ resolution: {integrity: sha512-jYtQKtnDRaVfyasvTGY04Z7m+xDWZYVwAIEOB4hP7czM7FVLOMgHlMlvw/EgF0DNHrBthqbPfBIS2tP50CzpEA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rspack/binding-linux-riscv64-musl@2.1.4':
+ resolution: {integrity: sha512-ZgxKjQAm9pidq2kChQO2PqKI9OQpLuGD7iPBuyT0gQg3m1+7vvbbkArLBPzJ12CQHVZvqua7n/QGx8pQjJI2Zw==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rspack/binding-linux-x64-gnu@2.1.4':
+ resolution: {integrity: sha512-C53B3e6M4yzlYn4hDxR9cHZV+HqkfFGR0zuhH8QCfdBfN5KyGsmXmujiFU85ANEvBgf9CF8VreBQeJ20lyto/g==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rspack/binding-linux-x64-musl@2.1.4':
+ resolution: {integrity: sha512-UaeG3FRo7e5RameQvWRNQ6KeXF29LEk67U/ohb9tF4U38mKH1OGqhmwCf5yLkqiOSgOi7Ff3ireOZD83Fso1iw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rspack/binding-wasm32-wasi@2.1.4':
+ resolution: {integrity: sha512-0P1WZEfu7JOPzD/jQfk9U/6gnRFc7RpvYCQaYZVVYZNJ2gU6O0/yLegRGKNK/2L0zjYwiD0ynhOIBVUUERf5Pw==}
+ cpu: [wasm32]
+
+ '@rspack/binding-win32-arm64-msvc@2.1.4':
+ resolution: {integrity: sha512-+aStQipk1EakLRPfD+/aQbtmTXfxqSWetcRRDWV3cAsD4ebv1tF8FLKYY1PCaFpQbX1FxzCBGF0KHxkAsi9cxA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rspack/binding-win32-ia32-msvc@2.1.4':
+ resolution: {integrity: sha512-7nyrLRQ07j6i6omZuwiwwTI6rpjdy/Su3niLDAG7WsLL21u3/UQQrw6Fvm8SH3XYteghoHLSM3dhgaisuUhdJg==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rspack/binding-win32-x64-msvc@2.1.4':
+ resolution: {integrity: sha512-Z4je7JBaDpO9vvNMgCxlycycRJq+GQwwuXSXagW2xvvGM10Ij63YVtIehSMG9xaW8PED41oc9nWndoEsiD60pA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rspack/binding@2.1.4':
+ resolution: {integrity: sha512-iye4BaTYtTt0qa39avWwEsUobVxFNhQHr6B8reFeKU7sdaZsC9LUoDR8JAt5gOnbnzFMPdKgrdU/VzkC6rXbIg==}
+
+ '@rspack/core@2.1.4':
+ resolution: {integrity: sha512-lpJgtr+JAXuDAMBJfRJ1LHyWVuYJyhZu6L6aj9t4lipUU03qwakHnzn3vwSCr68PsVvVPzR6NbJE1gJienSV0g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0
+ '@swc/helpers': ^0.5.23
+ peerDependenciesMeta:
+ '@module-federation/runtime-tools':
+ optional: true
+ '@swc/helpers':
+ optional: true
+
'@simple-libs/child-process-utils@2.0.0':
resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==}
engines: {node: '>=22'}
@@ -994,6 +1235,9 @@ packages:
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
'@types/node@22.20.1':
resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==}
@@ -1162,6 +1406,63 @@ packages:
'@vitest/utils@4.1.10':
resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ acorn-import-phases@1.0.4:
+ resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ acorn: ^8.14.0
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -1172,6 +1473,14 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
@@ -1223,6 +1532,11 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.10.44:
+ resolution: {integrity: sha512-T3ghW+sl/ZJ8w1v/yQx3qvJ9040DWoLBz8JT/CILbAKcFyG9b2MRe75v6W5uXjv6uH1lumK2Kv46y2zSkcej0Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
@@ -1233,6 +1547,14 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+ browserslist@4.28.6:
+ resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -1248,6 +1570,9 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ caniuse-lite@1.0.30001806:
+ resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==}
+
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
engines: {node: '>=18'}
@@ -1263,6 +1588,10 @@ packages:
chardet@2.2.0:
resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==}
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
clean-publish@5.2.2:
resolution: {integrity: sha512-sqM9uAXG+K7QzEn0Ur00otEHfbQTsyle4enj/388ZZQhG6daXMJ15dfD/ALsFCQCJvMZPxYwDx/QrdcdzWVPyg==}
engines: {node: '>= 18.0.0'}
@@ -1301,6 +1630,9 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
commitizen@4.3.2:
resolution: {integrity: sha512-1Zs37z9JPvAcuTSSricZZwBhOPVNNxJouuY4yDEt+eD70EoxT2TU9kViG8CuB/PmVg2G4XsAGQiK4YCst97aDQ==}
engines: {node: '>= 18'}
@@ -1383,12 +1715,19 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ electron-to-chromium@1.5.393:
+ resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==}
+
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ enhanced-resolve@5.24.3:
+ resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==}
+ engines: {node: '>=10.13.0'}
+
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
@@ -1415,6 +1754,10 @@ packages:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1427,6 +1770,14 @@ packages:
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
@@ -1434,6 +1785,10 @@ packages:
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
expand-tilde@2.0.2:
resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
engines: {node: '>=0.10.0'}
@@ -1506,6 +1861,12 @@ packages:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
+ glob-to-regex.js@1.2.0:
+ resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
@@ -1544,6 +1905,10 @@ packages:
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ hyperdyperid@1.2.0:
+ resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==}
+ engines: {node: '>=10.18'}
+
iconv-lite@0.7.3:
resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
engines: {node: '>=0.10.0'}
@@ -1646,6 +2011,10 @@ packages:
resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
engines: {node: '>=8'}
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -1755,6 +2124,10 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ loader-runner@4.3.2:
+ resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==}
+ engines: {node: '>=6.11.5'}
+
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
@@ -1782,10 +2155,16 @@ packages:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
+ memfs@4.64.0:
+ resolution: {integrity: sha512-Kw72fgY7Wn+sD8KmtNWSafl1dz0UvAsE/PHs3YVfLiaZuA3HxNm9sRLqAu0ATiBGJvME1PxZXbBZPv5GycDeAw==}
+
meow@14.1.0:
resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==}
engines: {node: '>=20'}
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@@ -1797,6 +2176,10 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -1807,6 +2190,49 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minimizer-webpack-plugin@5.6.1:
+ resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@minify-html/node': '*'
+ '@swc/core': '*'
+ '@swc/css': '*'
+ '@swc/html': '*'
+ clean-css: '*'
+ cssnano: '*'
+ csso: '*'
+ esbuild: '*'
+ html-minifier-terser: '*'
+ lightningcss: '*'
+ postcss: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@minify-html/node':
+ optional: true
+ '@swc/core':
+ optional: true
+ '@swc/css':
+ optional: true
+ '@swc/html':
+ optional: true
+ clean-css:
+ optional: true
+ cssnano:
+ optional: true
+ csso:
+ optional: true
+ esbuild:
+ optional: true
+ html-minifier-terser:
+ optional: true
+ lightningcss:
+ optional: true
+ postcss:
+ optional: true
+ uglify-js:
+ optional: true
+
mute-stream@0.0.8:
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
@@ -1828,6 +2254,13 @@ packages:
nanospinner@1.2.2:
resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==}
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-releases@2.0.51:
+ resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==}
+ engines: {node: '>=18'}
+
obug@2.1.4:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
@@ -1974,6 +2407,10 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
semver@7.8.5:
resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
@@ -2032,6 +2469,13 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@@ -2080,6 +2524,25 @@ packages:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
+ terser@5.49.0:
+ resolution: {integrity: sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ thingies@2.6.0:
+ resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==}
+ engines: {node: '>=10.18'}
+ peerDependencies:
+ tslib: ^2
+
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
@@ -2102,6 +2565,12 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ tree-dump@1.1.0:
+ resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -2125,6 +2594,12 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -2212,9 +2687,27 @@ packages:
jsdom:
optional: true
+ watchpack@2.5.2:
+ resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==}
+ engines: {node: '>=10.13.0'}
+
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ webpack-sources@3.5.1:
+ resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==}
+ engines: {node: '>=10.13.0'}
+
+ webpack@5.108.4:
+ resolution: {integrity: sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
@@ -2435,6 +2928,12 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@emnapi/core@1.11.2':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.2
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
@@ -2647,8 +3146,18 @@ snapshots:
optionalDependencies:
'@types/node': 22.20.1
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/resolve-uri@3.1.2': {}
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31':
@@ -2656,6 +3165,134 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-core@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ thingies: 2.6.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-fsa@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ thingies: 2.6.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-builtins@4.64.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-to-fsa@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-fsa': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-utils@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ glob-to-regex.js: 1.2.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-print': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-snapshot': 4.64.0(tslib@2.8.1)
+ glob-to-regex.js: 1.2.0(tslib@2.8.1)
+ thingies: 2.6.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-print@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-snapshot@4.64.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1)
+ '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ hyperdyperid: 1.2.0
+ thingies: 2.6.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ hyperdyperid: 1.2.0
+ thingies: 2.6.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/util@1.9.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/util@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
'@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
dependencies:
'@emnapi/core': 1.11.1
@@ -2663,6 +3300,13 @@ snapshots:
'@tybys/wasm-util': 0.10.3
optional: true
+ '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ dependencies:
+ '@emnapi/core': 1.11.2
+ '@emnapi/runtime': 1.11.2
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -2844,6 +3488,65 @@ snapshots:
'@rolldown/pluginutils@1.0.1': {}
+ '@rspack/binding-darwin-arm64@2.1.4':
+ optional: true
+
+ '@rspack/binding-darwin-x64@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-arm64-gnu@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-arm64-musl@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-riscv64-gnu@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-riscv64-musl@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-x64-gnu@2.1.4':
+ optional: true
+
+ '@rspack/binding-linux-x64-musl@2.1.4':
+ optional: true
+
+ '@rspack/binding-wasm32-wasi@2.1.4':
+ dependencies:
+ '@emnapi/core': 1.11.2
+ '@emnapi/runtime': 1.11.2
+ '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ optional: true
+
+ '@rspack/binding-win32-arm64-msvc@2.1.4':
+ optional: true
+
+ '@rspack/binding-win32-ia32-msvc@2.1.4':
+ optional: true
+
+ '@rspack/binding-win32-x64-msvc@2.1.4':
+ optional: true
+
+ '@rspack/binding@2.1.4':
+ optionalDependencies:
+ '@rspack/binding-darwin-arm64': 2.1.4
+ '@rspack/binding-darwin-x64': 2.1.4
+ '@rspack/binding-linux-arm64-gnu': 2.1.4
+ '@rspack/binding-linux-arm64-musl': 2.1.4
+ '@rspack/binding-linux-riscv64-gnu': 2.1.4
+ '@rspack/binding-linux-riscv64-musl': 2.1.4
+ '@rspack/binding-linux-x64-gnu': 2.1.4
+ '@rspack/binding-linux-x64-musl': 2.1.4
+ '@rspack/binding-wasm32-wasi': 2.1.4
+ '@rspack/binding-win32-arm64-msvc': 2.1.4
+ '@rspack/binding-win32-ia32-msvc': 2.1.4
+ '@rspack/binding-win32-x64-msvc': 2.1.4
+
+ '@rspack/core@2.1.4':
+ dependencies:
+ '@rspack/binding': 2.1.4
+
'@simple-libs/child-process-utils@2.0.0':
dependencies:
'@simple-libs/stream-utils': 2.0.0
@@ -2913,6 +3616,8 @@ snapshots:
'@types/estree@1.0.9': {}
+ '@types/json-schema@7.0.15': {}
+
'@types/node@22.20.1':
dependencies:
undici-types: 6.21.0
@@ -2993,7 +3698,7 @@ snapshots:
obug: 2.1.4
std-env: 4.2.0
tinyrainbow: 3.1.0
- vitest: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1))
+ vitest: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
'@vitest/expect@4.1.10':
dependencies:
@@ -3004,13 +3709,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1))':
+ '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))':
dependencies:
'@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)
+ vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
'@vitest/pretty-format@4.1.10':
dependencies:
@@ -3036,12 +3741,105 @@ snapshots:
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ acorn-import-phases@1.0.4(acorn@8.17.0):
+ dependencies:
+ acorn: 8.17.0
+
acorn-jsx@5.3.2(acorn@8.17.0):
dependencies:
acorn: 8.17.0
acorn@8.17.0: {}
+ ajv-formats@2.1.1:
+ dependencies:
+ ajv: 8.20.0
+
+ ajv-keywords@5.1.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+ fast-deep-equal: 3.1.3
+
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -3085,6 +3883,8 @@ snapshots:
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.10.44: {}
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
@@ -3100,6 +3900,16 @@ snapshots:
dependencies:
fill-range: 7.1.1
+ browserslist@4.28.6:
+ dependencies:
+ baseline-browser-mapping: 2.10.44
+ caniuse-lite: 1.0.30001806
+ electron-to-chromium: 1.5.393
+ node-releases: 2.0.51
+ update-browserslist-db: 1.2.3(browserslist@4.28.6)
+
+ buffer-from@1.1.2: {}
+
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
@@ -3111,6 +3921,8 @@ snapshots:
callsites@3.1.0: {}
+ caniuse-lite@1.0.30001806: {}
+
chai@6.2.2: {}
chalk@2.4.2:
@@ -3126,6 +3938,8 @@ snapshots:
chardet@2.2.0: {}
+ chrome-trace-event@1.0.4: {}
+
clean-publish@5.2.2:
dependencies:
cross-spawn: 7.0.6
@@ -3161,6 +3975,8 @@ snapshots:
color-name@1.1.4: {}
+ commander@2.20.3: {}
+
commitizen@4.3.2(@types/node@22.20.1)(typescript@7.0.2):
dependencies:
cachedir: 2.4.0
@@ -3266,10 +4082,17 @@ snapshots:
detect-libc@2.1.2: {}
+ electron-to-chromium@1.5.393: {}
+
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
+ enhanced-resolve@5.24.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
env-paths@2.2.1: {}
error-ex@1.3.4:
@@ -3313,6 +4136,11 @@ snapshots:
escape-string-regexp@1.0.5: {}
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.2.1: {}
@@ -3323,12 +4151,20 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.17.0)
eslint-visitor-keys: 4.2.1
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
estraverse@5.3.0: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.9
+ events@3.3.0: {}
+
expand-tilde@2.0.2:
dependencies:
homedir-polyfill: 1.0.3
@@ -3397,6 +4233,10 @@ snapshots:
dependencies:
is-glob: 4.0.3
+ glob-to-regex.js@1.2.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@@ -3445,6 +4285,8 @@ snapshots:
html-escaper@2.0.2: {}
+ hyperdyperid@1.2.0: {}
+
iconv-lite@0.7.3:
dependencies:
safer-buffer: 2.1.2
@@ -3534,6 +4376,12 @@ snapshots:
html-escaper: 2.0.2
istanbul-lib-report: 3.0.1
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 22.20.1
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
jiti@2.6.1: {}
js-tokens@10.0.0: {}
@@ -3609,6 +4457,8 @@ snapshots:
lines-and-columns@1.2.4: {}
+ loader-runner@4.3.2: {}
+
lodash.clonedeep@4.5.0: {}
lodash.map@4.6.0: {}
@@ -3636,8 +4486,27 @@ snapshots:
dependencies:
semver: 7.8.5
+ memfs@4.64.0:
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-fsa': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-to-fsa': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-print': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-snapshot': 4.64.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ glob-to-regex.js: 1.2.0(tslib@2.8.1)
+ thingies: 2.6.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
meow@14.1.0: {}
+ merge-stream@2.0.0: {}
+
merge2@1.4.1: {}
merge@2.1.1: {}
@@ -3647,6 +4516,8 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.2
+ mime-db@1.54.0: {}
+
mimic-fn@2.1.0: {}
minimatch@3.1.5:
@@ -3655,6 +4526,16 @@ snapshots:
minimist@1.2.8: {}
+ minimizer-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.108.4(esbuild@0.28.1)):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.49.0
+ webpack: 5.108.4(esbuild@0.28.1)
+ optionalDependencies:
+ esbuild: 0.28.1
+
mute-stream@0.0.8: {}
nano-staged@1.0.2: {}
@@ -3667,6 +4548,10 @@ snapshots:
dependencies:
picocolors: 1.1.1
+ neo-async@2.6.2: {}
+
+ node-releases@2.0.51: {}
+
obug@2.1.4: {}
once@1.4.0:
@@ -3833,6 +4718,13 @@ snapshots:
safer-buffer@2.1.2: {}
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.20.0
+ ajv-formats: 2.1.1
+ ajv-keywords: 5.1.0(ajv@8.20.0)
+
semver@7.8.5: {}
sharp@0.35.3(@types/node@22.20.1):
@@ -3900,6 +4792,13 @@ snapshots:
source-map-js@1.2.1: {}
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
stackback@0.0.2: {}
std-env@4.2.0: {}
@@ -3944,6 +4843,23 @@ snapshots:
dependencies:
has-flag: 4.0.0
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ tapable@2.3.3: {}
+
+ terser@5.49.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.17.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ thingies@2.6.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
through@2.3.8: {}
tinybench@2.9.0: {}
@@ -3961,6 +4877,10 @@ snapshots:
dependencies:
is-number: 7.0.0
+ tree-dump@1.1.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
tslib@2.8.1: {}
type-fest@0.21.3: {}
@@ -3994,9 +4914,15 @@ snapshots:
universalify@2.0.1: {}
+ update-browserslist-db@1.2.3(browserslist@4.28.6):
+ dependencies:
+ browserslist: 4.28.6
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
util-deprecate@1.0.2: {}
- vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1):
+ vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
@@ -4008,11 +4934,12 @@ snapshots:
esbuild: 0.28.1
fsevents: 2.3.3
jiti: 2.6.1
+ terser: 5.49.0
- vitest@4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)):
+ vitest@4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)):
dependencies:
'@vitest/expect': 4.1.10
- '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1))
+ '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
'@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.10
@@ -4029,7 +4956,7 @@ snapshots:
tinyexec: 1.2.4
tinyglobby: 0.2.17
tinyrainbow: 3.1.0
- vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)
+ vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.20.1
@@ -4037,10 +4964,54 @@ snapshots:
transitivePeerDependencies:
- msw
+ watchpack@2.5.2:
+ dependencies:
+ graceful-fs: 4.2.11
+
wcwidth@1.0.1:
dependencies:
defaults: 1.0.4
+ webpack-sources@3.5.1: {}
+
+ webpack@5.108.4(esbuild@0.28.1):
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.17.0
+ acorn-import-phases: 1.0.4(acorn@8.17.0)
+ browserslist: 4.28.6
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.24.3
+ es-module-lexer: 2.3.1
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ graceful-fs: 4.2.11
+ loader-runner: 4.3.2
+ mime-db: 1.54.0
+ minimizer-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.108.4(esbuild@0.28.1))
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.3
+ watchpack: 2.5.2
+ webpack-sources: 3.5.1
+ transitivePeerDependencies:
+ - '@minify-html/node'
+ - '@swc/core'
+ - '@swc/css'
+ - '@swc/html'
+ - clean-css
+ - cssnano
+ - csso
+ - esbuild
+ - html-minifier-terser
+ - lightningcss
+ - postcss
+ - uglify-js
+
which@1.3.1:
dependencies:
isexe: 2.0.0