diff --git a/.github/workflows/build-and-tests.yml b/.github/workflows/build-and-tests.yml index 992ec9eff..ef724b308 100644 --- a/.github/workflows/build-and-tests.yml +++ b/.github/workflows/build-and-tests.yml @@ -51,7 +51,7 @@ jobs: - name: Lint run: npm run ci:lint - name: Vulnerabilities - run: npm audit + run: npm audit --audit-level moderate - name: Optional Dependencies run: npm run test:package - name: Generated Code diff --git a/CHANGELOG.md b/CHANGELOG.md index 1de4b3bf8..968c5076d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # rollup changelog +## 4.43.0 + +_2025-06-11_ + +### Features + +- Provide new `fs` option and `this.fs` API to replace file system (#5944) + +### Pull Requests + +- [#5944](https://github.com/rollup/rollup/pull/5944): feat(options): Add an option for overriding the file system module in the JS API (@EggDice, @lukastaegert) + +## 4.42.0 + +_2025-06-06_ + +### Features + +- Add option to allow the input to be located in the output in watch mode (#5966) + +### Pull Requests + +- [#5966](https://github.com/rollup/rollup/pull/5966): feat: watch mode add `allowInputInsideOutputPath` option (@btea, @lukastaegert) + +## 4.41.2 + +_2025-06-06_ + +### Bug Fixes + +- Detect named export usages in dynamic imports with `then` and non-arrow function expressions (#5977) +- Do not replace usages of constant variables with their values for readability (#5968) + +### Pull Requests + +- [#5968](https://github.com/rollup/rollup/pull/5968): fix: preserve constant identifiers in unary expressions instead of magic numbers (@OmkarJ13, @lukastaegert) +- [#5969](https://github.com/rollup/rollup/pull/5969): chore(deps): update dependency yargs-parser to v22 (@renovate[bot], @lukastaegert) +- [#5970](https://github.com/rollup/rollup/pull/5970): chore(deps): lock file maintenance minor/patch updates (@renovate[bot]) +- [#5971](https://github.com/rollup/rollup/pull/5971): chore(deps): lock file maintenance (@renovate[bot]) +- [#5976](https://github.com/rollup/rollup/pull/5976): Update README.md (@ftlno, @lukastaegert) +- [#5977](https://github.com/rollup/rollup/pull/5977): fix: consider function expression in thenable when tree-shaking dynamic imports (@TrickyPi) +- [#5981](https://github.com/rollup/rollup/pull/5981): fix(deps): lock file maintenance minor/patch updates (@renovate[bot]) +- [#5982](https://github.com/rollup/rollup/pull/5982): Debug/fix watch pipeline (@lukastaegert) + ## 4.41.1 _2025-05-24_ diff --git a/README.md b/README.md index 52866181f..74b74b6b6 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Support this project by becoming a sponsor. Your logo will show up here with a l ## 特别赞助 -TNG Logo +TNG Logo TNG 自 2017 年以来一直在支持 [Lukas Taegert-Atkinson](https://github.com/lukastaegert) 在 Rollup 上的工作。 diff --git a/browser/package.json b/browser/package.json index 6d6934fe0..d21e7e229 100644 --- a/browser/package.json +++ b/browser/package.json @@ -1,6 +1,6 @@ { "name": "@rollup/browser", - "version": "4.41.1", + "version": "4.43.0", "description": "Next-generation ES module bundler browser build", "main": "dist/rollup.browser.js", "module": "dist/es/rollup.browser.js", diff --git a/browser/src/fs.ts b/browser/src/fs.ts index 290663f74..0dff3bf6c 100644 --- a/browser/src/fs.ts +++ b/browser/src/fs.ts @@ -1,5 +1,20 @@ +import type { RollupFsModule } from '../../src/rollup/types'; import { throwNoFileSystem } from './error'; +import type * as FsType from './fs.ts'; +// Ensure this satisfies the RollupFsModule API, will be removed by tree-shaking +const _typeTest = null as unknown as typeof FsType satisfies RollupFsModule; + +export const appendFile = throwNoFileSystem('fs.appendFile'); +export const copyFile = throwNoFileSystem('fs.copyFile'); export const mkdir = throwNoFileSystem('fs.mkdir'); +export const mkdtemp = throwNoFileSystem('fs.mkdtemp'); +export const readdir = throwNoFileSystem('fs.readdir'); export const readFile = throwNoFileSystem('fs.readFile'); +export const realpath = throwNoFileSystem('fs.realpath'); +export const rename = throwNoFileSystem('fs.rename'); +export const rmdir = throwNoFileSystem('fs.rmdir'); +export const stat = throwNoFileSystem('fs.stat'); +export const lstat = throwNoFileSystem('fs.lstat'); +export const unlink = throwNoFileSystem('fs.unlink'); export const writeFile = throwNoFileSystem('fs.writeFile'); diff --git a/browser/src/resolveId.ts b/browser/src/resolveId.ts deleted file mode 100644 index fb0d23378..000000000 --- a/browser/src/resolveId.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { ModuleLoaderResolveId } from '../../src/ModuleLoader'; -import type { CustomPluginOptions, Plugin, ResolveIdResult } from '../../src/rollup/types'; -import type { PluginDriver } from '../../src/utils/PluginDriver'; -import { resolveIdViaPlugins } from '../../src/utils/resolveIdViaPlugins'; -import { throwNoFileSystem } from './error'; - -export async function resolveId( - source: string, - importer: string | undefined, - _preserveSymlinks: boolean, - pluginDriver: PluginDriver, - moduleLoaderResolveId: ModuleLoaderResolveId, - skip: readonly { importer: string | undefined; plugin: Plugin; source: string }[] | null, - customOptions: CustomPluginOptions | undefined, - isEntry: boolean, - assertions: Record -): Promise { - const pluginResult = await resolveIdViaPlugins( - source, - importer, - pluginDriver, - moduleLoaderResolveId, - skip, - customOptions, - isEntry, - assertions - ); - if (pluginResult == null) { - return throwNoFileSystem('path.resolve')(); - } - return pluginResult[0]; -} diff --git a/build-plugins/replace-browser-modules.ts b/build-plugins/replace-browser-modules.ts index f1cecf2d1..84a59f85a 100644 --- a/build-plugins/replace-browser-modules.ts +++ b/build-plugins/replace-browser-modules.ts @@ -5,15 +5,7 @@ import type { Plugin } from 'vite'; const resolve = (path: string) => fileURLToPath(new URL(`../${path}`, import.meta.url)); -const JS_REPLACED_MODULES = [ - 'fs', - 'hookActions', - 'path', - 'performance', - 'process', - 'resolveId', - 'initWasm' -]; +const JS_REPLACED_MODULES = ['fs', 'hookActions', 'path', 'performance', 'process', 'initWasm']; type ModulesMap = [string, string][]; diff --git a/cli/help.md b/cli/help.md index 7a49dd45d..8c5560d02 100644 --- a/cli/help.md +++ b/cli/help.md @@ -90,6 +90,8 @@ Basic options: --no-treeshake.unknownGlobalSideEffects Assume unknown globals do not throw --validate Validate output --waitForBundleInput Wait for bundle input files +--watch.allowInputInsideOutputPath Whether the input path is allowed to be a + subpath of the output path --watch.buildDelay Throttle watch rebuilds --no-watch.clearScreen Do not clear the screen when rebuilding --watch.exclude Exclude files from being watched diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index ebbf95b67..277a32dbd 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -117,6 +117,10 @@ export default defineConfig({ link: '/es-module-syntax/', text: 'ES 模块语法' }, + { + link: '/browser/', + text: '在浏览器中运行 Rollup' + }, { link: '/faqs/', text: '常见问题' diff --git a/docs/browser/index.md b/docs/browser/index.md new file mode 100755 index 000000000..d1d9f5e05 --- /dev/null +++ b/docs/browser/index.md @@ -0,0 +1,134 @@ +--- +title: 在浏览器中运行 Rollup +--- + +# {{ $frontmatter.title }} + +[[toc]] + +## 浏览器构建 {#the-browser-build} + +虽然常规的 Rollup 构建依赖于一些 NodeJS 内置库,但也有一个仅使用浏览器 API 的浏览器构建可用。可以通过以下方式安装: + +```shell +npm install @rollup/browser +``` + +在你的脚本中,可以通过以下方式导入: + +```js +import { rollup } from '@rollup/browser'; +``` + +或者,你也可以从 CDN 导入,例如对于 ESM 构建: + +```js +import * as rollup from 'https://unpkg.com/@rollup/browser/dist/es/rollup.browser.js'; +``` + +对于 UMD 构建: + +```html + +``` + +这将创建一个全局变量 `window.rollup`。请注意,在每种情况下,你需要确保 `@rollup/browser` 包中的 `dist/bindings_wasm_bg.wasm` 文件与浏览器构建一起提供。 + +由于浏览器构建无法访问文件系统,你需要提供一个 [内存文件系统](#using-an-in-memory-file-system) 通过 [`fs`](../configuration-options/index.md#fs) 选项,或者你需要提供 [插件](#using-plugins-to-resolve-and-load-modules) 来解析和加载所有你想要打包的模块。 + +## 使用内存文件系统 {#using-an-in-memory-file-system} + +Rollup 允许你提供一个内存文件系统实现,该实现需要实现 NodeJS `fs` API 的至少一个子集,参见 [`fs`](../configuration-options/index.md#fs) 选项。这使得浏览器构建的行为非常类似于 NodeJS 构建,甚至允许你使用某些依赖于文件系统的插件,前提是它们只能通过 [`this.fs`](../plugin-development/index.md#this-fs) 插件上下文属性访问它。下面是一个使用 [`memfs`](https://www.npmjs.com/package/memfs) 的示例: + +```js twoslash +/** @type {import('rollup')} */ +var rollup; +// ---cut--- +import { rollup } from '@rollup/browser'; +import { Volume } from 'memfs'; + +const vol = Volume.fromJSON({ + '/main.js': "import foo from 'foo.js'; console.log(foo);", + '/foo.js': 'export default 42;' +}); + +rollup + .rollup({ + input: '/main.js', + fs: vol.promises + }) + .then(bundle => bundle.generate({ format: 'es' })) + .then(({ output }) => console.log(output[0].code)); +``` + +## 使用插件解析和加载模块 {#using-plugins-to-resolve-and-load-modules} + +你也可以通过插件解析和加载所有模块。下面是一个示例: + +```js twoslash +/** @type {import('rollup')} */ +var rollup; +// ---cut--- +const modules = { + 'main.js': "import foo from 'foo.js'; console.log(foo);", + 'foo.js': 'export default 42;' +}; + +rollup + .rollup({ + input: 'main.js', + plugins: [ + { + name: 'loader', + resolveId(source) { + if (modules.hasOwnProperty(source)) { + return source; + } + }, + load(id) { + if (modules.hasOwnProperty(id)) { + return modules[id]; + } + } + } + ] + }) + .then(bundle => bundle.generate({ format: 'es' })) + .then(({ output }) => console.log(output[0].code)); +``` + +这个示例只支持两个导入,`"main.js"` 和 `"foo.js"`,并且不支持相对导入。下面是一个使用绝对 URL 作为入口文件并支持相对导入的示例。在这种情况下,我们只是重新打包 Rollup 本身,但它可以用于任何其他暴露 ES 模块的 URL: + +```js twoslash +/** @type {import('rollup')} */ +var rollup; +// ---cut--- +rollup + .rollup({ + input: 'https://unpkg.com/rollup/dist/es/rollup.js', + plugins: [ + { + name: 'url-resolver', + resolveId(source, importer) { + if (source[0] !== '.') { + try { + new URL(source); + // If it is a valid URL, return it + return source; + } catch { + // Otherwise make it external + return { id: source, external: true }; + } + } + return new URL(source, importer).href; + }, + async load(id) { + const response = await fetch(id); + return response.text(); + } + } + ] + }) + .then(bundle => bundle.generate({ format: 'es' })) + .then(({ output }) => console.log(output)); +``` diff --git a/docs/command-line-interface/index.md b/docs/command-line-interface/index.md index 569b454b1..2373a0b5c 100755 --- a/docs/command-line-interface/index.md +++ b/docs/command-line-interface/index.md @@ -139,7 +139,8 @@ export default { clearScreen, exclude, include, - skipWrite + skipWrite, + allowInputInsideOutputPath } }; ``` @@ -459,6 +460,7 @@ export default { --no-treeshake.unknownGlobalSideEffects 假设未知的全局变量不会抛出异常 --validate 验证输出 --waitForBundleInput 等待打包输入文件 +--watch.allowInputInsideOutputPath 输入路径是否允许是输出路径的子路径 --watch.buildDelay 节流观察重建 --no-watch.clearScreen 重建时不要清除屏幕 --watch.exclude 排除要观察的文件 diff --git a/docs/configuration-options/index.md b/docs/configuration-options/index.md index b83e9aef4..b894a0782 100755 --- a/docs/configuration-options/index.md +++ b/docs/configuration-options/index.md @@ -2851,7 +2851,108 @@ const element = angular.element; 对于每个键的值,是一个数组,其中,第一个数值表示经过的时间,第二个数值表示内存消耗的变化,第三个数值表示此步骤完成后的总内存消耗。这些步骤的顺序是通过 `Object.keys` 确定的。顶层的键以 `#` 开头,包含嵌套步骤的耗时,例如,在上面例子中,耗时 698ms 的 `# BUILD` 步骤包含了耗时 539ms 的 `## parse modules` 步骤。 -## 观察选项 {#watch} +### fs + +| | | +| -----: | :----------------------------------------------- | +| 类型: | `RollupFsModule` | +| 默认: | NodeJS 中为 `node:fs.promises`,浏览器中无默认值 | + +如果想要使用自定义的文件系统模块,可以将此选项设置为一个实现了与 `RollupFsModule` 接口相同 API 的对象。这在想要使用不同的文件系统实现(如 [`memfs`](https://www.npmjs.com/package/memfs))、想要测试模拟文件系统,或者使用 Rollup 的 [浏览器构建](../browser/index.md) 时非常有用。 + +```typescript +interface RollupFsModule { + appendFile( + path: string, + data: string | Uint8Array, + options?: { + encoding?: BufferEncoding | null; + mode?: string | number; + flag?: string | number; + } + ): Promise; + + copyFile( + source: string, + destination: string, + mode?: string | number + ): Promise; + + mkdir( + path: string, + options?: { recursive?: boolean; mode?: string | number } + ): Promise; + + mkdtemp(prefix: string): Promise; + + readdir( + path: string, + options?: { withFileTypes?: boolean } + ): Promise<(string | RollupDirectoryEntry)[]>; + + readFile( + path: string, + options?: { + encoding?: BufferEncoding | null; + flag?: string | number; + signal?: AbortSignal; + } + ): Promise; + + realpath(path: string): Promise; + + rename(oldPath: string, newPath: string): Promise; + + rmdir(path: string, options?: { recursive?: boolean }): Promise; + + stat(path: string): Promise; + + lstat(path: string): Promise; + + unlink(path: string): Promise; + + writeFile( + path: string, + data: string | ArrayBuffer | ArrayBufferView, + options?: { + encoding?: BufferEncoding | null; + mode?: string | number; + flag?: string | number; + } + ): Promise; +} + +type BufferEncoding = + | 'ascii' + | 'utf8' + | 'utf16le' + | 'ucs2' + | 'base64' + | 'base64url' + | 'latin1' + | 'binary' + | 'hex'; + +export interface RollupDirectoryEntry { + isFile(): boolean; + isDirectory(): boolean; + isSymbolicLink(): boolean; + name: string; +} + +interface RollupFileStats { + isFile(): boolean; + isDirectory(): boolean; + isSymbolicLink(): boolean; + size: number; + mtime: Date; + ctime: Date; + atime: Date; + birthtime: Date; +} +``` + +## watch | | | | -----: | :------------------------ | @@ -2860,6 +2961,7 @@ const element = angular.element; ```typescript interface WatcherOptions { + allowInputInsideOutputPath?: boolean; buildDelay?: number; chokidar?: ChokidarOptions; clearScreen?: boolean; @@ -2892,7 +2994,17 @@ export default [ 这些选项仅在使用 `--watch` 标志或使用 `rollup.watch` 运行 Rollup 时生效。 -### watch.buildDelay {#watch-builddelay} +### watch.allowInputInsideOutputPath + +| | | +| --: | :-- | +| 类型: | `boolean` | +| CLI: | `--watch.allowInputInsideOutputPath`/`--no-watch.allowInputInsideOutputPath` | +| 默认: | `false` | + +该选项用于决定输入路径是否允许是输出路径的子路径。 + +### watch.buildDelay | | | | -----: | :---------------------------- | diff --git a/docs/faqs/index.md b/docs/faqs/index.md index b9ada7a7c..164448897 100755 --- a/docs/faqs/index.md +++ b/docs/faqs/index.md @@ -106,102 +106,6 @@ console.log('main'); Rollup 已经被许多主要的 JavaScript 库使用,并且也可以用于构建绝大多数应用程序。但是,如果你想在旧版浏览器中使用代码拆分或动态导入,则需要使用额外的运行时来处理加载丢失的块。我们建议使用 [SystemJS 构建产物作为生产环境](https://github.com/systemjs/systemjs#browser-production),因为它与 Rollup 的系统格式输出很好地集成,并且能够正确处理所有 ES 模块实时绑定和重新导出边缘情况。或者,也可以使用 AMD 加载器。 -## 我如何在浏览器中运行 Rollup? {#how-do-i-run-rollup-itself-in-a-browser} - -虽然常规的 Rollup 构建依赖于一些 NodeJS 特性,但还有一个仅使用浏览器 API 的浏览器版本可用。你可以通过以下方式安装它: - -```shell -npm install @rollup/browser -``` - -在你的脚本代码中,这样导入: - -```js -import { rollup } from '@rollup/browser'; -``` - -另外,你也可以从 CDN 导入,例如导入 ESM 格式产物: - -```js -import * as rollup from 'https://unpkg.com/@rollup/browser/dist/es/rollup.browser.js'; -``` - -而对于 UMD 格式产物: - -```html - -``` - -这将创建一个全局变量 `window.rollup`。由于浏览器构建无法访问文件系统,因此你需要提供解析和加载要捆绑的所有模块的插件。以下是一个虚构的示例: - -```js twoslash -/** @type {import('rollup')} */ -var rollup; -// ---cut--- -const modules = { - 'main.js': "import foo from 'foo.js'; console.log(foo);", - 'foo.js': 'export default 42;' -}; - -rollup - .rollup({ - input: 'main.js', - plugins: [ - { - name: 'loader', - resolveId(source) { - if (modules.hasOwnProperty(source)) { - return source; - } - }, - load(id) { - if (modules.hasOwnProperty(id)) { - return modules[id]; - } - } - } - ] - }) - .then(bundle => bundle.generate({ format: 'es' })) - .then(({ output }) => console.log(output[0].code)); -``` - -此示例仅支持两个导入,`"main.js"` 和 `"foo.js"`,不支持相对导入。以下是另一个示例,它使用绝对 URL 作为入口点,并支持相对导入。在这种情况下,我们只是重新打包 Rollup 本身,但它可以用于任何其他公开 ES 模块的 URL: - -```js twoslash -/** @type {import('rollup')} */ -var rollup; -// ---cut--- -rollup - .rollup({ - input: 'https://unpkg.com/rollup/dist/es/rollup.js', - plugins: [ - { - name: 'url-resolver', - resolveId(source, importer) { - if (source[0] !== '.') { - try { - new URL(source); - // If it is a valid URL, return it - return source; - } catch { - // Otherwise make it external - return { id: source, external: true }; - } - } - return new URL(source, importer).href; - }, - async load(id) { - const response = await fetch(id); - return response.text(); - } - } - ] - }) - .then(bundle => bundle.generate({ format: 'es' })) - .then(({ output }) => console.log(output)); -``` - -## Rollup logo 是谁制作的?太可爱了! {#who-made-the-rollup-logo-its-lovely} +## Who made the Rollup logo? It's lovely. [Julian Lloyd](https://github.com/jlmakes)! diff --git a/docs/guide/en/slugs-and-pages-by-legacy-slugs.json b/docs/guide/en/slugs-and-pages-by-legacy-slugs.json index 2381c75f8..927da056d 100644 --- a/docs/guide/en/slugs-and-pages-by-legacy-slugs.json +++ b/docs/guide/en/slugs-and-pages-by-legacy-slugs.json @@ -1 +1 @@ -{"--bundleconfigascjs":["command-line-interface","bundleconfigascjs"],"--configplugin-plugin":["command-line-interface","configplugin-plugin"],"--environment-values":["command-line-interface","environment-values"],"--failafterwarnings":["command-line-interface","failafterwarnings"],"--no-stdin":["command-line-interface","no-stdin"],"--silent":["command-line-interface","silent"],"--stdinext":["command-line-interface","stdinext"],"--waitforbundleinput":["command-line-interface","waitforbundleinput"],"-h--help":["command-line-interface","h-help"],"-v--version":["command-line-interface","v-version"],"-w--watch":["command-line-interface","w-watch"],"augmentchunkhash":["plugin-development","augmentchunkhash"],"babel":["tools","babel"],"banner":["plugin-development","banner"],"big-list-of-options":["configuration-options",""],"buildend":["plugin-development","buildend"],"buildstart":["plugin-development","buildstart"],"cache":["configuration-options","cache"],"closebundle":["plugin-development","closebundle"],"closewatcher":["plugin-development","closewatcher"],"command-line-reference":["command-line-interface",""],"context":["configuration-options","context"],"deno":["tools","deno"],"error-emfile-too-many-open-files":["troubleshooting","error-emfile-too-many-open-files"],"error-javascript-heap-out-of-memory":["troubleshooting","error:-javascript-heap-out-of-memory"],"error-name-is-not-exported-by-module":["troubleshooting","error-name-is-not-exported-by-module"],"error-node-tried-to-load-your-configuration-file-as-commonjs-even-though-it-is-likely-an-es-module":["troubleshooting","error-node-tried-to-load-your-configuration-file-as-commonjs-even-though-it-is-likely-an-es-module"],"error-this-is-undefined":["troubleshooting","error-this-is-undefined"],"es-module-syntax":["es-module-syntax",""],"eval2--eval":["troubleshooting","eval2-eval"],"experimentalcacheexpiry":["configuration-options","experimentalcacheexpiry"],"external":["configuration-options","external"],"faqs":["faqs",""],"footer":["plugin-development","footer"],"generatebundle":["plugin-development","generatebundle"],"gulp":["tools","gulp"],"input":["configuration-options","input"],"intro":["plugin-development","intro"],"introduction":["introduction",""],"javascript-api":["javascript-api",""],"load":["plugin-development","load"],"makeabsoluteexternalsrelative":["configuration-options","makeabsoluteexternalsrelative"],"maxparallelfileops":["configuration-options","maxparallelfileops"],"migration":["migration",""],"modulecontext":["configuration-options","modulecontext"],"moduleparsed":["plugin-development","moduleparsed"],"name":["plugin-development","name"],"new-function":["troubleshooting","new-function"],"onwarn":["configuration-options","onwarn"],"options":["plugin-development","options"],"outputamd":["configuration-options","output-amd"],"outputassetfilenames":["configuration-options","output-assetfilenames"],"outputbanneroutputfooter":["configuration-options","output-banner-output-footer"],"outputchunkfilenames":["configuration-options","output-chunkfilenames"],"outputcompact":["configuration-options","output-compact"],"outputdir":["configuration-options","output-dir"],"outputdynamicimportincjs":["configuration-options","output-dynamicimportincjs"],"outputentryfilenames":["configuration-options","output-entryfilenames"],"outputesmodule":["configuration-options","output-esmodule"],"outputexports":["configuration-options","output-exports"],"outputextend":["configuration-options","output-extend"],"outputexternalimportassertions":["configuration-options","output-externalimportassertions"],"outputexternallivebindings":["configuration-options","output-externallivebindings"],"outputfile":["configuration-options","output-file"],"outputformat":["configuration-options","output-format"],"outputfreeze":["configuration-options","output-freeze"],"outputgeneratedcode":["configuration-options","output-generatedcode"],"outputglobals":["configuration-options","output-globals"],"outputhoisttransitiveimports":["configuration-options","output-hoisttransitiveimports"],"outputindent":["configuration-options","output-indent"],"outputinlinedynamicimports":["configuration-options","output-inlinedynamicimports"],"outputinterop":["configuration-options","output-interop"],"outputintrooutputoutro":["configuration-options","output-intro-output-outro"],"outputmanualchunks":["configuration-options","output-manualchunks"],"outputminifyinternalexports":["configuration-options","output-minifyinternalexports"],"outputname":["configuration-options","output-name"],"outputnoconflict":["configuration-options","output-noconflict"],"outputoptions":["plugin-development","outputoptions"],"outputpaths":["configuration-options","output-paths"],"outputplugins":["configuration-options","output-plugins"],"outputpreservemodules":["configuration-options","output-preservemodules"],"outputpreservemodulesroot":["configuration-options","output-preservemodulesroot"],"outputsanitizefilename":["configuration-options","output-sanitizefilename"],"outputsourcemap":["configuration-options","output-sourcemap"],"outputsourcemapbaseurl":["configuration-options","output-sourcemapbaseurl"],"outputsourcemapexcludesources":["configuration-options","output-sourcemapexcludesources"],"outputsourcemapfile":["configuration-options","output-sourcemapfile"],"outputsourcemappathtransform":["configuration-options","output-sourcemappathtransform"],"outputstrict":["configuration-options","output-strict"],"outputsystemnullsetters":["configuration-options","output-systemnullsetters"],"outputvalidate":["configuration-options","output-validate"],"outro":["plugin-development","outro"],"perf":["configuration-options","perf"],"plugin-development":["plugin-development",""],"plugins":["configuration-options","plugins"],"preserveentrysignatures":["configuration-options","preserveentrysignatures"],"preservesymlinks":["configuration-options","preservesymlinks"],"renderchunk":["plugin-development","renderchunk"],"renderdynamicimport":["plugin-development","renderdynamicimport"],"rendererror":["plugin-development","rendererror"],"renderstart":["plugin-development","renderstart"],"resolvedynamicimport":["plugin-development","resolvedynamicimport"],"resolvefileurl":["plugin-development","resolvefileurl"],"resolveid":["plugin-development","resolveid"],"resolveimportmeta":["plugin-development","resolveimportmeta"],"rollupplugin-commonjs":["tools","rollupplugin-commonjs"],"rollupplugin-node-resolve":["tools","rollupplugin-node-resolve"],"rolluprollup":["javascript-api","rollup-rollup"],"rollupwatch":["javascript-api","rollup-watch"],"shimmissingexports":["configuration-options","shimmissingexports"],"shouldtransformcachedmodule":["plugin-development","shouldtransformcachedmodule"],"strictdeprecations":["configuration-options","strictdeprecations"],"thisaddwatchfile":["plugin-development","this-addwatchfile"],"thisemitfile":["plugin-development","this-emitfile"],"thiserror":["plugin-development","this-error"],"thisgetcombinedsourcemap":["plugin-development","this-getcombinedsourcemap"],"thisgetfilename":["plugin-development","this-getfilename"],"thisgetmoduleids":["plugin-development","this-getmoduleids"],"thisgetmoduleinfo":["plugin-development","this-getmoduleinfo"],"thisgetwatchfiles":["plugin-development","this-getwatchfiles"],"thisload":["plugin-development","this-load"],"thismeta":["plugin-development","this-meta"],"thisparse":["plugin-development","this-parse"],"thisresolve":["plugin-development","this-resolve"],"thissetassetsource":["plugin-development","this-setassetsource"],"thiswarn":["plugin-development","this-warn"],"tools":["tools",""],"transform":["plugin-development","transform"],"treeshake":["configuration-options","treeshake"],"troubleshooting":["troubleshooting",""],"tutorial":["tutorial",""],"warning-sourcemap-is-likely-to-be-incorrect":["troubleshooting","warning-sourcemap-is-likely-to-be-incorrect"],"warning-treating-module-as-external-dependency":["troubleshooting","warning-treating-module-as-external-dependency"],"watchbuilddelay":["configuration-options","watch-builddelay"],"watchchange":["plugin-development","watchchange"],"watchchokidar":["configuration-options","watch-chokidar"],"watchclearscreen":["configuration-options","watch-clearscreen"],"watchexclude":["configuration-options","watch-exclude"],"watchinclude":["configuration-options","watch-include"],"watchoptions":["javascript-api","watchoptions"],"watchskipwrite":["configuration-options","watch-skipwrite"],"writebundle":["plugin-development","writebundle"]} \ No newline at end of file +{"--bundleconfigascjs":["command-line-interface","bundleconfigascjs"],"--configplugin-plugin":["command-line-interface","configplugin-plugin"],"--environment-values":["command-line-interface","environment-values"],"--failafterwarnings":["command-line-interface","failafterwarnings"],"--no-stdin":["command-line-interface","no-stdin"],"--silent":["command-line-interface","silent"],"--stdinext":["command-line-interface","stdinext"],"--waitforbundleinput":["command-line-interface","waitforbundleinput"],"-h--help":["command-line-interface","h-help"],"-v--version":["command-line-interface","v-version"],"-w--watch":["command-line-interface","w-watch"],"augmentchunkhash":["plugin-development","augmentchunkhash"],"babel":["tools","babel"],"banner":["plugin-development","banner"],"big-list-of-options":["configuration-options",""],"buildend":["plugin-development","buildend"],"buildstart":["plugin-development","buildstart"],"cache":["configuration-options","cache"],"closebundle":["plugin-development","closebundle"],"closewatcher":["plugin-development","closewatcher"],"command-line-reference":["command-line-interface",""],"context":["configuration-options","context"],"deno":["tools","deno"],"error-emfile-too-many-open-files":["troubleshooting","error-emfile-too-many-open-files"],"error-javascript-heap-out-of-memory":["troubleshooting","error:-javascript-heap-out-of-memory"],"error-name-is-not-exported-by-module":["troubleshooting","error-name-is-not-exported-by-module"],"error-node-tried-to-load-your-configuration-file-as-commonjs-even-though-it-is-likely-an-es-module":["troubleshooting","error-node-tried-to-load-your-configuration-file-as-commonjs-even-though-it-is-likely-an-es-module"],"error-this-is-undefined":["troubleshooting","error-this-is-undefined"],"es-module-syntax":["es-module-syntax",""],"eval2--eval":["troubleshooting","eval2-eval"],"experimentalcacheexpiry":["configuration-options","experimentalcacheexpiry"],"external":["configuration-options","external"],"faqs":["faqs",""],"footer":["plugin-development","footer"],"generatebundle":["plugin-development","generatebundle"],"gulp":["tools","gulp"],"input":["configuration-options","input"],"intro":["plugin-development","intro"],"introduction":["introduction",""],"javascript-api":["javascript-api",""],"load":["plugin-development","load"],"makeabsoluteexternalsrelative":["configuration-options","makeabsoluteexternalsrelative"],"maxparallelfileops":["configuration-options","maxparallelfileops"],"migration":["migration",""],"modulecontext":["configuration-options","modulecontext"],"moduleparsed":["plugin-development","moduleparsed"],"name":["plugin-development","name"],"new-function":["troubleshooting","new-function"],"onwarn":["configuration-options","onwarn"],"options":["plugin-development","options"],"outputamd":["configuration-options","output-amd"],"outputassetfilenames":["configuration-options","output-assetfilenames"],"outputbanneroutputfooter":["configuration-options","output-banner-output-footer"],"outputchunkfilenames":["configuration-options","output-chunkfilenames"],"outputcompact":["configuration-options","output-compact"],"outputdir":["configuration-options","output-dir"],"outputdynamicimportincjs":["configuration-options","output-dynamicimportincjs"],"outputentryfilenames":["configuration-options","output-entryfilenames"],"outputesmodule":["configuration-options","output-esmodule"],"outputexports":["configuration-options","output-exports"],"outputextend":["configuration-options","output-extend"],"outputexternalimportassertions":["configuration-options","output-externalimportassertions"],"outputexternallivebindings":["configuration-options","output-externallivebindings"],"outputfile":["configuration-options","output-file"],"outputformat":["configuration-options","output-format"],"outputfreeze":["configuration-options","output-freeze"],"outputgeneratedcode":["configuration-options","output-generatedcode"],"outputglobals":["configuration-options","output-globals"],"outputhoisttransitiveimports":["configuration-options","output-hoisttransitiveimports"],"outputindent":["configuration-options","output-indent"],"outputinlinedynamicimports":["configuration-options","output-inlinedynamicimports"],"outputinterop":["configuration-options","output-interop"],"outputintrooutputoutro":["configuration-options","output-intro-output-outro"],"outputmanualchunks":["configuration-options","output-manualchunks"],"outputminifyinternalexports":["configuration-options","output-minifyinternalexports"],"outputname":["configuration-options","output-name"],"outputnoconflict":["configuration-options","output-noconflict"],"outputoptions":["plugin-development","outputoptions"],"outputpaths":["configuration-options","output-paths"],"outputplugins":["configuration-options","output-plugins"],"outputpreservemodules":["configuration-options","output-preservemodules"],"outputpreservemodulesroot":["configuration-options","output-preservemodulesroot"],"outputsanitizefilename":["configuration-options","output-sanitizefilename"],"outputsourcemap":["configuration-options","output-sourcemap"],"outputsourcemapbaseurl":["configuration-options","output-sourcemapbaseurl"],"outputsourcemapexcludesources":["configuration-options","output-sourcemapexcludesources"],"outputsourcemapfile":["configuration-options","output-sourcemapfile"],"outputsourcemappathtransform":["configuration-options","output-sourcemappathtransform"],"outputstrict":["configuration-options","output-strict"],"outputsystemnullsetters":["configuration-options","output-systemnullsetters"],"outputvalidate":["configuration-options","output-validate"],"outro":["plugin-development","outro"],"perf":["configuration-options","perf"],"plugin-development":["plugin-development",""],"plugins":["configuration-options","plugins"],"preserveentrysignatures":["configuration-options","preserveentrysignatures"],"preservesymlinks":["configuration-options","preservesymlinks"],"renderchunk":["plugin-development","renderchunk"],"renderdynamicimport":["plugin-development","renderdynamicimport"],"rendererror":["plugin-development","rendererror"],"renderstart":["plugin-development","renderstart"],"resolvedynamicimport":["plugin-development","resolvedynamicimport"],"resolvefileurl":["plugin-development","resolvefileurl"],"resolveid":["plugin-development","resolveid"],"resolveimportmeta":["plugin-development","resolveimportmeta"],"rollupplugin-commonjs":["tools","rollupplugin-commonjs"],"rollupplugin-node-resolve":["tools","rollupplugin-node-resolve"],"rolluprollup":["javascript-api","rollup-rollup"],"rollupwatch":["javascript-api","rollup-watch"],"shimmissingexports":["configuration-options","shimmissingexports"],"shouldtransformcachedmodule":["plugin-development","shouldtransformcachedmodule"],"strictdeprecations":["configuration-options","strictdeprecations"],"thisaddwatchfile":["plugin-development","this-addwatchfile"],"thisemitfile":["plugin-development","this-emitfile"],"thiserror":["plugin-development","this-error"],"thisgetcombinedsourcemap":["plugin-development","this-getcombinedsourcemap"],"thisgetfilename":["plugin-development","this-getfilename"],"thisgetmoduleids":["plugin-development","this-getmoduleids"],"thisgetmoduleinfo":["plugin-development","this-getmoduleinfo"],"thisgetwatchfiles":["plugin-development","this-getwatchfiles"],"thisload":["plugin-development","this-load"],"thismeta":["plugin-development","this-meta"],"thisparse":["plugin-development","this-parse"],"thisresolve":["plugin-development","this-resolve"],"thissetassetsource":["plugin-development","this-setassetsource"],"thiswarn":["plugin-development","this-warn"],"tools":["tools",""],"transform":["plugin-development","transform"],"treeshake":["configuration-options","treeshake"],"troubleshooting":["troubleshooting",""],"tutorial":["tutorial",""],"warning-sourcemap-is-likely-to-be-incorrect":["troubleshooting","warning-sourcemap-is-likely-to-be-incorrect"],"warning-treating-module-as-external-dependency":["troubleshooting","warning-treating-module-as-external-dependency"],"watch-options":["configuration-options","watch"],"watchbuilddelay":["configuration-options","watch-builddelay"],"watchchange":["plugin-development","watchchange"],"watchchokidar":["configuration-options","watch-chokidar"],"watchclearscreen":["configuration-options","watch-clearscreen"],"watchexclude":["configuration-options","watch-exclude"],"watchinclude":["configuration-options","watch-include"],"watchoptions":["javascript-api","watchoptions"],"watchskipwrite":["configuration-options","watch-skipwrite"],"who-made-the-rollup-logo-its-lovely":["faqs","who-made-the-rollup-logo-it-s-lovely"],"writebundle":["plugin-development","writebundle"]} \ No newline at end of file diff --git a/docs/javascript-api/index.md b/docs/javascript-api/index.md index 94441d9e6..b030ebc8c 100755 --- a/docs/javascript-api/index.md +++ b/docs/javascript-api/index.md @@ -167,7 +167,8 @@ const inputOptions = { // 实验性 experimentalCacheExpiry, experimentalLogSideEffects, - perf + perf, + fs }; ``` @@ -320,6 +321,7 @@ const watchOptions = { ...inputOptions, output: [outputOptions], watch: { + allowInputInsideOutputPath, buildDelay, chokidar, clearScreen, diff --git a/docs/plugin-development/index.md b/docs/plugin-development/index.md index f5962df8b..05ac021b4 100644 --- a/docs/plugin-development/index.md +++ b/docs/plugin-development/index.md @@ -1596,6 +1596,14 @@ function myPlugin() { 当在 `transform` 钩子中使用时,当前模块的 `id` 也将被添加,并且可以提供一个 `position`。这是一个字符索引或文件位置,它将用于增强日志,包括 `pos`,`loc`(一个标准的 `{ file, line, column }` 对象)和 `frame`(显示位置的代码片段)。 +### this.fs + +| | | +| -----: | :--------------- | +| 类型: | `RollupFsModule` | + +提供对文件系统的抽象访问。有关 `RollupFsModule` 类型的信息,请参阅 [`fs` 选项](../configuration-options/index.md#fs) 的文档。如果插件使用此选项而不是直接导入 `node:fs`,则它们可以在提供内存文件系统的浏览器构建中使用。 + ### this.getCombinedSourcemap | | | diff --git a/package-lock.json b/package-lock.json index aee11d6d1..e82217701 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rollup", - "version": "4.41.1", + "version": "4.43.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rollup", - "version": "4.41.1", + "version": "4.43.0", "license": "MIT", "dependencies": { "@types/estree": "1.0.7" @@ -17,11 +17,11 @@ "devDependencies": { "@codemirror/commands": "^6.8.1", "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/language": "^6.11.0", + "@codemirror/language": "^6.11.1", "@codemirror/search": "^6.5.11", "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.36.8", - "@eslint/js": "^9.27.0", + "@codemirror/view": "^6.37.1", + "@eslint/js": "^9.28.0", "@inquirer/prompts": "^7.5.3", "@jridgewell/sourcemap-codec": "^1.5.0", "@mermaid-js/mermaid-cli": "^11.4.2", @@ -37,7 +37,7 @@ "@rollup/pluginutils": "^5.1.4", "@shikijs/vitepress-twoslash": "^3.4.2", "@types/mocha": "^10.0.10", - "@types/node": "^18.19.103", + "@types/node": "^18.19.110", "@types/picomatch": "^4.0.0", "@types/semver": "^7.7.0", "@types/yargs-parser": "^21.0.3", @@ -54,9 +54,9 @@ "date-time": "^4.0.0", "es5-shim": "^4.6.7", "es6-shim": "^0.35.8", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-prettier": "^5.4.1", "eslint-plugin-unicorn": "^59.0.1", "eslint-plugin-vue": "^10.1.0", "fixturify": "^3.0.0", @@ -66,9 +66,10 @@ "globals": "^16.2.0", "husky": "^9.1.7", "is-reference": "^3.0.3", - "lint-staged": "^16.0.0", + "lint-staged": "^16.1.0", "locate-character": "^3.0.0", "magic-string": "^0.30.17", + "memfs": "^4.17.0", "mocha": "^11.5.0", "nodemon": "^3.1.10", "nyc": "^17.1.0", @@ -89,13 +90,13 @@ "source-map": "^0.7.4", "source-map-support": "^0.5.21", "systemjs": "^6.15.1", - "terser": "^5.39.2", + "terser": "^5.40.0", "tslib": "^2.8.1", "typescript": "^5.8.3", - "typescript-eslint": "^8.32.1", + "typescript-eslint": "^8.33.1", "vite": "^6.3.5", "vitepress": "^1.6.3", - "vue": "^3.5.15", + "vue": "^3.5.16", "vue-tsc": "^2.2.10", "wasm-pack": "^0.13.1", "yargs-parser": "^21.1.1" @@ -158,41 +159,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.25.0.tgz", - "integrity": "sha512-1pfQulNUYNf1Tk/svbfjfkLBS36zsuph6m+B6gDkPEivFmso/XnRgwDvjAx80WNtiHnmeNjIXdF7Gos8+OLHqQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.27.0.tgz", + "integrity": "sha512-SITU5umoknxETtw67TxJu9njyMkWiH8pM+Bvw4dzfuIrIAT6Y1rmwV4y0A0didWoT+6xVuammIykbtBMolBcmg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.25.0.tgz", - "integrity": "sha512-AFbG6VDJX/o2vDd9hqncj1B6B4Tulk61mY0pzTtzKClyTDlNP0xaUiEKhl6E7KO9I/x0FJF5tDCm0Hn6v5x18A==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.27.0.tgz", + "integrity": "sha512-go1b9qIZK5vYEQ7jD2bsfhhhVsoh9cFxQ5xF8TzTsg2WOCZR3O92oXCkq15SOK0ngJfqDU6a/k0oZ4KuEnih1Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.25.0.tgz", - "integrity": "sha512-il1zS/+Rc6la6RaCdSZ2YbJnkQC6W1wiBO8+SH+DE6CPMWBU6iDVzH0sCKSAtMWl9WBxoN6MhNjGBnCv9Yy2bA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.27.0.tgz", + "integrity": "sha512-tnFOzdNuMzsz93kOClj3fKfuYoF3oYaEB5bggULSj075GJ7HUNedBEm7a6ScrjtnOaOtipbnT7veUpHA4o4wEQ==", "dev": true, "license": "MIT", "engines": { @@ -200,151 +201,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.25.0.tgz", - "integrity": "sha512-blbjrUH1siZNfyCGeq0iLQu00w3a4fBXm0WRIM0V8alcAPo7rWjLbMJMrfBtzL9X5ic6wgxVpDADXduGtdrnkw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.27.0.tgz", + "integrity": "sha512-y1qgw39qZijjQBXrqZTiwK1cWgWGRiLpJNWBv9w36nVMKfl9kInrfsYmdBAfmlhVgF/+Woe0y1jQ7pa4HyShAw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.25.0.tgz", - "integrity": "sha512-aywoEuu1NxChBcHZ1pWaat0Plw7A8jDMwjgRJ00Mcl7wGlwuPt5dJ/LTNcg3McsEUbs2MBNmw0ignXBw9Tbgow==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.27.0.tgz", + "integrity": "sha512-XluG9qPZKEbiLoIfXTKbABsWDNOMPx0t6T2ImJTTeuX+U/zBdmfcqqgcgkqXp+vbXof/XX/4of9Eqo1JaqEmKw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.25.0.tgz", - "integrity": "sha512-a/W2z6XWKjKjIW1QQQV8PTTj1TXtaKx79uR3NGBdBdGvVdt24KzGAaN7sCr5oP8DW4D3cJt44wp2OY/fZcPAVA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.27.0.tgz", + "integrity": "sha512-V8/To+SsAl2sdw2AAjeLJuCW1L+xpz+LAGerJK7HKqHzE5yQhWmIWZTzqYQcojkii4iBMYn0y3+uReWqT8XVSQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.25.0.tgz", - "integrity": "sha512-9rUYcMIBOrCtYiLX49djyzxqdK9Dya/6Z/8sebPn94BekT+KLOpaZCuc6s0Fpfq7nx5J6YY5LIVFQrtioK9u0g==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.27.0.tgz", + "integrity": "sha512-EJJ7WmvmUXZdchueKFCK8UZFyLqy4Hz64snNp0cTc7c0MKaSeDGYEDxVsIJKp15r7ORaoGxSyS4y6BGZMXYuCg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.25.0.tgz", - "integrity": "sha512-jJeH/Hk+k17Vkokf02lkfYE4A+EJX+UgnMhTLR/Mb+d1ya5WhE+po8p5a/Nxb6lo9OLCRl6w3Hmk1TX1e9gVbQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.27.0.tgz", + "integrity": "sha512-xNCyWeqpmEo4EdmpG57Fs1fJIQcPwt5NnJ6MBdXnUdMVXF4f5PHgza+HQWQQcYpCsune96jfmR0v7us6gRIlCw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.25.0.tgz", - "integrity": "sha512-Ls3i1AehJ0C6xaHe7kK9vPmzImOn5zBg7Kzj8tRYIcmCWVyuuFwCIsbuIIz/qzUf1FPSWmw0TZrGeTumk2fqXg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.27.0.tgz", + "integrity": "sha512-P0NDiEFyt9UYQLBI0IQocIT7xHpjMpoFN3UDeerbztlkH9HdqT0GGh1SHYmNWpbMWIGWhSJTtz6kSIWvFu4+pw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.25.0.tgz", - "integrity": "sha512-79sMdHpiRLXVxSjgw7Pt4R1aNUHxFLHiaTDnN2MQjHwJ1+o3wSseb55T9VXU4kqy3m7TUme3pyRhLk5ip/S4Mw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.27.0.tgz", + "integrity": "sha512-cqfTMF1d1cc7hg0vITNAFxJZas7MJ4Obc36WwkKpY23NOtGb+4tH9X7UKlQa2PmTgbXIANoJ/DAQTeiVlD2I4Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.25.0.tgz", - "integrity": "sha512-JLaF23p1SOPBmfEqozUAgKHQrGl3z/Z5RHbggBu6s07QqXXcazEsub5VLonCxGVqTv6a61AAPr8J1G5HgGGjEw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.27.0.tgz", + "integrity": "sha512-ErenYTcXl16wYXtf0pxLl9KLVxIztuehqXHfW9nNsD8mz9OX42HbXuPzT7y6JcPiWJpc/UU/LY5wBTB65vsEUg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.25.0.tgz", - "integrity": "sha512-rtzXwqzFi1edkOF6sXxq+HhmRKDy7tz84u0o5t1fXwz0cwx+cjpmxu/6OQKTdOJFS92JUYHsG51Iunie7xbqfQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.27.0.tgz", + "integrity": "sha512-CNOvmXsVi+IvT7z1d+6X7FveVkgEQwTNgipjQCHTIbF9KSMfZR7tUsJC+NpELrm10ALdOMauah84ybs9rw1cKQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.25.0.tgz", - "integrity": "sha512-ZO0UKvDyEFvyeJQX0gmZDQEvhLZ2X10K+ps6hViMo1HgE2V8em00SwNsQ+7E/52a+YiBkVWX61pJJJE44juDMQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.27.0.tgz", + "integrity": "sha512-Nx9EdLYZDsaYFTthqmc0XcVvsx6jqeEX8fNiYOB5i2HboQwl8pJPj1jFhGqoGd0KG7KFR+sdPO5/e0EDDAru2Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" @@ -417,9 +418,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", - "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, "license": "MIT", "engines": { @@ -427,9 +428,9 @@ } }, "node_modules/@babel/core": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.3.tgz", - "integrity": "sha512-hyrN8ivxfvJ4i0fIJuV4EOlV0WDMz5Ui4StRTgVaAvWeiRCilXgwVvxJKtFQ3TKtHgJscB2YiXKGNJuVwhQMtA==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "license": "MIT", "dependencies": { @@ -438,10 +439,10 @@ "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.3", - "@babel/parser": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.3", + "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -465,13 +466,13 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", - "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.3", + "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", @@ -561,23 +562,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz", - "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", - "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { @@ -606,15 +607,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", - "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", @@ -635,9 +636,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -742,9 +743,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", - "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.1.tgz", + "integrity": "sha512-5kS1U7emOGV84vxC+ruBty5sUgcD0te6dyupyRVG2zaSjhTDM73LhVKUtVwiqSe6QwmEoA4SCiU8AKPFyumAWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -791,13 +792,14 @@ } }, "node_modules/@codemirror/view": { - "version": "6.37.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.37.0.tgz", - "integrity": "sha512-ghHIeRGfWB8h9Tc3sMdr7D5zp4sZvlCzG36Xjdh2ymmfAwvSaCJAAsL3HLyLEnHcE953+5Uox1bx5OS+YCW/7Q==", + "version": "6.37.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.37.1.tgz", + "integrity": "sha512-Qy4CAUwngy/VQkEz0XzMKVRcckQuqLYWKqVpDDDghBe5FSXSqfVrJn49nw3ePZHxRUz4nRmb05Lgi+9csWo4eg==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } @@ -1506,9 +1508,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", - "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, "license": "MIT", "engines": { @@ -1543,9 +1545,9 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", "dev": true, "license": "MIT", "dependencies": { @@ -1553,13 +1555,13 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", "dev": true, "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.0", + "@floating-ui/core": "^1.7.1", "@floating-ui/utils": "^0.2.9" } }, @@ -1721,9 +1723,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.36.tgz", - "integrity": "sha512-ZMpVdoW/7hhbt2aHVSvudjH8eSVNNjKkAAjwAQHgiuPUiIfbvNakVin+H9uhUz4N9TbDT/nanzV/4Slb+6dDXw==", + "version": "1.2.37", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.37.tgz", + "integrity": "sha512-jZwTBznpYVDYKWyAuRpepPpCiHScVrX6f8WRX8ReX6pdii99LYVHwJywKcH2excWQrWmBomC9nkxGlEKzXZ/wQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -2341,6 +2343,63 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", + "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@lezer/common": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", @@ -2500,9 +2559,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", + "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", "dev": true, "license": "MIT", "engines": { @@ -3036,59 +3095,59 @@ ] }, "node_modules/@shikijs/core": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.4.2.tgz", - "integrity": "sha512-AG8vnSi1W2pbgR2B911EfGqtLE9c4hQBYkv/x7Z+Kt0VxhgQKcW7UNDVYsu9YxwV6u+OJrvdJrMq6DNWoBjihQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.6.0.tgz", + "integrity": "sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.4.2", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.4.2.tgz", - "integrity": "sha512-1/adJbSMBOkpScCE/SB6XkjJU17ANln3Wky7lOmrnpl+zBdQ1qXUJg2GXTYVHRq+2j3hd1DesmElTXYDgtfSOQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.6.0.tgz", + "integrity": "sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.4.2", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.4.2.tgz", - "integrity": "sha512-zcZKMnNndgRa3ORja6Iemsr3DrLtkX3cAF7lTJkdMB6v9alhlBsX9uNiCpqofNrXOvpA3h6lHcLJxgCIhVOU5Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.6.0.tgz", + "integrity": "sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.4.2", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.4.2.tgz", - "integrity": "sha512-H6azIAM+OXD98yztIfs/KH5H4PU39t+SREhmM8LaNXyUrqj2mx+zVkr8MWYqjceSjDw9I1jawm1WdFqU806rMA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.6.0.tgz", + "integrity": "sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.4.2" + "@shikijs/types": "3.6.0" } }, "node_modules/@shikijs/themes": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.4.2.tgz", - "integrity": "sha512-qAEuAQh+brd8Jyej2UDDf+b4V2g1Rm8aBIdvt32XhDPrHvDkEnpb7Kzc9hSuHUxz0Iuflmq7elaDuQAP9bHIhg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.6.0.tgz", + "integrity": "sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.4.2" + "@shikijs/types": "3.6.0" } }, "node_modules/@shikijs/transformers": { @@ -3164,14 +3223,14 @@ } }, "node_modules/@shikijs/twoslash": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.4.2.tgz", - "integrity": "sha512-zRNPmi2lA8o+k7UQfmbPwH2jPvfW9OrgpsO4OUOM+8QTxrepFU9TNF8vNcxZEW5cbishQkJrV19cI9Zk3cb5aQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.6.0.tgz", + "integrity": "sha512-AxRxLWtmrVftwxN/2hSL6Hym+bannS+zuUEXpbNuo6BpG4jHTM0KEkICEH3B3Gm5ZNzGdI74NdDiAqAZ6WPJuQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "3.4.2", - "@shikijs/types": "3.4.2", + "@shikijs/core": "3.6.0", + "@shikijs/types": "3.6.0", "twoslash": "^0.3.1" }, "peerDependencies": { @@ -3179,9 +3238,9 @@ } }, "node_modules/@shikijs/types": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.4.2.tgz", - "integrity": "sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.6.0.tgz", + "integrity": "sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==", "dev": true, "license": "MIT", "dependencies": { @@ -3190,9 +3249,9 @@ } }, "node_modules/@shikijs/vitepress-twoslash": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-3.4.2.tgz", - "integrity": "sha512-irVhypyX0vs79S00buqBGYeBJnBtBV50nqppPcKz3TiGlaWxH3BqcCLbJ6cl39N1hxzzuI51SVQv21SbjfsCBA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-3.6.0.tgz", + "integrity": "sha512-pUoRj98UDV41CxfxPysrBryc1/1WdUL93ogcD/s156i4XcujnCfJJc+y5vR3W5Nc1R31VUacwWsI8HhaRRS/uA==", "dev": true, "license": "MIT", "dependencies": { @@ -3201,10 +3260,10 @@ "mdast-util-from-markdown": "^2.0.2", "mdast-util-gfm": "^3.1.0", "mdast-util-to-hast": "^13.2.0", - "shiki": "3.4.2", + "shiki": "3.6.0", "twoslash": "^0.3.1", "twoslash-vue": "^0.3.1", - "vue": "^3.5.14" + "vue": "^3.5.16" } }, "node_modules/@shikijs/vscode-textmate": { @@ -3686,9 +3745,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.107", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.107.tgz", - "integrity": "sha512-uvHN/vnsPj8hJWaqXUjT59LKYh0RlZXsdYa4CGz4R9aFGePPsUPN0xlHrDzOset937H2TunFJ8SwPCX69y9qhA==", + "version": "18.19.111", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.111.tgz", + "integrity": "sha512-90sGdgA+QLJr1F9X79tQuEut0gEYIfkX9pydI4XGRgvFo9g2JWswefI+WUSUHPYVBHYSEfTEqBxA5hQvAZB3Mw==", "dev": true, "license": "MIT", "dependencies": { @@ -3779,17 +3838,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.0.tgz", - "integrity": "sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", + "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.33.0", - "@typescript-eslint/type-utils": "8.33.0", - "@typescript-eslint/utils": "8.33.0", - "@typescript-eslint/visitor-keys": "8.33.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/type-utils": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3803,15 +3862,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.33.0", + "@typescript-eslint/parser": "^8.34.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", - "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -3819,16 +3878,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.0.tgz", - "integrity": "sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.33.0", - "@typescript-eslint/types": "8.33.0", - "@typescript-eslint/typescript-estree": "8.33.0", - "@typescript-eslint/visitor-keys": "8.33.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4" }, "engines": { @@ -3844,14 +3903,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.0.tgz", - "integrity": "sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.33.0", - "@typescript-eslint/types": "^8.33.0", + "@typescript-eslint/tsconfig-utils": "^8.34.0", + "@typescript-eslint/types": "^8.34.0", "debug": "^4.3.4" }, "engines": { @@ -3860,17 +3919,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz", - "integrity": "sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.0", - "@typescript-eslint/visitor-keys": "8.33.0" + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3881,9 +3943,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz", - "integrity": "sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", "dev": true, "license": "MIT", "engines": { @@ -3898,14 +3960,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.0.tgz", - "integrity": "sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", + "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.33.0", - "@typescript-eslint/utils": "8.33.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/utils": "8.34.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3922,9 +3984,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.0.tgz", - "integrity": "sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", "dev": true, "license": "MIT", "engines": { @@ -3936,16 +3998,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz", - "integrity": "sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.33.0", - "@typescript-eslint/tsconfig-utils": "8.33.0", - "@typescript-eslint/types": "8.33.0", - "@typescript-eslint/visitor-keys": "8.33.0", + "@typescript-eslint/project-service": "8.34.0", + "@typescript-eslint/tsconfig-utils": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3965,16 +4027,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.0.tgz", - "integrity": "sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.33.0", - "@typescript-eslint/types": "8.33.0", - "@typescript-eslint/typescript-estree": "8.33.0" + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3989,13 +4051,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz", - "integrity": "sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -4618,25 +4680,25 @@ } }, "node_modules/algoliasearch": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.25.0.tgz", - "integrity": "sha512-n73BVorL4HIwKlfJKb4SEzAYkR3Buwfwbh+MYxg2mloFph2fFGV58E90QTzdbfzWrLn4HE5Czx/WTjI8fcHaMg==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.27.0.tgz", + "integrity": "sha512-2PvAgvxxJzA3+dB+ERfS2JPdvUsxNf89Cc2GF5iCcFupTULOwmbfinvqrC4Qj9nHJJDNf494NqEN/1f9177ZTQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-abtesting": "5.25.0", - "@algolia/client-analytics": "5.25.0", - "@algolia/client-common": "5.25.0", - "@algolia/client-insights": "5.25.0", - "@algolia/client-personalization": "5.25.0", - "@algolia/client-query-suggestions": "5.25.0", - "@algolia/client-search": "5.25.0", - "@algolia/ingestion": "1.25.0", - "@algolia/monitoring": "1.25.0", - "@algolia/recommend": "5.25.0", - "@algolia/requester-browser-xhr": "5.25.0", - "@algolia/requester-fetch": "5.25.0", - "@algolia/requester-node-http": "5.25.0" + "@algolia/client-abtesting": "5.27.0", + "@algolia/client-analytics": "5.27.0", + "@algolia/client-common": "5.27.0", + "@algolia/client-insights": "5.27.0", + "@algolia/client-personalization": "5.27.0", + "@algolia/client-query-suggestions": "5.27.0", + "@algolia/client-search": "5.27.0", + "@algolia/ingestion": "1.27.0", + "@algolia/monitoring": "1.27.0", + "@algolia/recommend": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" @@ -5309,9 +5371,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001720", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", - "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==", + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", "dev": true, "funding": [ { @@ -6839,9 +6901,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.161", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", - "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==", + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", "dev": true, "license": "ISC" }, @@ -7114,9 +7176,9 @@ } }, "node_modules/eslint": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", - "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7126,7 +7188,7 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.27.0", + "@eslint/js": "9.28.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7191,14 +7253,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", - "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", + "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -8012,15 +8074,16 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -8568,6 +8631,16 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10026,6 +10099,26 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/memfs": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10744,9 +10837,9 @@ } }, "node_modules/mocha": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.5.0.tgz", - "integrity": "sha512-VKDjhy6LMTKm0WgNEdlY77YVsD49LZnPSXJAaPNL9NRYQADxvORsyG1DIQY6v53BKTnlNbEE2MbVCDbnxr4K3w==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.6.0.tgz", + "integrity": "sha512-i0JVb+OUBqw63X/1pC3jCyJsqYisgxySBbsQa8TKvefpA1oEnw7JXxXnftfMHRsw7bEEVGRtVlHcDYXBa7FzVw==", "dev": true, "license": "MIT", "dependencies": { @@ -10766,7 +10859,7 @@ "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", + "workerpool": "^9.2.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" @@ -11760,9 +11853,9 @@ } }, "node_modules/pinia": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.2.tgz", - "integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", "dev": true, "license": "MIT", "dependencies": { @@ -13061,9 +13154,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -13093,18 +13186,18 @@ } }, "node_modules/shiki": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.4.2.tgz", - "integrity": "sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.6.0.tgz", + "integrity": "sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "3.4.2", - "@shikijs/engine-javascript": "3.4.2", - "@shikijs/engine-oniguruma": "3.4.2", - "@shikijs/langs": "3.4.2", - "@shikijs/themes": "3.4.2", - "@shikijs/types": "3.4.2", + "@shikijs/core": "3.6.0", + "@shikijs/engine-javascript": "3.6.0", + "@shikijs/engine-oniguruma": "3.6.0", + "@shikijs/langs": "3.6.0", + "@shikijs/themes": "3.6.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } @@ -13441,9 +13534,9 @@ "peer": true }, "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "dev": true, "license": "MIT", "peer": true, @@ -13733,9 +13826,9 @@ } }, "node_modules/synckit": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.7.tgz", - "integrity": "sha512-/5aUeiRPqmY0CRTJ+iVWfOOMHWTDh8JAIuNF1A6nZ2/RdCNWwKaUrO5Qw5ephLK6dYa7NclYBI0ahdgUECvdhA==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", + "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", "dev": true, "license": "MIT", "dependencies": { @@ -13878,9 +13971,9 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", - "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", + "version": "5.41.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.41.0.tgz", + "integrity": "sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -13998,6 +14091,19 @@ "node": ">=0.8" } }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/thread-stream": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", @@ -14096,6 +14202,23 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tree-dump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", + "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -14294,15 +14417,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.0.tgz", - "integrity": "sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz", + "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.33.0", - "@typescript-eslint/parser": "8.33.0", - "@typescript-eslint/utils": "8.33.0" + "@typescript-eslint/eslint-plugin": "8.34.0", + "@typescript-eslint/parser": "8.34.0", + "@typescript-eslint/utils": "8.34.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15006,9 +15129,9 @@ } }, "node_modules/vscode-css-languageservice": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.5.tgz", - "integrity": "sha512-ehEIMXYPYEz/5Svi2raL9OKLpBt5dSAdoCFoLpo0TVFKrVpDemyuQwS3c3D552z/qQCg3pMp8oOLMObY6M3ajQ==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.6.tgz", + "integrity": "sha512-fU4h8mT3KlvfRcbF74v/M+Gzbligav6QMx4AD/7CbclWPYOpGb9kgIswfpZVJbIcOEJJACI9iYizkNwdiAqlHw==", "dev": true, "license": "MIT", "dependencies": { @@ -15019,9 +15142,9 @@ } }, "node_modules/vscode-html-languageservice": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.4.0.tgz", - "integrity": "sha512-9/cbc90BSYCghmHI7/VbWettHZdC7WYpz2g5gBK6UDUI1MkZbM773Q12uAYJx9jzAiNHPpyo6KzcwmcnugncAQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.5.0.tgz", + "integrity": "sha512-No6Er2P2L8IsXDnUFlp0bP4f2sdkJv+zJLZYFhtEQIp+2xNfxY8WYkhSxLJ/7bZhuV/aU55lmGSSHBVxSGer3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -15032,9 +15155,9 @@ } }, "node_modules/vscode-json-languageservice": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.5.0.tgz", - "integrity": "sha512-JchBzp8ArzhCVpRS/LT4wzEEvwHXIUEdZD064cGTI4RVs34rNCZXPUguIYSfGBcHH1GV79ufPcfy3Pd8+ukbKw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.6.0.tgz", + "integrity": "sha512-w1dv0nEoFxaNDq0PlYleYnlM4sFYXtFNZxaGGYy9nsCidXqHMh4RFHqld6XkFOhxs7hRBpK1QuXlH9OFDkTyfg==", "dev": true, "license": "MIT", "dependencies": { @@ -15304,9 +15427,9 @@ } }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", + "integrity": "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==", "dev": true, "license": "Apache-2.0" }, diff --git a/package.json b/package.json index 1346a35e7..1cc4dd08e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rollup", - "version": "4.41.1", + "version": "4.43.0", "description": "Next-generation ES module bundler", "main": "dist/rollup.js", "module": "dist/es/rollup.js", @@ -119,11 +119,11 @@ "devDependencies": { "@codemirror/commands": "^6.8.1", "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/language": "^6.11.0", + "@codemirror/language": "^6.11.1", "@codemirror/search": "^6.5.11", "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.36.8", - "@eslint/js": "^9.27.0", + "@codemirror/view": "^6.37.1", + "@eslint/js": "^9.28.0", "@inquirer/prompts": "^7.5.3", "@jridgewell/sourcemap-codec": "^1.5.0", "@mermaid-js/mermaid-cli": "^11.4.2", @@ -139,7 +139,7 @@ "@rollup/pluginutils": "^5.1.4", "@shikijs/vitepress-twoslash": "^3.4.2", "@types/mocha": "^10.0.10", - "@types/node": "^18.19.103", + "@types/node": "^18.19.110", "@types/picomatch": "^4.0.0", "@types/semver": "^7.7.0", "@types/yargs-parser": "^21.0.3", @@ -156,9 +156,9 @@ "date-time": "^4.0.0", "es5-shim": "^4.6.7", "es6-shim": "^0.35.8", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-prettier": "^5.4.1", "eslint-plugin-unicorn": "^59.0.1", "eslint-plugin-vue": "^10.1.0", "fixturify": "^3.0.0", @@ -168,9 +168,10 @@ "globals": "^16.2.0", "husky": "^9.1.7", "is-reference": "^3.0.3", - "lint-staged": "^16.0.0", + "lint-staged": "^16.1.0", "locate-character": "^3.0.0", "magic-string": "^0.30.17", + "memfs": "^4.17.0", "mocha": "^11.5.0", "nodemon": "^3.1.10", "nyc": "^17.1.0", @@ -191,13 +192,13 @@ "source-map": "^0.7.4", "source-map-support": "^0.5.21", "systemjs": "^6.15.1", - "terser": "^5.39.2", + "terser": "^5.40.0", "tslib": "^2.8.1", "typescript": "^5.8.3", - "typescript-eslint": "^8.32.1", + "typescript-eslint": "^8.33.1", "vite": "^6.3.5", "vitepress": "^1.6.3", - "vue": "^3.5.15", + "vue": "^3.5.16", "vue-tsc": "^2.2.10", "wasm-pack": "^0.13.1", "yargs-parser": "^21.1.1" diff --git a/rust/Cargo.lock b/rust/Cargo.lock index e168a0b64..5c262fbce 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" dependencies = [ "allocator-api2", ] @@ -167,9 +167,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.24" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "shlex", ] @@ -348,9 +348,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hstr" @@ -596,9 +596,9 @@ dependencies = [ [[package]] name = "napi-build" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03acbfa4f156a32188bfa09b86dc11a431b5725253fc1fc6f6df5bed273382c4" +checksum = "44e0e3177307063d3e7e55b7dd7b648cca9d7f46daa35422c0d98cc2bf48c2c1" [[package]] name = "napi-derive" @@ -675,9 +675,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -1053,9 +1053,9 @@ dependencies = [ [[package]] name = "sourcemap" -version = "9.2.1" +version = "9.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdee719193ae5c919a3ee43f64c2c0dd87f9b9a451d67918a2a5ec2e3c70561c" +checksum = "e22afbcb92ce02d23815b9795523c005cb9d3c214f8b7a66318541c240ea7935" dependencies = [ "base64-simd", "bitvec", @@ -1134,9 +1134,9 @@ dependencies = [ [[package]] name = "swc_common" -version = "11.0.0" +version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209e700a12f0fccd72db3bac7a751e631ef777d543c9e86247e9366b11e30a27" +checksum = "44c332906667b0fa98622f19a19e43afa5aa63b652813f80645dd0f33eca1fbb" dependencies = [ "anyhow", "ast_node", @@ -1163,9 +1163,9 @@ dependencies = [ [[package]] name = "swc_compiler_base" -version = "22.0.0" +version = "22.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aef98ee955eac3339cb3a8152c64746196bd14919b41afdf2cc410c06e6cfee" +checksum = "3993329d52eab041a7123fc25c76a54ead1488cb24114b5c7b56f0d1f9d2a210" dependencies = [ "anyhow", "base64", @@ -1277,9 +1277,9 @@ dependencies = [ [[package]] name = "swc_ecma_lexer" -version = "14.0.3" +version = "14.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b232a4ba5106d7bfa4da9cb4a22c3f3fdac64d656cf45c60a349f8ded133462" +checksum = "bb339d30ba6ee93da5d5638982faaa79586cd429fe331648abf42afa0eb0a7b5" dependencies = [ "arrayvec", "bitflags", @@ -1302,9 +1302,9 @@ dependencies = [ [[package]] name = "swc_ecma_minifier" -version = "20.0.3" +version = "20.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c43654113e9a75edf05fbe2c66b5232e149f563c97bef58ff1a896daa288092" +checksum = "cf26b860e6a0e23807c70b03175d0e09082cfe256130c4759fdf9372020d3a3f" dependencies = [ "arrayvec", "bitflags", @@ -1340,9 +1340,9 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "14.0.1" +version = "14.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b59cd2d4c1989c38eae5cd5888f3a3120ecbe2e53b939e586d340b12de7c1e2" +checksum = "60e07e6ecd47f748988902976d09c4022b1147772f88ad8a95852a20722ac7dc" dependencies = [ "arrayvec", "bitflags", @@ -1366,9 +1366,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "15.1.0" +version = "15.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb01eeec1de9e2cfd089e3afcf3db60df10c812f97a42d953d094eba32e9d26f" +checksum = "49c0a76bff24b9fa13d5451e7a664d18158849c45434d863e0553e29fb31170b" dependencies = [ "better_scoped_tls", "bitflags", @@ -1444,9 +1444,9 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "15.0.1" +version = "15.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199e2f048c1998d550ebe5296e0876a3e5b2f963d75a925c2208466071edb9d8" +checksum = "7d2c29dbfc54e02c14975aff9d2c75ae6fff0808d860d9971a493d37870e282f" dependencies = [ "indexmap", "num_cpus", diff --git a/rust/parse_ast/Cargo.toml b/rust/parse_ast/Cargo.toml index 937800751..d596201f1 100644 --- a/rust/parse_ast/Cargo.toml +++ b/rust/parse_ast/Cargo.toml @@ -10,7 +10,7 @@ anyhow = "1.0.98" swc_atoms = "5.0.0" swc_compiler_base = "22.0.0" swc_config = "3.0.0" -swc_common = { version = "11.0.0", features = ["parking_lot"] } +swc_common = { version = "11.0.3", features = ["parking_lot"] } swc_ecma_ast = "11.0.0" -swc_ecma_parser = "14.0.0" -parking_lot = "0.12.3" +swc_ecma_parser = "14.0.1" +parking_lot = "0.12.4" diff --git a/scripts/prepare-release.js b/scripts/prepare-release.js index f7696ab4f..b879fce10 100755 --- a/scripts/prepare-release.js +++ b/scripts/prepare-release.js @@ -193,7 +193,7 @@ function getDummyLogSection(headline, pr) { */ async function installDependenciesAndLint() { await runWithEcho('npm', ['ci', '--ignore-scripts']); - await runWithEcho('npm', ['audit']); + await runWithEcho('npm', ['audit', '--audit-level', 'moderate']); await runWithEcho('npm', ['run', 'ci:lint']); } diff --git a/src/ModuleLoader.ts b/src/ModuleLoader.ts index 210c1148b..b1aea19e9 100644 --- a/src/ModuleLoader.ts +++ b/src/ModuleLoader.ts @@ -15,9 +15,7 @@ import type { ResolvedId, ResolveIdResult } from './rollup/types'; -import type { PluginDriver } from './utils/PluginDriver'; import { EMPTY_OBJECT } from './utils/blank'; -import { readFile } from './utils/fs'; import { LOGLEVEL_WARN } from './utils/logging'; import { error, @@ -39,6 +37,7 @@ import { getAttributesFromImportExpression } from './utils/parseImportAttributes'; import { isAbsolute, isRelative, resolve } from './utils/path'; +import type { PluginDriver } from './utils/PluginDriver'; import relativeId from './utils/relativeId'; import { resolveId } from './utils/resolveId'; import stripBom from './utils/stripBom'; @@ -228,7 +227,8 @@ export class ModuleLoader { skip, customOptions, typeof isEntry === 'boolean' ? isEntry : !importer, - attributes + attributes, + this.options.fs ), importer, source @@ -282,7 +282,7 @@ export class ModuleLoader { const content = await this.pluginDriver.hookFirst('load', [id]); if (content !== null) return content; this.graph.watchFiles[id] = true; - return await readFile(id, 'utf8'); + return (await this.options.fs.readFile(id, { encoding: 'utf8' })) as string; }); } catch (error_: any) { let message = `Could not load ${id}`; @@ -674,7 +674,8 @@ export class ModuleLoader { null, EMPTY_OBJECT, true, - EMPTY_OBJECT + EMPTY_OBJECT, + this.options.fs ); if (resolveIdResult == null) { return error( diff --git a/src/ast/nodes/UnaryExpression.ts b/src/ast/nodes/UnaryExpression.ts index 555f39f4a..4f22084c1 100644 --- a/src/ast/nodes/UnaryExpression.ts +++ b/src/ast/nodes/UnaryExpression.ts @@ -114,9 +114,13 @@ export default class UnaryExpression extends NodeBase { ): void { if (!this.deoptimized) this.applyDeoptimizations(); this.included = true; + // Check if the argument is an identifier that should be preserved as a reference for readability + const shouldPreserveArgument = + this.argument instanceof Identifier && this.argument.variable?.included; if ( typeof this.getRenderedLiteralValue(includeChildrenRecursively) === 'symbol' || - this.argument.shouldBeIncluded(context) + this.argument.shouldBeIncluded(context) || + shouldPreserveArgument ) { this.argument.include(context, includeChildrenRecursively); this.renderedLiteralValue = UnknownValue; diff --git a/src/ast/utils/identifyNode.ts b/src/ast/utils/identifyNode.ts index 1090a27b6..e07c8c3f0 100644 --- a/src/ast/utils/identifyNode.ts +++ b/src/ast/utils/identifyNode.ts @@ -1,6 +1,7 @@ import type ArrowFunctionExpression from '../nodes/ArrowFunctionExpression'; import type AwaitExpression from '../nodes/AwaitExpression'; import type CallExpression from '../nodes/CallExpression'; +import type FunctionExpression from '../nodes/FunctionExpression'; import type Identifier from '../nodes/Identifier'; import type ImportExpression from '../nodes/ImportExpression'; import type MemberExpression from '../nodes/MemberExpression'; @@ -22,6 +23,10 @@ export function isArrowFunctionExpressionNode(node: unknown): node is ArrowFunct return node instanceof NodeBase && node.type === nodeType.ArrowFunctionExpression; } +export function isFunctionExpressionNode(node: unknown): node is FunctionExpression { + return node instanceof NodeBase && node.type === nodeType.FunctionExpression; +} + export function isCallExpressionNode(node: unknown): node is CallExpression { return node instanceof NodeBase && node.type === nodeType.CallExpression; } diff --git a/src/ast/variables/LocalVariable.ts b/src/ast/variables/LocalVariable.ts index 331f1199a..ed7438793 100644 --- a/src/ast/variables/LocalVariable.ts +++ b/src/ast/variables/LocalVariable.ts @@ -25,6 +25,7 @@ import type { VariableKind } from '../nodes/shared/VariableKinds'; import { isArrowFunctionExpressionNode, isCallExpressionNode, + isFunctionExpressionNode, isIdentifierNode, isImportExpressionNode, isMemberExpressionNode @@ -237,7 +238,8 @@ export default class LocalVariable extends Variable { */ if ( this.kind === 'parameter' && - isArrowFunctionExpressionNode(declaration.parent) && + (isArrowFunctionExpressionNode(declaration.parent) || + isFunctionExpressionNode(declaration.parent)) && isCallExpressionNode(declaration.parent.parent) && isMemberExpressionNode(declaration.parent.parent.callee) && isIdentifierNode(declaration.parent.parent.callee.property) && diff --git a/src/rollup/rollup.ts b/src/rollup/rollup.ts index f60fd5b4f..8a8bd7622 100644 --- a/src/rollup/rollup.ts +++ b/src/rollup/rollup.ts @@ -1,7 +1,6 @@ import { version as rollupVersion } from 'package.json'; import Bundle from '../Bundle'; import Graph from '../Graph'; -import { mkdir, writeFile } from '../utils/fs'; import { catchUnfinishedHookActions } from '../utils/hookActions'; import initWasm from '../utils/initWasm'; import { getLogger } from '../utils/logger'; @@ -215,7 +214,7 @@ async function handleGenerateWrite( } await Promise.all( Object.values(generated).map(chunk => - graph.fileOperationQueue.run(() => writeOutputFile(chunk, outputOptions)) + graph.fileOperationQueue.run(() => writeOutputFile(chunk, outputOptions, inputOptions)) ) ); await outputPluginDriver.hookParallel('writeBundle', [outputOptions, generated]); @@ -310,7 +309,8 @@ function getSortingFileType(file: OutputAsset | OutputChunk): SortingFileType { async function writeOutputFile( outputFile: OutputAsset | OutputChunk, - outputOptions: NormalizedOutputOptions + outputOptions: NormalizedOutputOptions, + { fs: { mkdir, writeFile } }: NormalizedInputOptions ): Promise { const fileName = resolve(outputOptions.dir || dirname(outputOptions.file!), outputFile.fileName); diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 42c9bb3c1..566c67117 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -244,6 +244,7 @@ export interface PluginContext extends MinimalPluginContext { debug: LoggingFunction; emitFile: EmitFile; error: (error: RollupError | string) => never; + fs: RollupFsModule; getFileName: (fileReferenceId: string) => string; getModuleIds: () => IterableIterator; getModuleInfo: GetModuleInfo; @@ -671,6 +672,7 @@ export interface InputOptions { experimentalCacheExpiry?: number; experimentalLogSideEffects?: boolean; external?: ExternalOption; + fs?: RollupFsModule; input?: InputOption; jsx?: false | JsxPreset | JsxOptions; logLevel?: LogLevelOption; @@ -699,6 +701,7 @@ export interface NormalizedInputOptions { experimentalCacheExpiry: number; experimentalLogSideEffects: boolean; external: IsExternal; + fs: RollupFsModule; input: string[] | Record; jsx: false | NormalizedJsxOptions; logLevel: LogLevelOption; @@ -1009,6 +1012,7 @@ export interface ChokidarOptions { export type RollupWatchHooks = 'onError' | 'onStart' | 'onBundleStart' | 'onBundleEnd' | 'onEnd'; export interface WatcherOptions { + allowInputInsideOutputPath?: boolean; buildDelay?: number; chokidar?: ChokidarOptions; clearScreen?: boolean; @@ -1102,3 +1106,76 @@ export function defineConfig(optionsFunction: RollupOptionsFunction): RollupOpti export type RollupOptionsFunction = ( commandLineArguments: Record ) => MaybePromise; + +export interface RollupFsModule { + appendFile( + path: string, + data: string | Uint8Array, + options?: { encoding?: BufferEncoding | null; mode?: string | number; flag?: string | number } + ): Promise; + + copyFile(source: string, destination: string, mode?: string | number): Promise; + + mkdir(path: string, options?: { recursive?: boolean; mode?: string | number }): Promise; + + mkdtemp(prefix: string): Promise; + + readdir(path: string, options?: { withFileTypes?: false }): Promise; + readdir(path: string, options?: { withFileTypes: true }): Promise; + + readFile( + path: string, + options?: { encoding?: null; flag?: string | number; signal?: AbortSignal } + ): Promise; + readFile( + path: string, + options?: { encoding: BufferEncoding; flag?: string | number; signal?: AbortSignal } + ): Promise; + + realpath(path: string): Promise; + + rename(oldPath: string, newPath: string): Promise; + + rmdir(path: string, options?: { recursive?: boolean }): Promise; + + stat(path: string): Promise; + + lstat(path: string): Promise; + + unlink(path: string): Promise; + + writeFile( + path: string, + data: string | Uint8Array, + options?: { encoding?: BufferEncoding | null; mode?: string | number; flag?: string | number } + ): Promise; +} + +export type BufferEncoding = + | 'ascii' + | 'utf8' + | 'utf16le' + | 'ucs2' + | 'base64' + | 'base64url' + | 'latin1' + | 'binary' + | 'hex'; + +export interface RollupDirectoryEntry { + isFile(): boolean; + isDirectory(): boolean; + isSymbolicLink(): boolean; + name: string; +} + +export interface RollupFileStats { + isFile(): boolean; + isDirectory(): boolean; + isSymbolicLink(): boolean; + size: number; + mtime: Date; + ctime: Date; + atime: Date; + birthtime: Date; +} diff --git a/src/utils/PluginContext.ts b/src/utils/PluginContext.ts index 7f038fd23..7590b89bf 100644 --- a/src/utils/PluginContext.ts +++ b/src/utils/PluginContext.ts @@ -61,6 +61,7 @@ export function getPluginContext( error(error_): never { return error(logPluginError(normalizeLog(error_), plugin.name)); }, + fs: options.fs, getFileName: fileEmitter.getFileName, getModuleIds: () => graph.modulesById.keys(), getModuleInfo: graph.getModuleInfo, diff --git a/src/utils/logs.ts b/src/utils/logs.ts index 7c09d04a1..e40f097d3 100644 --- a/src/utils/logs.ts +++ b/src/utils/logs.ts @@ -911,7 +911,7 @@ export function logRedeclarationError(name: string): RollupLog { export function logReservedNamespace(namespace: string): RollupLog { return { code: RESERVED_NAMESPACE, - message: `You have overided reserved namespace "${namespace}"` + message: `You have overridden reserved namespace "${namespace}"` }; } diff --git a/src/utils/options/mergeOptions.ts b/src/utils/options/mergeOptions.ts index c427babcb..89beea517 100644 --- a/src/utils/options/mergeOptions.ts +++ b/src/utils/options/mergeOptions.ts @@ -69,7 +69,7 @@ export async function mergeOptions( warnUnknownOptions( command, [ - ...Object.keys(inputOptions), + ...Object.keys(inputOptions).filter(option => option !== 'fs'), ...Object.keys(outputOptions[0]).filter( option => option !== 'sourcemapIgnoreList' && option !== 'sourcemapPathTransform' ), @@ -135,6 +135,7 @@ function mergeInputOptions( experimentalCacheExpiry: getOption('experimentalCacheExpiry'), experimentalLogSideEffects: getOption('experimentalLogSideEffects'), external: getExternal(config, overrides), + fs: getOption('fs'), input: getOption('input') || [], jsx: getObjectOption( config, diff --git a/src/utils/options/normalizeInputOptions.ts b/src/utils/options/normalizeInputOptions.ts index 85127200c..9446c5d2f 100644 --- a/src/utils/options/normalizeInputOptions.ts +++ b/src/utils/options/normalizeInputOptions.ts @@ -3,10 +3,12 @@ import type { InputOptions, ModuleSideEffectsOption, NormalizedInputOptions, - RollupBuild + RollupBuild, + RollupFsModule } from '../../rollup/types'; import { EMPTY_ARRAY } from '../blank'; import { ensureArray } from '../ensureArray'; +import * as fs from '../fs'; import { getLogger } from '../logger'; import { LOGLEVEL_INFO } from '../logging'; import { error, logInvalidOption } from '../logs'; @@ -50,6 +52,7 @@ export async function normalizeInputOptions( experimentalCacheExpiry: config.experimentalCacheExpiry ?? 10, experimentalLogSideEffects: config.experimentalLogSideEffects || false, external: getIdMatcher(config.external), + fs: config.fs ?? (fs as RollupFsModule), input: getInput(config), jsx: getJsx(config), logLevel, diff --git a/src/utils/resolveId.ts b/src/utils/resolveId.ts index 812f2e901..766da800c 100644 --- a/src/utils/resolveId.ts +++ b/src/utils/resolveId.ts @@ -1,8 +1,7 @@ import type { ModuleLoaderResolveId } from '../ModuleLoader'; -import type { CustomPluginOptions, Plugin, ResolveIdResult } from '../rollup/types'; -import type { PluginDriver } from './PluginDriver'; -import { lstat, readdir, realpath } from './fs'; +import type { CustomPluginOptions, Plugin, ResolveIdResult, RollupFsModule } from '../rollup/types'; import { basename, dirname, isAbsolute, resolve } from './path'; +import type { PluginDriver } from './PluginDriver'; import { resolveIdViaPlugins } from './resolveIdViaPlugins'; export async function resolveId( @@ -14,7 +13,8 @@ export async function resolveId( skip: readonly { importer: string | undefined; plugin: Plugin; source: string }[] | null, customOptions: CustomPluginOptions | undefined, isEntry: boolean, - attributes: Record + attributes: Record, + fs: RollupFsModule ): Promise { const pluginResult = await resolveIdViaPlugins( source, @@ -54,30 +54,36 @@ export async function resolveId( // See https://nodejs.org/api/path.html#path_path_resolve_paths return addJsExtensionIfNecessary( importer ? resolve(dirname(importer), source) : resolve(source), - preserveSymlinks + preserveSymlinks, + fs ); } async function addJsExtensionIfNecessary( file: string, - preserveSymlinks: boolean + preserveSymlinks: boolean, + fs: RollupFsModule ): Promise { return ( - (await findFile(file, preserveSymlinks)) ?? - (await findFile(file + '.mjs', preserveSymlinks)) ?? - (await findFile(file + '.js', preserveSymlinks)) + (await findFile(file, preserveSymlinks, fs)) ?? + (await findFile(file + '.mjs', preserveSymlinks, fs)) ?? + (await findFile(file + '.js', preserveSymlinks, fs)) ); } -async function findFile(file: string, preserveSymlinks: boolean): Promise { +async function findFile( + file: string, + preserveSymlinks: boolean, + fs: RollupFsModule +): Promise { try { - const stats = await lstat(file); + const stats = await fs.lstat(file); if (!preserveSymlinks && stats.isSymbolicLink()) - return await findFile(await realpath(file), preserveSymlinks); + return await findFile(await fs.realpath(file), preserveSymlinks, fs); if ((preserveSymlinks && stats.isSymbolicLink()) || stats.isFile()) { // check case const name = basename(file); - const files = await readdir(dirname(file)); + const files = await fs.readdir(dirname(file)); if (files.includes(name)) return file; } diff --git a/src/watch/watch-proxy.ts b/src/watch/watch-proxy.ts index 2d02ebede..f2c0d10a5 100644 --- a/src/watch/watch-proxy.ts +++ b/src/watch/watch-proxy.ts @@ -9,8 +9,8 @@ import { ensureArray } from '../utils/ensureArray'; import { error, logInvalidOption } from '../utils/logs'; import { mergeOptions } from '../utils/options/mergeOptions'; import { URL_WATCH } from '../utils/urls'; -import { WatchEmitter } from './WatchEmitter'; import { loadFsEvents } from './fsevents-importer'; +import { WatchEmitter } from './WatchEmitter'; export default function watch(configs: RollupOptions[] | RollupOptions): RollupWatcher { const emitter = new WatchEmitter() as RollupWatcher; @@ -22,7 +22,7 @@ export default function watch(configs: RollupOptions[] | RollupOptions): RollupW return emitter; } -function withTrailingSlash(path: string): string { +function ensureTrailingSlash(path: string): string { if (path[path.length - 1] !== '/') { return `${path}/`; } @@ -31,25 +31,26 @@ function withTrailingSlash(path: string): string { function checkWatchConfig(config: MergedRollupOptions[]): void { for (const item of config) { + if (typeof item.watch !== 'boolean' && item.watch?.allowInputInsideOutputPath) { + break; + } if (item.input && item.output) { const input = typeof item.input === 'string' ? ensureArray(item.input) : item.input; - const output = ensureArray(item.output); + const outputs = ensureArray(item.output); for (const index in input) { - const inputPath = input[index as keyof typeof input] as string; - const subPath = output.find(o => { - if (!o.dir || typeof inputPath !== 'string') { - return false; - } - const _outPath = withTrailingSlash(o.dir); - const _inputPath = withTrailingSlash(inputPath); - return _inputPath.startsWith(_outPath); - }); - if (subPath) { + const inputPath = input[index as keyof typeof input]; + if (typeof inputPath !== 'string') { + continue; + } + const outputWithInputAsSubPath = outputs.find( + ({ dir }) => dir && ensureTrailingSlash(inputPath).startsWith(ensureTrailingSlash(dir)) + ); + if (outputWithInputAsSubPath) { error( logInvalidOption( 'watch', URL_WATCH, - `the input "${inputPath}" is a subpath of the output "${subPath.dir}"` + `the input "${inputPath}" is a subpath of the output "${outputWithInputAsSubPath.dir}"` ) ); } diff --git a/test/browser/samples/missing-default-fs/_config.js b/test/browser/samples/missing-default-fs/_config.js new file mode 100644 index 000000000..2a9277fe0 --- /dev/null +++ b/test/browser/samples/missing-default-fs/_config.js @@ -0,0 +1,23 @@ +module.exports = defineTest({ + description: 'fails when accessing fs from a browser without supplying it via option', + options: { + plugins: { + name: 'test', + resolveId(source) { + return source; + }, + load(id) { + return this.fs.readFile(id, { encoding: 'utf8' }); + } + } + }, + error: { + code: 'PLUGIN_ERROR', + hook: 'load', + message: + 'Could not load main: Cannot access the file system (via "fs.readFile") when using the browser build of Rollup. Make sure you supply a plugin with custom resolveId and load hooks to Rollup.', + plugin: 'test', + pluginCode: 'NO_FS_IN_BROWSER', + url: 'https://rollupjs.org/plugin-development/#a-simple-example' + } +}); diff --git a/test/browser/samples/missing-dependency-resolution/_config.js b/test/browser/samples/missing-dependency-resolution/_config.js index a683f11c2..671cebb52 100644 --- a/test/browser/samples/missing-dependency-resolution/_config.js +++ b/test/browser/samples/missing-dependency-resolution/_config.js @@ -1,17 +1,36 @@ const { loader } = require('../../../testHelpers.js'); +const assert = require('node:assert/strict'); + +const logs = []; module.exports = defineTest({ - description: 'fails if a dependency cannot be resolved', + description: 'warns if a dependency cannot be resolved', options: { - plugins: loader({ - main: `import {foo} from 'dep'; + onLog(level, log) { + logs.push({ level, log }); + }, + plugins: [ + loader({ + main: `import {foo} from 'dep'; console.log(foo);` - }) - }, - error: { - code: 'NO_FS_IN_BROWSER', - message: - 'Cannot access the file system (via "path.resolve") when using the browser build of Rollup. Make sure you supply a plugin with custom resolveId and load hooks to Rollup.', - url: 'https://rollupjs.org/plugin-development/#a-simple-example' + }), + { + buildEnd() { + assert.deepEqual(logs, [ + { + level: 'warn', + log: { + code: 'UNRESOLVED_IMPORT', + exporter: 'dep', + id: 'main', + message: + '"dep" is imported by "main", but could not be resolved – treating it as an external dependency.', + url: 'https://rollupjs.org/troubleshooting/#warning-treating-module-as-external-dependency' + } + } + ]); + } + } + ] } }); diff --git a/test/browser/samples/missing-dependency-resolution/_expected/main.js b/test/browser/samples/missing-dependency-resolution/_expected/main.js new file mode 100644 index 000000000..37f4a46d1 --- /dev/null +++ b/test/browser/samples/missing-dependency-resolution/_expected/main.js @@ -0,0 +1,3 @@ +import { foo } from 'dep'; + +console.log(foo); diff --git a/test/browser/samples/missing-entry-resolution/_config.js b/test/browser/samples/missing-entry-resolution/_config.js index f122cdb59..e41dbc216 100644 --- a/test/browser/samples/missing-entry-resolution/_config.js +++ b/test/browser/samples/missing-entry-resolution/_config.js @@ -1,9 +1,7 @@ module.exports = defineTest({ description: 'fails if an entry cannot be resolved', error: { - code: 'NO_FS_IN_BROWSER', - message: - 'Cannot access the file system (via "path.resolve") when using the browser build of Rollup. Make sure you supply a plugin with custom resolveId and load hooks to Rollup.', - url: 'https://rollupjs.org/plugin-development/#a-simple-example' + code: 'UNRESOLVED_ENTRY', + message: 'Could not resolve entry module "main".' } }); diff --git a/test/browser/samples/provide-fs/_config.js b/test/browser/samples/provide-fs/_config.js new file mode 100644 index 000000000..a053d83a8 --- /dev/null +++ b/test/browser/samples/provide-fs/_config.js @@ -0,0 +1,12 @@ +const { Volume } = require('memfs'); + +const vol = Volume.fromJSON({ + main: "console.log('Hello, Rollup!');" +}); + +module.exports = defineTest({ + description: 'allows to provide an in-memory fs via option', + options: { + fs: vol.promises + } +}); diff --git a/test/browser/samples/provide-fs/_expected/main.js b/test/browser/samples/provide-fs/_expected/main.js new file mode 100644 index 000000000..f5d3e627b --- /dev/null +++ b/test/browser/samples/provide-fs/_expected/main.js @@ -0,0 +1 @@ +console.log('Hello, Rollup!'); diff --git a/test/chunking-form/samples/max-parallel-file-operations/_config.js b/test/chunking-form/samples/max-parallel-file-operations/_config.js index b9d5da1de..f2cc3f557 100644 --- a/test/chunking-form/samples/max-parallel-file-operations/_config.js +++ b/test/chunking-form/samples/max-parallel-file-operations/_config.js @@ -10,7 +10,8 @@ module.exports = defineTest({ description: 'maxParallelFileOps limits write operations', options: { maxParallelFileOps: 3, - output: { preserveModules: true } + output: { preserveModules: true }, + fs }, before() { fs.writeFile = async (path, content) => { diff --git a/test/cli/index.js b/test/cli/index.js index 4ac71627c..13d0ed2bc 100644 --- a/test/cli/index.js +++ b/test/cli/index.js @@ -23,12 +23,13 @@ runTestSuiteWithSamples( 'cli', path.resolve(__dirname, 'samples'), /** + * @param {string} directory * @param {import('../types').TestConfigCli} config */ (directory, config) => { - (config.skip ? it.skip : config.solo ? it.only : it)( - path.basename(directory) + ': ' + config.description, - async () => { + for (let iteration = 0; iteration < (config.repeat || 1); iteration++) { + const description = `${path.basename(directory)}: ${config.description}${iteration > 0 ? ` (run ${iteration + 1})` : ''}`; + (config.skip ? it.skip : config.solo ? it.only : it)(description, async () => { process.chdir(config.cwd || directory); try { await runTest(config); @@ -39,8 +40,8 @@ runTestSuiteWithSamples( } throw error; } - } - ).timeout(80_000); + }).timeout(80_000); + } }, () => process.chdir(cwd) ); @@ -106,7 +107,9 @@ async function runTest(config) { } } if (childProcess.signalCode === 'SIGKILL') { - return reject(new Error('Test aborted due to timeout.')); + return reject( + new Error(`Test aborted due to timeout.\nstdout: ${stdout}\n\nstderr: ${stderr}\n`) + ); } if ('stderr' in config) { diff --git a/test/cli/samples/watch/watch-event-hooks-error/_config.js b/test/cli/samples/watch/watch-event-hooks-error/_config.js index 4987c8e7b..5e0a06a01 100644 --- a/test/cli/samples/watch/watch-event-hooks-error/_config.js +++ b/test/cli/samples/watch/watch-event-hooks-error/_config.js @@ -1,11 +1,13 @@ -const { assertIncludes } = require('../../../../testHelpers.js'); +const { assertIncludes, wait } = require('../../../../testHelpers.js'); module.exports = defineTest({ description: 'onError event hook shell commands write to stderr', spawnScript: 'wrapper.js', spawnArgs: ['-cw', '--watch.onError', 'echo error'], - abortOnStderr(data) { + async abortOnStderr(data) { if (data.includes('waiting for changes')) { + // Wait a little for the child process to complete the command + await wait(300); return true; } }, diff --git a/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/_config.js b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/_config.js new file mode 100644 index 000000000..79acda4b6 --- /dev/null +++ b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/_config.js @@ -0,0 +1,9 @@ +module.exports = defineTest({ + description: + 'allowInputInsideOutputPath set to true, should not throw an error when input is inside output path', + spawnArgs: ['-cw'], + abortOnStderr(data) { + return data.includes('waiting for changes'); + }, + execute: true +}); diff --git a/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/main.js b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/main.js new file mode 100644 index 000000000..17eee8f1f --- /dev/null +++ b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/main.js @@ -0,0 +1 @@ +assert.equal( 1 + 1, 2 ); diff --git a/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/out.js b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/out.js new file mode 100644 index 000000000..17eee8f1f --- /dev/null +++ b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/output/out.js @@ -0,0 +1 @@ +assert.equal( 1 + 1, 2 ); diff --git a/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/rollup.config.mjs b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/rollup.config.mjs new file mode 100644 index 000000000..51fa9da44 --- /dev/null +++ b/test/cli/samples/watch/watch-output-contain-input-allowInputInsideOutputPath/rollup.config.mjs @@ -0,0 +1,12 @@ +export default [ + { + input: {'out': 'output/main.js'}, + watch: { + allowInputInsideOutputPath: true, + }, + output: { + dir: 'output', + format: 'es' + } + }, +]; diff --git a/test/form/samples/treeshake-deterministic-dynamic-import/_expected.js b/test/form/samples/treeshake-deterministic-dynamic-import/_expected.js index 9dda828d7..9bd210cfb 100644 --- a/test/form/samples/treeshake-deterministic-dynamic-import/_expected.js +++ b/test/form/samples/treeshake-deterministic-dynamic-import/_expected.js @@ -29,6 +29,12 @@ async function entry() { } f(m); }); + Promise.resolve().then(function () { return sub2; }).then(function(m){ + function f(m){ + console.log(m.baz2); + } + f(m); + }); Promise.resolve().then(function () { return sub2; }).then(({ baz2 }) => baz2); Promise.resolve().then(function () { return sub2; }).then(function({ reexported }) { }); diff --git a/test/form/samples/treeshake-deterministic-dynamic-import/main.js b/test/form/samples/treeshake-deterministic-dynamic-import/main.js index ee9855071..67588eb10 100644 --- a/test/form/samples/treeshake-deterministic-dynamic-import/main.js +++ b/test/form/samples/treeshake-deterministic-dynamic-import/main.js @@ -14,6 +14,12 @@ export async function entry() { } f(m); }) + import('./sub2.js').then(function(m){ + function f(m){ + console.log(m.baz2) + } + f(m); + }) import('./sub2.js').then(({ baz2 }) => baz2) import('./sub2.js').then(function({ reexported }) { reexported }) diff --git a/test/form/samples/unary-expressions-preserve-constants/_config.js b/test/form/samples/unary-expressions-preserve-constants/_config.js new file mode 100644 index 000000000..da9b696b9 --- /dev/null +++ b/test/form/samples/unary-expressions-preserve-constants/_config.js @@ -0,0 +1,4 @@ +module.exports = defineTest({ + description: + 'Preserves constant identifiers in unary expressions when constants are used elsewhere' +}); diff --git a/test/form/samples/unary-expressions-preserve-constants/_expected.js b/test/form/samples/unary-expressions-preserve-constants/_expected.js new file mode 100644 index 000000000..2bdd58007 --- /dev/null +++ b/test/form/samples/unary-expressions-preserve-constants/_expected.js @@ -0,0 +1,25 @@ +const BOB = 3; +const ALICE = 5; + +function getBob() { + return {x: BOB, y: -BOB, z: +BOB}; +} + +function getAlice() { + console.log(ALICE); + return ~ALICE; +} + +// Test with different operators +function testOperators() { + return { + negate: -BOB, + plus: +BOB, + not: !BOB, + bitwise: ~BOB, + typeof: typeof BOB, + void: void BOB + }; +} + +export { ALICE, BOB, getAlice, getBob, testOperators }; diff --git a/test/form/samples/unary-expressions-preserve-constants/main.js b/test/form/samples/unary-expressions-preserve-constants/main.js new file mode 100644 index 000000000..9dc8dcce3 --- /dev/null +++ b/test/form/samples/unary-expressions-preserve-constants/main.js @@ -0,0 +1,23 @@ +export const BOB = 3; +export const ALICE = 5; + +export function getBob() { + return {x: BOB, y: -BOB, z: +BOB}; +} + +export function getAlice() { + console.log(ALICE); + return ~ALICE; +} + +// Test with different operators +export function testOperators() { + return { + negate: -BOB, + plus: +BOB, + not: !BOB, + bitwise: ~BOB, + typeof: typeof BOB, + void: void BOB + }; +} diff --git a/test/function/samples/max-parallel-file-operations/default/_config.js b/test/function/samples/max-parallel-file-operations/default/_config.js index cfe030764..5710cdd1a 100644 --- a/test/function/samples/max-parallel-file-operations/default/_config.js +++ b/test/function/samples/max-parallel-file-operations/default/_config.js @@ -8,6 +8,9 @@ let maxReads = 0; module.exports = defineTest({ description: 'maxParallelFileOps not set', + options: { + fs + }, before() { fs.readFile = async (path, options) => { currentReads++; diff --git a/test/function/samples/max-parallel-file-operations/error/_config.js b/test/function/samples/max-parallel-file-operations/error/_config.js index 2ed14956e..ff46cae7b 100644 --- a/test/function/samples/max-parallel-file-operations/error/_config.js +++ b/test/function/samples/max-parallel-file-operations/error/_config.js @@ -10,7 +10,8 @@ module.exports = defineTest({ input: 'main', plugins: loader({ main: `import {foo} from './dep';` - }) + }), + fs }, before() { fs.readFile = (path, options) => { diff --git a/test/function/samples/max-parallel-file-operations/infinity/_config.js b/test/function/samples/max-parallel-file-operations/infinity/_config.js index fb6b8aeb9..a672fb4ad 100644 --- a/test/function/samples/max-parallel-file-operations/infinity/_config.js +++ b/test/function/samples/max-parallel-file-operations/infinity/_config.js @@ -9,7 +9,8 @@ let maxReads = 0; module.exports = defineTest({ description: 'maxParallelFileOps set to infinity', options: { - maxParallelFileOps: 0 + maxParallelFileOps: 0, + fs }, before() { fs.readFile = async (path, options) => { diff --git a/test/function/samples/max-parallel-file-operations/set/_config.js b/test/function/samples/max-parallel-file-operations/set/_config.js index 5c631ef9c..8dfac8f3f 100644 --- a/test/function/samples/max-parallel-file-operations/set/_config.js +++ b/test/function/samples/max-parallel-file-operations/set/_config.js @@ -9,7 +9,8 @@ let maxReads = 0; module.exports = defineTest({ description: 'maxParallelFileOps set to 3', options: { - maxParallelFileOps: 3 + maxParallelFileOps: 3, + fs }, before() { fs.readFile = async (path, options) => { diff --git a/test/function/samples/options-hook/_config.js b/test/function/samples/options-hook/_config.js index ef6bdc039..ee4c6c73d 100644 --- a/test/function/samples/options-hook/_config.js +++ b/test/function/samples/options-hook/_config.js @@ -10,7 +10,10 @@ module.exports = defineTest({ { name: 'test-plugin', buildStart(options) { - assert.deepStrictEqual(JSON.parse(JSON.stringify(options)), { + // The fs option is not json stringifiable + const { fs, ...restOptions } = options; + assert.ok(fs); + assert.deepStrictEqual(JSON.parse(JSON.stringify(restOptions)), { context: 'undefined', experimentalCacheExpiry: 10, experimentalLogSideEffects: false, diff --git a/test/misc/fs-override.js b/test/misc/fs-override.js new file mode 100644 index 000000000..f83f91565 --- /dev/null +++ b/test/misc/fs-override.js @@ -0,0 +1,56 @@ +const assert = require('node:assert'); +const { Volume } = require('memfs'); +const rollup = require('../../dist/rollup'); + +describe('fs-override', () => { + it('uses fs from options', async () => { + const vol = Volume.fromJSON( + { + '/input.js': "console.log('Hello, Rollup!');" + }, + __dirname + ); + const bundle = await rollup.rollup({ + input: '/input.js', + fs: vol.promises + }); + + await bundle.write({ + file: '/output.js', + format: 'esm' + }); + + const generatedCode = vol.readFileSync('/output.js', 'utf8'); + assert.strictEqual(generatedCode.trim(), "console.log('Hello, Rollup!');"); + }); + + it('passes fs from options to plugin context', async () => { + const vol = Volume.fromJSON( + { + '/input.js': "console.log('Hello, Rollup!');" + }, + __dirname + ); + const bundle = await rollup.rollup({ + input: '/input.js', + fs: vol.promises, + plugins: [ + { + name: 'test-plugin', + async transform(code, _id) { + assert.equal(await this.fs.readFile('/input.js'), "console.log('Hello, Rollup!');"); + return { + code, + map: null + }; + } + } + ] + }); + + await bundle.write({ + file: '/output.js', + format: 'esm' + }); + }); +}); diff --git a/test/misc/index.js b/test/misc/index.js index 8950e1f05..8bc305f61 100644 --- a/test/misc/index.js +++ b/test/misc/index.js @@ -1,4 +1,5 @@ require('./bundle-information'); +require('./fs-override'); require('./get-log-filter'); require('./parse-ast'); require('./iife'); diff --git a/test/misc/optionList.js b/test/misc/optionList.js index d559168cf..42ed455ab 100644 --- a/test/misc/optionList.js +++ b/test/misc/optionList.js @@ -1,5 +1,5 @@ exports.input = - 'cache, context, experimentalCacheExpiry, experimentalLogSideEffects, external, input, jsx, logLevel, makeAbsoluteExternalsRelative, maxParallelFileOps, moduleContext, onLog, onwarn, perf, plugins, preserveEntrySignatures, preserveSymlinks, shimMissingExports, strictDeprecations, treeshake, watch'; + 'cache, context, experimentalCacheExpiry, experimentalLogSideEffects, external, fs, input, jsx, logLevel, makeAbsoluteExternalsRelative, maxParallelFileOps, moduleContext, onLog, onwarn, perf, plugins, preserveEntrySignatures, preserveSymlinks, shimMissingExports, strictDeprecations, treeshake, watch'; exports.flags = 'amd, assetFileNames, banner, bundleConfigAsCjs, c, cache, chunkFileNames, compact, config, configImportAttributesKey, configPlugin, context, d, dir, dynamicImportInCjs, e, entryFileNames, environment, esModule, experimentalCacheExpiry, experimentalLogSideEffects, experimentalMinChunkSize, exports, extend, external, externalImportAssertions, externalImportAttributes, externalLiveBindings, f, failAfterWarnings, file, filterLogs, footer, forceExit, format, freeze, g, generatedCode, globals, h, hashCharacters, hoistTransitiveImports, i, importAttributesKey, indent, inlineDynamicImports, input, interop, intro, jsx, logLevel, m, makeAbsoluteExternalsRelative, manualChunks, maxParallelFileOps, minifyInternalExports, moduleContext, n, name, noConflict, o, onLog, onwarn, outro, p, paths, perf, plugin, plugins, preserveEntrySignatures, preserveModules, preserveModulesRoot, preserveSymlinks, reexportProtoFromExternal, sanitizeFileName, shimMissingExports, silent, sourcemap, sourcemapBaseUrl, sourcemapDebugIds, sourcemapExcludeSources, sourcemapFile, sourcemapFileNames, stdin, strict, strictDeprecations, systemNullSetters, treeshake, v, validate, virtualDirname, w, waitForBundleInput, watch'; exports.output = diff --git a/test/types.d.ts b/test/types.d.ts index be8377537..f9f2337fd 100644 --- a/test/types.d.ts +++ b/test/types.d.ts @@ -133,11 +133,12 @@ export interface TestConfigCli extends TestConfigBase { * Run assertions against the exports of the bundle after executing it. */ exports?: (exportObject: any) => void | Promise; + repeat?: number; /** * Run assertions against the generated code when bundling to stdout. */ result?: (code: string) => void; - retry?: number; + retry?: boolean; /** * Display generated output in console. */