diff --git a/.gitignore b/.gitignore index d882285f..fa96d744 100644 --- a/.gitignore +++ b/.gitignore @@ -17,10 +17,10 @@ !/package.json !/pnpm-lock.yaml !/pnpm-workspace.yaml -!/tsconfig.json -!/jest.config.ts !/.prettierrc !/.prettierignore +# shared by pkgs +!/tsconfig.json !/.npmignore # useful stuff @@ -28,8 +28,9 @@ !/.cruft.json # packages -pkg/*/node_modules/ +!/pkg/*/src/**/*.ts +!/pkg/*/test/**/*.ts !/pkg/*/package.json !/pkg/*/pnpm-lock.yaml -!/pkg/**/*.ts -!/pkg/**/*.test.ts +!/pkg/*/tsconfig.json +!/pkg/*/.npmignore diff --git a/.npmignore b/.npmignore index cc119507..c6f7730a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,11 +1,13 @@ -# blacklist everything * -*/ +!*/ -# useful stuff !/package.json -# built files and types -!/.build/*/*.js -!/.build/*/*.js.map -!/.build/*/*.d.ts +!/build/esm/src/**/*.js +!/build/esm/src/**/*.js.map +!/build/esm/src/**/*.d.ts + +!/build/cjs/package.json +!/build/cjs/src/**/*.js +!/build/cjs/src/**/*.js.map +!/build/cjs/src/**/*.d.ts diff --git a/jest.config.ts b/jest.config.ts deleted file mode 100644 index ade69b28..00000000 --- a/jest.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { JestConfigWithTsJest } from 'ts-jest'; - -export default { - transform: { '^.+\\.ts$': ['ts-jest', { useESM: true }] }, - moduleNameMapper: { '@slangroom/(.*)': '/pkg/$1' }, - testMatch: ['/pkg/*/**/*.test.ts'], - forceCoverageMatch: ['/pkg/*/**/*.test.ts'], - collectCoverageFrom: ['/pkg/*/**/*.ts'], - coverageDirectory: '/.coverage/', - testEnvironment: 'node', - errorOnDeprecated: true, - extensionsToTreatAsEsm: ['.ts'], - reporters: ['default', ['jest-junit', { outputDirectory: '/.coverage' }]], -}; diff --git a/package.json b/package.json index 87de12aa..f550d729 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "slangroom", - "version": "0.0.1", + "version": "0.0.3", "description": "Enhance zencode smart contracts with your slang dialect", "repository": "https://github.com/dyne/slangroom", "author": { @@ -9,27 +9,28 @@ }, "license": "AGPL-3.0-only", "scripts": { - "lint": "eslint --ext .ts pkg/ jest.config.ts", - "test": "jest", - "coverage": "jest --coverage", - "clean": "rm -rf .build .coverage", - "ts-node": "ts-node", - "build": "tsc", + "lint": "eslint --ext .ts pkg/*/src pkg/*/test", + "format": "prettier --ignore-path .gitignore --write '**/*.+(js|ts|json|html)'", + "test": "pnpm build && pnpm -F @slangroom/* exec ava build/esm/test", + "coverage": "c8 -o .coverage --exclude '**/test/' pnpm test", + "clean": "rm -rf .coverage && pnpm -F @slangroom/* exec -- rm -rf build", + "build": "pnpm build:esm", + "build:dual": "pnpm build:esm && pnpm build:cjs", + "build:cjs": "pnpm -F @slangroom/* exec tsc --outDir build/cjs --module commonjs && pnpm cjs-fixup", + "build:esm": "pnpm -F @slangroom/* exec tsc --outdir build/esm --module node16", "build-all": "pnpm build", - "format": "prettier --ignore-path .gitignore --write '**/*.+(js|ts|json|html)'" + "cjs-fixup": "pnpm -F @slangroom/* exec sh -c \"echo '{\\\"type\\\":\\\"commonjs\\\"}' >build/cjs/package.json\"" }, "devDependencies": { - "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@typescript-eslint/eslint-plugin": "^5.59.11", "@typescript-eslint/parser": "^5.59.11", + "ava": "^5.3.1", + "c8": "^8.0.1", "esbuild": "^0.18.4", "eslint": "^8.43.0", "eslint-config-prettier": "^8.8.0", - "jest": "29.5.0", - "jest-junit": "^16.0.0", "prettier": "^2.8.8", - "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "tslib": "^2.5.3", "typedoc": "^0.24.8", diff --git a/pkg/core/.npmignore b/pkg/core/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/core/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/core/package.json b/pkg/core/package.json new file mode 100644 index 00000000..06c5f4da --- /dev/null +++ b/pkg/core/package.json @@ -0,0 +1,35 @@ +{ + "name": "@slangroom/core", + "version": "1.0.0", + "dependencies": { + "@slangroom/shared": "workspace:*", + "@slangroom/ignored": "workspace:*" + }, + "repository": "https://github.com/dyne/slangroom", + "license": "AGPL-3.0-only", + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } + } +} diff --git a/pkg/core/src/index.ts b/pkg/core/src/index.ts new file mode 100644 index 00000000..3541d260 --- /dev/null +++ b/pkg/core/src/index.ts @@ -0,0 +1,2 @@ +export * from '@slangroom/core/plugin'; +export * from '@slangroom/core/slangroom'; diff --git a/pkg/core/src/plugin.ts b/pkg/core/src/plugin.ts new file mode 100644 index 00000000..e1dcd64d --- /dev/null +++ b/pkg/core/src/plugin.ts @@ -0,0 +1,46 @@ +import type { ZenroomParams, JsonableObject } from '@slangroom/shared'; + +/** + * A plugin that must be executed **before** the actual Zenroom execution takes + * place. + * + * The plugin is defined using a single parameter which is a callback, + * named [execute], which takes in the necessary parameters from [BeforeParams]. + */ +export class BeforePlugin { + constructor(readonly execute: (params: BeforeParams) => Promise | void) {} +} + +/** + * A plugin that must be executed **after** the actual Zenroom execution takes + * place. + * + * The plugin is defined using a single parameter which is a callback, + * named [execute], which takes in the necessary parameters from [AfterParams]. + */ +export class AfterPlugin { + constructor(readonly execute: (params: AfterParams) => Promise | void) {} +} + +/** + * The parameters passed down to [BeforePlugin]'s callback. + * + * [statement] is the ignored statement for each iteration. + * [params] is the original parameters passed to Zenroom, if any. + */ +export type BeforeParams = { + readonly statement: string; + readonly params: ZenroomParams | undefined; +}; + +/** + * The parameters passed down to [BeforePlugin]'s callback. + * [statement] is the ignored statement for each iteration. + * [params] is the original parameters passed to Zenroom, if any. + * [result] is the result of the actual Zenroom execution. + */ +export type AfterParams = { + readonly statement: string; + readonly params: ZenroomParams | undefined; + readonly result: JsonableObject; +}; diff --git a/pkg/core/src/slangroom.ts b/pkg/core/src/slangroom.ts new file mode 100644 index 00000000..83f84946 --- /dev/null +++ b/pkg/core/src/slangroom.ts @@ -0,0 +1,84 @@ +import { BeforePlugin, AfterPlugin } from '@slangroom/core/plugin'; +import { type ZenroomParams, type ZenroomOutput, zencodeExec } from '@slangroom/shared'; +import { getIgnoredStatements } from '@slangroom/ignored'; + +/** + * A helper type that disallows nested arrays. + */ +type Plugins = + | BeforePlugin + | AfterPlugin + | Set + | Array>; + +/** + * A Slangroom instance. + */ +export class Slangroom { + /** + * A set of plugins that needs to be executed **before** the actual Zenroom execution. + */ + private _beforeExecution = new Set(); + get beforeExecution() { + return this._beforeExecution; + } + + /** + * A set of plugins that needs to be executed **after** the actual Zenroom execution. + */ + private _afterExecution = new Set(); + get afterExecution() { + return this._afterExecution; + } + + constructor(first: Plugins, ...rest: Plugins[]) { + this.addPlugins(first, ...rest); + } + + /** + * Adds a single or a list of plugins to the Slangroom instance. + */ + addPlugins(first: Plugins, ...rest: Plugins[]) { + const plugins = new Set(); + [first, ...rest].forEach(function recurse(x: Plugins) { + if (Array.isArray(x) || x instanceof Set) x.forEach(recurse); + else plugins.add(x); + }); + + for (const p of plugins) { + if (p instanceof BeforePlugin) this._beforeExecution.add(p); + if (p instanceof AfterPlugin) this._afterExecution.add(p); + } + } + + /** + * Executes a contract using optional parameters with custom statements. + */ + async execute(contract: string, params?: ZenroomParams): Promise { + const ignoreds = await getIgnoredStatements(contract, params); + + // TODO: remove the statements when they match (decide how) + for (const b of this._beforeExecution) { + for (const ignored of ignoreds) { + await b.execute({ + statement: ignored, + params: params, + }); + } + } + + const zout = await zencodeExec(contract, params); + + for (const a of this._afterExecution) { + for (const ignored of ignoreds) { + await a.execute({ + statement: ignored, + result: zout.result, + params: params, + }); + } + } + + return zout; + } +} diff --git a/pkg/core/test/slangroom.ts b/pkg/core/test/slangroom.ts new file mode 100644 index 00000000..cf0a475f --- /dev/null +++ b/pkg/core/test/slangroom.ts @@ -0,0 +1,65 @@ +import test from 'ava'; +import { BeforePlugin, AfterPlugin, Slangroom } from '@slangroom/core'; + +test('adding a plugin correctly falls into either before or after', (t) => { + const before = new BeforePlugin(() => { + return; + }); + const after = new AfterPlugin(() => { + return; + }); + const slang = new Slangroom(before, after); + + t.is(slang.beforeExecution.size, 1); + t.true(slang.beforeExecution.has(before)); + + t.is(slang.afterExecution.size, 1); + t.true(slang.afterExecution.has(after)); +}); + +test('no plugins are executed if no ignored statemnets are found', async (t) => { + let hasBeforeRan = false; + let hasAfterRan = false; + const before = new BeforePlugin(() => { + hasBeforeRan = true; + return; + }); + const after = new BeforePlugin(() => { + hasAfterRan = true; + return; + }); + const slang = new Slangroom([before, after]); + const contract = `Given I have nothing +Then I print the string 'I love you' +`; + await slang.execute(contract); + t.false(hasBeforeRan); + t.false(hasAfterRan); +}); + +test('before-plugins runs before the actual execution and after-plugins runs after', async (t) => { + let hasBeforeRan = false; + let hasAfterRan = false; + const before = new BeforePlugin(() => { + t.false(hasBeforeRan); + t.false(hasAfterRan); + hasBeforeRan = true; + return; + }); + const after = new AfterPlugin(() => { + t.true(hasBeforeRan); + t.false(hasAfterRan); + hasAfterRan = true; + return; + }); + const slang = new Slangroom(new Set([before, after])); + const contract = `Rule unknown ignore + +Given I have nothing +Then I print the string 'I love you' +Then this statement does not exist +`; + await slang.execute(contract); + t.true(hasBeforeRan); + t.true(hasAfterRan); +}); diff --git a/pkg/core/tsconfig.json b/pkg/core/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/core/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/deps/.npmignore b/pkg/deps/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/deps/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/deps/package.json b/pkg/deps/package.json index b2edb92d..91dc68ea 100644 --- a/pkg/deps/package.json +++ b/pkg/deps/package.json @@ -1,14 +1,35 @@ { "name": "@slangroom/deps", - "exports": { - "*": "../../.build/deps/*.js" - }, - "version": "1.0.0", - "type": "module", - "repository": "https://github.com/dyne/slangroom", - "license": "AGPL-3.0-only", + "version": "1.0.3", "dependencies": { "chevrotain": "^10.5.0", "zenroom": "^3.10.0" + }, + "repository": "https://github.com/dyne/slangroom", + "license": "AGPL-3.0-only", + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } } } diff --git a/pkg/deps/chevrotain.ts b/pkg/deps/src/chevrotain.ts similarity index 100% rename from pkg/deps/chevrotain.ts rename to pkg/deps/src/chevrotain.ts diff --git a/pkg/deps/zenroom.ts b/pkg/deps/src/zenroom.ts similarity index 100% rename from pkg/deps/zenroom.ts rename to pkg/deps/src/zenroom.ts diff --git a/pkg/deps/test/make-ava-happy.ts b/pkg/deps/test/make-ava-happy.ts new file mode 100644 index 00000000..aaa68a69 --- /dev/null +++ b/pkg/deps/test/make-ava-happy.ts @@ -0,0 +1,3 @@ +import test from 'ava'; + +test('ava is happy', (t) => t.true(true)); diff --git a/pkg/deps/tsconfig.json b/pkg/deps/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/deps/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/fs/.npmignore b/pkg/fs/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/fs/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/fs/index.ts b/pkg/fs/index.ts deleted file mode 100644 index 41b2e4ed..00000000 --- a/pkg/fs/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './lexer'; -export * from './parser'; -export * from './tokens'; -export * from './visitor'; diff --git a/pkg/fs/lexer.test.ts b/pkg/fs/lexer.test.ts deleted file mode 100644 index ac973344..00000000 --- a/pkg/fs/lexer.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { lex } from './lexer'; -import { Then, I, SaveThe, IntoTheFile } from './tokens'; - -import { Identifier } from '@slangroom/shared/tokens'; -import { getIgnoredStatements } from '@slangroom/ignored'; - -test('lexing works', async () => { - // Given I have a contract with filesystem statements in it - const contract = `Rule unknown ignore -Given I have a 'string' named 'stringToWrite0' -and I have a 'string' named 'nameOfTheFile0' -and I have a 'string' named 'stringToWrite1' -and I have a 'string' named 'nameOfTheFile1' - -Then I save the 'stringToWrite0' into the file 'nameOfTheFile0' -and I save the 'stringToWrite1' into the file 'nameOfTheFile1' -`; - // When I get the ignored statements of it - const ignoreds = await getIgnoredStatements(contract, { - data: { - stringToWrite0: 'foo0', nameOfTheFile0: 'bar0', - stringToWrite1: 'foo1', nameOfTheFile1: 'bar1', - }, - }); - // and I lex each of them - const lexeds = ignoreds.map((x) => lex(x)); - // Then the result must contain 2 items - expect(lexeds).toHaveLength(2); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - - // When I get the first one - const first = lexeds[0]!; - // Then it must have no errors - expect(first.errors).toHaveLength(0); - // and it must have 6 tokens - expect(first.tokens).toHaveLength(6); - // and those tokens must be these: - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expect(first.tokens[0]!.tokenType).toStrictEqual(Then); - expect(first.tokens[1]!.tokenType).toStrictEqual(I); - expect(first.tokens[2]!.tokenType).toStrictEqual(SaveThe); - expect(first.tokens[3]!.tokenType).toStrictEqual(Identifier); - expect(first.tokens[4]!.tokenType).toStrictEqual(IntoTheFile); - expect(first.tokens[5]!.tokenType).toStrictEqual(Identifier); - /* eslint-enable */ - - // When I get the second one - const second = lexeds[0]!; - // Then it must have no errors - expect(second.errors).toHaveLength(0); - // and it must have 6 tokens - expect(second.tokens).toHaveLength(6); - // and those tokens must be these: - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expect(second.tokens[0]!.tokenType).toStrictEqual(Then); - expect(second.tokens[1]!.tokenType).toStrictEqual(I); - expect(second.tokens[2]!.tokenType).toStrictEqual(SaveThe); - expect(second.tokens[3]!.tokenType).toStrictEqual(Identifier); - expect(second.tokens[4]!.tokenType).toStrictEqual(IntoTheFile); - expect(second.tokens[5]!.tokenType).toStrictEqual(Identifier); - /* eslint-enable */ -}); diff --git a/pkg/fs/package.json b/pkg/fs/package.json index c7f6c0a7..ed00729f 100644 --- a/pkg/fs/package.json +++ b/pkg/fs/package.json @@ -1,15 +1,37 @@ { "name": "@slangroom/fs", - "exports": { - "*": "../../.build/fs/*.js" - }, - "version": "1.0.0", - "type": "module", - "repository": "https://github.com/dyne/slangroom", - "license": "AGPL-3.0-only", + "version": "1.0.3", "dependencies": { "@slangroom/deps": "workspace:*", "@slangroom/shared": "workspace:*", - "@slangroom/ignored": "workspace:*" + "@slangroom/ignored": "workspace:*", + "@slangroom/core": "workspace:*" + }, + "repository": "https://github.com/dyne/slangroom", + "license": "AGPL-3.0-only", + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } } } diff --git a/pkg/fs/src/index.ts b/pkg/fs/src/index.ts new file mode 100644 index 00000000..d4c0a0b0 --- /dev/null +++ b/pkg/fs/src/index.ts @@ -0,0 +1,4 @@ +export * from '@slangroom/fs/lexer'; +export * from '@slangroom/fs/parser'; +export * from '@slangroom/fs/tokens'; +export * from '@slangroom/fs/visitor'; diff --git a/pkg/fs/lexer.ts b/pkg/fs/src/lexer.ts similarity index 87% rename from pkg/fs/lexer.ts rename to pkg/fs/src/lexer.ts index 67c40928..61c73837 100644 --- a/pkg/fs/lexer.ts +++ b/pkg/fs/src/lexer.ts @@ -1,5 +1,4 @@ -import { vocab } from './tokens'; - +import { vocab } from '@slangroom/fs/tokens'; import { Lexer } from '@slangroom/deps/chevrotain'; const FsLexer = new Lexer(vocab); diff --git a/pkg/fs/parser.ts b/pkg/fs/src/parser.ts similarity index 78% rename from pkg/fs/parser.ts rename to pkg/fs/src/parser.ts index 6fb24874..d8d6a672 100644 --- a/pkg/fs/parser.ts +++ b/pkg/fs/src/parser.ts @@ -1,11 +1,11 @@ -import { IntoTheFile, SaveThe, Then, And, I, vocab } from './tokens'; -import { lex } from './lexer'; - +import { IntoTheFile, SaveThe, vocab } from '@slangroom/fs/tokens'; +import { lex } from '@slangroom/fs/lexer'; import { CstParser, type IToken } from '@slangroom/deps/chevrotain'; -import { Identifier } from '@slangroom/shared/tokens'; +import { Then, I, Identifier } from '@slangroom/shared/tokens'; export type FileOverrideStatementCtx = { - ThenI: [IToken]; + Then: [IToken]; + I: [IToken]; SaveThe: [IToken]; content: [IToken]; IntoTheFile: [IToken]; @@ -19,10 +19,7 @@ class Parser extends CstParser { } fileOverrideStatement = this.RULE('fileOverrideStatement', () => { - this.OR([ - { ALT: () => this.CONSUME(Then) }, - { ALT: () => this.CONSUME(And) }, - ]); + this.CONSUME(Then); this.CONSUME(I); this.CONSUME(SaveThe); this.CONSUME(Identifier, { LABEL: 'content' }); diff --git a/pkg/fs/src/plugins.ts b/pkg/fs/src/plugins.ts new file mode 100644 index 00000000..99feea46 --- /dev/null +++ b/pkg/fs/src/plugins.ts @@ -0,0 +1,39 @@ +import { visit } from '@slangroom/fs/visitor'; +import { AfterPlugin } from '@slangroom/core/plugin'; +import * as path from 'node:path'; +import * as fs from 'node:fs/promises'; + +/** + * A directory that is safe to write to and read from. + * + * Care must be taken to not allow writes and reads outside of this directory. + */ +export const SandboxDir = '/tmp/slangroom'; + +export const ThenISaveStringIntoTheFile = new AfterPlugin(async ({ statement, result }) => { + const ast = visit(statement); + // TODO: if `visit()` fails, exit (return) + + const filename = result[ast.filename] as string; + const content = result[ast.content] as string; + const normalized = path.normalize(filename); + // "/" and ".." prevents directory traversal + const does_directory_traversal = normalized.startsWith('/') || normalized.startsWith('..'); + // "." ensures that "foo/bar" or "./foo" is valid, while "." isn't + // (that is, no "real" filepath is provided) + const doesnt_provide_file = normalized.startsWith('.'); + if (does_directory_traversal || doesnt_provide_file) return; // TODO: instead of ignoring, do we wanna error out? + // here onward, we're sure `filepath` is under `SandboxDir` + const filepath = path.join(SandboxDir, normalized); + + // these following two lines allow subdirs to be created if + // `normalized` contains any (or `SandboxDir` to be created if it + // doesn't exist already) + const dirname = path.dirname(filepath); + await fs.mkdir(dirname, { recursive: true }); + + const fhandle = await fs.open(filepath, 'wx'); + await fhandle.write(content); +}); + +export const allPlugins = new Set([ThenISaveStringIntoTheFile]); diff --git a/pkg/fs/src/tokens.ts b/pkg/fs/src/tokens.ts new file mode 100644 index 00000000..ae865393 --- /dev/null +++ b/pkg/fs/src/tokens.ts @@ -0,0 +1,24 @@ +import { Whitespace, Comment, Identifier, Then, I } from '@slangroom/shared'; +import { createToken } from '@slangroom/deps/chevrotain'; + +/** + * The "save the" statement, used to write files to the filesystems. + */ +export const SaveThe = createToken({ + name: 'SaveThe', + pattern: /save the/, +}); + +/** + * The "into the file" statement, used to indicate the file to which to + * write. + */ +export const IntoTheFile = createToken({ + name: 'IntoTheFile', + pattern: /into the file/, +}); + +/** + * Vocabulary to perform filesystems actions. + */ +export const vocab = [Whitespace, Comment, Then, I, SaveThe, IntoTheFile, Identifier]; diff --git a/pkg/fs/visitor.ts b/pkg/fs/src/visitor.ts similarity index 97% rename from pkg/fs/visitor.ts rename to pkg/fs/src/visitor.ts index 2623545a..0ed434bf 100644 --- a/pkg/fs/visitor.ts +++ b/pkg/fs/src/visitor.ts @@ -1,5 +1,4 @@ -import { BaseFsVisitor, parse, type FileOverrideStatementCtx } from './parser'; - +import { BaseFsVisitor, parse, type FileOverrideStatementCtx } from '@slangroom/fs/parser'; import type { CstNode } from '@slangroom/deps/chevrotain'; export type FileOverrideStatement = { diff --git a/pkg/fs/test/plugins.ts b/pkg/fs/test/plugins.ts new file mode 100644 index 00000000..1bd99677 --- /dev/null +++ b/pkg/fs/test/plugins.ts @@ -0,0 +1,53 @@ +import test from 'ava'; +import { allPlugins, SandboxDir } from '@slangroom/fs/plugins'; +import { Slangroom } from '@slangroom/core'; +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; + +test('requires a real path', async (t) => { + const slang = new Slangroom(allPlugins); + const contract = `Rule unknown ignore +Given I have a 'string' named 'nameOfTheFile' + +When I create the random object of '64' bits +When I rename the 'random_object' to 'stringToWrite' + +Then I save the 'stringToWrite' into the file 'nameOfTheFile' +Then I print the 'stringToWrite' +Then I print the 'nameOfTheFile' +`; + { + const params = { data: { nameOfTheFile: '../trying/to/h4ck' } }; + const zout = await slang.execute(contract, params); + const nameOfTheFile = zout.result['nameOfTheFile'] as string; + await t.throwsAsync(fs.readFile(path.resolve(SandboxDir, nameOfTheFile))); + } + + { + const params = { data: { nameOfTheFile: '/trying/to/h4ck' } }; + const zout = await slang.execute(contract, params); + const nameOfTheFile = zout.result['nameOfTheFile'] as string; + await t.throwsAsync(fs.readFile(path.resolve(SandboxDir, nameOfTheFile))); + } +}); + +test('keyholder works', async (t) => { + const slang = new Slangroom(allPlugins); + const contract = `Rule unknown ignore +Given I have a 'string' named 'nameOfTheFile' + +When I create the random object of '64' bits +When I rename the 'random_object' to 'stringToWrite' + +Then I save the 'stringToWrite' into the file 'nameOfTheFile' +Then I print the 'stringToWrite' +Then I print the 'nameOfTheFile' +`; + const randomStr = (Math.random() + 1).toString(36).substring(7); + const params = { data: { nameOfTheFile: randomStr } }; + const zout = await slang.execute(contract, params); + const nameOfTheFile = zout.result['nameOfTheFile'] as string; + const stringToWrite = zout.result['stringToWrite'] as string; + const buf = await fs.readFile(path.resolve(SandboxDir, nameOfTheFile)); + t.is(buf.toString(), stringToWrite); +}); diff --git a/pkg/fs/test/visitor.ts b/pkg/fs/test/visitor.ts new file mode 100644 index 00000000..a8a2cc5a --- /dev/null +++ b/pkg/fs/test/visitor.ts @@ -0,0 +1,98 @@ +import test from 'ava'; +import { visit } from '@slangroom/fs/visitor'; +import { getIgnoredStatements } from '@slangroom/ignored'; + +test('ast is correct with one statement', async (t) => { + // Given I have a contract with one filesystems statement in it + const contract = `Rule unknown ignore +Given I have a 'string' named 'stringToWrite' +Given I have a 'string' named 'nameOfTheFile' + +Then I save the 'stringToWrite' into the file 'nameOfTheFile' +`; + const data = { + stringToWrite: 'hello world', + nameOfTheFile: 'hello-world.txt', + }; + // When I get the ignored statements of it + const ignoreds = await getIgnoredStatements(contract, { + data: data, + }); + // and I generate AST of each of them + const asts = ignoreds.map((x) => visit(x)); + // Then the result must contain only one item + t.is(asts?.length, 1); + const ast = asts[0]; + // and its content must be "stringToWrite" + t.is(ast?.content, 'stringToWrite'); + // and its filename must be "nameOfTheFile" + t.is(ast?.filename, 'nameOfTheFile'); + // and the value indexed by its content in data must be data's stringToWrite + t.is(data[ast?.content as 'stringToWrite'], data.stringToWrite); + // and the value indexed by its filename in data must be data's nameOfTheFile + t.is(data[ast?.filename as 'nameOfTheFile'], data.nameOfTheFile); +}); + +test('ast is correct with multiple statements', async (t) => { + // Given I have a contract with multiple filesystems statements in it + const contract = `Rule unknown ignore +Given I have a 'string' named 'stringToWrite0' +Given I have a 'string' named 'nameOfTheFile0' +Given I have a 'string' named 'stringToWrite1' +Given I have a 'string' named 'nameOfTheFile1' +Given I have a 'string' named 'stringToWrite2' +Given I have a 'string' named 'nameOfTheFile2' + +Then I save the 'stringToWrite0' into the file 'nameOfTheFile0' +Then I save the 'stringToWrite1' into the file 'nameOfTheFile1' +Then I save the 'stringToWrite2' into the file 'nameOfTheFile2' +`; + const data = { + stringToWrite0: 'hello world0', + nameOfTheFile0: 'hello-world0.txt', + stringToWrite1: 'hello world1', + nameOfTheFile1: 'hello-world1.txt', + stringToWrite2: 'hello world2', + nameOfTheFile2: 'hello-world2.txt', + }; + // When I get the ignored statements of it + const ignoreds = await getIgnoredStatements(contract, { + data: data, + }); + // And I generate AST of each of them + const asts = ignoreds.map((x) => visit(x)); + // Then the result must contain 3 items + t.is(asts.length, 3); + // And I get the first one + const first = asts[0]; + // And the its content must be "stringToWrite0" + t.is(first?.content, 'stringToWrite0'); + // And the its filename must be "nameOfTheFile" + t.is(first?.filename, 'nameOfTheFile0'); + // And the value indexed by its content in data must be data's stringToWrite0 + t.is(data[first?.content as 'stringToWrite0'], data.stringToWrite0); + // And the value indexed by its filename in data must be data's nameOfTheFile0 + t.is(data[first?.filename as 'nameOfTheFile0'], data.nameOfTheFile0); + + // Then get the second one + const second = asts[1]; + // and the its content must be "stringToWrite0" + t.is(second?.content, 'stringToWrite1'); + // and the its filename must be "nameOfTheFile" + t.is(second?.filename, 'nameOfTheFile1'); + // and the value indexed by its content in data must be data's stringToWrite1 + t.is(data[second?.content as 'stringToWrite1'], data.stringToWrite1); + // and the value indexed by its filename in data must be data's nameOfTheFile1 + t.is(data[second?.filename as 'nameOfTheFile1'], data.nameOfTheFile1); + + // Then I get the third one + const third = asts[2]; + // And the its content must be "stringToWrite2" + t.is(third?.content, 'stringToWrite2'); + // And the its filename must be "nameOfTheFile" + t.is(third?.filename, 'nameOfTheFile2'); + // And the value indexed by its content in data must be data's stringToWrite2 + t.is(data[third?.content as 'stringToWrite2'], data.stringToWrite2); + // And the value indexed by its filename in data must be data's nameOfTheFile2 + t.is(data[third?.filename as 'nameOfTheFile2'], data.nameOfTheFile2); +}); diff --git a/pkg/fs/tokens.ts b/pkg/fs/tokens.ts deleted file mode 100644 index caa1b900..00000000 --- a/pkg/fs/tokens.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Whitespace, Comment, Identifier } from '@slangroom/shared'; -import { createToken } from '@slangroom/deps/chevrotain'; - -/** - * The "Then" statement. - */ -export const Then = createToken({ - name: 'Then', - pattern: /Then/, -}); - -/** - * The "and" statement. - */ -export const And = createToken({ - name: 'and', - pattern: /and/, -}); - -/** - * The selfish "I" statement. - */ -export const I = createToken({ - name: 'I', - pattern: /I/, -}); - -/** - * The "save the" statement, used to write files to the filesystems. - */ -export const SaveThe = createToken({ - name: 'SaveThe', - pattern: /save the/, -}); - -/** - * The "into the file" statement, used to indicate the file to which to - * write. - */ -export const IntoTheFile = createToken({ - name: 'IntoTheFile', - pattern: /into the file/, -}); - -/** - * Vocabulary to perform filesystems actions. - */ -export const vocab = [Whitespace, Comment, Then, And, I, SaveThe, IntoTheFile, Identifier]; diff --git a/pkg/fs/tsconfig.json b/pkg/fs/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/fs/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/fs/visitor.test.ts b/pkg/fs/visitor.test.ts deleted file mode 100644 index 8d28ef09..00000000 --- a/pkg/fs/visitor.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { visit } from './visitor'; - -import { getIgnoredStatements } from '@slangroom/ignored'; - -test('ast is correct with one statement', async () => { - // Given I have a contract with one filesystems statement in it - const contract = `Rule unknown ignore -Given I have a 'string' named 'stringToWrite' -and I have a 'string' named 'nameOfTheFile' - -Then I save the 'stringToWrite' into the file 'nameOfTheFile' -`; - const data = { - stringToWrite: 'hello world', - nameOfTheFile: 'hello-world.txt', - }; - // When I get the ignored statements of it - const ignoreds = await getIgnoredStatements(contract, { - data: data, - }); - // and I generate AST of each of them - const asts = ignoreds.map((x) => visit(x)); - // Then the result must contain only one item - expect(asts).toHaveLength(1); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const ast = asts[0]!; - // and its content must be "stringToWrite" - expect(ast.content).toStrictEqual('stringToWrite'); - // and its filename must be "nameOfTheFile" - expect(ast.filename).toStrictEqual('nameOfTheFile'); - // and the value indexed by its content in data must be data's stringToWrite - expect(data[ast.content as 'stringToWrite']).toStrictEqual(data.stringToWrite); - // and the value indexed by its filename in data must be data's nameOfTheFile - expect(data[ast.filename as 'nameOfTheFile']).toStrictEqual(data.nameOfTheFile); -}); - -test('ast is correct with multiple statements', async () => { - // Given I have a contract with multiple filesystems statements in it - const contract = `Rule unknown ignore -Given I have a 'string' named 'stringToWrite0' -and I have a 'string' named 'nameOfTheFile0' -and I have a 'string' named 'stringToWrite1' -and I have a 'string' named 'nameOfTheFile1' -and I have a 'string' named 'stringToWrite2' -and I have a 'string' named 'nameOfTheFile2' - -Then I save the 'stringToWrite0' into the file 'nameOfTheFile0' -and I save the 'stringToWrite1' into the file 'nameOfTheFile1' -and I save the 'stringToWrite2' into the file 'nameOfTheFile2' -`; - const data = { - stringToWrite0: 'hello world0', - nameOfTheFile0: 'hello-world0.txt', - stringToWrite1: 'hello world1', - nameOfTheFile1: 'hello-world1.txt', - stringToWrite2: 'hello world2', - nameOfTheFile2: 'hello-world2.txt', - }; - // When I get the ignored statements of it - const ignoreds = await getIgnoredStatements(contract, { - data: data, - }); - // and I generate AST of each of them - const asts = ignoreds.map((x) => visit(x)); - // Then the result must contain 3 items - expect(asts).toHaveLength(3); - // and I get the first one - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const first = asts[0]!; - // and the its content must be "stringToWrite0" - expect(first.content).toStrictEqual('stringToWrite0'); - // and the its filename must be "nameOfTheFile" - expect(first.filename).toStrictEqual('nameOfTheFile0'); - // and the value indexed by its content in data must be data's stringToWrite0 - expect(data[first.content as 'stringToWrite0']).toStrictEqual(data.stringToWrite0); - // and the value indexed by its filename in data must be data's nameOfTheFile0 - expect(data[first.filename as 'nameOfTheFile0']).toStrictEqual(data.nameOfTheFile0); - // and I get the second one - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const second = asts[1]!; - // and the its content must be "stringToWrite0" - expect(second.content).toStrictEqual('stringToWrite1'); - // and the its filename must be "nameOfTheFile" - expect(second.filename).toStrictEqual('nameOfTheFile1'); - // and the value indexed by its content in data must be data's stringToWrite1 - expect(data[second.content as 'stringToWrite1']).toStrictEqual(data.stringToWrite1); - // and the value indexed by its filename in data must be data's nameOfTheFile1 - expect(data[second.filename as 'nameOfTheFile1']).toStrictEqual(data.nameOfTheFile1); - // and I get the third one - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const third = asts[2]!; - // and the its content must be "stringToWrite2" - expect(third.content).toStrictEqual('stringToWrite2'); - // and the its filename must be "nameOfTheFile" - expect(third.filename).toStrictEqual('nameOfTheFile2'); - // and the value indexed by its content in data must be data's stringToWrite2 - expect(data[third.content as 'stringToWrite2']).toStrictEqual(data.stringToWrite2); - // and the value indexed by its filename in data must be data's nameOfTheFile2 - expect(data[third.filename as 'nameOfTheFile2']).toStrictEqual(data.nameOfTheFile2); -}); diff --git a/pkg/ignored/.npmignore b/pkg/ignored/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/ignored/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/ignored/index.ts b/pkg/ignored/index.ts deleted file mode 100644 index a6d9169c..00000000 --- a/pkg/ignored/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { vocab } from './tokens'; - -import { zencodeExec, type ZenroomParams } from '@slangroom/shared'; -import { Lexer } from '@slangroom/deps/chevrotain'; - -const IgnoredLexer = new Lexer(vocab); - -/** - * Finds statements ignored by Zenroom in the provided contract. - * - * @param contract is the Zenroom contract. - * @param params is the parameters of Zenroom, such as data and keys. - * @returns the ignored statements. - */ -export const getIgnoredStatements = async (contract: string, params?: ZenroomParams) => { - const { logs } = await zencodeExec(contract, params); - const lexed = IgnoredLexer.tokenize(logs); - return lexed.tokens.map((s) => s.image); -}; diff --git a/pkg/ignored/package.json b/pkg/ignored/package.json index f90df4bb..54127577 100644 --- a/pkg/ignored/package.json +++ b/pkg/ignored/package.json @@ -1,14 +1,35 @@ { "name": "@slangroom/ignored", - "exports": { - "*": "../../.build/ignored/*.js" - }, - "version": "1.0.0", - "type": "module", - "repository": "https://github.com/dyne/slangroom", - "license": "AGPL-3.0-only", + "version": "1.0.3", "dependencies": { "@slangroom/deps": "workspace:*", "@slangroom/shared": "workspace:*" + }, + "repository": "https://github.com/dyne/slangroom", + "license": "AGPL-3.0-only", + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } } } diff --git a/pkg/ignored/src/index.ts b/pkg/ignored/src/index.ts new file mode 100644 index 00000000..dd2c3379 --- /dev/null +++ b/pkg/ignored/src/index.ts @@ -0,0 +1,26 @@ +import { Lexer } from '@slangroom/deps/chevrotain'; +import { vocab } from '@slangroom/ignored/tokens'; +import { zencodeExec, type ZenroomParams } from '@slangroom/shared'; + +const IgnoredLexer = new Lexer(vocab); + +/** + * Finds statements ignored by Zenroom in the provided contract. + * + * If no statement is found, then that means the contract was executed with + * only statements found in Zenroom itself, thus no customization is possible. + * + * @param contract is the Zenroom contract. + * @param params is the parameters of Zenroom, such as data and keys. + * @returns the array of ignored statements. + */ +export const getIgnoredStatements = async ( + contract: string, + params?: ZenroomParams +): Promise => { + // TODO: the zencodeExec() call could potentially be optimized, as + // zencodeExec() parses the output result. Keep in mind: optimization bad. + const { logs } = await zencodeExec(contract, params); + const lexed = IgnoredLexer.tokenize(logs); + return lexed.tokens.map((s) => s.image); +}; diff --git a/pkg/ignored/tokens.ts b/pkg/ignored/src/tokens.ts similarity index 91% rename from pkg/ignored/tokens.ts rename to pkg/ignored/src/tokens.ts index 24f78512..9c2ef2b5 100644 --- a/pkg/ignored/tokens.ts +++ b/pkg/ignored/src/tokens.ts @@ -1,5 +1,5 @@ import { Whitespace } from '@slangroom/shared'; -import { createToken, CustomPatternMatcherFunc } from '@slangroom/deps/chevrotain'; +import { createToken, type CustomPatternMatcherFunc } from '@slangroom/deps/chevrotain'; /* * Prevent regex-ast annoing warnings diff --git a/pkg/ignored/index.test.ts b/pkg/ignored/test/index.ts similarity index 90% rename from pkg/ignored/index.test.ts rename to pkg/ignored/test/index.ts index e4f7d7f2..84bbdfa5 100644 --- a/pkg/ignored/index.test.ts +++ b/pkg/ignored/test/index.ts @@ -1,6 +1,7 @@ -import { getIgnoredStatements } from './index'; +import test from 'ava'; +import { getIgnoredStatements } from '@slangroom/ignored'; -test("zenroom ignores statements it doesn't know in general", async () => { +test("zenroom ignores statements it doesn't know in general", async (t) => { // Given I have a contract with a general rule unknown statemets in it const uknowns = [ 'When I test the rule with a statement that does not exist 1', @@ -16,12 +17,12 @@ When I write string 'test passed' in 'result' Then print the data `; // When I get the unknown statements - const result = await getIgnoredStatements(contract); + const ignoreds = await getIgnoredStatements(contract); // Then it must be the given unknown statements - expect(result).toStrictEqual(uknowns); + t.deepEqual(ignoreds, uknowns); }); -test("zenroom doesn't ignore ecdh but ignores restroom statements", async () => { +test("zenroom doesn't ignore ecdh but ignores restroom statements", async (t) => { // Given I have a contract with ecdh and restroom statements const contract = `# Always use 'Rule caller restroom-mw' when using Restroom Rule caller restroom-mw @@ -69,7 +70,7 @@ When I rename the 'signature' to 'outputData.signature' Then print the 'outputData' Then print the 'outputData.signature' `; - // and params to zenroom + // And params to zenroom const data = { endpoint: 'https://apiroom.net/api/dyneorg/512-bits-random-generator', timeServer: 'http://showcase.api.linx.twenty57.net/UnixTime/tounix?date=now', @@ -81,9 +82,9 @@ Then print the 'outputData.signature' }, }; // When I get the ignored statements - const result = await getIgnoredStatements(contract, { data: data }); + const ignoreds = await getIgnoredStatements(contract, { data: data }); // Then it must be equal to the statements of restroom - expect(result).toStrictEqual([ + t.deepEqual(ignoreds, [ "Given that I have an endpoint named 'endpoint'", "Given that I have an endpoint named 'timeServer'", "Given I connect to 'endpoint' and save the output into 'dataFromEndpoint'", diff --git a/pkg/ignored/tsconfig.json b/pkg/ignored/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/ignored/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/shared/.npmignore b/pkg/shared/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/shared/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/shared/gen-types.ts b/pkg/shared/gen-types.ts deleted file mode 100644 index f15d4b68..00000000 --- a/pkg/shared/gen-types.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* -import { writeFileSync } from 'fs'; -import { resolve } from 'path'; -*/ -import { generateCstDts, type CstParser } from '@slangroom/deps/chevrotain'; - -/** - * Generates typescript types, suitable for a .d.ts file, out of a - * parser definition. - * - * @param parser is a CstParser. - * @returns the contents of a .d.ts file, generated from the given - * parser. - */ -export const genTypes = (parser: CstParser): string => generateCstDts(parser.getGAstProductions()); - -/* -const dtsPath = resolve(__dirname, '..', 'json_cst.d.ts'); -writeFileSync(dtsPath, dtsString); -*/ diff --git a/pkg/shared/index.ts b/pkg/shared/index.ts deleted file mode 100644 index a8b8d3fc..00000000 --- a/pkg/shared/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './gen-types'; -export * from './jsonable'; -export * from './tokens'; -export * from './zenroom'; diff --git a/pkg/shared/package.json b/pkg/shared/package.json index 163af575..d1a3a795 100644 --- a/pkg/shared/package.json +++ b/pkg/shared/package.json @@ -1,13 +1,34 @@ { "name": "@slangroom/shared", - "exports": { - "*": "../../.build/shared/*.js" + "version": "1.0.5", + "dependencies": { + "@slangroom/deps": "workspace:*" }, - "version": "1.0.0", - "type": "module", "repository": "https://github.com/dyne/slangroom", "license": "AGPL-3.0-only", - "dependencies": { - "@slangroom/deps": "workspace:*" + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } } } diff --git a/pkg/shared/src/index.ts b/pkg/shared/src/index.ts new file mode 100644 index 00000000..bfcd998b --- /dev/null +++ b/pkg/shared/src/index.ts @@ -0,0 +1,3 @@ +export * from '@slangroom/shared/jsonable'; +export * from '@slangroom/shared/tokens'; +export * from '@slangroom/shared/zenroom'; diff --git a/pkg/shared/jsonable.ts b/pkg/shared/src/jsonable.ts similarity index 100% rename from pkg/shared/jsonable.ts rename to pkg/shared/src/jsonable.ts diff --git a/pkg/shared/src/tokens.ts b/pkg/shared/src/tokens.ts new file mode 100644 index 00000000..ed785aad --- /dev/null +++ b/pkg/shared/src/tokens.ts @@ -0,0 +1,88 @@ +import { Lexer, createToken } from '@slangroom/deps/chevrotain'; + +/** + * Whitespace of any kind (blanks, tabs, and newlines). + */ +export const Whitespace = createToken({ + name: 'Whitespace', + pattern: /\s+/, + group: Lexer.SKIPPED, +}); + +/** + * Shell-like comments using '#' to mark what's after it as comments. + * + * Spans across the entire line, as expected. + */ +export const Comment = createToken({ + name: 'Comment', + pattern: /#[^\n\r]*/, + group: 'comments', +}); + +/** + * The most selfish constants of all. The evilful. + * + * Unlike other statements, this must be case-sensitive. + */ +export const I = createToken({ + name: 'I', + pattern: /I/, +}); + +/** + * The statement that follows one of Given, When, or Then. + * + * It can optionally followed by itself, but the top of the list must be one of + * Given, When, or Then. + * + * Custom statements MUST run the And statements according to the following + * Given, When, or Then. + */ +export const And = createToken({ + name: 'And', + pattern: /and/i, +}); + +/** + * The Given (initial) stage of Zenroom contracts. + * + * Custom statements MUST run before the actual execution. + */ +export const Given = createToken({ + name: 'Given', + pattern: /given/i, +}); + +/** + * The When (middle) stage of Zenroom contracts. + * + * Custom statements MUST run before the actual execution. + */ +export const When = createToken({ + name: 'When', + pattern: /when/i, +}); + +/** + * The Then (last) stage of Zenroom contracts. + * + * Custom statements MUST run AFTER the actual execution. + */ +export const Then = createToken({ + name: 'Then', + pattern: /then/i, +}); + +/** + * Identifiers in single quotes, such as 'foo' and 'bar'. + * + * Escaped characters '\b', '\f', '\n', '\r', '\t', and '\v' are also + * accepted. + * Unicode characters of the format '\uXXXX' (where X is a hexedecimal + * digit) are also accepted. + */ +export const Identifier = createToken({ + name: 'Identifier', + pattern: /'(?:[^\\']|\\(?:[bfnrtv'\\/]|u[0-9a-fA-F]{4}))*'/, +}); diff --git a/pkg/shared/zenroom.ts b/pkg/shared/src/zenroom.ts similarity index 78% rename from pkg/shared/zenroom.ts rename to pkg/shared/src/zenroom.ts index 18e70283..d93699fe 100644 --- a/pkg/shared/zenroom.ts +++ b/pkg/shared/src/zenroom.ts @@ -1,17 +1,18 @@ -import { JsonableObject } from './jsonable'; - +import { JsonableObject } from './jsonable.js'; import { zencode_exec } from '@slangroom/deps/zenroom'; /** * Output of execution of a contract in Zenroom. */ -export type ZenroomResult = { - result: string; +export type ZenroomOutput = { + result: JsonableObject; logs: string; }; /** * Error thrown by [zenroomExec] if contract execution somehow fails. + * + * The [message] contains the logs. */ export class ZenroomError extends Error { constructor(logs: string) { @@ -51,7 +52,6 @@ export const convZenParams = (params?: ZenroomParams): ZenroomStringParams => { if (params[k]) ret[k] = JSON.stringify(params[k]); } } - // And while we are on it, let's freeze it. return ret; }; @@ -66,10 +66,18 @@ export const convZenParams = (params?: ZenroomParams): ZenroomStringParams => { export const zencodeExec = async ( contract: string, params?: ZenroomParams -): Promise => { +): Promise => { + let tmp: { result: string; logs: string }; try { - return await zencode_exec(contract, convZenParams(params)); + tmp = await zencode_exec(contract, convZenParams(params)); } catch (e) { throw new ZenroomError(e.logs); } + // Due to the try-catch above, it is ensured that [tmp.result] is a JSON + // string, whoose top-level value is a JSON Object. Thus, return's [result] + // is a JS Object. + return { + result: JSON.parse(tmp.result), + logs: tmp.logs, + }; }; diff --git a/pkg/shared/test/tokens.ts b/pkg/shared/test/tokens.ts new file mode 100644 index 00000000..478ba866 --- /dev/null +++ b/pkg/shared/test/tokens.ts @@ -0,0 +1,90 @@ +import test from 'ava'; +import { Whitespace, Identifier, Comment } from '@slangroom/shared/tokens'; +import { Lexer, createToken, type IToken } from '@slangroom/deps/chevrotain'; + +const skipped = 'given when then and i that valid all inside am an a'.split(' '); +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +const capitalize = (t: string) => `${t[0]!.toUpperCase()}${t.slice(1)}`; + +export const SkippedTokens = skipped.map((t) => + createToken({ name: capitalize(t), pattern: new RegExp(`${t} `), group: Lexer.SKIPPED }) +); + +const TestLexer = new Lexer([Whitespace, Comment, Identifier, ...SkippedTokens]); + +const lex = (contract: string) => TestLexer.tokenize(contract); + +test('identifiers are tokenized correctly', (t) => { + // Given I have a contract with various identifiers mixed with comments and whitespace + const contract = `# Given nothing I am all valid inside! +'one' # and another comment +'two' + '\uDEAD\uBEEF' # there's a tab before there +# it shouldn't catch this 'three + 'four' # blanks here and there + 'five' # mix of blanks and tabs +`; + // When I lex it + const lexed = lex(contract); + // Then I must have no errors + t.is(lexed.errors.length, 0); + // And I must have 6 comments + t.is(lexed.groups['comments']?.length, 6); + lexed.groups['comments']?.forEach((x: IToken) => t.is(x.tokenType, Comment)); + // And those must be these: + t.deepEqual( + lexed.groups['comments']?.map((x: IToken) => x.image), + [ + '# Given nothing I am all valid inside! ', + '# and another comment', + "# there's a tab before there ", + "# it shouldn't catch this 'three", + '# blanks here and there ', + '# mix of blanks and tabs ', + ] + ); + + // Then I must have 5 identifiers + t.is(lexed.tokens.length, 5); + lexed.tokens.forEach((x: IToken) => t.is(x.tokenType, Identifier)); + // And those must be these: + t.deepEqual( + lexed.tokens.map((x: IToken) => x.image), + ["'one'", "'two'", "'\uDEAD\uBEEF'", "'four'", "'five'"] + ); +}); + +test('non-matcheds error out', (t) => { + // Given I have a broken contract + const contract = `broken contract`; + // When I lex it + const lexed = lex(contract); + // Then I must have 2 errors, which are: + t.deepEqual(lexed.errors, [ + { + offset: 0, + length: 6, + line: 1, + column: 1, + message: 'unexpected character: ->b<- at offset: 0, skipped 6 characters.', + }, + { + offset: 7, + length: 8, + line: 1, + column: 2, + message: 'unexpected character: ->c<- at offset: 7, skipped 8 characters.', + }, + ]); +}); + +test('tokens are skipped correctly', (t) => { + // Given I have a contract with several ignored and an identifier tokens + const contract = "given I am 'alice'"; + // When I lex it + const lexed = lex(contract); + // Then I must have 1 identifier token, which is: + t.is(lexed.tokens.length, 1); + t.is(lexed.tokens[0]?.tokenType, Identifier); + t.is(lexed.tokens[0]?.image, "'alice'"); +}); diff --git a/pkg/shared/test/zenroom.ts b/pkg/shared/test/zenroom.ts new file mode 100644 index 00000000..b6e77462 --- /dev/null +++ b/pkg/shared/test/zenroom.ts @@ -0,0 +1,67 @@ +import test from 'ava'; +import { convZenParams, zencodeExec, ZenroomError } from '@slangroom/shared/zenroom'; + +test('convZenParams() works', (t) => { + // Since TS already covers our butts regarding type checks, we just + // need to convice the coverage here that all the code paths are + // taken. + + // Given I have a valid "data" and "keys" value + const data = { "doesn't really": 'matter' }; + const keys = { "doesn't": 'really matter' }; + + { + // When I provide an undefined params + const result = convZenParams(undefined); + // Then the result must be an empty object + t.deepEqual(result, {}); + } + + { + // When I provide empty params + const result = convZenParams({}); + // Then the result must be an empty object + t.deepEqual(result, {}); + } + + { + // When I provide only the "" + const result = convZenParams({ data: data }); + // Then the result must be JSON.strigify()'d "data" + t.deepEqual(result, { data: JSON.stringify(data) }); + } + + { + // When I provide only the "keys" + const result = convZenParams({ keys: keys }); + // Then the result must be JSON.strigify()'d "keys" + t.deepEqual(result, { keys: JSON.stringify(keys) }); + } + + { + // When I provide both the "data" and "keys" + const result = convZenParams({ data: data, keys: keys }); + // Then the result must be JSON.strigify()'d "keys" + t.deepEqual(result, { data: JSON.stringify(data), keys: JSON.stringify(keys) }); + } +}); + +test("zencodeExec(): doesn't throw with valid input", async (t) => { + // Given I have a valid contract + const contract = `Given I have nothing +Then I print the string 'I love you' +`; + // When I execute the contract + const { result } = await zencodeExec(contract); + // Then it must have a result, thus it's not an error + t.deepEqual(result, { output: ['I_love_you'] }); +}); + +test('zencodeExec(): throws with invalid input', async (t) => { + // Given I have an invalid contract + const contract = "I'm invalid."; + // When I execute the contract + const promise = zencodeExec(contract); + // Then it must throw some errors + await t.throwsAsync(promise, { instanceOf: ZenroomError }); +}); diff --git a/pkg/shared/tokens.test.ts b/pkg/shared/tokens.test.ts deleted file mode 100644 index 2e4f9142..00000000 --- a/pkg/shared/tokens.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Whitespace, Identifier, Comment } from './tokens'; - -import { Lexer, createToken, type IToken } from '@slangroom/deps/chevrotain'; - -const skipped = 'given when then and i that valid all inside am an a'.split(' '); -// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -const capitalize = (t: string) => `${t[0]!.toUpperCase()}${t.slice(1)}`; - -export const SkippedTokens = skipped.map((t) => - createToken({ name: capitalize(t), pattern: new RegExp(`${t} `), group: Lexer.SKIPPED }) -); - -const TestLexer = new Lexer([Whitespace, Comment, Identifier, ...SkippedTokens]); - -const lex = (contract: string) => TestLexer.tokenize(contract); - -test('that identifiers are identified correctly', () => { - // Given I have a contract with various identifiers mixed with comments and whitespace - const contract = `# Given nothing I am all valid inside! -'one' # and another comment -'two' - '\uDEAD\uBEEF' # there's a tab before there -# it shouldn't catch this 'three - 'four' # blanks here and there - 'five' # mix of blanks and tabs -`; - // When I lex it - const lexed = lex(contract); - // Then I must have no errors - expect(lexed.errors).toHaveLength(0); - - // Then I must have 6 comments - expect(lexed.groups).toHaveProperty('comments'); - expect(lexed.groups['comments']).toHaveLength(6); - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - lexed.groups['comments']!.forEach((x: IToken) => expect(x.tokenType).toBe(Comment)); - // and those must be these: - expect(lexed.groups['comments']![0]!.image).toStrictEqual( - '# Given nothing I am all valid inside! ' - ); - expect(lexed.groups['comments']![1]!.image).toStrictEqual('# and another comment'); - expect(lexed.groups['comments']![2]!.image).toStrictEqual("# there's a tab before there "); - expect(lexed.groups['comments']![3]!.image).toStrictEqual("# it shouldn't catch this 'three"); - expect(lexed.groups['comments']![4]!.image).toStrictEqual('# blanks here and there '); - expect(lexed.groups['comments']![5]!.image).toStrictEqual('# mix of blanks and tabs '); - /* eslint-enable */ - - // Then I must have 5 identifiers - expect(lexed.tokens).toHaveLength(5); - lexed.tokens.forEach((x) => expect(x.tokenType).toBe(Identifier)); - // and those must be these: - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expect(lexed.tokens[0]!.image).toStrictEqual("'one'"); - expect(lexed.tokens[1]!.image).toStrictEqual("'two'"); - expect(lexed.tokens[2]!.image).toStrictEqual("'\uDEAD\uBEEF'"); - expect(lexed.tokens[3]!.image).toStrictEqual("'four'"); - expect(lexed.tokens[4]!.image).toStrictEqual("'five'"); - /* eslint-enable */ -}); - -test('non-matcheds error out', () => { - // Given I have a broken contract - const contract = `broken contract`; - // When I lex it - const lexed = lex(contract); - // Then I must have 2 errors, which are: - expect(lexed.errors).toStrictEqual([ - { - offset: 0, - length: 6, - line: 1, - column: 1, - message: 'unexpected character: ->b<- at offset: 0, skipped 6 characters.', - }, - { - offset: 7, - length: 8, - line: 1, - column: 2, - message: 'unexpected character: ->c<- at offset: 7, skipped 8 characters.', - }, - ]); -}); - -test('tokens are skipped correctly', () => { - // Given I have a contract with several ignored and an identifier tokens - const contract = "given I am 'alice'"; - // When I lex it - const lexed = lex(contract); - // Then I must have 1 identifier token, which is: - expect(lexed.tokens).toHaveLength(1); - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expect(lexed.tokens[0]!.tokenType).toBe(Identifier); - expect(lexed.tokens[0]!.image).toStrictEqual("'alice'"); - /* eslint-enable */ -}); diff --git a/pkg/shared/tokens.ts b/pkg/shared/tokens.ts deleted file mode 100644 index 6c5d14c8..00000000 --- a/pkg/shared/tokens.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Lexer, createToken } from '@slangroom/deps/chevrotain'; - -/** - * Whitespace of any kind (blanks, tabs, and newlines). - */ -export const Whitespace = createToken({ - name: 'Whitespace', - pattern: /\s+/, - group: Lexer.SKIPPED, -}); - -/** - * Shell-like comments using '#' to mark what's after it as comments. - * - * Spans across the entire line, as expected. - */ -export const Comment = createToken({ - name: 'Comment', - pattern: /#[^\n\r]*/, - group: 'comments', -}); - -/** - * Identifiers in single quotes, such as 'foo' and 'bar'. - * - * Escaped characters '\b', '\f', '\n', '\r', '\t', and '\v' are also - * accepted. - * Unicode characters of the format '\uXXXX' (where X is a hexedecimal - * digit) are also accepted. - */ -export const Identifier = createToken({ - name: 'Identifier', - pattern: /'(?:[^\\']|\\(?:[bfnrtv'\\/]|u[0-9a-fA-F]{4}))*'/, -}); diff --git a/pkg/shared/tsconfig.json b/pkg/shared/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/shared/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/shared/zenroom.test.ts b/pkg/shared/zenroom.test.ts deleted file mode 100644 index f5a11cca..00000000 --- a/pkg/shared/zenroom.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { convZenParams, zencodeExec, ZenroomError } from './zenroom'; - -test('convZenParams() works', () => { - // Since TS already covers our butts regarding type checks, we just - // need to convice the coverage here that all the code paths are - // taken. - - // Given I have a valid "data" and "keys" value - const data = { "doesn't really": 'matter' }; - const keys = { "doesn't": 'really matter' }; - - { - // When I provide an undefined params - const result = convZenParams(undefined); - // Then the result must be an empty object - expect(result).toStrictEqual({}); - } - - { - // When I provide empty params - const result = convZenParams({}); - // Then the result must be an empty object - expect(result).toStrictEqual({}); - } - - { - // When I provide only the "" - const result = convZenParams({ data: data }); - // Then the result must be JSON.strigify()'d "data" - expect(result).toStrictEqual({ data: JSON.stringify(data) }); - } - - { - // When I provide only the "keys" - const result = convZenParams({ keys: keys }); - // Then the result must be JSON.strigify()'d "keys" - expect(result).toStrictEqual({ keys: JSON.stringify(keys) }); - } - - { - // When I provide both the "data" and "keys" - const result = convZenParams({ data: data, keys: keys }); - // Then the result must be JSON.strigify()'d "keys" - expect(result).toStrictEqual({ data: JSON.stringify(data), keys: JSON.stringify(keys) }); - } -}); - -describe('zencode()', () => { - test("doesn't throw with valid input", async () => { - // Given I have a valid contract - const contract = `Given I have nothing -Then I print string 'I love you' -`; - // When I execute the contract - const promise = zencodeExec(contract); - // Then it must not throw any errors - await expect(promise).resolves.toBeTruthy(); - }); - - test('throws with invalid input', async () => { - // Given I have an invalid contract - const contract = "I'm invalid."; - // When I execute the contract - const promise = zencodeExec(contract); - // Then it must throw some errors - await expect(promise).rejects.toThrow(ZenroomError); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3db1fc48..59e24f5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -8,9 +8,6 @@ importers: .: devDependencies: - '@types/jest': - specifier: ^29.5.2 - version: 29.5.2 '@types/node': specifier: ^20.3.1 version: 20.3.1 @@ -20,6 +17,12 @@ importers: '@typescript-eslint/parser': specifier: ^5.59.11 version: 5.59.11(eslint@8.43.0)(typescript@4.9.5) + ava: + specifier: ^5.3.1 + version: 5.3.1 + c8: + specifier: ^8.0.1 + version: 8.0.1 esbuild: specifier: ^0.18.4 version: 0.18.4 @@ -29,18 +32,9 @@ importers: eslint-config-prettier: specifier: ^8.8.0 version: 8.8.0(eslint@8.43.0) - jest: - specifier: 29.5.0 - version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - jest-junit: - specifier: ^16.0.0 - version: 16.0.0 prettier: specifier: ^2.8.8 version: 2.8.8 - ts-jest: - specifier: ^29.1.0 - version: 29.1.0(@babel/core@7.22.5)(esbuild@0.18.4)(jest@29.5.0)(typescript@4.9.5) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@20.3.1)(typescript@4.9.5) @@ -54,6 +48,15 @@ importers: specifier: 4.9.5 version: 4.9.5 + pkg/core: + dependencies: + '@slangroom/ignored': + specifier: workspace:* + version: link:../ignored + '@slangroom/shared': + specifier: workspace:* + version: link:../shared + pkg/deps: dependencies: chevrotain: @@ -65,6 +68,9 @@ importers: pkg/fs: dependencies: + '@slangroom/core': + specifier: workspace:* + version: link:../core '@slangroom/deps': specifier: workspace:* version: link:../deps @@ -92,343 +98,6 @@ importers: packages: - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.5: - resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.22.5: - resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) - '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.5: - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.5: - resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.5: - resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.22.5: - resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.5): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.5): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.5): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.5): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.5: - resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -718,244 +387,11 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console@29.5.0: - resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - dev: true - - /@jest/core@29.5.0(ts-node@10.9.1): - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} - 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 - dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 - micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.5.0: - resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - jest-mock: 29.5.0 - dev: true - - /@jest/expect-utils@29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.5.0: - resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.5.0 - jest-snapshot: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.5.0: - resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@sinonjs/fake-timers': 10.1.0 - '@types/node': 20.3.1 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-util: 29.5.0 - dev: true - - /@jest/globals@29.5.0: - resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/types': 29.5.0 - jest-mock: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.5.0: - resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} - 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 - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.3.1 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.25.24 - dev: true - - /@jest/source-map@29.4.3: - resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.5.0: - resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer@29.5.0: - resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.5.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - slash: 3.0.0 - dev: true - - /@jest/transform@29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.5 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.3.1 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} @@ -966,11 +402,6 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -1014,22 +445,6 @@ packages: fastq: 1.15.0 dev: true - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.1.0: - resolution: {integrity: sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -1046,64 +461,10 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - dependencies: - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 20.3.1 - dev: true - /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/jest@29.5.2: - resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} - dependencies: - expect: 29.5.0 - pretty-format: 29.5.0 - dev: true - /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true @@ -1112,28 +473,10 @@ packages: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} dev: true - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true - /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.43.0)(typescript@4.9.5): resolution: {integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1283,6 +626,14 @@ packages: hasBin: true dev: true + /aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1292,27 +643,18 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-sequence-parser@1.1.0: - resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} dev: true - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 + /ansi-sequence-parser@1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} dev: true /ansi-styles@4.3.0: @@ -1322,9 +664,9 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} dev: true /anymatch@3.1.3: @@ -1349,85 +691,94 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /babel-jest@29.5.0(@babel/core@7.22.5): - resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.22.5 - '@jest/transform': 29.5.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.22.5) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color + /arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + /arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + dev: true + + /ava@5.3.1: + resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 + acorn: 8.9.0 + acorn-walk: 8.2.0 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.0.0 + cbor: 8.1.0 + chalk: 5.3.0 + chokidar: 3.5.3 + chunkd: 2.0.1 + ci-info: 3.8.0 + ci-parallel-vars: 1.0.1 + clean-yaml-object: 0.1.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.4 + emittery: 1.0.1 + figures: 5.0.0 + globby: 13.2.2 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-error: 2.2.2 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + mem: 9.0.2 + ms: 2.1.3 + p-event: 5.0.1 + p-map: 5.5.0 + picomatch: 2.3.1 + pkg-conf: 4.0.0 + plur: 5.1.0 + pretty-ms: 8.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.5): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.22.5): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.5 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.5) + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: true /brace-expansion@1.1.11: @@ -1450,32 +801,23 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + /c8@8.0.1: + resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} + engines: {node: '>=12'} hasBin: true dependencies: - caniuse-lite: 1.0.30001504 - electron-to-chromium: 1.4.433 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 dev: true /callsites@3.1.0: @@ -1483,27 +825,16 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + /callsites@4.0.0: + resolution: {integrity: sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==} + engines: {node: '>=12.20'} dev: true - /caniuse-lite@1.0.30001504: - resolution: {integrity: sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + nofilter: 3.1.0 dev: true /chalk@4.1.2: @@ -1514,9 +845,9 @@ packages: supports-color: 7.2.0 dev: true - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true /chevrotain@10.5.0: @@ -1530,13 +861,52 @@ packages: regexp-to-ast: 0.5.0 dev: false + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + dev: true + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + /ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + dev: true + + /clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 dev: true /cliui@8.0.1: @@ -1548,19 +918,11 @@ packages: wrap-ansi: 7.0.0 dev: true - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + /code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - color-name: 1.1.3 + convert-to-spaces: 2.0.1 dev: true /color-convert@2.0.1: @@ -1570,24 +932,39 @@ packages: color-name: 1.1.4 dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.2 + well-known-symbols: 2.0.0 + dev: true + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /create-require@1.1.1: @@ -1603,6 +980,20 @@ packages: which: 2.0.2 dev: true + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1615,29 +1006,10 @@ packages: ms: 2.1.2 dev: true - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -1657,23 +1029,21 @@ packages: esutils: 2.0.3 dev: true - /electron-to-chromium@1.4.433: - resolution: {integrity: sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + /emittery@1.0.1: + resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} + engines: {node: '>=14.16'} dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true /esbuild@0.18.4: @@ -1711,11 +1081,6 @@ packages: engines: {node: '>=6'} dev: true - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -1726,6 +1091,11 @@ packages: engines: {node: '>=10'} dev: true + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + /eslint-config-prettier@8.8.0(eslint@8.43.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true @@ -1848,43 +1218,27 @@ packages: engines: {node: '>=0.10.0'} dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /expect@29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} dependencies: - '@jest/expect-utils': 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1908,10 +1262,12 @@ packages: reusify: 1.0.4 dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} dependencies: - bser: 2.1.1 + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 dev: true /file-entry-cache@6.0.1: @@ -1928,14 +1284,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1944,6 +1292,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1956,6 +1312,14 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1968,30 +1332,11 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2017,11 +1362,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} @@ -2041,8 +1381,15 @@ packages: slash: 3.0.0 dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 dev: true /grapheme-splitter@1.0.4: @@ -2053,30 +1400,18 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + /ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} dev: true /ignore@5.2.4: @@ -2092,20 +1427,16 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -2117,525 +1448,97 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.5 - '@babel/parser': 7.22.5 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color dev: true - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.5.0: - resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - p-limit: 3.1.0 - pretty-format: 29.5.0 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - jest-util: 29.5.0 - jest-validate: 29.5.0 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.22.5 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - babel-jest: 29.5.0(@babel/core@7.22.5) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.5.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.3.1)(typescript@4.9.5) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 - dev: true - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.5.0: - resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.5.0 - pretty-format: 29.5.0 - dev: true - - /jest-environment-node@29.5.0: - resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - jest-mock: 29.5.0 - jest-util: 29.5.0 - dev: true - - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.3.1 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-junit@16.0.0: - resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} - engines: {node: '>=10.12.0'} - dependencies: - mkdirp: 1.0.4 - strip-ansi: 6.0.1 - uuid: 8.3.2 - xml: 1.0.1 - dev: true - - /jest-leak-detector@29.5.0: - resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.5.0 - dev: true - - /jest-matcher-utils@29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + binary-extensions: 2.2.0 dev: true - /jest-message-util@29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.5.0 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - stack-utils: 2.0.6 + /is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} dev: true - /jest-mock@29.5.0: - resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - jest-util: 29.5.0 + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.5.0 + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} dev: true - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} dev: true - /jest-resolve-dependencies@29.5.0: - resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 - transitivePeerDependencies: - - supports-color + is-extglob: 2.1.1 dev: true - /jest-resolve@29.5.0: - resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) - jest-util: 29.5.0 - jest-validate: 29.5.0 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} dev: true - /jest-runner@29.5.0: - resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} dev: true - /jest-runtime@29.5.0: - resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} dev: true - /jest-snapshot@29.5.0: - resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.5) - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.20.1 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.5) - chalk: 4.1.2 - expect: 29.5.0 - graceful-fs: 4.2.11 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.5.2 - transitivePeerDependencies: - - supports-color + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} dev: true - /jest-util@29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} dev: true - /jest-validate@29.5.0: - resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.5.0 + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jest-watcher@29.5.0: - resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 20.3.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.5.0 - string-length: 4.0.2 + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} dev: true - /jest-worker@29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: - '@types/node': 20.3.1 - jest-util: 29.5.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 dev: true - /jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/types': 29.5.0 - import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} dev: true /js-yaml@3.14.1: @@ -2653,16 +1556,6 @@ packages: argparse: 2.0.1 dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -2671,26 +1564,10 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2699,15 +1576,9 @@ packages: type-check: 0.4.0 dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 + /load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /locate-path@6.0.0: @@ -2717,8 +1588,11 @@ packages: p-locate: 5.0.0 dev: true - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 dev: true /lodash.merge@4.6.2: @@ -2727,13 +1601,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -2746,21 +1613,22 @@ packages: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: - semver: 6.3.0 + semver: 7.5.4 dev: true /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} dependencies: - tmpl: 1.0.5 + p-defer: 1.0.0 dev: true /marked@4.3.0: @@ -2769,8 +1637,26 @@ packages: hasBin: true dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + /matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 4.0.0 dev: true /merge2@1.4.1: @@ -2786,9 +1672,9 @@ packages: picomatch: 2.3.1 dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} dev: true /minimatch@3.1.2: @@ -2804,16 +1690,14 @@ packages: brace-expansion: 2.0.1 dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -2822,12 +1706,9 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} dev: true /normalize-path@3.0.0: @@ -2835,26 +1716,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -2867,11 +1734,16 @@ packages: word-wrap: 1.2.3 dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - p-try: 2.2.0 + p-timeout: 5.1.0 dev: true /p-limit@3.1.0: @@ -2881,11 +1753,11 @@ packages: yocto-queue: 0.1.0 dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - p-limit: 2.3.0 + yocto-queue: 1.0.0 dev: true /p-locate@5.0.0: @@ -2895,9 +1767,23 @@ packages: p-limit: 3.1.0 dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + dependencies: + aggregate-error: 4.0.1 + dev: true + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} dev: true /parent-module@1.0.1: @@ -2907,14 +1793,9 @@ packages: callsites: 3.1.0 dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + /parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} dev: true /path-exists@4.0.0: @@ -2922,6 +1803,11 @@ packages: engines: {node: '>=8'} dev: true + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -2932,34 +1818,29 @@ packages: engines: {node: '>=8'} dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} + /pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + load-json-file: 7.0.1 dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + /plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - find-up: 4.1.0 + irregular-plurals: 3.5.0 dev: true /prelude-ls@1.2.1: @@ -2973,21 +1854,11 @@ packages: hasBin: true dev: true - /pretty-format@29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + /pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + parse-ms: 3.0.0 dev: true /punycode@2.3.0: @@ -2995,16 +1866,15 @@ packages: engines: {node: '>=6'} dev: true - /pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - dev: true - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 dev: true /regexp-to-ast@0.5.0: @@ -3033,20 +1903,6 @@ packages: engines: {node: '>=8'} dev: true - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3065,19 +1921,29 @@ packages: queue-microtask: 1.2.3 dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@7.5.2: + resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + engines: {node: '>=10'} hasBin: true + dependencies: + lru-cache: 6.0.0 dev: true - /semver@7.5.2: - resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 dev: true + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3103,8 +1969,9 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} dev: true /slash@3.0.0: @@ -3112,16 +1979,17 @@ packages: engines: {node: '>=8'} dev: true - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 dev: true /sprintf-js@1.0.3: @@ -3135,14 +2003,6 @@ packages: escape-string-regexp: 2.0.0 dev: true - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3152,6 +2012,15 @@ packages: strip-ansi: 6.0.1 dev: true + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3159,14 +2028,11 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 dev: true /strip-json-comments@3.1.1: @@ -3174,11 +2040,14 @@ packages: engines: {node: '>=8'} dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + /supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - has-flag: 3.0.0 + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 dev: true /supports-color@7.2.0: @@ -3188,16 +2057,9 @@ packages: has-flag: 4.0.0 dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} dev: true /test-exclude@6.0.0: @@ -3213,12 +2075,8 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} dev: true @@ -3229,41 +2087,6 @@ packages: is-number: 7.0.0 dev: true - /ts-jest@29.1.0(@babel/core@7.22.5)(esbuild@0.18.4)(jest@29.5.0)(typescript@4.9.5): - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.22.5 - bs-logger: 0.2.6 - esbuild: 0.18.4 - fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.2 - typescript: 4.9.5 - yargs-parser: 21.1.1 - dev: true - /ts-node@10.9.1(@types/node@20.3.1)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -3320,9 +2143,9 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} dev: true /type-fest@0.20.2: @@ -3330,11 +2153,6 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - /typedoc@0.24.8(typescript@4.9.5): resolution: {integrity: sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==} engines: {node: '>= 14.14'} @@ -3355,28 +2173,12 @@ packages: hasBin: true dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -3398,10 +2200,9 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} dev: true /which@2.0.2: @@ -3430,16 +2231,12 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + signal-exit: 4.1.0 dev: true /y18n@5.0.8: @@ -3447,10 +2244,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true @@ -3483,6 +2276,11 @@ packages: engines: {node: '>=10'} dev: true + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zenroom@3.10.0: resolution: {integrity: sha512-IaULB5zVo7pfC/tT2t5gz/nWK/v+j5rMrcX0lmiu/QMVMgUfmu61mf1vxTi4RJhfizu2R878IoX0Ua0783dpjg==} dev: false diff --git a/tsconfig.json b/tsconfig.json index d25e3dad..2909b28a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,13 @@ { + "include": ["src/**/*", "test/**/*"], "compilerOptions": { + "rootDir": ".", "target": "es2016", - "module": "node16", - "moduleResolution": "node", + "moduleResolution": "node16", "incremental": true, "newLine": "lf", + "declaration": true, "forceConsistentCasingInFileNames": true, - "tsBuildInfoFile": ".build/tsbuildinfo", - "outDir": ".build/", - "rootDir": "pkg/", "allowUnreachableCode": false, "allowUnusedLabels": false, "alwaysStrict": true, @@ -28,13 +27,11 @@ "strictNullChecks": true, "strictPropertyInitialization": true, "useUnknownInCatchVariables": false, - "importHelpers": true, "skipLibCheck": true, "esModuleInterop": true, "experimentalDecorators": true, "sourceMap": true, - "types": ["node", "jest"], + "types": ["node"], "lib": ["es6", "dom"] - }, - "include": ["pkg/*/**/*.ts"] + } }