From a7d6c783ce98667139b4ff9adaea3b6b64ffa189 Mon Sep 17 00:00:00 2001 From: Sam Guo <501018786@qq.com> Date: Thu, 10 Oct 2024 21:36:38 +0800 Subject: [PATCH 01/23] build(tests): type check packages/neovim/*.test.ts #411 --- packages/neovim/src/api/Neovim.test.ts | 10 +++++--- packages/neovim/src/api/Neovim.ts | 6 ++--- packages/neovim/src/api/Tabpage.test.ts | 7 +++--- packages/neovim/src/api/Window.test.ts | 11 +++++--- packages/neovim/src/host/NvimPlugin.test.ts | 3 ++- packages/neovim/src/plugin/plugin.test.ts | 28 +++++++++++++-------- packages/neovim/tsconfig.json | 4 +-- 7 files changed, 41 insertions(+), 28 deletions(-) diff --git a/packages/neovim/src/api/Neovim.test.ts b/packages/neovim/src/api/Neovim.test.ts index c25d8a2f..2227bc77 100644 --- a/packages/neovim/src/api/Neovim.test.ts +++ b/packages/neovim/src/api/Neovim.test.ts @@ -1,5 +1,6 @@ /* eslint-env jest */ import * as path from 'node:path'; +import assert from 'node:assert'; import * as testUtil from '../testUtil'; describe('Neovim API', () => { @@ -25,7 +26,7 @@ describe('Neovim API', () => { // switch buffers [nvim.buffer] = buffers; - expect(await nvim.buffer.name).toMatch(/hello\.txt$/); + expect(await (await nvim.buffer).name).toMatch(/hello\.txt$/); }); it('can list runtimepaths', async () => { @@ -218,7 +219,7 @@ describe('Neovim API', () => { const numWindows = (await nvim.windows).length; const buffer = await nvim.createBuffer(false, false); expect(await nvim.buffers).toHaveLength(numBuffers + 1); - + assert(typeof buffer !== 'number'); const floatingWindow = await nvim.openWindow(buffer, true, { relative: 'editor', row: 5, @@ -227,7 +228,7 @@ describe('Neovim API', () => { height: 50, }); expect(await nvim.windows).toHaveLength(numWindows + 1); - + assert(typeof floatingWindow !== 'number'); await nvim.windowClose(floatingWindow, true); expect(await nvim.windows).toHaveLength(numWindows); }); @@ -235,7 +236,7 @@ describe('Neovim API', () => { it('resizes a window', async () => { const numWindows = (await nvim.windows).length; const buffer = await nvim.createBuffer(false, false); - + assert(typeof buffer !== 'number'); const floatingWindow = await nvim.openWindow(buffer, true, { relative: 'editor', row: 5, @@ -243,6 +244,7 @@ describe('Neovim API', () => { width: 10, height: 10, }); + assert(typeof floatingWindow !== 'number'); expect(await nvim.windows).toHaveLength(numWindows + 1); expect(await floatingWindow.height).toBe(10); expect(await floatingWindow.width).toBe(10); diff --git a/packages/neovim/src/api/Neovim.ts b/packages/neovim/src/api/Neovim.ts index 5929a6b5..8933f9b5 100644 --- a/packages/neovim/src/api/Neovim.ts +++ b/packages/neovim/src/api/Neovim.ts @@ -169,7 +169,7 @@ export class Neovim extends BaseApi { /** * Sets the current buffer */ - set buffer(buffer: AsyncBuffer) { + set buffer(buffer: AsyncBuffer | Buffer) { this.request(`${this.prefix}set_current_buf`, [buffer]); } @@ -232,7 +232,7 @@ export class Neovim extends BaseApi { /** * Sets the current tabpage */ - set tabpage(tabpage: AsyncTabpage) { + set tabpage(tabpage: AsyncTabpage | Tabpage) { this.request(`${this.prefix}set_current_tabpage`, [tabpage]); } @@ -259,7 +259,7 @@ export class Neovim extends BaseApi { * * @param win Window handle */ - set window(win: AsyncWindow) { + set window(win: AsyncWindow | Window) { if (win instanceof Window) this.setWindow(win); else win.then(win => this.setWindow(win)); } diff --git a/packages/neovim/src/api/Tabpage.test.ts b/packages/neovim/src/api/Tabpage.test.ts index 169bfcb9..15f5ec6d 100644 --- a/packages/neovim/src/api/Tabpage.test.ts +++ b/packages/neovim/src/api/Tabpage.test.ts @@ -1,5 +1,6 @@ /* eslint-env jest */ import * as testUtil from '../testUtil'; +import type { Tabpage } from './Tabpage'; describe('Tabpage API', () => { let nvim: ReturnType[1]; @@ -18,7 +19,7 @@ describe('Tabpage API', () => { }); describe('Normal API calls', () => { - let tabpage; + let tabpage: Tabpage; beforeEach(async () => { tabpage = await nvim.tabpage; @@ -68,10 +69,10 @@ describe('Tabpage API', () => { it('logs an error when calling `getOption`', () => { const spy = jest.spyOn(tabpage.logger, 'error'); - tabpage.getOption('option'); + tabpage.getOption(); expect(spy.mock.calls.length).toBe(1); - tabpage.setOption('option', 'value'); + tabpage.setOption(); expect(spy.mock.calls.length).toBe(2); spy.mockClear(); }); diff --git a/packages/neovim/src/api/Window.test.ts b/packages/neovim/src/api/Window.test.ts index ff272002..f59e2562 100644 --- a/packages/neovim/src/api/Window.test.ts +++ b/packages/neovim/src/api/Window.test.ts @@ -1,5 +1,7 @@ /* eslint-env jest */ +import assert from 'node:assert'; import * as testUtil from '../testUtil'; +import type { Window } from './Window'; describe('Window API', () => { let nvim: ReturnType[1]; @@ -24,7 +26,7 @@ describe('Window API', () => { }); describe('Normal API calls', () => { - let win; + let win: Window; beforeEach(async () => { win = await nvim.window; @@ -51,7 +53,7 @@ describe('Window API', () => { }); it('has same cursor position after appending a line to buffer', async () => { - await win.buffer.append(['test']); + await (await win.buffer).append(['test']); expect(await win.buffer.lines).toEqual(['', 'test']); expect(await win.cursor).toEqual([1, 0]); }); @@ -94,7 +96,7 @@ describe('Window API', () => { }); it('has the right window positions in display cells', async () => { - let windows; + let windows: Awaited; nvim.command('vsplit'); // XXX If we re-use `win` without a new call to `nvim.window`, @@ -126,6 +128,7 @@ describe('Window API', () => { expect(await win.getOption('list')).toBe(true); win.setOption('list', false); expect(await win.getOption('list')).toBe(false); + assert(list !== undefined); // Restore option win.setOption('list', list); expect(await win.getOption('list')).toBe(list); @@ -167,7 +170,7 @@ describe('Window API', () => { }); it.skip('gets current lines in buffer', async () => { - expect(await nvim.window.buffer.lines).toEqual(['test']); + expect(await (await nvim.window.buffer).lines).toEqual(['test']); }); }); }); diff --git a/packages/neovim/src/host/NvimPlugin.test.ts b/packages/neovim/src/host/NvimPlugin.test.ts index d6174fae..672f239b 100644 --- a/packages/neovim/src/host/NvimPlugin.test.ts +++ b/packages/neovim/src/host/NvimPlugin.test.ts @@ -128,6 +128,7 @@ describe('NvimPlugin', () => { () => {}, getFakeNvimClient() ); + // @ts-expect-error Intentionally passing empty array for command arguments. plugin.registerCommand('MyCommand', [], {}); expect(Object.keys(plugin.commands)).toHaveLength(0); }); @@ -175,7 +176,7 @@ describe('NvimPlugin', () => { () => {}, getFakeNvimClient() ); - const fn = arg => arg; + const fn = (arg: any) => arg; plugin.registerAutocmd('BufWritePre', fn, { pattern: '*', sync: true }); plugin.registerCommand('MyCommand', fn, { sync: true }); diff --git a/packages/neovim/src/plugin/plugin.test.ts b/packages/neovim/src/plugin/plugin.test.ts index 291fd8ea..6ff003a5 100644 --- a/packages/neovim/src/plugin/plugin.test.ts +++ b/packages/neovim/src/plugin/plugin.test.ts @@ -6,7 +6,7 @@ import { command as Command } from './command'; import { autocmd as Autocmd } from './autocmd'; import { getFakeNvimClient } from '../testUtil'; -const instantiateOrRun = (Fn, ...args) => { +const instantiateOrRun = (Fn: ReturnType, ...args: any[]) => { try { return new Fn(...args); } catch (err) { @@ -36,13 +36,16 @@ describe('Plugin class decorator', () => { }); it('decorates class methods', () => { - class MyClass {} - MyClass.prototype.testF = () => {}; - MyClass.prototype.testC = () => {}; - MyClass.prototype.testA = () => {}; + class MyClass { + testF() {} + + testC() {} + + testA() {} + } // This is how (closeish) babel applies decorators - FunctionDecorator('TestF', { eval: 'test', range: 'test' })( + FunctionDecorator('TestF', { eval: 'test', range: [1, 10] })( MyClass.prototype, 'testF' ); @@ -85,15 +88,18 @@ describe('Plugin class decorator', () => { expect(pluginObject.registerFunction).toHaveBeenCalledWith( 'TestF', [instance, MyClass.prototype.testF], - { sync: false, eval: 'test', range: 'test' } + { sync: false, eval: 'test', range: [1, 10] } ); }); it('generates specs from decorated methods', () => { - class MyClass {} - MyClass.prototype.testF = () => {}; - MyClass.prototype.testC = () => {}; - MyClass.prototype.testA = () => {}; + class MyClass { + testF() {} + + testC() {} + + testA() {} + } // This is how (closeish) babel applies decorators FunctionDecorator('TestF')(MyClass.prototype, 'testF'); diff --git a/packages/neovim/tsconfig.json b/packages/neovim/tsconfig.json index 94e89d26..146c85e3 100644 --- a/packages/neovim/tsconfig.json +++ b/packages/neovim/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "outDir": "./lib" }, - "include": ["src", "**/api/Buffer.test.ts"], - "exclude": ["node_modules", "__tests__", "**/*.test.ts", "examples", "lib"] + "include": ["src"], + "exclude": ["node_modules", "examples", "lib"] } From e28b0c698b7fba0d5e012b8ff01f3932b317ff94 Mon Sep 17 00:00:00 2001 From: Sam Guo <501018786@qq.com> Date: Fri, 11 Oct 2024 00:17:57 +0800 Subject: [PATCH 02/23] build(tests): type check integration.test.ts #413 * Avoid jest runs on js files --- .../__tests__/integration.test.ts | 21 ++++++++++--------- packages/integration-tests/package.json | 4 ++++ packages/integration-tests/tsconfig.json | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/integration-tests/__tests__/integration.test.ts b/packages/integration-tests/__tests__/integration.test.ts index 47231301..e682cab8 100644 --- a/packages/integration-tests/__tests__/integration.test.ts +++ b/packages/integration-tests/__tests__/integration.test.ts @@ -1,8 +1,8 @@ /* eslint-env jest */ -import * as cp from 'child_process'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as http from 'http'; +import * as cp from 'node:child_process'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import * as http from 'node:http'; import { NeovimClient, attach, findNvim } from 'neovim'; @@ -37,11 +37,11 @@ describe('Node host', () => { ` ); - const minVersion = '0.9.5' - const nvimInfo = findNvim({ minVersion: minVersion }); + const minVersion = '0.9.5'; + const nvimInfo = findNvim({ minVersion }); const nvimPath = nvimInfo.matches[0]?.path; if (!nvimPath) { - throw new Error(`nvim ${minVersion} not found`) + throw new Error(`nvim ${minVersion} not found`); } cp.spawnSync(nvimPath, args); @@ -115,10 +115,10 @@ describe('Node host', () => { const childHost = cp.spawn( process.execPath, [path.join(__dirname, '..', '..', 'neovim', 'bin', 'cli.js')], - { env: { NVIM_NODE_HOST_DEBUG: 1 }, stdio: 'ignore' } + { env: { NVIM_NODE_HOST_DEBUG: 'TRUE' }, stdio: 'ignore' } ); - setTimeout(function () { + setTimeout(() => { http.get('http://127.0.0.1:9229/json/list', res => { let rawData = ''; res.on('data', chunk => { @@ -133,7 +133,8 @@ describe('Node host', () => { 'ws://127.0.0.1:9229' ); done(); - } catch (e) { + } catch (e: any) { + // eslint-disable-next-line no-console console.error(e.message); throw e; } diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 31179859..c714badb 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -53,5 +53,9 @@ "jest": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-resolve": "^29.6.1" + }, + "jest": { + "testEnvironment": "node", + "testPathIgnorePatterns": [".d.ts", ".js"] } } diff --git a/packages/integration-tests/tsconfig.json b/packages/integration-tests/tsconfig.json index 6521e21b..fd982030 100644 --- a/packages/integration-tests/tsconfig.json +++ b/packages/integration-tests/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "outDir": "./lib" }, - "include": ["src"], - "exclude": ["node_modules", "__tests__", "**/*.test.ts", "examples", "lib"] + "include": ["src", "__tests__"], + "exclude": ["node_modules", "examples", "lib"] } From 090903314961b4574eade68bc8032646c0e09536 Mon Sep 17 00:00:00 2001 From: Sam Guo <501018786@qq.com> Date: Fri, 11 Oct 2024 17:28:27 +0800 Subject: [PATCH 03/23] test(attach): fix "emits disconnect" timeout #414 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: This test may time out, because the `proc.on('close')` event is never triggered. FAIL src/attach/attach.test.ts (5.62 s) ● Nvim API › emits "disconnect" after quit thrown: "Exceeded timeout of 5000 ms for a test while waiting for `done()` to be called. | }); | > | it('emits "disconnect" after quit', done => { | ^ | const disconnectMock = jest.fn(); | nvim.on('disconnect', disconnectMock); | nvim.quit(); at it (src/attach/attach.test.ts:138:3) at Object.describe (src/attach/attach.test.ts:6:1) Solution: Listen for 'exit' instead of 'close'. This may indicate that Nvim or node-client is not properly closing all of its streams, but that is unrelated to this particular test. --- packages/neovim/src/attach/attach.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index 5fa3ae13..70d16597 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -157,10 +157,12 @@ describe('Nvim API', () => { it('emits "disconnect" after quit', done => { const disconnectMock = jest.fn(); nvim.on('disconnect', disconnectMock); + nvim.quit(); - proc.on('close', () => { - expect(disconnectMock.mock.calls.length).toBe(1); + // TODO: 'close' event sometimes does not emit. #414 + proc.on('exit', () => { + expect(disconnectMock).toHaveBeenCalledTimes(1); done(); }); From a124b514662f8ca6c31ba8e299037560613bd698 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:44:05 -0700 Subject: [PATCH 04/23] deps: bump winston from 3.14.1 to 3.15.0 (#406) Bumps [winston](https://github.com/winstonjs/winston) from 3.14.1 to 3.15.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.14.1...v3.15.0) --- updated-dependencies: - dependency-name: winston dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- packages/neovim/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87d0ab43..aff38aed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8839,9 +8839,9 @@ } }, "node_modules/winston": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.1.tgz", - "integrity": "sha512-CJi4Il/msz8HkdDfXOMu+r5Au/oyEjFiOZzbX2d23hRLY0narGjqfE5lFlrT5hfYJhPtM8b85/GNFsxIML/RVA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", + "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -9065,7 +9065,7 @@ "license": "MIT", "dependencies": { "@msgpack/msgpack": "^2.8.0", - "winston": "3.14.1" + "winston": "3.15.0" }, "bin": { "neovim-node-host": "bin/cli.js" @@ -14260,7 +14260,7 @@ "jest-resolve": "^29.6.1", "typedoc": "^0.26.7", "typescript": "^5.5.4", - "winston": "3.14.1" + "winston": "3.15.0" } }, "node-int64": { @@ -15530,9 +15530,9 @@ } }, "winston": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.1.tgz", - "integrity": "sha512-CJi4Il/msz8HkdDfXOMu+r5Au/oyEjFiOZzbX2d23hRLY0narGjqfE5lFlrT5hfYJhPtM8b85/GNFsxIML/RVA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", + "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", "requires": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", diff --git a/packages/neovim/package.json b/packages/neovim/package.json index 2bf9263f..e498d706 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -51,7 +51,7 @@ }, "dependencies": { "@msgpack/msgpack": "^2.8.0", - "winston": "3.14.1" + "winston": "3.15.0" }, "devDependencies": { "@babel/core": "^7.25.2", From b156cbdaf43ec3e8713975d1d5cac1aed836993a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:45:04 -0700 Subject: [PATCH 05/23] deps: bump lint-staged from 15.2.0 to 15.2.10 (#390) Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 15.2.0 to 15.2.10. - [Release notes](https://github.com/lint-staged/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/lint-staged/lint-staged/compare/v15.2.0...v15.2.10) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 484 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 268 insertions(+), 218 deletions(-) diff --git a/package-lock.json b/package-lock.json index aff38aed..ebda7b83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-unicorn": "^50.0.1", "husky": "^9.1.4", - "lint-staged": "^15.2.0", + "lint-staged": "^15.2.10", "prettier": "^3.3.3", "typescript": "^5.5.4" } @@ -3679,15 +3679,15 @@ } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3710,9 +3710,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -3722,15 +3722,15 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -3853,12 +3853,12 @@ } }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/concat-map": { @@ -3943,12 +3943,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4102,6 +4102,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6430,12 +6442,15 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -6454,21 +6469,21 @@ } }, "node_modules/lint-staged": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", - "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.0", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -6627,16 +6642,16 @@ } }, "node_modules/listr2": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", - "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -6644,9 +6659,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -6668,15 +6683,15 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/listr2/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -6747,14 +6762,14 @@ "dev": true }, "node_modules/log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "dependencies": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" }, @@ -6766,24 +6781,24 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "type-fest": "^3.0.0" + "environment": "^1.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -6805,9 +6820,9 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { @@ -6842,9 +6857,9 @@ } }, "node_modules/log-update/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -6873,18 +6888,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -7011,12 +7014,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -7032,6 +7035,18 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -7063,9 +7078,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -7842,21 +7857,48 @@ } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7868,9 +7910,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { @@ -8640,18 +8682,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typedoc/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -8923,10 +8953,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -11768,12 +11801,12 @@ } }, "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "requires": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" } }, "cli-truncate": { @@ -11787,21 +11820,21 @@ }, "dependencies": { "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true }, "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -11906,9 +11939,9 @@ } }, "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true }, "concat-map": { @@ -11976,12 +12009,12 @@ } }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "dedent": { @@ -12084,6 +12117,12 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, + "environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -13795,9 +13834,9 @@ } }, "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true }, "lines-and-columns": { @@ -13816,21 +13855,21 @@ } }, "lint-staged": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", - "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", "dev": true, "requires": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.0", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" }, "dependencies": { "chalk": { @@ -13919,23 +13958,23 @@ } }, "listr2": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", - "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "requires": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" }, "dependencies": { "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true }, "ansi-styles": { @@ -13945,15 +13984,15 @@ "dev": true }, "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -14005,31 +14044,31 @@ "dev": true }, "log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "requires": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" }, "dependencies": { "ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "requires": { - "type-fest": "^3.0.0" + "environment": "^1.0.0" } }, "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true }, "ansi-styles": { @@ -14039,9 +14078,9 @@ "dev": true }, "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "is-fullwidth-code-point": { @@ -14064,9 +14103,9 @@ } }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -14083,12 +14122,6 @@ "ansi-regex": "^6.0.1" } }, - "type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true - }, "wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -14197,12 +14230,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -14212,6 +14245,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -14234,9 +14273,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "natural-compare": { "version": "1.4.0", @@ -14814,13 +14853,30 @@ "dev": true }, "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "dependencies": { + "onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "requires": { + "mimic-function": "^5.0.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } } }, "reusify": { @@ -14830,9 +14886,9 @@ "dev": true }, "rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "rimraf": { @@ -15388,12 +15444,6 @@ "requires": { "brace-expansion": "^2.0.1" } - }, - "yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true } } }, @@ -15596,9 +15646,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index f5c6db54..df2d4dd3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-unicorn": "^50.0.1", "husky": "^9.1.4", - "lint-staged": "^15.2.0", + "lint-staged": "^15.2.10", "prettier": "^3.3.3", "typescript": "^5.5.4" }, From ba4c247f96fc2c47cc549dfdf05ff4ac34825a8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 08:30:41 -0700 Subject: [PATCH 06/23] deps: bump typescript from 5.5.4 to 5.6.3 (#415) --- package-lock.json | 38 +++++++++++++++++++----------------- package.json | 2 +- packages/neovim/package.json | 4 ++-- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index ebda7b83..3637eae4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "husky": "^9.1.4", "lint-staged": "^15.2.10", "prettier": "^3.3.3", - "typescript": "^5.5.4" + "typescript": "^5.6.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2790,10 +2790,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.9.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", - "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", - "dev": true + "version": "16.18.113", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.113.tgz", + "integrity": "sha512-4jHxcEzSXpF1cBNxogs5FVbVSFSKo50sFCn7Xg7vmjJTbWFWgeuHW3QnoINlfmfG++MFR/q97RZE5RQXKeT+jg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", @@ -8683,10 +8684,11 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9109,13 +9111,13 @@ "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.24.7", "@types/jest": "^29.5.12", - "@types/node": "16.9.x", + "@types/node": "^16.18.113", "babel-jest": "^29.7.0", "jest": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-resolve": "^29.6.1", "typedoc": "^0.26.7", - "typescript": "^5.5.4" + "typescript": "^5.6.3" }, "engines": { "node": ">=10" @@ -11191,9 +11193,9 @@ "dev": true }, "@types/node": { - "version": "16.9.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", - "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", + "version": "16.18.113", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.113.tgz", + "integrity": "sha512-4jHxcEzSXpF1cBNxogs5FVbVSFSKo50sFCn7Xg7vmjJTbWFWgeuHW3QnoINlfmfG++MFR/q97RZE5RQXKeT+jg==", "dev": true }, "@types/normalize-package-data": { @@ -14292,13 +14294,13 @@ "@babel/preset-typescript": "^7.24.7", "@msgpack/msgpack": "^2.8.0", "@types/jest": "^29.5.12", - "@types/node": "16.9.x", + "@types/node": "^16.18.113", "babel-jest": "^29.7.0", "jest": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-resolve": "^29.6.1", "typedoc": "^0.26.7", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "winston": "3.15.0" } }, @@ -15448,9 +15450,9 @@ } }, "typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index df2d4dd3..e27ad2cf 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "husky": "^9.1.4", "lint-staged": "^15.2.10", "prettier": "^3.3.3", - "typescript": "^5.5.4" + "typescript": "^5.6.3" }, "scripts": { "build": "npm run build --workspaces --if-present", diff --git a/packages/neovim/package.json b/packages/neovim/package.json index e498d706..49f11de3 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -59,13 +59,13 @@ "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.24.7", "@types/jest": "^29.5.12", - "@types/node": "16.9.x", + "@types/node": "^16.18.113", "babel-jest": "^29.7.0", "jest": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-resolve": "^29.6.1", "typedoc": "^0.26.7", - "typescript": "^5.5.4" + "typescript": "^5.6.3" }, "scripts": { "doc": "typedoc --out doc --exclude '**/*.test.ts' src", From 0b2008a3131d77979c20d54417c1d3dc01953ae4 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 15 Oct 2024 14:00:44 +0200 Subject: [PATCH 07/23] feat(findNvim): version parsing robustness Problem: Version parsing makes some assumptions about the `nvim -v` output that could be more robust. For example, - "NVIM" may change to "Nvim": https://github.com/neovim/neovim/commit/98ba65b8be8cb2dde839502357e70916c4a3e37a - "v" is not guaranteed to precede the version Solution: - match case-insensitive "NVIM" - match "v?" instead of "v" - Note: `--api-info` is not used because it is a big payload (thus requires streamed decoding, thus more complex code). --- CHANGELOG.md | 2 +- packages/neovim/src/utils/findNvim.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4f6b312..82152639 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [5.4.0](https://github.com/neovim/node-client/compare/v5.3.0...v5.4.0) -- TODO +- feat(findNvim): version parsing robustness ## [5.3.0](https://github.com/neovim/node-client/compare/v5.2.1...v5.3.0) diff --git a/packages/neovim/src/utils/findNvim.ts b/packages/neovim/src/utils/findNvim.ts index 45098f6c..7ab38e3a 100644 --- a/packages/neovim/src/utils/findNvim.ts +++ b/packages/neovim/src/utils/findNvim.ts @@ -67,7 +67,7 @@ export type FindNvimResult = { }; const versionRegex = /^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/; -const nvimVersionRegex = /^NVIM\s+v(.+)$/m; +const nvimVersionRegex = /^[nN][vV][iI][mM]\s+v?(.+)$/m; const buildTypeRegex = /^Build\s+type:\s+(.+)$/m; const luaJitVersionRegex = /^LuaJIT\s+(.+)$/m; const windows = process.platform === 'win32'; From 4d6d4d3c4c79cd2fd09c039b3052223bddb86ef4 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 15 Oct 2024 16:04:05 +0200 Subject: [PATCH 08/23] fix(findNvim): handle invalid versions Problem: parseVersion() does not handle invalid version strings. For example if findNvim() passes a partial or invalid version string, or undefined. Solution: - If compareVersions() arg 1 is invalid, throw an error. - If compareVersions() arg 2 is invalid, treat it as "older"/"less". --- packages/neovim/src/utils/findNvim.test.ts | 13 +++++++++++++ packages/neovim/src/utils/findNvim.ts | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/neovim/src/utils/findNvim.test.ts b/packages/neovim/src/utils/findNvim.test.ts index e93cb3cd..0c0fad6a 100644 --- a/packages/neovim/src/utils/findNvim.test.ts +++ b/packages/neovim/src/utils/findNvim.test.ts @@ -21,6 +21,7 @@ describe('findNvim', () => { afterAll(() => { rmSync(testDir, { recursive: true, force: true }); }); + it('parseVersion()', () => { expect(parseVersion('0.5.0-dev+1357-g192f89ea1')).toEqual([ 0, @@ -74,6 +75,18 @@ describe('findNvim', () => { '0.3.0-dev-658+g06694203e-Homebrew' ) ).toBe(1); + + // Failure modes: + expect(compareVersions('0.3.0', 'nonsense')).toBe(1); + expect(() => compareVersions('nonsense', '0.3.0')).toThrow( + 'Invalid version: "nonsense"' + ); + expect(() => compareVersions('nonsense', 'nonsense')).toThrow( + 'Invalid version: "nonsense"' + ); + expect(() => compareVersions(undefined, undefined)).toThrow( + 'Invalid version format: not a string' + ); }); /** Asserts that >=1 nvim binaries were found. */ diff --git a/packages/neovim/src/utils/findNvim.ts b/packages/neovim/src/utils/findNvim.ts index 7ab38e3a..3e0ba1af 100644 --- a/packages/neovim/src/utils/findNvim.ts +++ b/packages/neovim/src/utils/findNvim.ts @@ -83,6 +83,9 @@ function parseVersion(version: string): (number | string)[] | undefined { } const [, major, minor, patch, prerelease] = match; + if (major === undefined || minor === undefined || patch === undefined) { + throw new TypeError(`Invalid version string: "${version}"`); + } const majorNumber = Number(major); const minorNumber = Number(minor); const patchNumber = Number(patch); @@ -114,11 +117,17 @@ function parseVersion(version: string): (number | string)[] | undefined { function compareVersions(a: string, b: string): number { const versionA = parseVersion(a); const versionB = parseVersion(b); - const length = Math.min(versionA?.length ?? 0, versionB?.length ?? 0); + if (versionA === undefined) { + throw new TypeError(`Invalid version: "${a}"`); + } + if (versionB === undefined) { + return 1; + } + const length = Math.min(versionA.length, versionB.length); for (let i = 0; i < length; i = i + 1) { - const partA = versionA?.[i] ?? 0; - const partB = versionB?.[i] ?? 0; + const partA = versionA[i] ?? 0; + const partB = versionB[i] ?? 0; if (partA < partB) { return -1; } @@ -127,7 +136,7 @@ function compareVersions(a: string, b: string): number { } } - if ((versionB?.length ?? 0) > (versionA?.length ?? 0)) { + if (versionB.length > versionA.length) { return -1; } @@ -209,6 +218,7 @@ export function findNvim(opt: FindNvimOptions = {}): Readonly { if (existsSync(nvimPath) || normalizedPathsFromUser.includes(nvimPath)) { try { accessSync(nvimPath, constants.X_OK); + // TODO: fallback to `echo 'print(vim.version())' | nvim -l -` if parsing --version fails. const nvimVersionFull = execFileSync(nvimPath, [ '--version', ]).toString(); From 234b0f7cdbccf24df9d5c1380afaf3cf786c0599 Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Fri, 11 Oct 2024 23:58:21 +0800 Subject: [PATCH 09/23] test: replace jest with mocha --- .eslintrc.js | 2 + .github/workflows/ci.yml | 2 +- package-lock.json | 4055 +++++++---------- package.json | 2 +- .../__tests__/integration.test.ts | 9 +- packages/integration-tests/package.json | 16 +- .../integration-tests/src/factory.test.ts | 2 +- packages/integration-tests/tsconfig.json | 3 +- packages/neovim/package.json | 41 +- packages/neovim/src/api/Buffer.test.ts | 35 +- packages/neovim/src/api/Neovim.test.ts | 14 +- packages/neovim/src/api/Tabpage.test.ts | 19 +- packages/neovim/src/api/Window.test.ts | 14 +- packages/neovim/src/attach/attach.test.ts | 29 +- packages/neovim/src/host/NvimPlugin.test.ts | 9 +- packages/neovim/src/plugin/plugin.test.ts | 14 +- packages/neovim/src/testSetup.ts | 19 +- packages/neovim/src/testUtil.ts | 18 +- packages/neovim/src/utils/findNvim.test.ts | 6 +- packages/neovim/src/utils/findNvim.ts | 2 +- packages/neovim/src/utils/transport.test.ts | 2 +- packages/neovim/src/utils/transport.ts | 2 +- packages/neovim/tsconfig.json | 3 +- tsconfig.json | 2 +- 24 files changed, 1692 insertions(+), 2628 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 0f55e7e0..bd5ae527 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,6 +14,7 @@ module.exports = { env: { node: true, es2024: true, + mocha: true, }, overrides: [ @@ -70,6 +71,7 @@ module.exports = { 'import/extensions': 'off', 'import/prefer-default-export': 'off', + 'import/no-extraneous-dependencies': ['error', {'devDependencies': true, 'optionalDependencies': false, 'peerDependencies': false}], '@typescript-eslint/no-namespace': 'error', // TODO: '@typescript-eslint/no-floating-promises': 'error', // Promises must catch errors or be awaited. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71e9f0d8..6eba7c2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: which nvim nvim --version - npm run test-build --stream + npm run test-coverage --stream - uses: codecov/codecov-action@v4 if: matrix.node == '20' diff --git a/package-lock.json b/package-lock.json index 3637eae4..e32c4a00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -755,18 +755,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", @@ -2074,6 +2062,28 @@ "node": ">=0.1.90" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -2191,130 +2201,109 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/@jest/expect-utils": { @@ -2329,97 +2318,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2432,76 +2330,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -2632,6 +2460,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -2666,64 +2504,29 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, - "node_modules/@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@types/graceful-fs": { "version": "4.1.5", @@ -2767,16 +2570,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2789,12 +2582,17 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", + "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", + "dev": true + }, "node_modules/@types/node": { "version": "16.18.113", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.113.tgz", "integrity": "sha512-4jHxcEzSXpF1cBNxogs5FVbVSFSKo50sFCn7Xg7vmjJTbWFWgeuHW3QnoINlfmfG++MFR/q97RZE5RQXKeT+jg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", @@ -3061,11 +2859,10 @@ "dev": true }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3082,6 +2879,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3098,31 +2907,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/ansi-regex": { @@ -3162,14 +2953,11 @@ "node": ">= 8" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", @@ -3305,58 +3093,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -3405,45 +3141,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3455,7 +3152,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "optional": true, "engines": { "node": ">=8" } @@ -3482,6 +3178,12 @@ "node": ">=8" } }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "node_modules/browserslist": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", @@ -3523,12 +3225,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -3541,6 +3237,85 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/c8": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", + "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } + } + }, + "node_modules/c8/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", @@ -3564,15 +3339,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001651", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", @@ -3609,15 +3375,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3629,7 +3386,6 @@ "url": "https://paulmillr.com/funding/" } ], - "optional": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3652,12 +3408,6 @@ "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", @@ -3774,22 +3524,6 @@ "node": ">=12" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -3893,26 +3627,11 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -3960,18 +3679,16 @@ } } }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-is": { @@ -3980,15 +3697,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/define-data-property": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", @@ -4020,13 +3728,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, "node_modules/diff-sequences": { @@ -4062,24 +3770,18 @@ "node": ">=6.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==", "dev": true }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4672,31 +4374,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -4745,38 +4422,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -4893,6 +4538,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -4926,9 +4580,25 @@ "is-callable": "^1.1.3" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, @@ -5033,27 +4703,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -5257,6 +4906,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -5269,15 +4927,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/husky": { "version": "9.1.4", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", @@ -5318,25 +4967,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5421,7 +5051,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5517,15 +5146,6 @@ "node": ">=8" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5583,6 +5203,15 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5667,6 +5296,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5692,39 +5333,14 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -5754,24 +5370,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5781,153 +5383,19 @@ "node": ">=8" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@isaacs/cliui": "^8.0.2" }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jest-diff": { @@ -5945,51 +5413,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -6024,19 +5447,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", @@ -6132,142 +5542,24 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { + "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.13.1", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { + "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", @@ -6296,25 +5588,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -6351,19 +5624,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6406,15 +5666,6 @@ "json5": "lib/cli.js" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -6618,18 +5869,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -6762,6 +6001,22 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -6961,6 +6216,12 @@ "semver": "bin/semver" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -7027,15 +6288,6 @@ "node": ">=8.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -7078,128 +6330,318 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neovim": { - "resolved": "packages/neovim", - "link": true + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "balanced-match": "^1.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, + "node": ">=12" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neovim": { + "resolved": "packages/neovim", + "link": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { @@ -7260,21 +6702,6 @@ "fn.name": "1.x.x" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -7343,6 +6770,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7406,6 +6839,28 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7454,27 +6909,6 @@ "node": ">=6" } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -7546,19 +6980,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -7577,22 +6998,6 @@ "node": ">=6" } }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7613,6 +7018,15 @@ } ] }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -7687,7 +7101,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -7818,27 +7231,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7888,18 +7280,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8030,6 +7410,15 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-function-length": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", @@ -8107,30 +7496,30 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -8180,25 +7569,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8231,12 +7601,6 @@ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -8283,20 +7647,22 @@ "node": ">=0.6.19" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/string-width": { + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -8367,6 +7733,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -8376,15 +7755,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -8450,17 +7820,61 @@ } }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/text-hex": { @@ -8521,6 +7935,58 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -8551,15 +8017,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -8802,10 +8259,16 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -8904,6 +8367,12 @@ "node": ">= 12.0.0" } }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -8921,25 +8390,30 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -8993,6 +8467,42 @@ "node": ">=12" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -9090,9 +8600,11 @@ "neovim": "file:../neovim" }, "devDependencies": { - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1" + "@types/mocha": "^10.0.9", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3" } }, "packages/neovim": { @@ -9110,12 +8622,13 @@ "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.24.7", - "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.9", "@types/node": "^16.18.113", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3", + "ts-node": "^10.9.2", "typedoc": "^0.26.7", "typescript": "^5.6.3" }, @@ -9653,15 +9166,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", @@ -10549,6 +10053,27 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -10637,24 +10162,68 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } } } }, @@ -10664,227 +10233,24 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, - "@jest/console": { + "@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "jest-get-type": "^29.6.3" } }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { "@sinclair/typebox": "^0.27.8" } }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, "@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -11002,9 +10368,11 @@ "version": "file:packages/integration-tests", "requires": { "@neovim/example-plugin": "file:../example-plugin", - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1", + "@types/mocha": "^10.0.9", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3", "neovim": "file:../neovim" } }, @@ -11041,6 +10409,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -11069,64 +10444,29 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, - "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "@types/graceful-fs": { "version": "4.1.5", @@ -11170,16 +10510,6 @@ "@types/istanbul-lib-report": "*" } }, - "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -11192,6 +10522,12 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/mocha": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", + "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", + "dev": true + }, "@types/node": { "version": "16.18.113", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.113.tgz", @@ -11370,11 +10706,10 @@ "dev": true }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "peer": true + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", @@ -11383,6 +10718,15 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -11395,22 +10739,11 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true }, "ansi-regex": { "version": "5.0.1", @@ -11437,14 +10770,11 @@ "picomatch": "^2.0.4" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "array-buffer-byte-length": { "version": "1.0.0", @@ -11538,46 +10868,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, "babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -11616,36 +10906,6 @@ "@babel/helper-define-polyfill-provider": "^0.6.2" } }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -11656,8 +10916,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", @@ -11678,6 +10937,12 @@ "fill-range": "^7.1.1" } }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserslist": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", @@ -11699,18 +10964,61 @@ "node-int64": "^0.4.0" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, + "c8": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", + "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, "call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", @@ -11728,12 +11036,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "caniuse-lite": { "version": "1.0.30001651", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", @@ -11750,18 +11052,11 @@ "supports-color": "^7.1.0" } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "optional": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -11779,12 +11074,6 @@ "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, "clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", @@ -11866,18 +11155,6 @@ "wrap-ansi": "^7.0.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, "color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -11973,20 +11250,11 @@ "browserslist": "^4.23.3" } }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "cross-spawn": { "version": "7.0.3", @@ -12019,12 +11287,11 @@ "ms": "^2.1.3" } }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true }, "deep-is": { "version": "0.1.4", @@ -12032,12 +11299,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, "define-data-property": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", @@ -12060,10 +11321,10 @@ "object-keys": "^1.1.1" } }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true }, "diff-sequences": { @@ -12090,18 +11351,18 @@ "esutils": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "electron-to-chromium": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==", "dev": true }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -12534,22 +11795,8 @@ "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" - }, - "dependencies": { - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -12586,29 +11833,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -12710,6 +11934,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -12740,6 +11970,16 @@ "is-callable": "^1.1.3" } }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -12813,18 +12053,6 @@ "hasown": "^2.0.0" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -12962,6 +12190,12 @@ "function-bind": "^1.1.2" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -12974,12 +12208,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, "husky": { "version": "9.1.4", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", @@ -13002,16 +12230,6 @@ "resolve-from": "^4.0.0" } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -13081,7 +12299,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -13141,12 +12358,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -13183,6 +12394,12 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -13234,6 +12451,12 @@ "which-typed-array": "^1.1.11" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -13256,32 +12479,11 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -13304,125 +12506,24 @@ } } }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" } }, "jest-diff": { @@ -13437,42 +12538,6 @@ "pretty-format": "^29.7.0" } }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, "jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -13499,16 +12564,6 @@ "walker": "^1.0.8" } }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, "jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", @@ -13579,111 +12634,6 @@ "slash": "^3.0.0" } }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, "jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -13720,22 +12670,6 @@ } } }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, "jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -13765,16 +12699,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -13808,12 +12732,6 @@ "minimist": "^1.2.0" } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -13945,12 +12863,6 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -14045,6 +12957,16 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -14182,6 +13104,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -14213,67 +13141,212 @@ } } }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -14293,12 +13366,13 @@ "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.24.7", "@msgpack/msgpack": "^2.8.0", - "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.9", "@types/node": "^16.18.113", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3", + "ts-node": "^10.9.2", "typedoc": "^0.26.7", "typescript": "^5.6.3", "winston": "3.15.0" @@ -14342,15 +13416,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -14437,15 +13502,6 @@ "fn.name": "1.x.x" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -14495,6 +13551,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14540,6 +13602,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14570,21 +13650,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -14631,16 +13696,6 @@ } } }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -14653,18 +13708,21 @@ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true }, - "pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -14725,7 +13783,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, "requires": { "picomatch": "^2.2.1" } @@ -14825,23 +13882,6 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -14872,12 +13912,6 @@ "requires": { "mimic-function": "^5.0.0" } - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true } } }, @@ -14952,6 +13986,15 @@ "lru-cache": "^6.0.0" } }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-function-length": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", @@ -15014,9 +14057,9 @@ } }, "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "simple-swizzle": { @@ -15034,12 +14077,6 @@ } } }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15070,22 +14107,6 @@ } } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15118,12 +14139,6 @@ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -15160,18 +14175,19 @@ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "string-width": { - "version": "4.2.3", + "string-width-cjs": { + "version": "npm:string-width@4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, @@ -15223,18 +14239,21 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -15276,14 +14295,48 @@ } }, "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "text-hex": { @@ -15330,6 +14383,35 @@ "dev": true, "requires": {} }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -15357,12 +14439,6 @@ "prelude-ls": "^1.2.1" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -15525,10 +14601,16 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", @@ -15609,6 +14691,12 @@ "triple-beam": "^1.3.0" } }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -15620,22 +14708,23 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15674,6 +14763,32 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index e27ad2cf..9ec0c6b1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dev": "npm run --stream --parallel dev --workspaces --if-present", "publish:neovim": "cd packages/neovim && cp ../../README.md . && cp ../../CHANGELOG.md . && npm publish", "test": "npm run test --workspaces --if-present", - "test-build": "npm run test-build --workspaces --if-present", + "test-coverage": "npm run test --workspaces --if-present", "test-staged": "npm run test-staged --workspaces --if-present -- --", "test-missing-apis": "npm run test-missing-apis --workspaces --if-present", "test-lint": "npm run lint", diff --git a/packages/integration-tests/__tests__/integration.test.ts b/packages/integration-tests/__tests__/integration.test.ts index e682cab8..1b0454d7 100644 --- a/packages/integration-tests/__tests__/integration.test.ts +++ b/packages/integration-tests/__tests__/integration.test.ts @@ -1,8 +1,9 @@ -/* eslint-env jest */ import * as cp from 'node:child_process'; import * as fs from 'node:fs'; import * as path from 'node:path'; import * as http from 'node:http'; +import expect from 'expect'; +import * as jestMock from 'jest-mock'; import { NeovimClient, attach, findNvim } from 'neovim'; @@ -12,7 +13,7 @@ describe('Node host', () => { let args; let nvim: NeovimClient; - beforeAll(async () => { + before(async () => { const plugdir = path.resolve(__dirname); const nvimrc = path.join(plugdir, 'nvimrc'); args = [ @@ -54,7 +55,7 @@ describe('Node host', () => { nvim = attach({ proc }); }); - afterAll(() => { + after(() => { process.chdir(testdir); nvim.quit(); if (proc && proc.connected) { @@ -74,7 +75,7 @@ describe('Node host', () => { // }); it('console.log is monkey-patched to logger.info #329', async () => { - const spy = jest.spyOn(nvim.logger, 'info'); + const spy = jestMock.spyOn(nvim.logger, 'info'); console.log('log message'); expect(spy).toHaveBeenCalledWith('log message'); // Still alive? diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index c714badb..426d85e8 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -35,8 +35,8 @@ "neovim": "file:../neovim" }, "scripts": { - "test": "jest", - "test-build": "npm test --runInBand --coverage", + "test": "mocha --exit --require ts-node/register src/**/*.test.ts __tests__/**/*.test.ts", + "test-coverage": "c8 --reporter=html --reporter=json npm test", "build": "tsc --pretty", "dev": "npm run build --watch true" }, @@ -50,12 +50,10 @@ "vim" ], "devDependencies": { - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1" - }, - "jest": { - "testEnvironment": "node", - "testPathIgnorePatterns": [".d.ts", ".js"] + "@types/mocha": "^10.0.9", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3" } } diff --git a/packages/integration-tests/src/factory.test.ts b/packages/integration-tests/src/factory.test.ts index 025e895d..f57bcb90 100644 --- a/packages/integration-tests/src/factory.test.ts +++ b/packages/integration-tests/src/factory.test.ts @@ -1,5 +1,5 @@ -/* eslint-env jest */ import { Neovim, NeovimClient, NvimPlugin, loadPlugin } from 'neovim'; +import expect from 'expect'; function getFakeNvimClient(): NeovimClient { const logged: string[] = []; diff --git a/packages/integration-tests/tsconfig.json b/packages/integration-tests/tsconfig.json index fd982030..49b39725 100644 --- a/packages/integration-tests/tsconfig.json +++ b/packages/integration-tests/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "./lib" + "outDir": "./lib", + "types": ["node", "mocha"] }, "include": ["src", "__tests__"], "exclude": ["node_modules", "examples", "lib"] diff --git a/packages/neovim/package.json b/packages/neovim/package.json index 49f11de3..9f8c2925 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -58,50 +58,27 @@ "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.24.7", - "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.9", "@types/node": "^16.18.113", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-resolve": "^29.6.1", + "c8": "^10.1.2", + "expect": "^29.7.0", + "jest-mock": "^29.7.0", + "mocha": "^10.7.3", + "ts-node": "^10.9.2", "typedoc": "^0.26.7", "typescript": "^5.6.3" }, "scripts": { "doc": "typedoc --out doc --exclude '**/*.test.ts' src", "prepublishOnly": "npm run build", - "test": "jest", - "test-build": "npm test --runInBand --coverage", - "test-staged": "npm test --bail --no-cache --findRelatedTests", + "test": "mocha --exit --parallel --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", + "test-coverage": "c8 --reporter=json --reporter=html npm test", + "test-staged": "npm test --bail", "test-missing-apis": "npm run build && node scripts/findMissingApi", "precommit": "lint-staged", "build": "tsc --pretty", "dev": "npm run build --watch true" }, - "jest": { - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "jsx", - "json", - "node" - ], - "setupFilesAfterEnv": [ - "/src/testSetup.ts" - ], - "testEnvironment": "node", - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.ts$", - "coverageDirectory": "./coverage/", - "collectCoverage": true, - "coverageReporters": [ - "json", - "html" - ], - "testEnvironmentOptions": { - "url": "http://localhost" - } - }, "keywords": [ "neovim", "neovim-client", diff --git a/packages/neovim/src/api/Buffer.test.ts b/packages/neovim/src/api/Buffer.test.ts index 3d3f4490..44455869 100644 --- a/packages/neovim/src/api/Buffer.test.ts +++ b/packages/neovim/src/api/Buffer.test.ts @@ -1,5 +1,6 @@ -/* eslint-env jest */ import assert from 'node:assert'; +import { expect } from 'expect'; +import * as jestMock from 'jest-mock'; import * as testUtil from '../testUtil'; import type { Buffer } from './Buffer'; @@ -35,11 +36,11 @@ describe('Buffer API', () => { }; } - beforeAll(async () => { + before(async () => { [, nvim] = testUtil.startNvim(); }); - afterAll(() => { + after(() => { testUtil.stopNvim(); }); @@ -401,11 +402,11 @@ describe('Buffer API', () => { describe('Buffer event updates', () => { let nvim: ReturnType[1]; - beforeAll(async () => { + before(async () => { [, nvim] = testUtil.startNvim(); }); - afterAll(() => { + after(() => { testUtil.stopNvim(); }); @@ -415,7 +416,7 @@ describe('Buffer event updates', () => { it('can listen and unlisten', async () => { const buffer = await nvim.buffer; - const mock = jest.fn(); + const mock = jestMock.fn(); const unlisten = buffer.listen('lines', mock); await buffer.insert(['bar'], 1); expect(mock).toHaveBeenCalledTimes(1); @@ -426,10 +427,10 @@ describe('Buffer event updates', () => { it('can reattach for buffer events', async () => { const buffer = await nvim.buffer; - let unlisten = buffer.listen('lines', jest.fn()); + let unlisten = buffer.listen('lines', jestMock.fn()); unlisten(); await wait(10); - const mock = jest.fn(); + const mock = jestMock.fn(); unlisten = buffer.listen('lines', mock); await buffer.insert(['bar'], 1); expect(mock).toHaveBeenCalledTimes(1); @@ -438,7 +439,7 @@ describe('Buffer event updates', () => { it('should return attached state', async () => { const buffer = await nvim.buffer; - const unlisten = buffer.listen('lines', jest.fn()); + const unlisten = buffer.listen('lines', jestMock.fn()); await wait(30); let attached = buffer.isAttached; expect(attached).toBe(true); @@ -450,7 +451,7 @@ describe('Buffer event updates', () => { it('only bind once for the same event and handler ', async () => { const buffer = await nvim.buffer; - const mock = jest.fn(); + const mock = jestMock.fn(); buffer.listen('lines', mock); buffer.listen('lines', mock); await buffer.insert(['bar'], 1); @@ -459,7 +460,7 @@ describe('Buffer event updates', () => { it('can use `buffer.unlisten` to unlisten', async () => { const buffer = await nvim.buffer; - const mock = jest.fn(); + const mock = jestMock.fn(); buffer.listen('lines', mock); await buffer.insert(['bar'], 1); expect(mock).toHaveBeenCalledTimes(1); @@ -500,8 +501,8 @@ describe('Buffer event updates', () => { it('has listener on multiple buffers ', async () => { await nvim.command('new!'); const buffers = await nvim.buffers; - const foo = jest.fn(); - const bar = jest.fn(); + const foo = jestMock.fn(); + const bar = jestMock.fn(); buffers[0].listen('lines', foo); buffers[1].listen('lines', bar); @@ -523,8 +524,8 @@ describe('Buffer event updates', () => { await nvim.command('new!'); const buffer = await nvim.buffer; - const foo = jest.fn(); - const bar = jest.fn(); + const foo = jestMock.fn(); + const bar = jestMock.fn(); const unlisten1 = buffer.listen('lines', foo); const unlisten2 = buffer.listen('lines', bar); @@ -547,8 +548,8 @@ describe('Buffer event updates', () => { await nvim.command('new!'); const buffer = await nvim.buffer; - const foo = jest.fn(); - const bar = jest.fn(); + const foo = jestMock.fn(); + const bar = jestMock.fn(); const unlisten1 = buffer.listen('lines', foo); const unlisten2 = buffer.listen('changedtick', bar); diff --git a/packages/neovim/src/api/Neovim.test.ts b/packages/neovim/src/api/Neovim.test.ts index 2227bc77..b2545342 100644 --- a/packages/neovim/src/api/Neovim.test.ts +++ b/packages/neovim/src/api/Neovim.test.ts @@ -1,19 +1,9 @@ -/* eslint-env jest */ import * as path from 'node:path'; import assert from 'node:assert'; -import * as testUtil from '../testUtil'; +import expect from 'expect'; +import { nvim } from '../testUtil'; describe('Neovim API', () => { - let nvim: ReturnType[1]; - - beforeAll(async () => { - [, nvim] = testUtil.startNvim(); - }); - - afterAll(() => { - testUtil.stopNvim(); - }); - describe('Normal API calls', () => { it('gets a list of buffers and switches buffers', async () => { const buffers = await nvim.buffers; diff --git a/packages/neovim/src/api/Tabpage.test.ts b/packages/neovim/src/api/Tabpage.test.ts index 15f5ec6d..e66218f4 100644 --- a/packages/neovim/src/api/Tabpage.test.ts +++ b/packages/neovim/src/api/Tabpage.test.ts @@ -1,18 +1,9 @@ -/* eslint-env jest */ -import * as testUtil from '../testUtil'; +import * as jestMock from 'jest-mock'; +import expect from 'expect'; +import { nvim } from '../testUtil'; import type { Tabpage } from './Tabpage'; describe('Tabpage API', () => { - let nvim: ReturnType[1]; - - beforeAll(async () => { - [, nvim] = testUtil.startNvim(); - }); - - afterAll(() => { - testUtil.stopNvim(); - }); - it('gets the current Tabpage', async () => { const tabpage = await nvim.tabpage; expect(tabpage).toBeInstanceOf(nvim.Tabpage); @@ -25,7 +16,7 @@ describe('Tabpage API', () => { tabpage = await nvim.tabpage; }); - afterAll(() => nvim.command('tabclose')); + after(() => nvim.command('tabclose')); it('gets the current tabpage number', async () => { expect(await tabpage.number).toBe(1); @@ -67,7 +58,7 @@ describe('Tabpage API', () => { }); it('logs an error when calling `getOption`', () => { - const spy = jest.spyOn(tabpage.logger, 'error'); + const spy = jestMock.spyOn(tabpage.logger, 'error'); tabpage.getOption(); expect(spy.mock.calls.length).toBe(1); diff --git a/packages/neovim/src/api/Window.test.ts b/packages/neovim/src/api/Window.test.ts index f59e2562..0db3ffd8 100644 --- a/packages/neovim/src/api/Window.test.ts +++ b/packages/neovim/src/api/Window.test.ts @@ -1,19 +1,9 @@ -/* eslint-env jest */ import assert from 'node:assert'; -import * as testUtil from '../testUtil'; +import expect from 'expect'; +import { nvim } from '../testUtil'; import type { Window } from './Window'; describe('Window API', () => { - let nvim: ReturnType[1]; - - beforeAll(async () => { - [, nvim] = testUtil.startNvim(); - }); - - afterAll(() => { - testUtil.stopNvim(); - }); - it('gets the current Window', async () => { const win = await nvim.window; expect(win).toBeInstanceOf(nvim.Window); diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index 70d16597..e8e0ff9d 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -1,18 +1,17 @@ -/* eslint-env jest */ +import * as jestMock from 'jest-mock'; +import expect from 'expect'; import { attach } from './attach'; import { Logger } from '../utils/logger'; -import * as testUtil from '../testUtil'; +import { proc, nvim, startNvim, stopNvim } from '../testUtil'; import { NeovimClient } from '../api/client'; +// global.expect = expect; + describe('Nvim API', () => { - let proc: ReturnType[0]; - let nvim: ReturnType[1]; let requests: { method: string; args: number[] }[]; let notifications: { method: string; args: number[] }[]; - beforeAll(async () => { - [proc, nvim] = testUtil.startNvim(); - + before(async () => { nvim.on('request', (method, args, resp) => { requests.push({ method, args }); resp.send(`received ${method}(${args})`); @@ -22,10 +21,6 @@ describe('Nvim API', () => { }); }); - afterAll(() => { - testUtil.stopNvim(); - }); - beforeEach(() => { requests = []; notifications = []; @@ -39,7 +34,7 @@ describe('Nvim API', () => { }); it('console.log is monkey-patched to logger.info #329', async () => { - const spy = jest.spyOn(nvim.logger, 'info'); + const spy = jestMock.spyOn(nvim.logger, 'info'); // eslint-disable-next-line no-console console.log('log message'); expect(spy).toHaveBeenCalledWith('log message'); @@ -48,7 +43,7 @@ describe('Nvim API', () => { }); it('console.assert is monkey-patched', async () => { - const spy = jest.spyOn(nvim.logger, 'error'); + const spy = jestMock.spyOn(nvim.logger, 'error'); // eslint-disable-next-line no-console console.assert(false, 'foo', 42, { x: [1, 2] }); expect(spy).toHaveBeenCalledWith('assertion failed', 'foo', 42, { @@ -59,7 +54,7 @@ describe('Nvim API', () => { }); it('console.log NOT monkey-patched if custom logger passed to attach()', async () => { - const [proc2] = testUtil.startNvim(false); + const [proc2] = startNvim(false); const logged: string[] = []; let logger2 = {}; const fakeLog = (msg: any) => { @@ -77,7 +72,7 @@ describe('Nvim API', () => { options: { logger: logger2 as Logger }, }); - const spy = jest.spyOn(nvim2.logger, 'info'); + const spy = jestMock.spyOn(nvim2.logger, 'info'); // eslint-disable-next-line no-console console.log('message 1'); // console.log was NOT patched. @@ -92,7 +87,7 @@ describe('Nvim API', () => { // Still alive? expect(await nvim2.eval('1+1')).toEqual(2); - testUtil.stopNvim(nvim2); + stopNvim(nvim2); }); it('can send requests and receive response', async () => { @@ -155,7 +150,7 @@ describe('Nvim API', () => { }); it('emits "disconnect" after quit', done => { - const disconnectMock = jest.fn(); + const disconnectMock = jestMock.fn(); nvim.on('disconnect', disconnectMock); nvim.quit(); diff --git a/packages/neovim/src/host/NvimPlugin.test.ts b/packages/neovim/src/host/NvimPlugin.test.ts index 672f239b..3d1f6222 100644 --- a/packages/neovim/src/host/NvimPlugin.test.ts +++ b/packages/neovim/src/host/NvimPlugin.test.ts @@ -1,4 +1,5 @@ -/* eslint-env jest */ +import expect from 'expect'; +import * as jestMock from 'jest-mock'; import { getFakeNvimClient } from '../testUtil'; import { callable, NvimPlugin } from './NvimPlugin'; @@ -94,7 +95,8 @@ describe('NvimPlugin', () => { }); it('should create functions from callable arrays', () => { - const fn = jest.fn(function () { + const fn = jestMock.fn(function () { + // @ts-expect-error intentional return this; }); expect(callable(fn)).toEqual(fn); @@ -110,7 +112,8 @@ describe('NvimPlugin', () => { getFakeNvimClient() ); const obj = { - func: jest.fn(function () { + func: jestMock.fn(function () { + // @ts-expect-error intentional return this; }), }; diff --git a/packages/neovim/src/plugin/plugin.test.ts b/packages/neovim/src/plugin/plugin.test.ts index 6ff003a5..8a734a6f 100644 --- a/packages/neovim/src/plugin/plugin.test.ts +++ b/packages/neovim/src/plugin/plugin.test.ts @@ -1,4 +1,5 @@ -/* eslint-env jest */ +import expect from 'expect'; +import * as jestMock from 'jest-mock'; import { plugin as Plugin } from './plugin'; import { NvimPlugin } from '../host/NvimPlugin'; import { nvimFunction as FunctionDecorator } from './function'; @@ -30,7 +31,10 @@ describe('Plugin class decorator', () => { const plugin = Plugin({ dev: true })(MyClass); expect(typeof plugin).toEqual('function'); - const pluginObject = { setOptions: jest.fn(), nvim: getFakeNvimClient() }; + const pluginObject = { + setOptions: jestMock.fn(), + nvim: getFakeNvimClient(), + }; instantiateOrRun(plugin, pluginObject); expect(pluginObject.setOptions).toHaveBeenCalledWith({ dev: true }); }); @@ -61,9 +65,9 @@ describe('Plugin class decorator', () => { const plugin = Plugin(MyClass); const pluginObject = { - registerAutocmd: jest.fn(), - registerCommand: jest.fn(), - registerFunction: jest.fn(), + registerAutocmd: jestMock.fn(), + registerCommand: jestMock.fn(), + registerFunction: jestMock.fn(), nvim: getFakeNvimClient(), }; diff --git a/packages/neovim/src/testSetup.ts b/packages/neovim/src/testSetup.ts index 5abaf537..e7d16de9 100644 --- a/packages/neovim/src/testSetup.ts +++ b/packages/neovim/src/testSetup.ts @@ -1,12 +1,13 @@ // Global test setup. Runs before each test. +import { startNvim, stopNvim } from './testUtil'; -import * as testUtil from './testUtil'; -// import * as jest from '@jest/globals' +process.env.NODE_ENV = 'test'; -testUtil.findNvimOrFail(); - -// TODO: this doesn't work because jest sucks. use mocha instead. -// jest.beforeAll(() => { -// }); -// jest.afterAll(() => { -// }); +export const mochaHooks = { + beforeAll: async () => { + startNvim(); + }, + afterAll: () => { + stopNvim(); + }, +}; diff --git a/packages/neovim/src/testUtil.ts b/packages/neovim/src/testUtil.ts index c47e6040..5d52e838 100644 --- a/packages/neovim/src/testUtil.ts +++ b/packages/neovim/src/testUtil.ts @@ -1,8 +1,7 @@ import * as cp from 'node:child_process'; -// eslint-disable-next-line import/no-extraneous-dependencies -import * as jest from '@jest/globals'; import * as fs from 'node:fs'; import * as path from 'node:path'; +import expect from 'expect'; import { NeovimClient } from './api/client'; import { attach } from './attach/attach'; import { findNvim } from './utils/findNvim'; @@ -19,8 +18,10 @@ export function findNvimOrFail() { const nvimPath = findNvimOrFail(); -let proc: cp.ChildProcessWithoutNullStreams; -let nvim: NeovimClient; +// eslint-disable-next-line import/no-mutable-exports +export let proc: cp.ChildProcessWithoutNullStreams; +// eslint-disable-next-line import/no-mutable-exports +export let nvim: NeovimClient; export function startNvim(): [cp.ChildProcessWithoutNullStreams, NeovimClient]; export function startNvim( @@ -32,7 +33,7 @@ export function startNvim( export function startNvim( doAttach: boolean = true ): [cp.ChildProcessWithoutNullStreams, NeovimClient | undefined] { - const testFile = jest.expect.getState().testPath?.replace(/.*[\\/]/, ''); + const testFile = expect.getState().testPath?.replace(/.*[\\/]/, ''); const msg = `startNvim in test: ${testFile}`; if (process.env.NVIM_NODE_LOG_FILE) { const logfile = path.resolve(process.env.NVIM_NODE_LOG_FILE); @@ -75,10 +76,3 @@ export function getFakeNvimClient() { logger: getLogger(), } as NeovimClient; } - -// jest.beforeAll(async () => { -// [proc, nvim] = startNvim(); -// }); -// jest.afterAll(() => { -// stopNvim(); -// }); diff --git a/packages/neovim/src/utils/findNvim.test.ts b/packages/neovim/src/utils/findNvim.test.ts index 0c0fad6a..e647d7f7 100644 --- a/packages/neovim/src/utils/findNvim.test.ts +++ b/packages/neovim/src/utils/findNvim.test.ts @@ -1,6 +1,6 @@ -/* eslint-env jest */ import { join } from 'node:path'; import { mkdirSync, writeFileSync, rmSync } from 'node:fs'; +import expect from 'expect'; import { findNvim, exportsForTesting, FindNvimResult } from './findNvim'; const parseVersion = exportsForTesting.parseVersion; @@ -13,12 +13,12 @@ describe('findNvim', () => { join(testDir, process.platform === 'win32' ? 'nvim.exe' : 'nvim') ); - beforeAll(() => { + before(() => { mkdirSync(testDir, { recursive: true }); writeFileSync(nvimExecutablePath, 'fake-nvim-executable'); }); - afterAll(() => { + after(() => { rmSync(testDir, { recursive: true, force: true }); }); diff --git a/packages/neovim/src/utils/findNvim.ts b/packages/neovim/src/utils/findNvim.ts index 3e0ba1af..cf6a4422 100644 --- a/packages/neovim/src/utils/findNvim.ts +++ b/packages/neovim/src/utils/findNvim.ts @@ -276,7 +276,7 @@ export function findNvim(opt: FindNvimOptions = {}): Readonly { // eslint-disable-next-line import/no-mutable-exports export let exportsForTesting: any; -// jest sets NODE_ENV=test. +// 'NODE_ENV=test' is being set in testSetup.ts if (process.env.NODE_ENV === 'test') { // These functions are intentionally not exported. After `nvim` is found, clients can use Nvim's // own `vim.version` module, so node-client shouldn't expose a half-baked "semver" implementation. diff --git a/packages/neovim/src/utils/transport.test.ts b/packages/neovim/src/utils/transport.test.ts index 5d969eab..46aa399f 100644 --- a/packages/neovim/src/utils/transport.test.ts +++ b/packages/neovim/src/utils/transport.test.ts @@ -1,7 +1,7 @@ -/* eslint-env jest */ import { EventEmitter } from 'node:events'; import { Readable, Writable } from 'node:stream'; import * as msgpack from '@msgpack/msgpack'; +import expect from 'expect'; import { attach } from '../attach/attach'; import { exportsForTesting } from './transport'; diff --git a/packages/neovim/src/utils/transport.ts b/packages/neovim/src/utils/transport.ts index 44260813..d40886af 100644 --- a/packages/neovim/src/utils/transport.ts +++ b/packages/neovim/src/utils/transport.ts @@ -14,7 +14,7 @@ import { import { Metadata } from '../api/types'; export let exportsForTesting: any; // eslint-disable-line import/no-mutable-exports -// jest sets NODE_ENV=test. +// 'NODE_ENV=test' is being set in testSetup.ts if (process.env.NODE_ENV === 'test') { exportsForTesting = { onTransportFail: new EventEmitter(), diff --git a/packages/neovim/tsconfig.json b/packages/neovim/tsconfig.json index 146c85e3..4b796a0d 100644 --- a/packages/neovim/tsconfig.json +++ b/packages/neovim/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "./lib" + "outDir": "./lib", + "types": ["node", "mocha"] }, "include": ["src"], "exclude": ["node_modules", "examples", "lib"] diff --git a/tsconfig.json b/tsconfig.json index 18feeb00..e775e755 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,7 @@ "target": "es2015", "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "types": ["node", "jest"] + "types": ["node", "mocha"] }, "exclude": ["**/node_modules"], "compileOnSave": false, From 8a8bc2e843cdc360280f11eb65eda7097a604f95 Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Wed, 16 Oct 2024 23:46:52 +0800 Subject: [PATCH 10/23] skip "emits disconnect after quit" test --- packages/neovim/src/attach/attach.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index e8e0ff9d..0b14b1b5 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -149,7 +149,8 @@ describe('Nvim API', () => { expect(newLines).toEqual(['line1', 'line2']); }); - it('emits "disconnect" after quit', done => { + // skip for now. #419 + it.skip('emits "disconnect" after quit', done => { const disconnectMock = jestMock.fn(); nvim.on('disconnect', disconnectMock); From 265382e7fac9c074e95ba11935c86f56f91e1445 Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Thu, 17 Oct 2024 00:45:57 +0800 Subject: [PATCH 11/23] drop --parallel --- packages/neovim/package.json | 2 +- packages/neovim/src/api/Neovim.test.ts | 12 +++++++++++- packages/neovim/src/api/Tabpage.test.ts | 12 +++++++++++- packages/neovim/src/api/Window.test.ts | 12 +++++++++++- packages/neovim/src/attach/attach.test.ts | 17 ++++++++++++++--- 5 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/neovim/package.json b/packages/neovim/package.json index 9f8c2925..5064731c 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -71,7 +71,7 @@ "scripts": { "doc": "typedoc --out doc --exclude '**/*.test.ts' src", "prepublishOnly": "npm run build", - "test": "mocha --exit --parallel --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", + "test": "mocha --exit --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", "test-coverage": "c8 --reporter=json --reporter=html npm test", "test-staged": "npm test --bail", "test-missing-apis": "npm run build && node scripts/findMissingApi", diff --git a/packages/neovim/src/api/Neovim.test.ts b/packages/neovim/src/api/Neovim.test.ts index b2545342..542582e7 100644 --- a/packages/neovim/src/api/Neovim.test.ts +++ b/packages/neovim/src/api/Neovim.test.ts @@ -1,9 +1,19 @@ import * as path from 'node:path'; import assert from 'node:assert'; import expect from 'expect'; -import { nvim } from '../testUtil'; +import * as testUtil from '../testUtil'; describe('Neovim API', () => { + let nvim: ReturnType[1]; + + before(async () => { + [, nvim] = testUtil.startNvim(); + }); + + after(() => { + testUtil.stopNvim(); + }); + describe('Normal API calls', () => { it('gets a list of buffers and switches buffers', async () => { const buffers = await nvim.buffers; diff --git a/packages/neovim/src/api/Tabpage.test.ts b/packages/neovim/src/api/Tabpage.test.ts index e66218f4..5ea694e9 100644 --- a/packages/neovim/src/api/Tabpage.test.ts +++ b/packages/neovim/src/api/Tabpage.test.ts @@ -1,9 +1,19 @@ import * as jestMock from 'jest-mock'; import expect from 'expect'; -import { nvim } from '../testUtil'; +import * as testUtil from '../testUtil'; import type { Tabpage } from './Tabpage'; describe('Tabpage API', () => { + let nvim: ReturnType[1]; + + before(async () => { + [, nvim] = testUtil.startNvim(); + }); + + after(() => { + testUtil.stopNvim(); + }); + it('gets the current Tabpage', async () => { const tabpage = await nvim.tabpage; expect(tabpage).toBeInstanceOf(nvim.Tabpage); diff --git a/packages/neovim/src/api/Window.test.ts b/packages/neovim/src/api/Window.test.ts index 0db3ffd8..7bf07557 100644 --- a/packages/neovim/src/api/Window.test.ts +++ b/packages/neovim/src/api/Window.test.ts @@ -1,9 +1,19 @@ import assert from 'node:assert'; import expect from 'expect'; -import { nvim } from '../testUtil'; +import * as testUtil from '../testUtil'; import type { Window } from './Window'; describe('Window API', () => { + let nvim: ReturnType[1]; + + before(async () => { + [, nvim] = testUtil.startNvim(); + }); + + after(() => { + testUtil.stopNvim(); + }); + it('gets the current Window', async () => { const win = await nvim.window; expect(win).toBeInstanceOf(nvim.Window); diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index 0b14b1b5..81a721fe 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -2,12 +2,23 @@ import * as jestMock from 'jest-mock'; import expect from 'expect'; import { attach } from './attach'; import { Logger } from '../utils/logger'; -import { proc, nvim, startNvim, stopNvim } from '../testUtil'; +import * as testUtil from '../testUtil'; import { NeovimClient } from '../api/client'; // global.expect = expect; describe('Nvim API', () => { + let proc: ReturnType[0]; + let nvim: ReturnType[1]; + + before(async () => { + [proc, nvim] = testUtil.startNvim(); + }); + + after(() => { + testUtil.stopNvim(); + }); + let requests: { method: string; args: number[] }[]; let notifications: { method: string; args: number[] }[]; @@ -54,7 +65,7 @@ describe('Nvim API', () => { }); it('console.log NOT monkey-patched if custom logger passed to attach()', async () => { - const [proc2] = startNvim(false); + const [proc2] = testUtil.startNvim(false); const logged: string[] = []; let logger2 = {}; const fakeLog = (msg: any) => { @@ -87,7 +98,7 @@ describe('Nvim API', () => { // Still alive? expect(await nvim2.eval('1+1')).toEqual(2); - stopNvim(nvim2); + testUtil.stopNvim(nvim2); }); it('can send requests and receive response', async () => { From c562c6246f281878a69217880f5041ddf068f81e Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Thu, 17 Oct 2024 00:48:32 +0800 Subject: [PATCH 12/23] set NODE_ENV on test script --- packages/neovim/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/neovim/package.json b/packages/neovim/package.json index 5064731c..6312987d 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -71,7 +71,7 @@ "scripts": { "doc": "typedoc --out doc --exclude '**/*.test.ts' src", "prepublishOnly": "npm run build", - "test": "mocha --exit --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", + "test": "NODE_ENV=test mocha --exit --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", "test-coverage": "c8 --reporter=json --reporter=html npm test", "test-staged": "npm test --bail", "test-missing-apis": "npm run build && node scripts/findMissingApi", From 535270329eb6d807c981002b69841aeeda8fbf49 Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Thu, 17 Oct 2024 01:01:17 +0800 Subject: [PATCH 13/23] add .mocharc.js to make NODE_ENV='test' work --- packages/neovim/.mocharc.js | 8 ++++++++ packages/neovim/package.json | 2 +- packages/neovim/src/testSetup.ts | 2 -- packages/neovim/src/utils/findNvim.ts | 2 +- packages/neovim/src/utils/transport.ts | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 packages/neovim/.mocharc.js diff --git a/packages/neovim/.mocharc.js b/packages/neovim/.mocharc.js new file mode 100644 index 00000000..c0193d41 --- /dev/null +++ b/packages/neovim/.mocharc.js @@ -0,0 +1,8 @@ +process.env.NODE_ENV = 'test'; + +module.exports = { + require: ['ts-node/register', 'src/testSetup.ts'], + extension: ['ts'], + spec: ['src/**/*.test.ts'], + exit: true +} \ No newline at end of file diff --git a/packages/neovim/package.json b/packages/neovim/package.json index 6312987d..33606ac0 100644 --- a/packages/neovim/package.json +++ b/packages/neovim/package.json @@ -71,7 +71,7 @@ "scripts": { "doc": "typedoc --out doc --exclude '**/*.test.ts' src", "prepublishOnly": "npm run build", - "test": "NODE_ENV=test mocha --exit --require ts-node/register --require src/testSetup.ts src/**/*.test.ts", + "test": "mocha", "test-coverage": "c8 --reporter=json --reporter=html npm test", "test-staged": "npm test --bail", "test-missing-apis": "npm run build && node scripts/findMissingApi", diff --git a/packages/neovim/src/testSetup.ts b/packages/neovim/src/testSetup.ts index e7d16de9..5679d9e3 100644 --- a/packages/neovim/src/testSetup.ts +++ b/packages/neovim/src/testSetup.ts @@ -1,8 +1,6 @@ // Global test setup. Runs before each test. import { startNvim, stopNvim } from './testUtil'; -process.env.NODE_ENV = 'test'; - export const mochaHooks = { beforeAll: async () => { startNvim(); diff --git a/packages/neovim/src/utils/findNvim.ts b/packages/neovim/src/utils/findNvim.ts index cf6a4422..abca031e 100644 --- a/packages/neovim/src/utils/findNvim.ts +++ b/packages/neovim/src/utils/findNvim.ts @@ -276,7 +276,7 @@ export function findNvim(opt: FindNvimOptions = {}): Readonly { // eslint-disable-next-line import/no-mutable-exports export let exportsForTesting: any; -// 'NODE_ENV=test' is being set in testSetup.ts +// .mocharc.js sets NODE_ENV=test. if (process.env.NODE_ENV === 'test') { // These functions are intentionally not exported. After `nvim` is found, clients can use Nvim's // own `vim.version` module, so node-client shouldn't expose a half-baked "semver" implementation. diff --git a/packages/neovim/src/utils/transport.ts b/packages/neovim/src/utils/transport.ts index d40886af..681c4f1c 100644 --- a/packages/neovim/src/utils/transport.ts +++ b/packages/neovim/src/utils/transport.ts @@ -14,7 +14,7 @@ import { import { Metadata } from '../api/types'; export let exportsForTesting: any; // eslint-disable-line import/no-mutable-exports -// 'NODE_ENV=test' is being set in testSetup.ts +// .mocharc.js sets NODE_ENV=test. if (process.env.NODE_ENV === 'test') { exportsForTesting = { onTransportFail: new EventEmitter(), From a694093be78906543b0149bd70005ba688ec03b7 Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Thu, 17 Oct 2024 08:36:26 +0800 Subject: [PATCH 14/23] enable coverage --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ec0c6b1..7e09c3f7 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dev": "npm run --stream --parallel dev --workspaces --if-present", "publish:neovim": "cd packages/neovim && cp ../../README.md . && cp ../../CHANGELOG.md . && npm publish", "test": "npm run test --workspaces --if-present", - "test-coverage": "npm run test --workspaces --if-present", + "test-coverage": "npm run test-coverage --workspaces --if-present", "test-staged": "npm run test-staged --workspaces --if-present -- --", "test-missing-apis": "npm run test-missing-apis --workspaces --if-present", "test-lint": "npm run lint", From 510f1cb0b912b59c7f6ffbebe530b8b81b71355f Mon Sep 17 00:00:00 2001 From: Hao Chen <501018786@qq.com> Date: Thu, 17 Oct 2024 17:09:54 +0800 Subject: [PATCH 15/23] fix eslint rule --- .eslintrc.js | 2 +- packages/neovim/src/testUtil.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index bd5ae527..04466802 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,6 +29,7 @@ module.exports = { // `jest` against the compiled .js results (would require compiling // the test files as well)? 'unicorn/prefer-at': 'off', + 'import/no-extraneous-dependencies': ['error', {'devDependencies': true, 'optionalDependencies': false, 'peerDependencies': false}], }, }, ], @@ -71,7 +72,6 @@ module.exports = { 'import/extensions': 'off', 'import/prefer-default-export': 'off', - 'import/no-extraneous-dependencies': ['error', {'devDependencies': true, 'optionalDependencies': false, 'peerDependencies': false}], '@typescript-eslint/no-namespace': 'error', // TODO: '@typescript-eslint/no-floating-promises': 'error', // Promises must catch errors or be awaited. diff --git a/packages/neovim/src/testUtil.ts b/packages/neovim/src/testUtil.ts index 5d52e838..9cbd8c05 100644 --- a/packages/neovim/src/testUtil.ts +++ b/packages/neovim/src/testUtil.ts @@ -1,6 +1,7 @@ import * as cp from 'node:child_process'; import * as fs from 'node:fs'; import * as path from 'node:path'; +// eslint-disable-next-line import/no-extraneous-dependencies import expect from 'expect'; import { NeovimClient } from './api/client'; import { attach } from './attach/attach'; From 3775c8dd457c653359c3a26d0290533550d97fd5 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Thu, 17 Oct 2024 11:37:52 +0200 Subject: [PATCH 16/23] ci: update dependabot "test" group --- .github/dependabot.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 193bf13f..ce02bc9e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -29,9 +29,13 @@ updates: - '@types/*' exclude-patterns: - '@types/node' - jest: + test: patterns: + - 'mocha*' + - '@types/mocha' - 'jest*' + - 'c8' + - 'expect' # Check for updates to GitHub Actions every week - package-ecosystem: 'github-actions' directory: '/' From 52e5d1ab7361d36291c07a6f0f3274e0dd4c798f Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Thu, 17 Oct 2024 03:51:06 -0700 Subject: [PATCH 17/23] test(transport): high-traffic RPC #412 Problem: In https://github.com/vscode-neovim/vscode-neovim/issues/2184#issuecomment-2369880327 it was reported that "Github Copilot Chat opens MANY buffers while writing code, and that somehow breaks the vscode-neovim extension". Solution: - Add test coverage for high amounts of RPC traffic. - TODO: this doesn't cover complex scenarios such as a looping `OptionSet` handler. --- packages/neovim/src/api/Base.ts | 1 + packages/neovim/src/api/client.ts | 3 ++ packages/neovim/src/attach/attach.test.ts | 51 +++++++++++++++++------ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/packages/neovim/src/api/Base.ts b/packages/neovim/src/api/Base.ts index 4f29c631..b88eaf29 100644 --- a/packages/neovim/src/api/Base.ts +++ b/packages/neovim/src/api/Base.ts @@ -118,6 +118,7 @@ export class BaseApi extends EventEmitter { }); } + /** Sends a request to Nvim (the peer). */ request(name: string, args: any[] = []): Promise { return this.asyncRequest(name, args); } diff --git a/packages/neovim/src/api/client.ts b/packages/neovim/src/api/client.ts index 672dff9e..15a9acb5 100644 --- a/packages/neovim/src/api/client.ts +++ b/packages/neovim/src/api/client.ts @@ -63,6 +63,7 @@ export class NeovimClient extends Neovim { return this.attachedBuffers.has(key); } + /** Handles incoming request (from the peer). */ handleRequest( method: string, args: VimValue[], @@ -85,6 +86,7 @@ export class NeovimClient extends Neovim { } } + /** Publishes to (local) subscribers of this `EventEmitter`. */ emitNotification(method: string, args: any[]) { if (method.endsWith('_event')) { if (!method.startsWith('nvim_buf_')) { @@ -114,6 +116,7 @@ export class NeovimClient extends Neovim { } } + /** Handles incoming notification (from the peer). */ handleNotification(method: string, args: VimValue[], ...restArgs: any[]) { this.logger.info('handleNotification: %s', method); // If neovim API is not generated yet then queue up requests diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index 81a721fe..deb10786 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -11,30 +11,33 @@ describe('Nvim API', () => { let proc: ReturnType[0]; let nvim: ReturnType[1]; + /** Incoming requests (from Nvim). */ + const requests: { method: string; args: number[] }[] = []; + /** Incoming notifications (from Nvim). */ + const notifications: { method: string; args: number[] }[] = []; + before(async () => { [proc, nvim] = testUtil.startNvim(); - }); - - after(() => { - testUtil.stopNvim(); - }); - let requests: { method: string; args: number[] }[]; - let notifications: { method: string; args: number[] }[]; - - before(async () => { + // Incoming requests (from Nvim). nvim.on('request', (method, args, resp) => { requests.push({ method, args }); resp.send(`received ${method}(${args})`); }); + + // Incoming notifications (from Nvim). nvim.on('notification', (method, args) => { notifications.push({ method, args }); }); }); + after(() => { + testUtil.stopNvim(); + }); + beforeEach(() => { - requests = []; - notifications = []; + requests.length = 0; + notifications.length = 0; }); it('failure modes', async () => { @@ -101,6 +104,30 @@ describe('Nvim API', () => { testUtil.stopNvim(nvim2); }); + it('noisy RPC traffic', async () => { + let requestCount = 0; + const oldRequest = nvim.request; + nvim.request = function ( + this: any, + name: string, + args: any[] = [] + ): Promise { + requestCount = requestCount + 1; + return oldRequest.call(this, name, args); + }; + + for (let i = 0; i < 99; i = i + 1) { + nvim.command('noswapfile edit test-node-client.lua'); + nvim.command('bwipeout!'); + } + + expect(requestCount).toEqual(99 * 2); + // Still alive? + expect(await nvim.eval('1+1')).toEqual(2); + + nvim.request = oldRequest; + }); + it('can send requests and receive response', async () => { const result = await nvim.eval('{"k1": "v1", "k2": 2}'); expect(result).toEqual({ k1: 'v1', k2: 2 }); @@ -149,7 +176,7 @@ describe('Nvim API', () => { end: -1, strictIndexing: true, }); - expect(lines).toEqual([]); + expect(lines).toEqual(['']); buf.setLines(['line1', 'line2'], { start: 0, end: 1 }); const newLines = await buf.getLines({ From 756871bec9afd44a4e8d5ccbc567c51ece1e8d98 Mon Sep 17 00:00:00 2001 From: Sam Guo <501018786@qq.com> Date: Sun, 20 Oct 2024 01:40:45 +0800 Subject: [PATCH 18/23] refactor: drop redundant buffered.ts #429 not needed since 669e1d9591138dc315092c52b819f118ece66749 --- packages/neovim/.mocharc.js | 2 +- packages/neovim/src/testSetup.ts | 4 +- packages/neovim/src/utils/buffered.ts | 61 --------------------------- 3 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 packages/neovim/src/utils/buffered.ts diff --git a/packages/neovim/.mocharc.js b/packages/neovim/.mocharc.js index c0193d41..cc091fa3 100644 --- a/packages/neovim/.mocharc.js +++ b/packages/neovim/.mocharc.js @@ -5,4 +5,4 @@ module.exports = { extension: ['ts'], spec: ['src/**/*.test.ts'], exit: true -} \ No newline at end of file +} diff --git a/packages/neovim/src/testSetup.ts b/packages/neovim/src/testSetup.ts index 5679d9e3..e91efbfb 100644 --- a/packages/neovim/src/testSetup.ts +++ b/packages/neovim/src/testSetup.ts @@ -2,10 +2,10 @@ import { startNvim, stopNvim } from './testUtil'; export const mochaHooks = { - beforeAll: async () => { + beforeAll() { startNvim(); }, - afterAll: () => { + afterAll() { stopNvim(); }, }; diff --git a/packages/neovim/src/utils/buffered.ts b/packages/neovim/src/utils/buffered.ts deleted file mode 100644 index b3a9362d..00000000 --- a/packages/neovim/src/utils/buffered.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Transform } from 'node:stream'; - -const MIN_SIZE = 8 * 1024; - -export default class Buffered extends Transform { - private chunks: Buffer[] | null; - - private timer: NodeJS.Timer | null; - - constructor() { - super({ - readableHighWaterMark: 10 * 1024 * 1024, - writableHighWaterMark: 10 * 1024 * 1024, - } as any); - this.chunks = null; - this.timer = null; - } - - sendData() { - const { chunks } = this; - if (chunks) { - this.chunks = null; - const buf = Buffer.concat(chunks); - this.push(buf); - } - } - - // eslint-disable-next-line consistent-return - override _transform(chunk: Buffer, _encoding: any, callback: any): void { - const { chunks, timer } = this; - - if (timer) clearTimeout(timer); - - if (chunk.length < MIN_SIZE) { - if (!chunks) return callback(null, chunk); - chunks.push(chunk); - this.sendData(); - callback(); - } else { - if (!chunks) { - this.chunks = [chunk]; - } else { - chunks.push(chunk); - } - - this.timer = setTimeout(this.sendData.bind(this), 20); - callback(); - } - } - - override _flush(callback: any) { - const { chunks } = this; - if (chunks) { - this.chunks = null; - const buf = Buffer.concat(chunks); - callback(null, buf); - } else { - callback(); - } - } -} From 74880148636620f3f76e0a568aed10ce18b512a1 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 21 Oct 2024 15:51:47 +0200 Subject: [PATCH 19/23] lint: editorconfig --- .editorconfig | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..f80bb5d4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +tab_width = 8 +end_of_line = lf +insert_final_newline = true +max_line_length = 100 From c3fa362342ac2cdc9704b1240d8faf79a99227d6 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Fri, 15 Nov 2024 13:27:35 -0800 Subject: [PATCH 20/23] lint: increased line-length #444 Since `.editorconfig` was added, eslint (or prettier) seems to treat it as authoritative. So let's just increase the line length. --- .prettierrc.json | 1 + packages/decorators/src/plugin/autocmd.ts | 4 +- packages/decorators/src/plugin/plugin.ts | 17 +-- .../integration-tests/src/factory.test.ts | 47 +++----- packages/neovim/src/api/Base.ts | 22 +--- packages/neovim/src/api/Buffer.test.ts | 95 +++------------- packages/neovim/src/api/Buffer.ts | 47 ++------ packages/neovim/src/api/Neovim.test.ts | 25 ++--- packages/neovim/src/api/Neovim.ts | 104 +++--------------- packages/neovim/src/api/Window.ts | 8 +- packages/neovim/src/api/client.ts | 45 ++------ .../src/api/utils/createChainableApi.ts | 35 ++---- packages/neovim/src/attach/attach.test.ts | 10 +- packages/neovim/src/attach/attach.ts | 8 +- packages/neovim/src/host/NvimPlugin.test.ts | 76 +++---------- packages/neovim/src/host/NvimPlugin.ts | 60 +++------- packages/neovim/src/host/factory.ts | 4 +- packages/neovim/src/host/index.ts | 12 +- packages/neovim/src/plugin/plugin.test.ts | 16 +-- packages/neovim/src/plugin/plugin.ts | 13 +-- packages/neovim/src/testUtil.ts | 12 +- packages/neovim/src/types/VimValue.ts | 7 +- packages/neovim/src/utils/findNvim.test.ts | 38 ++----- packages/neovim/src/utils/findNvim.ts | 17 +-- packages/neovim/src/utils/logger.ts | 8 +- packages/neovim/src/utils/transport.ts | 42 ++----- packages/neovim/src/utils/util.ts | 13 +-- 27 files changed, 166 insertions(+), 620 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index 9d9d30fb..168b240a 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,6 +2,7 @@ "tabWidth": 2, "trailingComma": "es5", "parser": "typescript", + "printWidth": 100, "singleQuote": true, "arrowParens": "avoid" } diff --git a/packages/decorators/src/plugin/autocmd.ts b/packages/decorators/src/plugin/autocmd.ts index 2337c501..1a73dccc 100644 --- a/packages/decorators/src/plugin/autocmd.ts +++ b/packages/decorators/src/plugin/autocmd.ts @@ -19,9 +19,7 @@ export function Autocmd(name: string, options?: AutocmdOptions) { } }); - const nameWithPattern = `${name}${ - options?.pattern ? `:${options.pattern}` : '' - }`; + const nameWithPattern = `${name}${options?.pattern ? `:${options.pattern}` : ''}`; Object.defineProperty(f, NVIM_METHOD_NAME, { value: `autocmd:${nameWithPattern}`, }); diff --git a/packages/decorators/src/plugin/plugin.ts b/packages/decorators/src/plugin/plugin.ts index 6421211d..49a83376 100644 --- a/packages/decorators/src/plugin/plugin.ts +++ b/packages/decorators/src/plugin/plugin.ts @@ -2,12 +2,7 @@ import { Neovim, NvimPlugin } from 'neovim'; import { NVIM_SPEC } from './properties'; -import { - PluginOptions, - AutocmdOptions, - CommandOptions, - FunctionOptions, -} from './types'; +import { PluginOptions, AutocmdOptions, CommandOptions, FunctionOptions } from './types'; interface Spec { type: 'function' | 'autocmd' | 'command'; @@ -57,11 +52,7 @@ function wrapper(cls: PluginWrapperConstructor, options?: PluginOptions): any { autoCmdOpts.eval = spec.opts.eval; } - plugin.registerAutocmd( - spec.name, - [this, method], - autoCmdOpts as any - ); + plugin.registerAutocmd(spec.name, [this, method], autoCmdOpts as any); break; case 'command': const cmdOpts: CommandOptions = { @@ -134,7 +125,5 @@ export function Plugin(outter: any): any { * * Plugin(TestPlugin) */ - return typeof outter !== 'function' - ? (cls: any) => wrapper(cls, outter) - : wrapper(outter); + return typeof outter !== 'function' ? (cls: any) => wrapper(cls, outter) : wrapper(outter); } diff --git a/packages/integration-tests/src/factory.test.ts b/packages/integration-tests/src/factory.test.ts index f57bcb90..8d8c1037 100644 --- a/packages/integration-tests/src/factory.test.ts +++ b/packages/integration-tests/src/factory.test.ts @@ -51,27 +51,20 @@ describe('Plugin Factory (used by host)', () => { }); it('should collect the handlers from a plugin', async () => { - expect(await pluginObj.handleRequest('Func', 'function', ['town'])).toEqual( - 'Funcy town' - ); + expect(await pluginObj.handleRequest('Func', 'function', ['town'])).toEqual('Funcy town'); }); it('should load the plugin a sandbox', async () => { - expect( - await pluginObj.handleRequest('Global', 'function', ['loaded']) - ).toEqual(true); - expect( - await pluginObj.handleRequest('Global', 'function', ['Buffer']) - ).not.toEqual(undefined); - expect( - await pluginObj.handleRequest('Global', 'function', ['process']) - ).not.toContain(['chdir', 'exit']); + expect(await pluginObj.handleRequest('Global', 'function', ['loaded'])).toEqual(true); + expect(await pluginObj.handleRequest('Global', 'function', ['Buffer'])).not.toEqual(undefined); + expect(await pluginObj.handleRequest('Global', 'function', ['process'])).not.toContain([ + 'chdir', + 'exit', + ]); }); it('should load files required by the plugin in a sandbox', async () => { - expect( - await pluginObj.handleRequest('Global', 'function', ['required']) - ).toEqual('you bet!'); + expect(await pluginObj.handleRequest('Global', 'function', ['required'])).toEqual('you bet!'); // expect( // Object.keys(required.globals.process), // ).not.toContain( @@ -94,10 +87,7 @@ describe('Plugin Factory (decorator api)', () => { let pluginObj: NvimPlugin; beforeEach(() => { - const p = loadPlugin( - '@neovim/example-plugin-decorators', - getFakeNvimClient() - ); + const p = loadPlugin('@neovim/example-plugin-decorators', getFakeNvimClient()); if (!p) { throw new Error(); } @@ -126,24 +116,19 @@ describe('Plugin Factory (decorator api)', () => { }); it('should collect the handlers from a plugin', async () => { - expect(await pluginObj.handleRequest('Func', 'function', ['town'])).toEqual( - 'Funcy town' - ); + expect(await pluginObj.handleRequest('Func', 'function', ['town'])).toEqual('Funcy town'); }); it('should load the plugin a sandbox', async () => { - expect( - await pluginObj.handleRequest('Global', 'function', ['loaded']) - ).toEqual(true); - expect( - await pluginObj.handleRequest('Global', 'function', ['process']) - ).not.toContain(['chdir', 'exit']); + expect(await pluginObj.handleRequest('Global', 'function', ['loaded'])).toEqual(true); + expect(await pluginObj.handleRequest('Global', 'function', ['process'])).not.toContain([ + 'chdir', + 'exit', + ]); }); it('should load files required by the plugin in a sandbox', async () => { - expect( - await pluginObj.handleRequest('Global', 'function', ['required']) - ).toEqual('you bet!'); + expect(await pluginObj.handleRequest('Global', 'function', ['required'])).toEqual('you bet!'); // expect( // Object.keys(required.globals.process), // ).not.toContain( diff --git a/packages/neovim/src/api/Base.ts b/packages/neovim/src/api/Base.ts index b88eaf29..5a0aef2e 100644 --- a/packages/neovim/src/api/Base.ts +++ b/packages/neovim/src/api/Base.ts @@ -39,13 +39,7 @@ export class BaseApi extends EventEmitter { // Node Buffer protected client: any; - constructor({ - transport, - data, - logger, - metadata, - client, - }: BaseConstructorOptions) { + constructor({ transport, data, logger, metadata, client }: BaseConstructorOptions) { super(); this.transport = transport; @@ -75,12 +69,7 @@ export class BaseApi extends EventEmitter { try { logData = res && typeof res === 'object' - ? partialClone( - res, - 2, - ['logger', 'transport', 'client'], - '[Object]' - ) + ? partialClone(res, 2, ['logger', 'transport', 'client'], '[Object]') : res; } catch { logData = String(res); @@ -108,12 +97,7 @@ export class BaseApi extends EventEmitter { return this[DO_REQUEST](name, args).catch(err => { // XXX: Get a `*.ts stacktrace. If we re-throw `err` we get a `*.js` trace. tsconfig issue? const newError = new Error(err.message); - this.logger.error( - `failed request to "%s": %s: %s`, - name, - newError.name, - newError.message - ); + this.logger.error(`failed request to "%s": %s: %s`, name, newError.name, newError.message); throw newError; }); } diff --git a/packages/neovim/src/api/Buffer.test.ts b/packages/neovim/src/api/Buffer.test.ts index 44455869..fb1398e3 100644 --- a/packages/neovim/src/api/Buffer.test.ts +++ b/packages/neovim/src/api/Buffer.test.ts @@ -17,10 +17,7 @@ describe('Buffer API', () => { // utility to allow each test to be run in its // own buffer - function withBuffer( - lines: string[], - test: (buffer: Buffer) => Promise - ) { + function withBuffer(lines: string[], test: (buffer: Buffer) => Promise) { return async () => { await nvim.command('new!'); @@ -118,38 +115,18 @@ describe('Buffer API', () => { it( 'replaces the right lines', - withBuffer( - ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - async buffer => { - await buffer.replace(['a', 'b', 'c'], 2); - - expect(await buffer.lines).toEqual([ - '0', - '1', - 'a', - 'b', - 'c', - '5', - '6', - '7', - '8', - '9', - ]); - } - ) + withBuffer(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], async buffer => { + await buffer.replace(['a', 'b', 'c'], 2); + + expect(await buffer.lines).toEqual(['0', '1', 'a', 'b', 'c', '5', '6', '7', '8', '9']); + }) ); it( 'inserts line at index 2', withBuffer(['test', 'bar', 'bar', 'bar'], async buffer => { buffer.insert(['foo'], 2); - expect(await buffer.lines).toEqual([ - 'test', - 'bar', - 'foo', - 'bar', - 'bar', - ]); + expect(await buffer.lines).toEqual(['test', 'bar', 'foo', 'bar', 'bar']); }) ); @@ -192,13 +169,7 @@ describe('Buffer API', () => { withBuffer(['test', 'bar', 'foo'], async buffer => { await buffer.append(['test', 'test']); - expect(await buffer.lines).toEqual([ - 'test', - 'bar', - 'foo', - 'test', - 'test', - ]); + expect(await buffer.lines).toEqual(['test', 'bar', 'foo', 'test', 'test']); }) ); @@ -307,26 +278,12 @@ describe('Buffer API', () => { it( 'replaces the right lines', - withBuffer( - ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], - async () => { - const buffer = await nvim.buffer; - await buffer.replace(['a', 'b', 'c'], 2); - - expect(await buffer.lines).toEqual([ - '0', - '1', - 'a', - 'b', - 'c', - '5', - '6', - '7', - '8', - '9', - ]); - } - ) + withBuffer(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], async () => { + const buffer = await nvim.buffer; + await buffer.replace(['a', 'b', 'c'], 2); + + expect(await buffer.lines).toEqual(['0', '1', 'a', 'b', 'c', '5', '6', '7', '8', '9']); + }) ); it( @@ -352,13 +309,7 @@ describe('Buffer API', () => { withBuffer(['test', 'bar', 'bar', 'bar'], async () => { const buffer = await nvim.buffer; await buffer.insert(['foo'], 2); - expect(await buffer.lines).toEqual([ - 'test', - 'bar', - 'foo', - 'bar', - 'bar', - ]); + expect(await buffer.lines).toEqual(['test', 'bar', 'foo', 'bar', 'bar']); }) ); @@ -376,13 +327,7 @@ describe('Buffer API', () => { withBuffer(['test', 'bar', 'foo'], async () => { const buffer = await nvim.buffer; await buffer.append(['test', 'test']); - expect(await buffer.lines).toEqual([ - 'test', - 'bar', - 'foo', - 'test', - 'test', - ]); + expect(await buffer.lines).toEqual(['test', 'bar', 'foo', 'test', 'test']); }) ); @@ -477,13 +422,7 @@ describe('Buffer event updates', () => { const promise = new Promise(resolve => { const unlisten = buffer.listen( 'lines', - async ( - currentBuffer: Buffer, - tick: number, - start: number, - end: number, - data: string[] - ) => { + async (currentBuffer: Buffer, tick: number, start: number, end: number, data: string[]) => { expect(await currentBuffer.name).toBe(bufferName); expect(start).toBe(1); expect(end).toBe(1); diff --git a/packages/neovim/src/api/Buffer.ts b/packages/neovim/src/api/Buffer.ts index feb66dd2..969a8537 100644 --- a/packages/neovim/src/api/Buffer.ts +++ b/packages/neovim/src/api/Buffer.ts @@ -89,14 +89,8 @@ export class Buffer extends BaseApi { getLines( { start, end, strictIndexing } = { start: 0, end: -1, strictIndexing: true } ): Promise { - const indexing = - typeof strictIndexing === 'undefined' ? true : strictIndexing; - return this.request(`${this.prefix}get_lines`, [ - this, - start, - end, - indexing, - ]); + const indexing = typeof strictIndexing === 'undefined' ? true : strictIndexing; + return this.request(`${this.prefix}get_lines`, [this, start, end, indexing]); } /** Set lines of buffer given indeces */ @@ -109,18 +103,11 @@ export class Buffer extends BaseApi { if (_start === undefined || _end === undefined) { throw new Error('start and end are required'); } - const indexing = - typeof strictIndexing === 'undefined' ? true : strictIndexing; + const indexing = typeof strictIndexing === 'undefined' ? true : strictIndexing; const lines = typeof _lines === 'string' ? [_lines] : _lines; const end = typeof _end !== 'undefined' ? _end : _start + 1; - return this.request(`${this.prefix}set_lines`, [ - this, - _start, - end, - indexing, - lines, - ]); + return this.request(`${this.prefix}set_lines`, [this, _start, end, indexing, lines]); } /** Insert lines at `start` index */ @@ -265,9 +252,7 @@ export class Buffer extends BaseApi { */ clearHighlight(args: BufferClearHighlight = {}) { // eslint-disable-next-line no-console - console.warn( - '`clearHighlight` is deprecated, use ``clearNamespace()` instead' - ); + console.warn('`clearHighlight` is deprecated, use ``clearNamespace()` instead'); const defaults = { srcId: -1, @@ -277,12 +262,7 @@ export class Buffer extends BaseApi { const { srcId, lineStart, lineEnd } = { ...defaults, ...args }; - return this.request(`${this.prefix}clear_highlight`, [ - this, - srcId, - lineStart, - lineEnd, - ]); + return this.request(`${this.prefix}clear_highlight`, [this, srcId, lineStart, lineEnd]); } /** @@ -303,12 +283,7 @@ export class Buffer extends BaseApi { const { nsId, lineStart, lineEnd } = { ...defaults, ...args }; - this.request(`${this.prefix}clear_namespace`, [ - this, - nsId, - lineStart, - lineEnd, - ]); + this.request(`${this.prefix}clear_namespace`, [this, nsId, lineStart, lineEnd]); } /** @@ -348,13 +323,7 @@ export class Buffer extends BaseApi { chunks: VirtualTextChunk[], opts = {} ): Promise { - return this.request(`${this.prefix}set_virtual_text`, [ - this, - nsId, - line, - chunks, - opts, - ]); + return this.request(`${this.prefix}set_virtual_text`, [this, nsId, line, chunks, opts]); } /** diff --git a/packages/neovim/src/api/Neovim.test.ts b/packages/neovim/src/api/Neovim.test.ts index 542582e7..d2a05b9a 100644 --- a/packages/neovim/src/api/Neovim.test.ts +++ b/packages/neovim/src/api/Neovim.test.ts @@ -86,22 +86,13 @@ describe('Neovim API', () => { }); it('can run lua', async () => { - expect( - await nvim.lua('function test(a) return a end return test(...)', [1]) - ).toBe(1); + expect(await nvim.lua('function test(a) return a end return test(...)', [1])).toBe(1); - expect( - await nvim.lua('function test(a) return a end return test(...)', [ - 'foo', - ]) - ).toBe('foo'); - - expect( - await nvim.executeLua( - 'function test(a) return a end return test(...)', - ['foo'] - ) - ).toBe('foo'); + expect(await nvim.lua('function test(a) return a end return test(...)', ['foo'])).toBe('foo'); + + expect(await nvim.executeLua('function test(a) return a end return test(...)', ['foo'])).toBe( + 'foo' + ); }); it('get/set/delete current line', async () => { @@ -143,9 +134,7 @@ describe('Neovim API', () => { }); it('parse expression', async () => { - expect(await nvim.parseExpression('@', 'm', true)).toEqual( - expect.objectContaining({}) - ); + expect(await nvim.parseExpression('@', 'm', true)).toEqual(expect.objectContaining({})); }); it('gets api info', async () => { diff --git a/packages/neovim/src/api/Neovim.ts b/packages/neovim/src/api/Neovim.ts index 8933f9b5..598ea593 100644 --- a/packages/neovim/src/api/Neovim.ts +++ b/packages/neovim/src/api/Neovim.ts @@ -111,14 +111,7 @@ export interface OpenWindowOptions { style?: 'minimal'; // Style of (optional) window border. This can either be a string or an array. - border?: - | 'none' - | 'single' - | 'double' - | 'rounded' - | 'solid' - | 'shadow' - | string[]; + border?: 'none' | 'single' | 'double' | 'rounded' | 'solid' | 'shadow' | string[]; // If true then no buffer-related autocommand events such as |BufEnter|, |BufLeave| or |BufWinEnter| may fire from calling this function. noautocmd?: boolean; @@ -397,15 +390,9 @@ export class Neovim extends BaseApi { * @param isRgb Should export RGB colors * @return Highlight definition map */ - getHighlight( - nameOrId: string | number, - isRgb = true - ): Promise | void { + getHighlight(nameOrId: string | number, isRgb = true): Promise | void { const functionName = typeof nameOrId === 'string' ? 'by_name' : 'by_id'; - return this.request(`${this.prefix}get_hl_${functionName}`, [ - nameOrId, - isRgb, - ]); + return this.request(`${this.prefix}get_hl_${functionName}`, [nameOrId, isRgb]); } /** @@ -467,17 +454,9 @@ export class Neovim extends BaseApi { * * On execution error: fails with VimL error, does not update v:errmsg. */ - callDictFunction( - dict: object, - fname: string, - args: VimValue | VimValue[] = [] - ): object { + callDictFunction(dict: object, fname: string, args: VimValue | VimValue[] = []): object { const _args = Array.isArray(args) ? args : [args]; - return this.request(`${this.prefix}call_dict_function`, [ - dict, - fname, - _args, - ]); + return this.request(`${this.prefix}call_dict_function`, [dict, fname, _args]); } /** @@ -624,14 +603,7 @@ export class Neovim extends BaseApi { row: number, col: number ) { - return this.request(`${this.prefix}input_mouse`, [ - button, - action, - modifier, - grid, - row, - col, - ]); + return this.request(`${this.prefix}input_mouse`, [button, action, modifier, grid, row, col]); } /** @@ -639,16 +611,8 @@ export class Neovim extends BaseApi { * * TODO: return type, see :help */ - parseExpression( - expr: string, - flags: string, - highlight: boolean - ): Promise { - return this.request(`${this.prefix}parse_expression`, [ - expr, - flags, - highlight, - ]); + parseExpression(expr: string, flags: string, highlight: boolean): Promise { + return this.request(`${this.prefix}parse_expression`, [expr, flags, highlight]); } /** @@ -686,12 +650,7 @@ export class Neovim extends BaseApi { doIt: boolean, special: boolean ): Promise { - return this.request(`${this.prefix}replace_termcodes`, [ - str, - fromPart, - doIt, - special, - ]); + return this.request(`${this.prefix}replace_termcodes`, [str, fromPart, doIt, special]); } /** @@ -739,11 +698,7 @@ export class Neovim extends BaseApi { return this.request(`${this.prefix}list_uis`); } - uiAttach( - width: number, - height: number, - options: UiAttachOptions - ): Promise { + uiAttach(width: number, height: number, options: UiAttachOptions): Promise { return this.request(`${this.prefix}ui_attach`, [width, height, options]); } @@ -773,11 +728,7 @@ export class Neovim extends BaseApi { * @param {Number} height The new requested height */ uiTryResizeGrid(grid: number, width: number, height: number): Promise { - return this.request(`${this.prefix}ui_try_resize_grid`, [ - grid, - width, - height, - ]); + return this.request(`${this.prefix}ui_try_resize_grid`, [grid, width, height]); } /** @@ -820,13 +771,7 @@ export class Neovim extends BaseApi { methods: object, attributes: object ): void { - this.request(`${this.prefix}set_client_info`, [ - name, - version, - type, - methods, - attributes, - ]); + this.request(`${this.prefix}set_client_info`, [name, version, type, methods, attributes]); } /** @@ -878,18 +823,8 @@ export class Neovim extends BaseApi { * Implies `insert`. * @param {Object} opts Optional parameters. Reserved for future use. */ - selectPopupmenuItem( - item: number, - insert: boolean, - finish: boolean, - opts: object = {} - ) { - return this.request(`${this.prefix}select_popupmenu_item`, [ - item, - insert, - finish, - opts, - ]); + selectPopupmenuItem(item: number, insert: boolean, finish: boolean, opts: object = {}) { + return this.request(`${this.prefix}select_popupmenu_item`, [item, insert, finish, opts]); } /** @@ -899,10 +834,7 @@ export class Neovim extends BaseApi { * @param {Boolean} scratch Creates a "throwaway" |scratch-buffer| for temporary work (always 'nomodified') * @return {Buffer|Number} Buffer handle, or 0 on error */ - private createBuf( - listed: boolean, - scratch: boolean - ): Promise { + private createBuf(listed: boolean, scratch: boolean): Promise { return this.request(`${this.prefix}create_buf`, [listed, scratch]); } @@ -940,11 +872,7 @@ export class Neovim extends BaseApi { /** * Public alias for `openWin` */ - openWindow( - buffer: Buffer, - enter: boolean, - options: OpenWindowOptions - ): Promise { + openWindow(buffer: Buffer, enter: boolean, options: OpenWindowOptions): Promise { return this.openWin(buffer, enter, options); } diff --git a/packages/neovim/src/api/Window.ts b/packages/neovim/src/api/Window.ts index 7c977c97..6d8de3b0 100644 --- a/packages/neovim/src/api/Window.ts +++ b/packages/neovim/src/api/Window.ts @@ -65,16 +65,12 @@ export class Window extends BaseApi { /** 0-indexed, on-screen window position(row) in display cells. */ get row(): Promise { - return this.request(`${this.prefix}get_position`, [this]).then( - position => position[0] - ); + return this.request(`${this.prefix}get_position`, [this]).then(position => position[0]); } /** 0-indexed, on-screen window position(col) in display cells. */ get col(): Promise { - return this.request(`${this.prefix}get_position`, [this]).then( - position => position[1] - ); + return this.request(`${this.prefix}get_position`, [this]).then(position => position[1]); } /** Is window valid */ diff --git a/packages/neovim/src/api/client.ts b/packages/neovim/src/api/client.ts index 15a9acb5..26b3a42d 100644 --- a/packages/neovim/src/api/client.ts +++ b/packages/neovim/src/api/client.ts @@ -32,13 +32,7 @@ export class NeovimClient extends Neovim { } /** Attaches msgpack to read/write streams * */ - attach({ - reader, - writer, - }: { - reader: NodeJS.ReadableStream; - writer: NodeJS.WritableStream; - }) { + attach({ reader, writer }: { reader: NodeJS.ReadableStream; writer: NodeJS.WritableStream }) { this.transport.attach(writer, reader, this); this.transportAttached = true; this.setupTransport(); @@ -64,12 +58,7 @@ export class NeovimClient extends Neovim { } /** Handles incoming request (from the peer). */ - handleRequest( - method: string, - args: VimValue[], - resp: any, - ...restArgs: any[] - ) { + handleRequest(method: string, args: VimValue[], resp: any, ...restArgs: any[]) { // If neovim API is not generated yet and we are not handle a 'specs' request // then queue up requests // @@ -152,17 +141,13 @@ export class NeovimClient extends Neovim { requestApi(): Promise { return new Promise((resolve, reject) => { - this.transport.request( - 'nvim_get_api_info', - [], - (err: Error, res: any[]) => { - if (err) { - reject(err); - } else { - resolve(res); - } + this.transport.request('nvim_get_api_info', [], (err: Error, res: any[]) => { + if (err) { + reject(err); + } else { + resolve(res); } - ); + }); }); } @@ -205,13 +190,9 @@ export class NeovimClient extends Neovim { return true; } catch (e) { const err = e as Error; - this.logger.error( - `Could not dynamically generate neovim API: %s: %O`, - err.name, - { - error: err, - } - ); + this.logger.error(`Could not dynamically generate neovim API: %s: %O`, err.name, { + error: err, + }); this.logger.error(err.stack); return false; } @@ -252,9 +233,7 @@ export class NeovimClient extends Neovim { const bufferMap = this.attachedBuffers.get(bufferKey); if (!bufferMap) return false; - const handlers = (bufferMap.get(eventName) || []).filter( - handler => handler !== cb - ); + const handlers = (bufferMap.get(eventName) || []).filter(handler => handler !== cb); // Remove eventName listener from bufferMap if no more handlers if (!handlers.length) { diff --git a/packages/neovim/src/api/utils/createChainableApi.ts b/packages/neovim/src/api/utils/createChainableApi.ts index bfe09599..e6f636d8 100644 --- a/packages/neovim/src/api/utils/createChainableApi.ts +++ b/packages/neovim/src/api/utils/createChainableApi.ts @@ -12,11 +12,7 @@ export function createChainableApi( const that = this as any; // re-use current promise if not resolved yet - if ( - that[`${name}Promise`] && - that[`${name}Promise`].status === 0 && - that[`${name}Proxy`] - ) { + if (that[`${name}Promise`] && that[`${name}Promise`].status === 0 && that[`${name}Proxy`]) { return that[`${name}Proxy`]; } @@ -24,15 +20,13 @@ export function createChainableApi( // TODO: Optimize this // Define properties on the promise for devtools - [...baseProperties, ...Object.getOwnPropertyNames(Type.prototype)].forEach( - key => { - Object.defineProperty(that[`${name}Promise`], key, { - enumerable: true, - writable: true, - configurable: true, - }); - } - ); + [...baseProperties, ...Object.getOwnPropertyNames(Type.prototype)].forEach(key => { + Object.defineProperty(that[`${name}Promise`], key, { + enumerable: true, + writable: true, + configurable: true, + }); + }); const proxyHandler = { get: (target: any, prop: string) => { @@ -52,8 +46,7 @@ export function createChainableApi( Object.getOwnPropertyDescriptor(BaseApi.prototype, prop); const isGetter = descriptor && - (typeof descriptor.get !== 'undefined' || - typeof descriptor.set !== 'undefined'); + (typeof descriptor.get !== 'undefined' || typeof descriptor.set !== 'undefined'); // XXX: the promise can potentially be stale // Check if resolved, else do a refresh request for current buffer? @@ -61,16 +54,12 @@ export function createChainableApi( if ( isOnPrototype && !isGetter && - ((prop in Type.prototype && - typeof Type.prototype[prop] === 'function') || - (prop in BaseApi.prototype && - typeof (BaseApi.prototype as any)[prop] === 'function')) + ((prop in Type.prototype && typeof Type.prototype[prop] === 'function') || + (prop in BaseApi.prototype && typeof (BaseApi.prototype as any)[prop] === 'function')) ) { // If property is a method on Type, we need to invoke it with captured args return (...args: any[]) => - that[`${name}Promise`].then((res: any) => - res[prop].call(res, ...args) - ); + that[`${name}Promise`].then((res: any) => res[prop].call(res, ...args)); } // Otherwise return the property requested after promise is resolved diff --git a/packages/neovim/src/attach/attach.test.ts b/packages/neovim/src/attach/attach.test.ts index deb10786..75e94fb5 100644 --- a/packages/neovim/src/attach/attach.test.ts +++ b/packages/neovim/src/attach/attach.test.ts @@ -42,9 +42,7 @@ describe('Nvim API', () => { it('failure modes', async () => { const c = new NeovimClient(); - await expect(c.channelId).rejects.toThrow( - 'channelId requested before _isReady' - ); + await expect(c.channelId).rejects.toThrow('channelId requested before _isReady'); }); it('console.log is monkey-patched to logger.info #329', async () => { @@ -107,11 +105,7 @@ describe('Nvim API', () => { it('noisy RPC traffic', async () => { let requestCount = 0; const oldRequest = nvim.request; - nvim.request = function ( - this: any, - name: string, - args: any[] = [] - ): Promise { + nvim.request = function (this: any, name: string, args: any[] = []): Promise { requestCount = requestCount + 1; return oldRequest.call(this, name, args); }; diff --git a/packages/neovim/src/attach/attach.ts b/packages/neovim/src/attach/attach.ts index d18b1008..042e52d1 100644 --- a/packages/neovim/src/attach/attach.ts +++ b/packages/neovim/src/attach/attach.ts @@ -14,13 +14,7 @@ export interface Attach { }; } -export function attach({ - reader: _reader, - writer: _writer, - proc, - socket, - options = {}, -}: Attach) { +export function attach({ reader: _reader, writer: _writer, proc, socket, options = {} }: Attach) { let writer; let reader; diff --git a/packages/neovim/src/host/NvimPlugin.test.ts b/packages/neovim/src/host/NvimPlugin.test.ts index 3d1f6222..77f9c3f1 100644 --- a/packages/neovim/src/host/NvimPlugin.test.ts +++ b/packages/neovim/src/host/NvimPlugin.test.ts @@ -17,22 +17,14 @@ describe('NvimPlugin', () => { }); it('should set dev options when you call setOptions', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); plugin.setOptions({ dev: true }); expect(plugin.dev).toBe(true); expect(plugin.shouldCacheModule).toBe(false); }); it('should store registered autocmds', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const fn = () => {}; const opts = { pattern: '*' }; const spec = { @@ -47,11 +39,7 @@ describe('NvimPlugin', () => { }); it('should store registered commands', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const fn = () => {}; const opts = { sync: true }; const spec = { @@ -66,11 +54,7 @@ describe('NvimPlugin', () => { }); it('should store registered functions', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const fn = () => {}; const opts = { sync: true }; const spec = { @@ -85,11 +69,7 @@ describe('NvimPlugin', () => { }); it('should not add autocmds with no pattern option', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); plugin.registerAutocmd('BufWritePre', () => {}, { pattern: '' }); expect(Object.keys(plugin.autocmds)).toHaveLength(0); }); @@ -106,11 +86,7 @@ describe('NvimPlugin', () => { const thisObj = {}; expect(callable([thisObj, fn])()).toBe(thisObj); - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const obj = { func: jestMock.fn(function () { // @ts-expect-error intentional @@ -126,22 +102,14 @@ describe('NvimPlugin', () => { }); it('should not register commands with incorrect callable arguments', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); // @ts-expect-error Intentionally passing empty array for command arguments. plugin.registerCommand('MyCommand', [], {}); expect(Object.keys(plugin.commands)).toHaveLength(0); }); it('should return specs for registered commands', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const fn = () => {}; const aOpts = { pattern: '*' }; const aSpec = { @@ -174,40 +142,24 @@ describe('NvimPlugin', () => { }); it('should handle requests for registered commands', async () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); const fn = (arg: any) => arg; plugin.registerAutocmd('BufWritePre', fn, { pattern: '*', sync: true }); plugin.registerCommand('MyCommand', fn, { sync: true }); plugin.registerFunction('MyFunction', fn); - expect(await plugin.handleRequest('BufWritePre *', 'autocmd', [true])).toBe( - true - ); - expect(await plugin.handleRequest('MyCommand', 'command', [false])).toBe( - false - ); - expect( - await plugin.handleRequest('MyFunction', 'function', ['blue']) - ).toEqual('blue'); + expect(await plugin.handleRequest('BufWritePre *', 'autocmd', [true])).toBe(true); + expect(await plugin.handleRequest('MyCommand', 'command', [false])).toBe(false); + expect(await plugin.handleRequest('MyFunction', 'function', ['blue'])).toEqual('blue'); }); it('should throw on unknown request', () => { - const plugin = new NvimPlugin( - '/tmp/filename', - () => {}, - getFakeNvimClient() - ); + const plugin = new NvimPlugin('/tmp/filename', () => {}, getFakeNvimClient()); expect.assertions(1); plugin.handleRequest('BufWritePre *', 'autocmd', [true]).catch(err => { expect(err).toEqual( - new Error( - 'Missing handler for autocmd: "BufWritePre *" in /tmp/filename' - ) + new Error('Missing handler for autocmd: "BufWritePre *" in /tmp/filename') ); }); }); diff --git a/packages/neovim/src/host/NvimPlugin.ts b/packages/neovim/src/host/NvimPlugin.ts index d96771e7..b5182edd 100644 --- a/packages/neovim/src/host/NvimPlugin.ts +++ b/packages/neovim/src/host/NvimPlugin.ts @@ -99,17 +99,11 @@ export class NvimPlugin { registerAutocmd(name: string, fn: Function, options: AutocmdOptions): void; - registerAutocmd( - name: string, - fn: [any, Function], - options: AutocmdOptions - ): void; + registerAutocmd(name: string, fn: [any, Function], options: AutocmdOptions): void; registerAutocmd(name: string, fn: any, options?: AutocmdOptions): void { if (!options?.pattern) { - this.nvim.logger.error( - `registerAutocmd expected pattern option for ${name}` - ); + this.nvim.logger.error(`registerAutocmd expected pattern option for ${name}`); return; } @@ -133,19 +127,13 @@ export class NvimPlugin { spec, }; } catch (err) { - this.nvim.logger.error( - `registerAutocmd expected callable argument for ${name}` - ); + this.nvim.logger.error(`registerAutocmd expected callable argument for ${name}`); } } registerCommand(name: string, fn: Function, options?: CommandOptions): void; - registerCommand( - name: string, - fn: [any, Function], - options?: CommandOptions - ): void; + registerCommand(name: string, fn: [any, Function], options?: CommandOptions): void; registerCommand(name: string, fn: any, options?: CommandOptions): void { const spec: Spec = { @@ -168,23 +156,13 @@ export class NvimPlugin { spec, }; } catch (err) { - this.nvim.logger.error( - `registerCommand expected callable argument for ${name}` - ); + this.nvim.logger.error(`registerCommand expected callable argument for ${name}`); } } - registerFunction( - name: string, - fn: Function, - options?: NvimFunctionOptions - ): void; + registerFunction(name: string, fn: Function, options?: NvimFunctionOptions): void; - registerFunction( - name: string, - fn: [any, Function], - options?: NvimFunctionOptions - ): void; + registerFunction(name: string, fn: [any, Function], options?: NvimFunctionOptions): void; registerFunction(name: string, fn: any, options?: NvimFunctionOptions): void { const spec: Spec = { @@ -207,22 +185,14 @@ export class NvimPlugin { spec, }; } catch (err) { - this.nvim.logger.error( - `registerFunction expected callable argument for ${name}` - ); + this.nvim.logger.error(`registerFunction expected callable argument for ${name}`); } } get specs(): Spec[] { - const autocmds = Object.keys(this.autocmds).map( - key => this.autocmds[key].spec - ); - const commands = Object.keys(this.commands).map( - key => this.commands[key].spec - ); - const functions = Object.keys(this.functions).map( - key => this.functions[key].spec - ); + const autocmds = Object.keys(this.autocmds).map(key => this.autocmds[key].spec); + const commands = Object.keys(this.commands).map(key => this.commands[key].spec); + const functions = Object.keys(this.functions).map(key => this.functions[key].spec); return autocmds.concat(commands).concat(functions); } @@ -248,15 +218,11 @@ export class NvimPlugin { if (handlers.hasOwnProperty(name)) { const handler = handlers[name]; try { - return handler.spec.sync - ? handler.fn(...args) - : await handler.fn(...args); + return handler.spec.sync ? handler.fn(...args) : await handler.fn(...args); } catch (e) { const err = e as Error; const msg = `Error in plugin for ${type}:${name}: ${err.message}`; - this.nvim.logger.error( - `${msg} (file: ${this.filename}, stack: ${err.stack})` - ); + this.nvim.logger.error(`${msg} (file: ${this.filename}, stack: ${err.stack})`); throw new Error(msg, { cause: err }); } } else { diff --git a/packages/neovim/src/host/factory.ts b/packages/neovim/src/host/factory.ts index 7c106265..ea7cebad 100644 --- a/packages/neovim/src/host/factory.ts +++ b/packages/neovim/src/host/factory.ts @@ -16,9 +16,7 @@ function createPlugin( options: LoadPluginOptions = {} ): NvimPlugin | null { try { - nvim.logger.debug( - `createPlugin.${filename}.clearCache: ${options && !options.cache}` - ); + nvim.logger.debug(`createPlugin.${filename}.clearCache: ${options && !options.cache}`); // Clear module from cache if (options && !options.cache) { diff --git a/packages/neovim/src/host/index.ts b/packages/neovim/src/host/index.ts index a19fbfe8..f29b3474 100644 --- a/packages/neovim/src/host/index.ts +++ b/packages/neovim/src/host/index.ts @@ -20,8 +20,7 @@ export class Host { getPlugin(filename: string, options: LoadPluginOptions = {}) { let plugin: (typeof this.loaded)[0] | null = this.loaded[filename]; - const shouldUseCachedPlugin = - plugin && plugin.shouldCacheModule && !plugin.alwaysInit; + const shouldUseCachedPlugin = plugin && plugin.shouldCacheModule && !plugin.alwaysInit; if (shouldUseCachedPlugin) { this.nvim?.logger.debug('getPlugin.useCachedPlugin'); @@ -36,10 +35,7 @@ export class Host { cache: plugin && plugin.shouldCacheModule, }); - this.nvim.logger.debug( - 'getPlugin.alwaysInit', - plugin && !plugin.alwaysInit - ); + this.nvim.logger.debug('getPlugin.alwaysInit', plugin && !plugin.alwaysInit); if (plugin) { this.loaded[filename] = plugin; } @@ -105,9 +101,7 @@ export class Host { } else { try { const plugResult = await this.handlePlugin(method, args); - res.send( - !plugResult || typeof plugResult === 'undefined' ? null : plugResult - ); + res.send(!plugResult || typeof plugResult === 'undefined' ? null : plugResult); } catch (e) { const err = e as Error; res.send(err.toString(), true); diff --git a/packages/neovim/src/plugin/plugin.test.ts b/packages/neovim/src/plugin/plugin.test.ts index 8a734a6f..6a0b3ebd 100644 --- a/packages/neovim/src/plugin/plugin.test.ts +++ b/packages/neovim/src/plugin/plugin.test.ts @@ -49,14 +49,8 @@ describe('Plugin class decorator', () => { } // This is how (closeish) babel applies decorators - FunctionDecorator('TestF', { eval: 'test', range: [1, 10] })( - MyClass.prototype, - 'testF' - ); - Command('TestCommand', { range: 'test', nargs: '3' })( - MyClass.prototype, - 'testC' - ); + FunctionDecorator('TestF', { eval: 'test', range: [1, 10] })(MyClass.prototype, 'testF'); + Command('TestCommand', { range: 'test', nargs: '3' })(MyClass.prototype, 'testC'); Autocmd('TestAutocmd', { pattern: '*.js', eval: 'test', @@ -114,11 +108,7 @@ describe('Plugin class decorator', () => { const plugin = Plugin(MyClass); - const pluginObject = new NvimPlugin( - '/tmp/filename', - plugin, - getFakeNvimClient() - ); + const pluginObject = new NvimPlugin('/tmp/filename', plugin, getFakeNvimClient()); expect(pluginObject.specs).toEqual([ { diff --git a/packages/neovim/src/plugin/plugin.ts b/packages/neovim/src/plugin/plugin.ts index 23e7fc0f..3144d553 100644 --- a/packages/neovim/src/plugin/plugin.ts +++ b/packages/neovim/src/plugin/plugin.ts @@ -21,10 +21,7 @@ export interface Constructor { new (...args: any[]): T; } -function wrapper>( - cls: T, - options?: PluginDecoratorOptions -) { +function wrapper>(cls: T, options?: PluginDecoratorOptions) { return class extends cls { public nvim!: Neovim; @@ -41,9 +38,7 @@ function wrapper>( // Search for decorated methods Object.getOwnPropertyNames(cls.prototype).forEach(methodName => { plugin.nvim.logger.info(`Method name ${methodName}`); - plugin.nvim.logger.info( - `${cls.prototype[methodName]} ${typeof cls.prototype[methodName]}` - ); + plugin.nvim.logger.info(`${cls.prototype[methodName]} ${typeof cls.prototype[methodName]}`); plugin.nvim.logger.info(`${this} ${typeof this}`); const method = cls.prototype[methodName]; @@ -132,7 +127,5 @@ export function plugin(outter: any): any { * * Plugin(TestPlugin) */ - return typeof outter !== 'function' - ? (cls: any) => wrapper(cls, outter) - : wrapper(outter); + return typeof outter !== 'function' ? (cls: any) => wrapper(cls, outter) : wrapper(outter); } diff --git a/packages/neovim/src/testUtil.ts b/packages/neovim/src/testUtil.ts index 9cbd8c05..13d2d8bf 100644 --- a/packages/neovim/src/testUtil.ts +++ b/packages/neovim/src/testUtil.ts @@ -25,12 +25,8 @@ export let proc: cp.ChildProcessWithoutNullStreams; export let nvim: NeovimClient; export function startNvim(): [cp.ChildProcessWithoutNullStreams, NeovimClient]; -export function startNvim( - doAttach: false -): [cp.ChildProcessWithoutNullStreams, undefined]; -export function startNvim( - doAttach: true -): [cp.ChildProcessWithoutNullStreams, NeovimClient]; +export function startNvim(doAttach: false): [cp.ChildProcessWithoutNullStreams, undefined]; +export function startNvim(doAttach: true): [cp.ChildProcessWithoutNullStreams, NeovimClient]; export function startNvim( doAttach: boolean = true ): [cp.ChildProcessWithoutNullStreams, NeovimClient | undefined] { @@ -51,9 +47,7 @@ export function startNvim( return [proc, nvim]; } -export function stopNvim( - proc_?: cp.ChildProcessWithoutNullStreams | NeovimClient -) { +export function stopNvim(proc_?: cp.ChildProcessWithoutNullStreams | NeovimClient) { // Stop all (proc + client). if (!proc_) { if (proc) { diff --git a/packages/neovim/src/types/VimValue.ts b/packages/neovim/src/types/VimValue.ts index 334642d8..831510c6 100644 --- a/packages/neovim/src/types/VimValue.ts +++ b/packages/neovim/src/types/VimValue.ts @@ -1,6 +1 @@ -export type VimValue = - | number - | boolean - | string - | number[] - | { [key: string]: any }; +export type VimValue = number | boolean | string | number[] | { [key: string]: any }; diff --git a/packages/neovim/src/utils/findNvim.test.ts b/packages/neovim/src/utils/findNvim.test.ts index e647d7f7..d5edfa96 100644 --- a/packages/neovim/src/utils/findNvim.test.ts +++ b/packages/neovim/src/utils/findNvim.test.ts @@ -23,12 +23,7 @@ describe('findNvim', () => { }); it('parseVersion()', () => { - expect(parseVersion('0.5.0-dev+1357-g192f89ea1')).toEqual([ - 0, - 5, - 0, - 'dev+1357-g192f89ea1', - ]); + expect(parseVersion('0.5.0-dev+1357-g192f89ea1')).toEqual([0, 5, 0, 'dev+1357-g192f89ea1']); expect(parseVersion('0.5.0-dev+1357-g192f89ea1-Homebrew')).toEqual([ 0, 5, @@ -51,39 +46,22 @@ describe('findNvim', () => { expect(compareVersions('0.3.0', '0.3.1')).toBe(-1); expect(compareVersions('0.3.1', '0.3.0')).toBe(1); expect(compareVersions('0.3.0-abc', '0.3.0-dev-420')).toBe(-1); - expect(compareVersions('0.3.0', '0.3.0-dev-658+g06694203e-Homebrew')).toBe( - 1 - ); - expect(compareVersions('0.3.0-dev-658+g06694203e-Homebrew', '0.3.0')).toBe( - -1 - ); + expect(compareVersions('0.3.0', '0.3.0-dev-658+g06694203e-Homebrew')).toBe(1); + expect(compareVersions('0.3.0-dev-658+g06694203e-Homebrew', '0.3.0')).toBe(-1); expect( - compareVersions( - '0.3.0-dev-658+g06694203e-Homebrew', - '0.3.0-dev-658+g06694203e-Homebrew' - ) + compareVersions('0.3.0-dev-658+g06694203e-Homebrew', '0.3.0-dev-658+g06694203e-Homebrew') ).toBe(0); expect( - compareVersions( - '0.3.0-dev-658+g06694203e-Homebrew', - '0.3.0-dev-659+g06694203e-Homebrew' - ) + compareVersions('0.3.0-dev-658+g06694203e-Homebrew', '0.3.0-dev-659+g06694203e-Homebrew') ).toBe(-1); expect( - compareVersions( - '0.3.0-dev-659+g06694203e-Homebrew', - '0.3.0-dev-658+g06694203e-Homebrew' - ) + compareVersions('0.3.0-dev-659+g06694203e-Homebrew', '0.3.0-dev-658+g06694203e-Homebrew') ).toBe(1); // Failure modes: expect(compareVersions('0.3.0', 'nonsense')).toBe(1); - expect(() => compareVersions('nonsense', '0.3.0')).toThrow( - 'Invalid version: "nonsense"' - ); - expect(() => compareVersions('nonsense', 'nonsense')).toThrow( - 'Invalid version: "nonsense"' - ); + expect(() => compareVersions('nonsense', '0.3.0')).toThrow('Invalid version: "nonsense"'); + expect(() => compareVersions('nonsense', 'nonsense')).toThrow('Invalid version: "nonsense"'); expect(() => compareVersions(undefined, undefined)).toThrow( 'Invalid version format: not a string' ); diff --git a/packages/neovim/src/utils/findNvim.ts b/packages/neovim/src/utils/findNvim.ts index abca031e..b12b4e5e 100644 --- a/packages/neovim/src/utils/findNvim.ts +++ b/packages/neovim/src/utils/findNvim.ts @@ -90,11 +90,7 @@ function parseVersion(version: string): (number | string)[] | undefined { const minorNumber = Number(minor); const patchNumber = Number(patch); - const versionParts: Array = [ - majorNumber, - minorNumber, - patchNumber, - ]; + const versionParts: Array = [majorNumber, minorNumber, patchNumber]; if (prerelease !== undefined) { versionParts.push(prerelease); } else { @@ -219,17 +215,14 @@ export function findNvim(opt: FindNvimOptions = {}): Readonly { try { accessSync(nvimPath, constants.X_OK); // TODO: fallback to `echo 'print(vim.version())' | nvim -l -` if parsing --version fails. - const nvimVersionFull = execFileSync(nvimPath, [ - '--version', - ]).toString(); + const nvimVersionFull = execFileSync(nvimPath, ['--version']).toString(); const nvimVersionMatch = nvimVersionRegex.exec(nvimVersionFull); const buildTypeMatch = buildTypeRegex.exec(nvimVersionFull); const luaJitVersionMatch = luaJitVersionRegex.exec(nvimVersionFull); if (nvimVersionMatch && buildTypeMatch && luaJitVersionMatch) { if ( 'minVersion' in opt && - compareVersions(opt.minVersion ?? '0.0.0', nvimVersionMatch[1]) === - 1 + compareVersions(opt.minVersion ?? '0.0.0', nvimVersionMatch[1]) === 1 ) { invalid.push({ nvimVersion: nvimVersionMatch[1], @@ -263,9 +256,7 @@ export function findNvim(opt: FindNvimOptions = {}): Readonly { } if (opt.orderBy === undefined || opt.orderBy === 'desc') { - matches.sort((a, b) => - compareVersions(b.nvimVersion ?? '0.0.0', a.nvimVersion ?? '0.0.0') - ); + matches.sort((a, b) => compareVersions(b.nvimVersion ?? '0.0.0', a.nvimVersion ?? '0.0.0')); } return { diff --git a/packages/neovim/src/utils/logger.ts b/packages/neovim/src/utils/logger.ts index acba525c..726d0ff5 100644 --- a/packages/neovim/src/utils/logger.ts +++ b/packages/neovim/src/utils/logger.ts @@ -22,8 +22,7 @@ function getFormat(colorize: boolean) { } catch { msg = info.message; } - const lvl = - info.level === 'debug' ? 'DBG' : info.level.slice(0, 3).toUpperCase(); + const lvl = info.level === 'debug' ? 'DBG' : info.level.slice(0, 3).toUpperCase(); return `${info.timestamp} ${lvl} ${msg}`; }) ); @@ -63,10 +62,7 @@ function setupWinstonLogger(): Logger { if (k === 'assert') { // XXX: support console.assert() even though our logger doesn't define it. // eslint-disable-next-line no-console - console.assert = function ( - condition?: boolean | undefined, - ...data: any[] - ) { + console.assert = function (condition?: boolean | undefined, ...data: any[]) { if (!condition) { logger.error('assertion failed', ...data); } diff --git a/packages/neovim/src/utils/transport.ts b/packages/neovim/src/utils/transport.ts index 681c4f1c..66fbe138 100644 --- a/packages/neovim/src/utils/transport.ts +++ b/packages/neovim/src/utils/transport.ts @@ -5,12 +5,7 @@ import { EventEmitter } from 'node:events'; import { inspect } from 'node:util'; -import { - encode, - decode, - ExtensionCodec, - decodeMultiStream, -} from '@msgpack/msgpack'; +import { encode, decode, ExtensionCodec, decodeMultiStream } from '@msgpack/msgpack'; import { Metadata } from '../api/types'; export let exportsForTesting: any; // eslint-disable-line import/no-mutable-exports @@ -38,16 +33,9 @@ class Response { throw new Error(`Response to id ${this.requestId} already sent`); } - const encoded = encode([ - 1, - this.requestId, - isError ? resp : null, - !isError ? resp : null, - ]); + const encoded = encode([1, this.requestId, isError ? resp : null, !isError ? resp : null]); - this.encoder.write( - Buffer.from(encoded.buffer, encoded.byteOffset, encoded.byteLength) - ); + this.encoder.write(Buffer.from(encoded.buffer, encoded.byteOffset, encoded.byteLength)); this.sent = true; } } @@ -61,8 +49,7 @@ class Transport extends EventEmitter { private writer!: NodeJS.WritableStream; - private readonly extensionCodec: ExtensionCodec = - this.initializeExtensionCodec(); + private readonly extensionCodec: ExtensionCodec = this.initializeExtensionCodec(); // Neovim client that holds state private client: any; @@ -96,11 +83,7 @@ class Transport extends EventEmitter { return Buffer.from(encoded.buffer, encoded.byteOffset, encoded.byteLength); } - attach( - writer: NodeJS.WritableStream, - reader: NodeJS.ReadableStream, - client: any - ) { + attach(writer: NodeJS.WritableStream, reader: NodeJS.ReadableStream, client: any) { this.writer = writer; this.reader = reader; this.client = client; @@ -157,9 +140,7 @@ class Transport extends EventEmitter { request(method: string, args: any[], cb: Function) { this.nextRequestId = this.nextRequestId + 1; - this.writer.write( - this.encodeToBuffer([0, this.nextRequestId, method, args]) - ); + this.writer.write(this.encodeToBuffer([0, this.nextRequestId, method, args])); this.pending.set(this.nextRequestId, cb); } @@ -176,12 +157,7 @@ class Transport extends EventEmitter { // - msg[1]: id // - msg[2]: method name // - msg[3]: arguments - this.emit( - 'request', - msg[2].toString(), - msg[3], - new Response(this.writer, msg[1]) - ); + this.emit('request', msg[2].toString(), msg[3], new Response(this.writer, msg[1])); } else if (msgType === 1) { // response to a previous request: // - msg[1]: the id @@ -200,9 +176,7 @@ class Transport extends EventEmitter { // - msg[2]: arguments this.emit('notification', msg[1].toString(), msg[2]); } else { - this.writer.write( - this.encodeToBuffer([1, 0, 'Invalid message type', null]) - ); + this.writer.write(this.encodeToBuffer([1, 0, 'Invalid message type', null])); } } } diff --git a/packages/neovim/src/utils/util.ts b/packages/neovim/src/utils/util.ts index 46ae85c7..cc2e428e 100644 --- a/packages/neovim/src/utils/util.ts +++ b/packages/neovim/src/utils/util.ts @@ -19,11 +19,7 @@ export function partialClone( replacement: any = undefined ): any { // Base case: If input is not an object or has no children, return it. - if ( - typeof obj !== 'object' || - obj === null || - Object.getOwnPropertyNames(obj).length === 0 - ) { + if (typeof obj !== 'object' || obj === null || Object.getOwnPropertyNames(obj).length === 0) { return obj; } @@ -39,12 +35,7 @@ export function partialClone( if (omitKeys.includes(key)) { (clonedObj as any)[key] = replacement || (Array.isArray(obj) ? [] : {}); } else if (Object.prototype.hasOwnProperty.call(obj, key)) { - (clonedObj as any)[key] = partialClone( - obj[key], - depth - 1, - omitKeys, - replacement - ); + (clonedObj as any)[key] = partialClone(obj[key], depth - 1, omitKeys, replacement); } } From cc08e042cf4760ea887c58929f44fe337c32a67c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:29:48 -0800 Subject: [PATCH 21/23] deps: bump codecov/codecov-action in the github-actions group (#443) Bumps the github-actions group with 1 update: [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `codecov/codecov-action` from 4 to 5 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6eba7c2d..19f3778a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -92,7 +92,7 @@ jobs: npm run test-coverage --stream - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 if: matrix.node == '20' with: verbose: true # optional (default = false) From 8702dcdc1e15f57c01d8ef2c9805e31d2e915cc1 Mon Sep 17 00:00:00 2001 From: Mika Vilpas Date: Sat, 16 Nov 2024 00:36:00 +0200 Subject: [PATCH 22/23] build: fix eslint error about missing neovim pkg in integration-tests #436 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The following error was reported by eslint: ```sh ❯ npm run lint ... /Users/mikavilpas/git/neovim-node-client/packages/integration-tests/src/factory.test.ts:1:62: Unable to resolve path to module 'neovim'. [Error/import/no-unresolved] 1 problem ``` --- package-lock.json | 3 ++- packages/integration-tests/package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e32c4a00..b1a917e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8604,7 +8604,8 @@ "c8": "^10.1.2", "expect": "^29.7.0", "jest-mock": "^29.7.0", - "mocha": "^10.7.3" + "mocha": "^10.7.3", + "neovim": "file:../neovim" } }, "packages/neovim": { diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 426d85e8..5bfe9d56 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -54,6 +54,7 @@ "c8": "^10.1.2", "expect": "^29.7.0", "jest-mock": "^29.7.0", - "mocha": "^10.7.3" + "mocha": "^10.7.3", + "neovim": "file:../neovim" } } From 816c6ba6a3efc774ba2e3b5ab73cd39678a2cbb1 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 26 Mar 2024 16:31:09 +0100 Subject: [PATCH 23/23] WIP: eliminate "host" concept MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: The "remote plugin" concept is too complicated. https://github.com/neovim/neovim/issues/27949 Solution: - Let the "client" also be the "host". Eliminate the separate "host" concept and related modules. - Let any node module be a "host". Any node module that imports the "neovim" package and defines method handler(s) is a "remote module". It is loaded by Nvim same as any "node client". Story: - The value in rplugins is: 1. it finds the interpreter on the system 2. it figures out how to invoke the main script with the interpreter Old architecture: nvim rplugin framework -> node: cli.js -> starts the "plugin Host" attaches itself to current node process searches for plugins and tries to load them in the node process (MULTI-TENANCY) -> plugin1 -> plugin2 -> ... New architecture: nvim vim.rplugin('node', '…/plugin1.js') -> node: neovim.cli() nvim vim.rplugin('node', '…/plugin2.js') -> node: neovim.cli() 1. A Lua plugin calls `vim.rplugin('node', '/path/to/plugin.js')`. 2. Each call to `vim.rplugin()` starts a new node process (no "multi-tenancy"). 3. plugin.js is just a normal javascript file that imports the `neovim` package. 4. plugin.js provides a "main" function. It can simply import the `neovim.cli()` util function, which handles attaching/setup. TEST CASE / DEMO: const found = findNvim({ orderBy: 'desc', minVersion: '0.9.0' }) const nvim_proc = child_process.spawn(found.matches[0].path, ['--clean', '--embed'], {}); const nvim = attach({ proc: nvim_proc }); nvim.setHandler('foo', (ev, args) => { nvim.logger.info('handled from remote module: "%s": args:%O', ev.name, args); }); nvim.callFunction('rpcrequest', [(await nvim.channelId), 'foo', [42, true, 'bar']]); 2024-03-26 16:47:35 INF handleRequest: foo 2024-03-26 16:47:35 DBG request received: foo 2024-03-26 16:47:35 INF handled from remote module: "foo": args:[ [ 42, true, 'bar' ] ] --- packages/example-plugin2/fixture.js | 1 + packages/example-plugin2/index.js | 30 +++++ packages/example-plugin2/package.json | 9 ++ .../__tests__/integration.test.ts | 9 +- .../__tests__/rplugin2.test.ts | 127 ++++++++++++++++++ packages/neovim/src/api/client.ts | 22 ++- packages/neovim/src/cli.ts | 100 ++++++++++++++ packages/neovim/src/host/index.ts | 3 + packages/neovim/src/index.ts | 1 + packages/neovim/src/utils/transport.ts | 2 +- 10 files changed, 300 insertions(+), 4 deletions(-) create mode 100644 packages/example-plugin2/fixture.js create mode 100644 packages/example-plugin2/index.js create mode 100644 packages/example-plugin2/package.json create mode 100644 packages/integration-tests/__tests__/rplugin2.test.ts create mode 100644 packages/neovim/src/cli.ts diff --git a/packages/example-plugin2/fixture.js b/packages/example-plugin2/fixture.js new file mode 100644 index 00000000..d72b480b --- /dev/null +++ b/packages/example-plugin2/fixture.js @@ -0,0 +1 @@ +module.exports = 'you bet!'; diff --git a/packages/example-plugin2/index.js b/packages/example-plugin2/index.js new file mode 100644 index 00000000..6755ddd9 --- /dev/null +++ b/packages/example-plugin2/index.js @@ -0,0 +1,30 @@ +const required = require('./fixture'); +const neovim = require('neovim'); + +let nvim; + +function hostTest(args, range) { + if (args[0] === 'canhazresponse?') { + throw new Error('no >:('); + } + + nvim.setLine('A line, for your troubles'); + + return 'called hostTest'; +} + +function onBufEnter(filename) { + return new Promise((resolve, reject) => { + console.log('This is an annoying function ' + filename); + resolve(filename); + }); +} + +function main() { + nvim = neovim.cli(); + // Now that we successfully started, we can remove the default listener. + //nvim.removeAllListeners('request'); + nvim.setHandler('testMethod1', hostTest); +} + +main(); diff --git a/packages/example-plugin2/package.json b/packages/example-plugin2/package.json new file mode 100644 index 00000000..04e8020f --- /dev/null +++ b/packages/example-plugin2/package.json @@ -0,0 +1,9 @@ +{ + "name": "@neovim/example-plugin2", + "private": true, + "version": "1.0.0", + "description": "Test fixture for new rplugin design", + "main": "index.js", + "license": "MIT", + "devDependencies": {} +} diff --git a/packages/integration-tests/__tests__/integration.test.ts b/packages/integration-tests/__tests__/integration.test.ts index 1b0454d7..907a10d2 100644 --- a/packages/integration-tests/__tests__/integration.test.ts +++ b/packages/integration-tests/__tests__/integration.test.ts @@ -5,9 +5,16 @@ import * as http from 'node:http'; import expect from 'expect'; import * as jestMock from 'jest-mock'; +// +// +// TODO: The old rplugin design is deprecated and NOT supported. +// This file will be deleted. +// +// + import { NeovimClient, attach, findNvim } from 'neovim'; -describe('Node host', () => { +describe.skip('Node host (OLD, DELETE ME)', () => { const testdir = process.cwd(); let proc: cp.ChildProcessWithoutNullStreams; let args; diff --git a/packages/integration-tests/__tests__/rplugin2.test.ts b/packages/integration-tests/__tests__/rplugin2.test.ts new file mode 100644 index 00000000..f226d047 --- /dev/null +++ b/packages/integration-tests/__tests__/rplugin2.test.ts @@ -0,0 +1,127 @@ +/* eslint-env jest */ +import * as cp from 'child_process'; +import * as path from 'path'; + +import { NeovimClient, attach, findNvim } from 'neovim'; + +/** + * Runs a program and returns its output. + */ +async function run(cmd: string, args: string[]) { + return new Promise<{ proc: ReturnType, stdout: string, stderr: string}>((resolve, reject) => { + const proc = cp.spawn(cmd, args, { shell: false }); + const rv = { + proc: proc, + stdout: '', + stderr: '', + } + + proc.stdout.on('data', (data) => { + rv.stdout += data.toString(); + }); + + proc.stderr.on('data', (data) => { + rv.stderr += data.toString(); + }); + + proc.on('exit', (code_) => { + resolve(rv); + }); + + proc.on('error', (e) => { + reject(e); + }); + }); +} + +describe('Node host2', () => { + const thisDir = path.resolve(__dirname); + const pluginDir = path.resolve(thisDir, '../../example-plugin2/'); + const pluginMain = path.resolve(pluginDir, 'index.js').replace(/\\/g, '/'); + + const testdir = process.cwd(); + let nvimProc: ReturnType; + let nvim: NeovimClient; + + beforeAll(async () => { + const minVersion = '0.9.5' + const nvimInfo = findNvim({ minVersion: minVersion }); + const nvimPath = nvimInfo.matches[0]?.path; + if (!nvimPath) { + throw new Error(`nvim ${minVersion} not found`) + } + + nvimProc = cp.spawn(nvimPath, ['--clean', '-n', '--headless', '--embed'], {}); + nvim = attach({ proc: nvimProc }); + }); + + afterAll(() => { + process.chdir(testdir); + nvim.quit(); + if (nvimProc && nvimProc.connected) { + nvimProc.disconnect(); + } + }); + + beforeEach(() => {}); + + afterEach(() => {}); + + + /** + * From the Nvim process, starts a new "node …/plugin/index.js" RPC job (that + * is, a node "plugin host", aka an Nvim node client). + */ + async function newPluginChan() { + const nodePath = process.argv0.replace(/\\/g, '/'); + const luacode = ` + -- "node …/plugin/index.js" + local argv = { [[${nodePath}]], [[${pluginMain}]] } + local chan = vim.fn.jobstart(argv, { rpc = true, stderr_buffered = true }) + return chan + ` + return await nvim.lua(luacode); + } + + it('`node plugin.js --version` prints node-client version', async () => { + //process.chdir(thisDir); + const proc = await run(process.argv0, [pluginMain, '--version']); + // "5.1.1-dev.0\n" + expect(proc.stdout).toMatch(/\d+\.\d+\.\d+/); + + proc.proc.kill('SIGKILL'); + }); + + it('responds to "poll" with "ok"', async () => { + // See also the old provider#Poll() function. + + // From Nvim, start an "node …/plugin/index.js" RPC job. + // Then use that channel to call methods on the remote plugin. + const chan = await newPluginChan(); + const rv = await nvim.lua(`return vim.rpcrequest(..., 'poll')`, [ chan ]); + + expect(rv).toEqual('ok'); + }); + + //it('responds to "nvim_xx" methods', async () => { + // // This is just a happy accident of the fact that Nvim plugin host === client. + // const chan = await newPluginChan(); + // const rv = await nvim.lua(`return vim.rpcrequest(..., 'nvim_eval', '1 + 3')`, [ chan ]); + // expect(rv).toEqual(3); + //}); + + it('responds to custom, plugin-defined methods', async () => { + const chan = await newPluginChan(); + // The "testMethod1" function is defined in …/example-plugin2/index.js. + const rv = await nvim.lua(`return vim.rpcrequest(..., 'testMethod1', {})`, [ chan ]); + + expect(rv).toEqual('called hostTest'); + }); + + // TODO + //it('Lua plugin can define autocmds/functions that call the remote plugin', async () => { + // // JSHostTestCmd + // // BufEnter + //}); +}); + diff --git a/packages/neovim/src/api/client.ts b/packages/neovim/src/api/client.ts index 26b3a42d..1abed623 100644 --- a/packages/neovim/src/api/client.ts +++ b/packages/neovim/src/api/client.ts @@ -2,7 +2,7 @@ * Handles attaching transport */ import { Logger } from '../utils/logger'; -import { Transport } from '../utils/transport'; +import { Response, Transport } from '../utils/transport'; import { VimValue } from '../types/VimValue'; import { Neovim } from './Neovim'; import { Buffer } from './Buffer'; @@ -12,12 +12,30 @@ const REGEX_BUF_EVENT = /nvim_buf_(.*)_event/; export class NeovimClient extends Neovim { protected requestQueue: any[]; + /** + * Handlers for custom (non "nvim_") methods registered by the remote module. + * These handle requests from the Nvim peer. + */ + public handlers: { + [index: string]: (args: any[], event: { name: string }) => any; + } = {}; + private transportAttached: boolean; private _channelId?: number; private attachedBuffers: Map> = new Map(); + /** + * Defines a handler for incoming RPC request method/notification. + */ + setHandler( + method: string, + fn: (args: any[], event: { name: string }) => any + ) { + this.handlers[method] = fn; + } + constructor(options: { transport?: Transport; logger?: Logger } = {}) { // Neovim has no `data` or `metadata` super({ @@ -58,7 +76,7 @@ export class NeovimClient extends Neovim { } /** Handles incoming request (from the peer). */ - handleRequest(method: string, args: VimValue[], resp: any, ...restArgs: any[]) { + handleRequest(method: string, args: VimValue[], resp: Response, ...restArgs: any[]) { // If neovim API is not generated yet and we are not handle a 'specs' request // then queue up requests // diff --git a/packages/neovim/src/cli.ts b/packages/neovim/src/cli.ts new file mode 100644 index 00000000..06ea393f --- /dev/null +++ b/packages/neovim/src/cli.ts @@ -0,0 +1,100 @@ +import { spawnSync } from 'node:child_process'; +import { attach } from './attach'; + +let nvim: ReturnType; + +// node +const [, , ...args] = process.argv; + +if (args[0] === '--version') { + // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires + const pkg = require('../package.json'); + // eslint-disable-next-line no-console + console.log(pkg.version); + process.exit(0); +} + +// "21.6.1" => "21" +const nodeMajorVersionStr = process.versions.node.replace(/\..*/, ''); +const nodeMajorVersion = Number.parseInt(nodeMajorVersionStr ?? '0', 10); + +if ( + process.env.NVIM_NODE_HOST_DEBUG && + nodeMajorVersion >= 8 && + process.execArgv.every(token => token !== '--inspect-brk') +) { + const childHost = spawnSync( + process.execPath, + process.execArgv.concat(['--inspect-brk']).concat(process.argv.slice(1)), + { stdio: 'inherit' } + ); + process.exit(childHost.status ?? undefined); +} + +export interface Response { + send(resp: any, isError?: boolean): void; +} + +process.on('unhandledRejection', (reason, p) => { + process.stderr.write(`Unhandled Rejection at: ${p} reason: ${reason}\n`); +}); + +/** + * The "client" is also the "host". https://github.com/neovim/neovim/issues/27949 + */ +async function handleRequest(method: string, args: any[], res: Response) { + nvim.logger.debug('request received: %s', method); + // 'poll' and 'specs' are requests from Nvim internals. Else we dispatch to registered remote module methods (if any). + if (method === 'poll') { + // Handshake for Nvim. + res.send('ok'); + // } else if (method.startsWith('nvim_')) { + // // Let base class handle it. + // nvim.request(method, args); + } else { + const handler = nvim.handlers[method]; + if (!handler) { + const msg = `node-client: missing handler for "${method}"`; + nvim.logger.error(msg); + res.send(msg, true); + } + + try { + nvim.logger.debug('found handler: %s: %O', method, handler); + const plugResult = await handler(args, { name: method }); + res.send( + !plugResult || typeof plugResult === 'undefined' ? null : plugResult + ); + } catch (e) { + const err = e as Error; + const msg = `node-client: failed to handle request: "${method}": ${err.message}`; + nvim.logger.error(msg); + res.send(err.toString(), true); + } + } +} + +// "The client *is* the host... The client *is* the host..." +// +// "Main" entrypoint for any Nvim remote plugin. It implements the Nvim remote +// plugin specification: +// - Attaches self to incoming RPC channel. +// - Responds to "poll" with "ok". +// - TODO: "specs"? +export function cli() { + try { + // Reverse stdio because it's from the perspective of Nvim. + nvim = attach({ reader: process.stdin, writer: process.stdout }); + nvim.logger.debug('host.start'); + nvim.on('request', handleRequest); + + return nvim; + } catch (e) { + const err = e as Error; + process.stderr.write( + `failed to start Nvim plugin host: ${err.name}: ${err.message}\n` + ); + + return undefined; + } +} diff --git a/packages/neovim/src/host/index.ts b/packages/neovim/src/host/index.ts index f29b3474..e420c4c9 100644 --- a/packages/neovim/src/host/index.ts +++ b/packages/neovim/src/host/index.ts @@ -6,6 +6,9 @@ export interface Response { send(resp: any, isError?: boolean): void; } +/** + * @deprecated Eliminate the "host" concept. https://github.com/neovim/neovim/issues/27949 + */ export class Host { public loaded: { [index: string]: NvimPlugin }; diff --git a/packages/neovim/src/index.ts b/packages/neovim/src/index.ts index 409a03ca..eea39f7d 100644 --- a/packages/neovim/src/index.ts +++ b/packages/neovim/src/index.ts @@ -1,4 +1,5 @@ export { attach } from './attach/attach'; +export { cli } from './cli'; export { Neovim, NeovimClient, Buffer, Tabpage, Window } from './api/index'; export { Plugin, Function, Autocmd, Command } from './plugin'; export { NvimPlugin } from './host/NvimPlugin'; diff --git a/packages/neovim/src/utils/transport.ts b/packages/neovim/src/utils/transport.ts index 66fbe138..ed28cac2 100644 --- a/packages/neovim/src/utils/transport.ts +++ b/packages/neovim/src/utils/transport.ts @@ -16,7 +16,7 @@ if (process.env.NODE_ENV === 'test') { }; } -class Response { +export class Response { private requestId: number; private sent!: boolean;