From 16a3c34e2fdd67d3fb521b852f8273a7ec9e2224 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 12:11:17 -0300 Subject: [PATCH 01/24] feat(@clack/core): path prompt --- packages/core/src/index.ts | 1 + packages/core/src/prompts/path.ts | 113 ++++++++++++++++++++++++++++ packages/core/src/prompts/prompt.ts | 1 + 3 files changed, 115 insertions(+) create mode 100644 packages/core/src/prompts/path.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index db26c399..ff8e109a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,4 +7,5 @@ export type { State } from './prompts/prompt'; export { default as SelectPrompt } from './prompts/select'; export { default as SelectKeyPrompt } from './prompts/select-key'; export { default as TextPrompt } from './prompts/text'; +export { default as PathPrompt } from './prompts/path'; export { block } from './utils'; diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts new file mode 100644 index 00000000..f5434b46 --- /dev/null +++ b/packages/core/src/prompts/path.ts @@ -0,0 +1,113 @@ +import { readdirSync } from 'node:fs'; +import Prompt, { PromptOptions } from './prompt'; +import { resolve } from 'node:path'; + +interface PathNode { + name: string; + children: PathNode[] | undefined; +} + +interface PathOptions extends PromptOptions {} +export default class PathPrompt extends Prompt { + private cursor: number[]; + root: PathNode; + + private get _node(): PathNode[] { + let aux: PathNode = this.root; + let options: PathNode[] = []; + for (const index of this.cursor) { + if (aux.children?.[index]) { + options = aux.children; + aux = aux.children[index]; + } else { + break; + } + } + return options; + } + + get _option() { + let aux: PathNode = this.root; + for (let i = 0; i < this.cursor.length; i++) { + if (aux.children && aux.children[this.cursor[i]]) { + aux = aux.children[this.cursor[i]]; + } else { + break; + } + } + return { + index: this.cursor[this.cursor.length - 1] ?? 0, + depth: this.cursor.length, + node: aux, + }; + } + + private get _value(): string { + const value: string[] = []; + let option: PathNode = this.root; + for (const index of this.cursor) { + if (option.children?.[index]) { + option = option.children[index]; + value.push(option.name); + } + } + return resolve(this.root.name, ...value); + } + + private changeValue() { + this.value = this._value; + } + + private mapDir(path: string): PathNode[] { + return readdirSync(path, { withFileTypes: true }).map((item) => ({ + name: item.name, + children: item.isDirectory() ? [] : undefined, + })); + } + + constructor(opts: PathOptions) { + super(opts, false); + this.root = { + name: process.cwd(), + children: this.mapDir(process.cwd()), + }; + this.cursor = [0]; + this.changeValue(); + + this.on('cursor', (key) => { + switch (key) { + case 'up': + if (this.cursor.length) { + this.cursor = [ + ...this.cursor.slice(0, -1), + this._option.index > 0 ? this._option.index - 1 : this._node.length - 1, + ]; + } + break; + case 'down': + if (this.cursor.length) { + this.cursor = [ + ...this.cursor.slice(0, -1), + this._option.index < this._node.length - 1 ? this._option.index + 1 : 0, + ]; + } + break; + case 'right': + if (this._option.node.children) { + this._option.node.children = this.mapDir(this._value); + this.cursor = [...this.cursor, 0]; + this.emit('resize'); + } + break; + case 'left': + this.cursor = this.cursor.slice(0, -1); + if (this._option.node.children && this._option.depth !== 0) { + this._option.node.children = []; + this.emit('resize'); + } + break; + } + this.changeValue(); + }); + } +} diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index 21ee0077..48af0a7b 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -106,6 +106,7 @@ export default class Prompt { this.input.on('keypress', this.onKeypress); setRawMode(this.input, true); this.output.on('resize', this.render); + this.on('resize', this.render) this.render(); From f6b5042fc6c01ebaf347fc8c00492beaf8f5bbeb Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 12:11:43 -0300 Subject: [PATCH 02/24] feat(@clack/prompts): path prompt --- packages/prompts/src/index.ts | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 42451cc8..d58d98ef 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,6 +9,7 @@ import { SelectPrompt, State, TextPrompt, + PathPrompt, } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; @@ -168,6 +169,56 @@ export const confirm = (opts: ConfirmOptions) => { }).prompt() as Promise; }; +interface PathNode { + name: string; + children: PathNode[] | undefined; +} + +export interface PathOptions { + message: string; +} + +export const path = (opts: PathOptions) => { + const opt = (node: PathNode, state: boolean, depth: number): string => { + return [ + color.cyan(S_BAR), + ' '.repeat(depth), + state ? color.green(S_RADIO_ACTIVE) : color.dim(S_RADIO_INACTIVE), + ' ', + node.name, + ].join(''); + }; + return new PathPrompt({ + render() { + const option = this._option; + const map = (node: PathNode, index: number = 0, depth: number = 0): string => { + const state = + option.index === index && option.depth === depth && option.node.name === node.name; + return node.children && node.children.length + ? [ + opt(node, state, depth), + node.children.map((_node, i) => map(_node, i, depth + 1)).join('\n'), + ].join('\n') + : opt(node, state, depth); + }; + + const title = [color.gray(S_BAR), `${symbol(this.state)} ${opts.message}`].join('\n'); + + switch (this.state) { + case 'submit': + return [title, `${color.gray(S_BAR)} ${color.dim(this.value)}`].join('\n'); + case 'cancel': + return [ + title, + `${color.gray(S_BAR)} ${color.dim(color.strikethrough(this.value))}`, + ].join('\n'); + default: + return [title, map(this.root)].join('\n'); + } + }, + }).prompt(); +}; + type Primitive = Readonly; type Option = Value extends Primitive From a93b8841a37ddb0775ba208da70dd6f3c5c419d1 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 12:48:04 -0300 Subject: [PATCH 03/24] feat: free navigation --- examples/basic/index.ts | 8 ++------ packages/core/src/prompts/path.ts | 15 ++++++++++++--- packages/prompts/src/index.ts | 5 +++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/basic/index.ts b/examples/basic/index.ts index 62cdaf78..9a77b564 100644 --- a/examples/basic/index.ts +++ b/examples/basic/index.ts @@ -1,4 +1,5 @@ import * as p from '@clack/prompts'; +import { resolve } from 'node:path'; import { setTimeout } from 'node:timers/promises'; import color from 'picocolors'; @@ -12,13 +13,8 @@ async function main() { const project = await p.group( { path: () => - p.text({ + p.path({ message: 'Where should we create your project?', - placeholder: './sparkling-solid', - validate: (value) => { - if (!value) return 'Please enter a path.'; - if (value[0] !== '.') return 'Please enter a relative path.'; - }, }), password: () => p.password({ diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index f5434b46..ba8d3296 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -67,9 +67,10 @@ export default class PathPrompt extends Prompt { constructor(opts: PathOptions) { super(opts, false); + const cwd = opts.initialValue ?? process.cwd(); this.root = { - name: process.cwd(), - children: this.mapDir(process.cwd()), + name: cwd, + children: this.mapDir(cwd), }; this.cursor = [0]; this.changeValue(); @@ -100,10 +101,18 @@ export default class PathPrompt extends Prompt { } break; case 'left': + const prevCursor = this.cursor this.cursor = this.cursor.slice(0, -1); - if (this._option.node.children && this._option.depth !== 0) { + if (this._option.node.children?.length && this.cursor.length) { this._option.node.children = []; this.emit('resize'); + } else if (prevCursor.length === 0) { + const cwd = resolve(this.root.name, '..'); + this.root = { + name: cwd, + children: this.mapDir(cwd), + }; + this.emit('resize'); } break; } diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index d58d98ef..eb8a1a33 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -176,6 +176,10 @@ interface PathNode { export interface PathOptions { message: string; + /** + * @default process.cwd() // current working dir + */ + initialValue?: string } export const path = (opts: PathOptions) => { @@ -189,6 +193,7 @@ export const path = (opts: PathOptions) => { ].join(''); }; return new PathPrompt({ + initialValue: opts.initialValue, render() { const option = this._option; const map = (node: PathNode, index: number = 0, depth: number = 0): string => { From 6a642003b3f0692486dda44ca4e91d8fc46180f8 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 12:49:44 -0300 Subject: [PATCH 04/24] chore: add changeset --- .changeset/fresh-grapes-rule.md | 5 +++++ .changeset/modern-eggs-laugh.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/fresh-grapes-rule.md create mode 100644 .changeset/modern-eggs-laugh.md diff --git a/.changeset/fresh-grapes-rule.md b/.changeset/fresh-grapes-rule.md new file mode 100644 index 00000000..ca61ad2a --- /dev/null +++ b/.changeset/fresh-grapes-rule.md @@ -0,0 +1,5 @@ +--- +'@clack/core': minor +--- + +Feat PathPrompt diff --git a/.changeset/modern-eggs-laugh.md b/.changeset/modern-eggs-laugh.md new file mode 100644 index 00000000..2ed17d01 --- /dev/null +++ b/.changeset/modern-eggs-laugh.md @@ -0,0 +1,5 @@ +--- +'@clack/prompts': minor +--- + +Feat path prompt From c55a847636c1fe28fafc9d03ff597d2f0a156c96 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 14:58:24 -0300 Subject: [PATCH 05/24] feat: max items --- examples/basic/index.ts | 1 + packages/core/src/prompts/path.ts | 92 ++++++++++++++++++------------- packages/prompts/src/index.ts | 42 +++++++++++++- 3 files changed, 95 insertions(+), 40 deletions(-) diff --git a/examples/basic/index.ts b/examples/basic/index.ts index 9a77b564..dfd33191 100644 --- a/examples/basic/index.ts +++ b/examples/basic/index.ts @@ -15,6 +15,7 @@ async function main() { path: () => p.path({ message: 'Where should we create your project?', + maxItems: 10, }), password: () => p.password({ diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index ba8d3296..7a61a6f2 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -9,16 +9,32 @@ interface PathNode { interface PathOptions extends PromptOptions {} export default class PathPrompt extends Prompt { - private cursor: number[]; - root: PathNode; + private cursorMap: number[]; + public root: PathNode; - private get _node(): PathNode[] { + public get option() { let aux: PathNode = this.root; - let options: PathNode[] = []; - for (const index of this.cursor) { - if (aux.children?.[index]) { - options = aux.children; - aux = aux.children[index]; + for (let i = 0; i < this.cursorMap.length; i++) { + if (aux.children && aux.children[this.cursorMap[i]]) { + aux = aux.children[this.cursorMap[i]]; + } else { + break; + } + } + return { + index: this.cursorMap[this.cursorMap.length - 1] ?? 0, + depth: this.cursorMap.length, + node: aux, + }; + } + + public get options(): PathNode[] { + let aux: PathNode = this.root; + let options: PathNode[] = [this.root]; + for (let i = 0; i < this.cursorMap.length; i++) { + if (aux.children && aux.children[this.cursorMap[i]]) { + options = options.concat(aux.children); + aux = aux.children[this.cursorMap[i]]; } else { break; } @@ -26,26 +42,28 @@ export default class PathPrompt extends Prompt { return options; } - get _option() { + public get cursor(): number { + return this.cursorMap.reduce((a, b) => a + b, 0); + } + + private get _node(): PathNode[] { let aux: PathNode = this.root; - for (let i = 0; i < this.cursor.length; i++) { - if (aux.children && aux.children[this.cursor[i]]) { - aux = aux.children[this.cursor[i]]; + let options: PathNode[] = []; + for (const index of this.cursorMap) { + if (aux.children?.[index]) { + options = aux.children; + aux = aux.children[index]; } else { break; } } - return { - index: this.cursor[this.cursor.length - 1] ?? 0, - depth: this.cursor.length, - node: aux, - }; + return options; } private get _value(): string { const value: string[] = []; let option: PathNode = this.root; - for (const index of this.cursor) { + for (const index of this.cursorMap) { if (option.children?.[index]) { option = option.children[index]; value.push(option.name); @@ -54,7 +72,7 @@ export default class PathPrompt extends Prompt { return resolve(this.root.name, ...value); } - private changeValue() { + private _changeValue() { this.value = this._value; } @@ -72,39 +90,39 @@ export default class PathPrompt extends Prompt { name: cwd, children: this.mapDir(cwd), }; - this.cursor = [0]; - this.changeValue(); + this.cursorMap = [0]; + this._changeValue(); this.on('cursor', (key) => { switch (key) { case 'up': - if (this.cursor.length) { - this.cursor = [ - ...this.cursor.slice(0, -1), - this._option.index > 0 ? this._option.index - 1 : this._node.length - 1, + if (this.cursorMap.length) { + this.cursorMap = [ + ...this.cursorMap.slice(0, -1), + this.option.index > 0 ? this.option.index - 1 : this._node.length - 1, ]; } break; case 'down': - if (this.cursor.length) { - this.cursor = [ - ...this.cursor.slice(0, -1), - this._option.index < this._node.length - 1 ? this._option.index + 1 : 0, + if (this.cursorMap.length) { + this.cursorMap = [ + ...this.cursorMap.slice(0, -1), + this.option.index < this._node.length - 1 ? this.option.index + 1 : 0, ]; } break; case 'right': - if (this._option.node.children) { - this._option.node.children = this.mapDir(this._value); - this.cursor = [...this.cursor, 0]; + if (this.option.node.children) { + this.option.node.children = this.mapDir(this._value); + this.cursorMap = [...this.cursorMap, 0]; this.emit('resize'); } break; case 'left': - const prevCursor = this.cursor - this.cursor = this.cursor.slice(0, -1); - if (this._option.node.children?.length && this.cursor.length) { - this._option.node.children = []; + const prevCursor = this.cursorMap; + this.cursorMap = this.cursorMap.slice(0, -1); + if (this.option.node.children?.length && this.cursorMap.length) { + this.option.node.children = []; this.emit('resize'); } else if (prevCursor.length === 0) { const cwd = resolve(this.root.name, '..'); @@ -116,7 +134,7 @@ export default class PathPrompt extends Prompt { } break; } - this.changeValue(); + this._changeValue(); }); } } diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index eb8a1a33..0f87793e 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -179,7 +179,8 @@ export interface PathOptions { /** * @default process.cwd() // current working dir */ - initialValue?: string + initialValue?: string; + maxItems?: number; } export const path = (opts: PathOptions) => { @@ -192,10 +193,13 @@ export const path = (opts: PathOptions) => { node.name, ].join(''); }; + + let slidingWindowLocation = 0; + return new PathPrompt({ initialValue: opts.initialValue, render() { - const option = this._option; + const option = this.option; const map = (node: PathNode, index: number = 0, depth: number = 0): string => { const state = option.index === index && option.depth === depth && option.node.name === node.name; @@ -218,7 +222,39 @@ export const path = (opts: PathOptions) => { `${color.gray(S_BAR)} ${color.dim(color.strikethrough(this.value))}`, ].join('\n'); default: - return [title, map(this.root)].join('\n'); + const maxItems = opts.maxItems === undefined ? Infinity : Math.max(opts.maxItems, 5); + if (this.cursor >= slidingWindowLocation + maxItems - 4) { + slidingWindowLocation = Math.max( + Math.min(this.cursor - maxItems + 4, this.options.length - maxItems), + 0 + ); + } else if (this.cursor < slidingWindowLocation + 2) { + slidingWindowLocation = Math.max(this.cursor - 2, 0); + } + + const shouldRenderTopEllipsis = + maxItems < this.options.length && slidingWindowLocation > 0; + const shouldRenderBottomEllipsis = + maxItems < this.options.length && + slidingWindowLocation + maxItems < this.options.length; + + return [ + title, + map(this.root) + .split(/\n/g) + .slice(slidingWindowLocation, slidingWindowLocation + maxItems) + .map((option, i, arr) => { + if (i === 0 && shouldRenderTopEllipsis) { + return color.dim('...'); + } else if (i === arr.length - 1 && shouldRenderBottomEllipsis) { + return color.dim('...'); + } else { + return option; + } + }), + ] + .flat() + .join('\n'); } }, }).prompt(); From a1a6a945ae9e0f76800759b00ad0493c6da81269 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 15:26:28 -0300 Subject: [PATCH 06/24] feat: folder arrow --- packages/core/src/prompts/path.ts | 2 +- packages/prompts/src/index.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 7a61a6f2..fd7d2754 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -36,7 +36,7 @@ export default class PathPrompt extends Prompt { options = options.concat(aux.children); aux = aux.children[this.cursorMap[i]]; } else { - break; + options = options.concat(aux.children ?? []); } } return options; diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 0f87793e..7bc5e58d 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -191,6 +191,7 @@ export const path = (opts: PathOptions) => { state ? color.green(S_RADIO_ACTIVE) : color.dim(S_RADIO_INACTIVE), ' ', node.name, + node.children ? (node.children.length ? ` v` : ` >`) : undefined, ].join(''); }; @@ -238,6 +239,8 @@ export const path = (opts: PathOptions) => { maxItems < this.options.length && slidingWindowLocation + maxItems < this.options.length; + const dots = `${color.cyan(S_BAR)} ${color.dim('...')}`; + return [ title, map(this.root) @@ -245,13 +248,15 @@ export const path = (opts: PathOptions) => { .slice(slidingWindowLocation, slidingWindowLocation + maxItems) .map((option, i, arr) => { if (i === 0 && shouldRenderTopEllipsis) { - return color.dim('...'); + return dots; } else if (i === arr.length - 1 && shouldRenderBottomEllipsis) { - return color.dim('...'); + return dots; } else { return option; } }), + , + color.cyan(S_BAR_END), ] .flat() .join('\n'); From fb8262afbd1ce5f4610a629928ad3202dd995471 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 15:27:41 -0300 Subject: [PATCH 07/24] chore: lint --- package.json | 2 +- packages/core/src/index.ts | 2 +- packages/core/src/prompts/path.ts | 2 +- packages/core/src/prompts/prompt.ts | 2 +- packages/prompts/src/index.ts | 2 +- pnpm-lock.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1664f4cb..b08e0dff 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "organize-imports-cli": "^0.10.0", "prettier": "^2.8.4", "typescript": "^4.9.5", - "unbuild": "^1.1.2" + "unbuild": "1.1.2" }, "packageManager": "pnpm@7.6.0", "volta": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ff8e109a..7240b40b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,10 +2,10 @@ export { default as ConfirmPrompt } from './prompts/confirm'; export { default as GroupMultiSelectPrompt } from './prompts/group-multiselect'; export { default as MultiSelectPrompt } from './prompts/multi-select'; export { default as PasswordPrompt } from './prompts/password'; +export { default as PathPrompt } from './prompts/path'; export { default as Prompt, isCancel } from './prompts/prompt'; export type { State } from './prompts/prompt'; export { default as SelectPrompt } from './prompts/select'; export { default as SelectKeyPrompt } from './prompts/select-key'; export { default as TextPrompt } from './prompts/text'; -export { default as PathPrompt } from './prompts/path'; export { block } from './utils'; diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index fd7d2754..bfcbabda 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -1,6 +1,6 @@ import { readdirSync } from 'node:fs'; -import Prompt, { PromptOptions } from './prompt'; import { resolve } from 'node:path'; +import Prompt, { PromptOptions } from './prompt'; interface PathNode { name: string; diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index 48af0a7b..69e23585 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -106,7 +106,7 @@ export default class Prompt { this.input.on('keypress', this.onKeypress); setRawMode(this.input, true); this.output.on('resize', this.render); - this.on('resize', this.render) + this.on('resize', this.render); this.render(); diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 7bc5e58d..c9c7ed2d 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -5,11 +5,11 @@ import { isCancel, MultiSelectPrompt, PasswordPrompt, + PathPrompt, SelectKeyPrompt, SelectPrompt, State, TextPrompt, - PathPrompt, } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c073399..fb3c154e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: organize-imports-cli: ^0.10.0 prettier: ^2.8.4 typescript: ^4.9.5 - unbuild: ^1.1.2 + unbuild: 1.1.2 devDependencies: '@changesets/cli': 2.26.0 '@types/node': 18.13.0 From 9395dbba53ee9aee0ae2f94d6dbba8a33cc32ff1 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 15:38:43 -0300 Subject: [PATCH 08/24] feat: only show dir option --- examples/basic/index.ts | 1 + packages/core/src/prompts/path.ts | 25 ++++++++++++++++++------- packages/prompts/src/index.ts | 2 ++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/examples/basic/index.ts b/examples/basic/index.ts index dfd33191..506aae90 100644 --- a/examples/basic/index.ts +++ b/examples/basic/index.ts @@ -16,6 +16,7 @@ async function main() { p.path({ message: 'Where should we create your project?', maxItems: 10, + onlyShowDir: true, }), password: () => p.password({ diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index bfcbabda..a0902733 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -7,9 +7,13 @@ interface PathNode { children: PathNode[] | undefined; } -interface PathOptions extends PromptOptions {} +interface PathOptions extends PromptOptions { + onlyShowDir?: boolean; +} + export default class PathPrompt extends Prompt { private cursorMap: number[]; + private onlyShowDir: boolean; public root: PathNode; public get option() { @@ -77,14 +81,20 @@ export default class PathPrompt extends Prompt { } private mapDir(path: string): PathNode[] { - return readdirSync(path, { withFileTypes: true }).map((item) => ({ - name: item.name, - children: item.isDirectory() ? [] : undefined, - })); + return readdirSync(path, { withFileTypes: true }) + .map((item) => ({ + name: item.name, + children: item.isDirectory() ? [] : undefined, + })) + .filter((node) => { + return this.onlyShowDir ? !!node.children : true; + }); } constructor(opts: PathOptions) { super(opts, false); + + this.onlyShowDir = opts.onlyShowDir ?? false; const cwd = opts.initialValue ?? process.cwd(); this.root = { name: cwd, @@ -113,8 +123,9 @@ export default class PathPrompt extends Prompt { break; case 'right': if (this.option.node.children) { - this.option.node.children = this.mapDir(this._value); - this.cursorMap = [...this.cursorMap, 0]; + const children = this.mapDir(this._value); + this.option.node.children = children; + this.cursorMap = children.length ? [...this.cursorMap, 0] : this.cursorMap; this.emit('resize'); } break; diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index c9c7ed2d..cea551a0 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -181,6 +181,7 @@ export interface PathOptions { */ initialValue?: string; maxItems?: number; + onlyShowDir?: boolean; } export const path = (opts: PathOptions) => { @@ -199,6 +200,7 @@ export const path = (opts: PathOptions) => { return new PathPrompt({ initialValue: opts.initialValue, + onlyShowDir: opts.onlyShowDir, render() { const option = this.option; const map = (node: PathNode, index: number = 0, depth: number = 0): string => { From c99fa86620ff6b74cad5f6261852a60ca50f8b92 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 15:51:02 -0300 Subject: [PATCH 09/24] chore: restore basic example --- examples/basic/index.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/basic/index.ts b/examples/basic/index.ts index 506aae90..62cdaf78 100644 --- a/examples/basic/index.ts +++ b/examples/basic/index.ts @@ -1,5 +1,4 @@ import * as p from '@clack/prompts'; -import { resolve } from 'node:path'; import { setTimeout } from 'node:timers/promises'; import color from 'picocolors'; @@ -13,10 +12,13 @@ async function main() { const project = await p.group( { path: () => - p.path({ + p.text({ message: 'Where should we create your project?', - maxItems: 10, - onlyShowDir: true, + placeholder: './sparkling-solid', + validate: (value) => { + if (!value) return 'Please enter a path.'; + if (value[0] !== '.') return 'Please enter a relative path.'; + }, }), password: () => p.password({ From 6ffd8c3c190a2b524c04ec6c872ff1fa2780e750 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 15:56:18 -0300 Subject: [PATCH 10/24] chore: add file selection example --- examples/basic/file-selection.ts | 15 +++++++++++++++ examples/basic/package.json | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 examples/basic/file-selection.ts diff --git a/examples/basic/file-selection.ts b/examples/basic/file-selection.ts new file mode 100644 index 00000000..cee13079 --- /dev/null +++ b/examples/basic/file-selection.ts @@ -0,0 +1,15 @@ +import * as p from '@clack/prompts'; + +(async () => { + const path = await p.path({ + message: 'Pick a file:', + onlyShowDir: false, + initialValue: process.cwd(), + maxItems: 15, + }); + if (p.isCancel(path)) { + p.cancel('File selection canceled'); + process.exit(0); + } + p.outro(path); +})(); diff --git a/examples/basic/package.json b/examples/basic/package.json index 0872dda8..14014f48 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -10,7 +10,8 @@ }, "scripts": { "start": "jiti ./index.ts", - "spinner": "jiti ./spinner.ts" + "spinner": "jiti ./spinner.ts", + "file": "jiti ./file-selection.ts" }, "devDependencies": { "jiti": "^1.17.0" From ef2d7e1e0a8e140dff7675c2ebb7f473034e3f8e Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 17:54:13 -0300 Subject: [PATCH 11/24] fix: leading space --- packages/prompts/src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index cea551a0..8ec19c7b 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,7 +9,7 @@ import { SelectKeyPrompt, SelectPrompt, State, - TextPrompt, + TextPrompt } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; @@ -188,7 +188,7 @@ export const path = (opts: PathOptions) => { const opt = (node: PathNode, state: boolean, depth: number): string => { return [ color.cyan(S_BAR), - ' '.repeat(depth), + ' '.repeat(depth + 2), state ? color.green(S_RADIO_ACTIVE) : color.dim(S_RADIO_INACTIVE), ' ', node.name, @@ -241,7 +241,7 @@ export const path = (opts: PathOptions) => { maxItems < this.options.length && slidingWindowLocation + maxItems < this.options.length; - const dots = `${color.cyan(S_BAR)} ${color.dim('...')}`; + const dots = `${color.cyan(S_BAR)} ${color.dim('...')}`; return [ title, From 647cefd2841a2c14487164b5e99c5b9c8307b4cc Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 21:55:11 -0300 Subject: [PATCH 12/24] refactor: remove unused event listener --- packages/core/src/prompts/path.ts | 3 --- packages/core/src/prompts/prompt.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index a0902733..5c8e0e04 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -126,7 +126,6 @@ export default class PathPrompt extends Prompt { const children = this.mapDir(this._value); this.option.node.children = children; this.cursorMap = children.length ? [...this.cursorMap, 0] : this.cursorMap; - this.emit('resize'); } break; case 'left': @@ -134,14 +133,12 @@ export default class PathPrompt extends Prompt { this.cursorMap = this.cursorMap.slice(0, -1); if (this.option.node.children?.length && this.cursorMap.length) { this.option.node.children = []; - this.emit('resize'); } else if (prevCursor.length === 0) { const cwd = resolve(this.root.name, '..'); this.root = { name: cwd, children: this.mapDir(cwd), }; - this.emit('resize'); } break; } diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index 69e23585..21ee0077 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -106,7 +106,6 @@ export default class Prompt { this.input.on('keypress', this.onKeypress); setRawMode(this.input, true); this.output.on('resize', this.render); - this.on('resize', this.render); this.render(); From 2aaf6bbffd489831f203a2a35bec982f3780be43 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 24 Aug 2023 22:07:50 -0300 Subject: [PATCH 13/24] refactor: improve cursor mapping --- packages/core/src/prompts/path.ts | 20 ++++++++------------ packages/prompts/src/index.ts | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 5c8e0e04..325df09a 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -18,11 +18,9 @@ export default class PathPrompt extends Prompt { public get option() { let aux: PathNode = this.root; - for (let i = 0; i < this.cursorMap.length; i++) { - if (aux.children && aux.children[this.cursorMap[i]]) { - aux = aux.children[this.cursorMap[i]]; - } else { - break; + for (const index of this.cursorMap) { + if (aux.children && aux.children[index]) { + aux = aux.children[index]; } } return { @@ -35,19 +33,17 @@ export default class PathPrompt extends Prompt { public get options(): PathNode[] { let aux: PathNode = this.root; let options: PathNode[] = [this.root]; - for (let i = 0; i < this.cursorMap.length; i++) { - if (aux.children && aux.children[this.cursorMap[i]]) { - options = options.concat(aux.children); - aux = aux.children[this.cursorMap[i]]; - } else { - options = options.concat(aux.children ?? []); + for (const index of this.cursorMap) { + options = options.concat(aux.children ?? []); + if (aux.children && aux.children[index]) { + aux = aux.children[index]; } } return options; } public get cursor(): number { - return this.cursorMap.reduce((a, b) => a + b, 0); + return this.cursorMap.reduce((a, b) => a + b + 1, 0); } private get _node(): PathNode[] { diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 8ec19c7b..4c7e9cbf 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -226,9 +226,9 @@ export const path = (opts: PathOptions) => { ].join('\n'); default: const maxItems = opts.maxItems === undefined ? Infinity : Math.max(opts.maxItems, 5); - if (this.cursor >= slidingWindowLocation + maxItems - 4) { + if (this.cursor >= slidingWindowLocation + maxItems - 3) { slidingWindowLocation = Math.max( - Math.min(this.cursor - maxItems + 4, this.options.length - maxItems), + Math.min(this.cursor - maxItems + 3, this.options.length - maxItems), 0 ); } else if (this.cursor < slidingWindowLocation + 2) { From 1a112477b77189e5a72aea0aad3cc8d550480eff Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Fri, 25 Aug 2023 11:43:09 -0300 Subject: [PATCH 14/24] refactor: cancel state --- packages/prompts/src/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 4c7e9cbf..9fb7de87 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,7 +9,7 @@ import { SelectKeyPrompt, SelectPrompt, State, - TextPrompt + TextPrompt, } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; @@ -222,7 +222,9 @@ export const path = (opts: PathOptions) => { case 'cancel': return [ title, - `${color.gray(S_BAR)} ${color.dim(color.strikethrough(this.value))}`, + `${color.gray(S_BAR)} ${color.dim(color.strikethrough(this.value))}\n${color.gray( + S_BAR + )}`, ].join('\n'); default: const maxItems = opts.maxItems === undefined ? Infinity : Math.max(opts.maxItems, 5); From 1bdf0bc31eb2d7bbc3547ede84e01d9d63594499 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Sun, 27 Aug 2023 17:40:10 -0300 Subject: [PATCH 15/24] docs: add path example --- packages/prompts/README.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/prompts/README.md b/packages/prompts/README.md index 767be885..f1e4c3c7 100644 --- a/packages/prompts/README.md +++ b/packages/prompts/README.md @@ -11,7 +11,7 @@ Effortlessly build beautiful command-line apps 🪄 [Try the demo](https://stack - 🤏 80% smaller than other options - 💎 Beautiful, minimal UI - ✅ Simple API -- 🧱 Comes with `text`, `confirm`, `select`, `multiselect`, and `spinner` components +- 🧱 Comes with `text`, `confirm`, `select`, `multiselect`, `path`, and `spinner` components ## Basics @@ -46,7 +46,7 @@ if (isCancel(value)) { ### Text -The text component accepts a single line of text. +The `text` component accepts a single line of text. ```js import { text } from '@clack/prompts'; @@ -63,7 +63,7 @@ const meaning = await text({ ### Confirm -The confirm component accepts a yes or no answer. The result is a boolean value of `true` or `false`. +The `confirm` component accepts a yes or no answer. The result is a boolean value of `true` or `false`. ```js import { confirm } from '@clack/prompts'; @@ -75,7 +75,7 @@ const shouldContinue = await confirm({ ### Select -The select component allows a user to choose one value from a list of options. The result is the `value` prop of a given option. +The `select` component allows a user to choose one value from a list of options. The result is the `value` prop of a given option. ```js import { select } from '@clack/prompts'; @@ -108,9 +108,24 @@ const additionalTools = await multiselect({ }); ``` +### Path + +The `path` component allows a user navigate thought directories and select the desired file/folder. The result is the absolute path of the selected item. + +```js +import { path } from '@clack/prompts'; + +const projectPath = await path({ + message: 'Pick a project:', + initialValue: process.cwd() // current working dir, + onlyShowDir: true, + maxItems: 12 +}); +``` + ### Spinner -The spinner component surfaces a pending action, such as a long-running download or dependency installation. +The `spinner` component surfaces a pending action, such as a long-running download or dependency installation. ```js import { spinner } from '@clack/prompts'; From 154f9c2639240f625b18d1593eb76b94e53f68ee Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Tue, 29 Aug 2023 13:17:25 -0300 Subject: [PATCH 16/24] feat: path input --- examples/basic/file-selection.ts | 21 +- packages/core/src/prompts/path.ts | 162 ++++- packages/core/src/prompts/prompt.ts | 2 +- packages/prompts/src/index.ts | 98 ++- pnpm-lock.yaml | 957 ++++++++++++++-------------- 5 files changed, 701 insertions(+), 539 deletions(-) diff --git a/examples/basic/file-selection.ts b/examples/basic/file-selection.ts index cee13079..e07d15a0 100644 --- a/examples/basic/file-selection.ts +++ b/examples/basic/file-selection.ts @@ -1,15 +1,28 @@ import * as p from '@clack/prompts'; (async () => { - const path = await p.path({ + const selectResult = await p.path({ + type: 'select', message: 'Pick a file:', - onlyShowDir: false, initialValue: process.cwd(), + onlyShowDir: false, maxItems: 15, }); - if (p.isCancel(path)) { + if (p.isCancel(selectResult)) { + p.cancel('File selection canceled'); + process.exit(0); + } + + const inputResult = await p.path({ + type: 'text', + message: 'Pick a file:', + onlyShowDir: false, + placeholder: process.cwd(), + }); + if (p.isCancel(inputResult)) { p.cancel('File selection canceled'); process.exit(0); } - p.outro(path); + + console.log({ selectResult, inputResult }); })(); diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 325df09a..35c341e2 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -1,31 +1,48 @@ -import { readdirSync } from 'node:fs'; +import { existsSync, readdirSync } from 'node:fs'; import { resolve } from 'node:path'; import Prompt, { PromptOptions } from './prompt'; +import color from 'picocolors'; interface PathNode { name: string; children: PathNode[] | undefined; } -interface PathOptions extends PromptOptions { - onlyShowDir?: boolean; -} +type PathType = 'text' | 'select'; + +type PathOptions = PromptOptions & + ( + | { + type: 'text'; + onlyShowDir?: boolean; + placeholder?: string; + } + | { + type: 'select'; + onlyShowDir?: boolean; + } + ); export default class PathPrompt extends Prompt { - private cursorMap: number[]; - private onlyShowDir: boolean; + public readonly type: PathType; + public readonly placeholder: string; + public readonly onlyShowDir: boolean; public root: PathNode; + public hint: string; + public valueWithHint: string; + + private _cursorMap: number[]; public get option() { let aux: PathNode = this.root; - for (const index of this.cursorMap) { + for (const index of this._cursorMap) { if (aux.children && aux.children[index]) { aux = aux.children[index]; } } return { - index: this.cursorMap[this.cursorMap.length - 1] ?? 0, - depth: this.cursorMap.length, + index: this._cursorMap[this._cursorMap.length - 1] ?? 0, + depth: this._cursorMap.length, node: aux, }; } @@ -33,7 +50,7 @@ export default class PathPrompt extends Prompt { public get options(): PathNode[] { let aux: PathNode = this.root; let options: PathNode[] = [this.root]; - for (const index of this.cursorMap) { + for (const index of this._cursorMap) { options = options.concat(aux.children ?? []); if (aux.children && aux.children[index]) { aux = aux.children[index]; @@ -43,13 +60,13 @@ export default class PathPrompt extends Prompt { } public get cursor(): number { - return this.cursorMap.reduce((a, b) => a + b + 1, 0); + return this.type === 'select' ? this._cursorMap.reduce((a, b) => a + b + 1, 0) : this._cursor; } - private get _node(): PathNode[] { + private get _layer(): PathNode[] { let aux: PathNode = this.root; let options: PathNode[] = []; - for (const index of this.cursorMap) { + for (const index of this._cursorMap) { if (aux.children?.[index]) { options = aux.children; aux = aux.children[index]; @@ -60,10 +77,10 @@ export default class PathPrompt extends Prompt { return options; } - private get _value(): string { + private get _selectValue(): string { const value: string[] = []; let option: PathNode = this.root; - for (const index of this.cursorMap) { + for (const index of this._cursorMap) { if (option.children?.[index]) { option = option.children[index]; value.push(option.name); @@ -72,8 +89,49 @@ export default class PathPrompt extends Prompt { return resolve(this.root.name, ...value); } - private _changeValue() { - this.value = this._value; + private _changeSelectValue(): void { + this.value = this._selectValue; + } + + private _changeHint(): void { + const root = resolve(this.value.replace(/^(.*\/).*/, '$1')); + const pathEnd = this.value.replace(/.*\/(.*)$/, '$1'); + + let options: string[] = []; + if (existsSync(root)) { + options = this.mapDir(root).map((node) => node.name); + } + const option = options.find((opt) => opt.startsWith(pathEnd)) ?? ''; + + this.hint = option.replace(pathEnd, '') ?? ''; + } + + private _changeInputValue(): void { + this._changeHint(); + if (this.cursor >= this.value.length) { + this.valueWithHint = `${this.value}${color.inverse(this.hint.charAt(0))}${color.dim( + this.hint.slice(1) + )}`; + } else { + const s1 = this.value.slice(0, this.cursor); + const s2 = this.value.slice(this.cursor); + this.valueWithHint = `${s1}${color.inverse(s2[0])}${s2.slice(1)}${color.dim(this.hint)}`; + } + if (!this.hint) { + this.valueWithHint += color.inverse(color.hidden('_')); + } + } + + private _changeValue(): void { + this.type === 'select' ? this._changeSelectValue() : this._changeInputValue(); + } + + private _autocomplete(): void { + const complete = this.value ? this.hint : this.placeholder; + this.value += complete; + this._cursor = this.value.length; + this.rl.write(complete); + this._changeInputValue(); } private mapDir(path: string): PathNode[] { @@ -88,46 +146,59 @@ export default class PathPrompt extends Prompt { } constructor(opts: PathOptions) { - super(opts, false); + super(opts, opts.type === 'text'); + // General + this.type = opts.type; this.onlyShowDir = opts.onlyShowDir ?? false; + this.value = opts.initialValue ?? ''; + + // Select + this._cursorMap = [0]; const cwd = opts.initialValue ?? process.cwd(); this.root = { name: cwd, children: this.mapDir(cwd), }; - this.cursorMap = [0]; + + // Text + this.placeholder = opts.placeholder ?? ''; + this.hint = ''; + this.valueWithHint = ''; + this._changeValue(); this.on('cursor', (key) => { + if (this.type !== 'select') return; + switch (key) { case 'up': - if (this.cursorMap.length) { - this.cursorMap = [ - ...this.cursorMap.slice(0, -1), - this.option.index > 0 ? this.option.index - 1 : this._node.length - 1, + if (this._cursorMap.length) { + this._cursorMap = [ + ...this._cursorMap.slice(0, -1), + this.option.index > 0 ? this.option.index - 1 : this._layer.length - 1, ]; } break; case 'down': - if (this.cursorMap.length) { - this.cursorMap = [ - ...this.cursorMap.slice(0, -1), - this.option.index < this._node.length - 1 ? this.option.index + 1 : 0, + if (this._cursorMap.length) { + this._cursorMap = [ + ...this._cursorMap.slice(0, -1), + this.option.index < this._layer.length - 1 ? this.option.index + 1 : 0, ]; } break; case 'right': if (this.option.node.children) { - const children = this.mapDir(this._value); + const children = this.mapDir(this._selectValue); this.option.node.children = children; - this.cursorMap = children.length ? [...this.cursorMap, 0] : this.cursorMap; + this._cursorMap = children.length ? [...this._cursorMap, 0] : this._cursorMap; } break; case 'left': - const prevCursor = this.cursorMap; - this.cursorMap = this.cursorMap.slice(0, -1); - if (this.option.node.children?.length && this.cursorMap.length) { + const prevCursor = this._cursorMap; + this._cursorMap = this._cursorMap.slice(0, -1); + if (this.option.node.children?.length && this._cursorMap.length) { this.option.node.children = []; } else if (prevCursor.length === 0) { const cwd = resolve(this.root.name, '..'); @@ -138,7 +209,32 @@ export default class PathPrompt extends Prompt { } break; } - this._changeValue(); + return this._changeSelectValue(); + }); + + this.on('cursor', (key) => { + if (this.type !== 'text') return; + + if (key === 'right' && this.cursor >= this.value.length) { + this._autocomplete(); + } + }); + + this.on('key', (key) => { + if (this.type !== 'text') return; + + if (key === '\t') { + this._autocomplete(); + } + }); + + this.on('value', () => { + if (this.type !== 'text') return; + this._changeInputValue(); + }); + + this.on('finalize', () => { + this.value = resolve(this.value); }); } } diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index 21ee0077..b1f8e0e2 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -53,7 +53,7 @@ export type State = 'initial' | 'active' | 'cancel' | 'submit' | 'error'; export default class Prompt { protected input: Readable; protected output: Writable; - private rl!: ReadLine; + protected rl!: ReadLine; private opts: Omit, 'render' | 'input' | 'output'>; private _track: boolean = false; private _render: (context: Omit) => string | void; diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 9fb7de87..39633942 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -174,15 +174,31 @@ interface PathNode { children: PathNode[] | undefined; } -export interface PathOptions { +export type PathOptions = { message: string; /** + * Starting absolute path * @default process.cwd() // current working dir */ initialValue?: string; - maxItems?: number; + /** + * Exclude files from options + * @default false + */ onlyShowDir?: boolean; -} +} & ( + | { + type: 'text'; + placeholder?: string; + } + | { + type: 'select'; + /** + * Limit the number of options that appears at once + */ + maxItems?: number; + } +); export const path = (opts: PathOptions) => { const opt = (node: PathNode, state: boolean, depth: number): string => { @@ -199,8 +215,10 @@ export const path = (opts: PathOptions) => { let slidingWindowLocation = 0; return new PathPrompt({ + type: opts.type, initialValue: opts.initialValue, onlyShowDir: opts.onlyShowDir, + placeholder: 'placeholder' in opts ? opts.placeholder : '', render() { const option = this.option; const map = (node: PathNode, index: number = 0, depth: number = 0): string => { @@ -227,43 +245,55 @@ export const path = (opts: PathOptions) => { )}`, ].join('\n'); default: - const maxItems = opts.maxItems === undefined ? Infinity : Math.max(opts.maxItems, 5); - if (this.cursor >= slidingWindowLocation + maxItems - 3) { - slidingWindowLocation = Math.max( - Math.min(this.cursor - maxItems + 3, this.options.length - maxItems), - 0 - ); - } else if (this.cursor < slidingWindowLocation + 2) { - slidingWindowLocation = Math.max(this.cursor - 2, 0); + if (opts.type === 'select') { + const maxItems = opts.maxItems === undefined ? Infinity : Math.max(opts.maxItems, 5); + if (this.cursor >= slidingWindowLocation + maxItems - 3) { + slidingWindowLocation = Math.max( + Math.min(this.cursor - maxItems + 3, this.options.length - maxItems), + 0 + ); + } else if (this.cursor < slidingWindowLocation + 2) { + slidingWindowLocation = Math.max(this.cursor - 2, 0); + } + + const shouldRenderTopEllipsis = + maxItems < this.options.length && slidingWindowLocation > 0; + const shouldRenderBottomEllipsis = + maxItems < this.options.length && + slidingWindowLocation + maxItems < this.options.length; + + const dots = `${color.cyan(S_BAR)} ${color.dim('...')}`; + + return [ + title, + map(this.root) + .split(/\n/g) + .slice(slidingWindowLocation, slidingWindowLocation + maxItems) + .map((option, i, arr) => { + if (i === 0 && shouldRenderTopEllipsis) { + return dots; + } else if (i === arr.length - 1 && shouldRenderBottomEllipsis) { + return dots; + } else { + return option; + } + }), + , + color.cyan(S_BAR_END), + ] + .flat() + .join('\n'); } - const shouldRenderTopEllipsis = - maxItems < this.options.length && slidingWindowLocation > 0; - const shouldRenderBottomEllipsis = - maxItems < this.options.length && - slidingWindowLocation + maxItems < this.options.length; - - const dots = `${color.cyan(S_BAR)} ${color.dim('...')}`; + const placeholder = opts.placeholder + ? color.inverse(opts.placeholder[0]) + color.dim(opts.placeholder.slice(1)) + : color.inverse(color.hidden('_')); return [ title, - map(this.root) - .split(/\n/g) - .slice(slidingWindowLocation, slidingWindowLocation + maxItems) - .map((option, i, arr) => { - if (i === 0 && shouldRenderTopEllipsis) { - return dots; - } else if (i === arr.length - 1 && shouldRenderBottomEllipsis) { - return dots; - } else { - return option; - } - }), - , + `${color.cyan(S_BAR)} ${this.value ? this.valueWithHint : placeholder}`, color.cyan(S_BAR_END), - ] - .flat() - .join('\n'); + ].join('\n'); } }, }).prompt(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb3c154e..3f26de65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,78 +1,99 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false importers: .: - specifiers: - '@changesets/cli': ^2.26.0 - '@types/node': '18' - merge2: ^1.4.1 - organize-imports-cli: ^0.10.0 - prettier: ^2.8.4 - typescript: ^4.9.5 - unbuild: 1.1.2 devDependencies: - '@changesets/cli': 2.26.0 - '@types/node': 18.13.0 - merge2: 1.4.1 - organize-imports-cli: 0.10.0 - prettier: 2.8.4 - typescript: 4.9.5 - unbuild: 1.1.2 + '@changesets/cli': + specifier: ^2.26.0 + version: 2.26.0 + '@types/node': + specifier: '18' + version: 18.13.0 + merge2: + specifier: ^1.4.1 + version: 1.4.1 + organize-imports-cli: + specifier: ^0.10.0 + version: 0.10.0 + prettier: + specifier: ^2.8.4 + version: 2.8.4 + typescript: + specifier: ^4.9.5 + version: 4.9.5 + unbuild: + specifier: 1.1.2 + version: 1.1.2 examples/basic: - specifiers: - '@clack/core': workspace:* - '@clack/prompts': workspace:* - jiti: ^1.17.0 - picocolors: ^1.0.0 - dependencies: - '@clack/core': link:../../packages/core - '@clack/prompts': link:../../packages/prompts - picocolors: 1.0.0 + dependencies: + '@clack/core': + specifier: workspace:* + version: link:../../packages/core + '@clack/prompts': + specifier: workspace:* + version: link:../../packages/prompts + picocolors: + specifier: ^1.0.0 + version: 1.0.0 devDependencies: - jiti: 1.17.0 + jiti: + specifier: ^1.17.0 + version: 1.17.0 examples/changesets: - specifiers: - '@clack/core': workspace:* - '@clack/prompts': workspace:* - jiti: ^1.17.0 - picocolors: ^1.0.0 - dependencies: - '@clack/core': link:../../packages/core - '@clack/prompts': link:../../packages/prompts - picocolors: 1.0.0 + dependencies: + '@clack/core': + specifier: workspace:* + version: link:../../packages/core + '@clack/prompts': + specifier: workspace:* + version: link:../../packages/prompts + picocolors: + specifier: ^1.0.0 + version: 1.0.0 devDependencies: - jiti: 1.17.0 + jiti: + specifier: ^1.17.0 + version: 1.17.0 packages/core: - specifiers: - picocolors: ^1.0.0 - sisteransi: ^1.0.5 - wrap-ansi: ^8.1.0 dependencies: - picocolors: 1.0.0 - sisteransi: 1.0.5 + picocolors: + specifier: ^1.0.0 + version: 1.0.0 + sisteransi: + specifier: ^1.0.5 + version: 1.0.5 devDependencies: - wrap-ansi: 8.1.0 + wrap-ansi: + specifier: ^8.1.0 + version: 8.1.0 packages/prompts: - specifiers: - '@clack/core': ^0.3.3 - is-unicode-supported: ^1.3.0 - picocolors: ^1.0.0 - sisteransi: ^1.0.5 dependencies: - '@clack/core': link:../core - picocolors: 1.0.0 - sisteransi: 1.0.5 + '@clack/core': + specifier: ^0.3.3 + version: link:../core + picocolors: + specifier: ^1.0.0 + version: 1.0.0 + sisteransi: + specifier: ^1.0.5 + version: 1.0.5 devDependencies: - is-unicode-supported: 1.3.0 + is-unicode-supported: + specifier: ^1.3.0 + version: 1.3.0 packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -80,26 +101,26 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.21.0: + /@babel/compat-data@7.21.0: resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.0: + /@babel/core@7.21.0: resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.21.1 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.2 @@ -115,7 +136,7 @@ packages: - supports-color dev: true - /@babel/generator/7.21.1: + /@babel/generator@7.21.1: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} dependencies: @@ -125,7 +146,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -139,12 +160,12 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.21.0: + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -152,21 +173,21 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-module-transforms/7.21.2: + /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -182,36 +203,36 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.21.0: + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.21.0: + /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -222,16 +243,17 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} + requiresBuild: true dependencies: '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.2: + /@babel/parser@7.21.2: resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -239,19 +261,19 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/runtime/7.20.13: + /@babel/runtime@7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/standalone/7.21.2: + /@babel/standalone@7.21.2: resolution: {integrity: sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==} engines: {node: '>=6.9.0'} dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -260,7 +282,7 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/traverse/7.21.2: + /@babel/traverse@7.21.2: resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} engines: {node: '>=6.9.0'} dependencies: @@ -278,7 +300,7 @@ packages: - supports-color dev: true - /@babel/types/7.21.2: + /@babel/types@7.21.2: resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} engines: {node: '>=6.9.0'} dependencies: @@ -287,7 +309,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@changesets/apply-release-plan/6.1.3: + /@changesets/apply-release-plan@6.1.3: resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==} dependencies: '@babel/runtime': 7.20.13 @@ -305,7 +327,7 @@ packages: semver: 5.7.1 dev: true - /@changesets/assemble-release-plan/5.2.3: + /@changesets/assemble-release-plan@5.2.3: resolution: {integrity: sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==} dependencies: '@babel/runtime': 7.20.13 @@ -316,13 +338,13 @@ packages: semver: 5.7.1 dev: true - /@changesets/changelog-git/0.1.14: + /@changesets/changelog-git@0.1.14: resolution: {integrity: sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==} dependencies: '@changesets/types': 5.2.1 dev: true - /@changesets/cli/2.26.0: + /@changesets/cli@2.26.0: resolution: {integrity: sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q==} hasBin: true dependencies: @@ -361,7 +383,7 @@ packages: tty-table: 4.1.6 dev: true - /@changesets/config/2.3.0: + /@changesets/config@2.3.0: resolution: {integrity: sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==} dependencies: '@changesets/errors': 0.1.4 @@ -373,13 +395,13 @@ packages: micromatch: 4.0.5 dev: true - /@changesets/errors/0.1.4: + /@changesets/errors@0.1.4: resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} dependencies: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph/1.3.5: + /@changesets/get-dependents-graph@1.3.5: resolution: {integrity: sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==} dependencies: '@changesets/types': 5.2.1 @@ -389,7 +411,7 @@ packages: semver: 5.7.1 dev: true - /@changesets/get-release-plan/3.0.16: + /@changesets/get-release-plan@3.0.16: resolution: {integrity: sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==} dependencies: '@babel/runtime': 7.20.13 @@ -401,11 +423,11 @@ packages: '@manypkg/get-packages': 1.1.3 dev: true - /@changesets/get-version-range-type/0.3.2: + /@changesets/get-version-range-type@0.3.2: resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} dev: true - /@changesets/git/2.0.0: + /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: '@babel/runtime': 7.20.13 @@ -417,20 +439,20 @@ packages: spawndamnit: 2.0.0 dev: true - /@changesets/logger/0.0.5: + /@changesets/logger@0.0.5: resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} dependencies: chalk: 2.4.2 dev: true - /@changesets/parse/0.3.16: + /@changesets/parse@0.3.16: resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} dependencies: '@changesets/types': 5.2.1 js-yaml: 3.14.1 dev: true - /@changesets/pre/1.0.14: + /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: '@babel/runtime': 7.20.13 @@ -440,7 +462,7 @@ packages: fs-extra: 7.0.1 dev: true - /@changesets/read/0.5.9: + /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: '@babel/runtime': 7.20.13 @@ -453,15 +475,15 @@ packages: p-filter: 2.1.0 dev: true - /@changesets/types/4.1.0: + /@changesets/types@4.1.0: resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} dev: true - /@changesets/types/5.2.1: + /@changesets/types@5.2.1: resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} dev: true - /@changesets/write/0.2.3: + /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: '@babel/runtime': 7.20.13 @@ -471,25 +493,25 @@ packages: prettier: 2.8.4 dev: true - /@esbuild/android-arm/0.17.10: - resolution: {integrity: sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==} + /@esbuild/android-arm64@0.17.10: + resolution: {integrity: sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.17.10: - resolution: {integrity: sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==} + /@esbuild/android-arm@0.17.10: + resolution: {integrity: sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.17.10: + /@esbuild/android-x64@0.17.10: resolution: {integrity: sha512-CYzrm+hTiY5QICji64aJ/xKdN70IK8XZ6iiyq0tZkd3tfnwwSWTYH1t3m6zyaaBxkuj40kxgMyj1km/NqdjQZA==} engines: {node: '>=12'} cpu: [x64] @@ -498,7 +520,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.10: + /@esbuild/darwin-arm64@0.17.10: resolution: {integrity: sha512-3HaGIowI+nMZlopqyW6+jxYr01KvNaLB5znXfbyyjuo4lE0VZfvFGcguIJapQeQMS4cX/NEispwOekJt3gr5Dg==} engines: {node: '>=12'} cpu: [arm64] @@ -507,7 +529,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.10: + /@esbuild/darwin-x64@0.17.10: resolution: {integrity: sha512-J4MJzGchuCRG5n+B4EHpAMoJmBeAE1L3wGYDIN5oWNqX0tEr7VKOzw0ymSwpoeSpdCa030lagGUfnfhS7OvzrQ==} engines: {node: '>=12'} cpu: [x64] @@ -516,7 +538,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.10: + /@esbuild/freebsd-arm64@0.17.10: resolution: {integrity: sha512-ZkX40Z7qCbugeK4U5/gbzna/UQkM9d9LNV+Fro8r7HA7sRof5Rwxc46SsqeMvB5ZaR0b1/ITQ/8Y1NmV2F0fXQ==} engines: {node: '>=12'} cpu: [arm64] @@ -525,7 +547,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.10: + /@esbuild/freebsd-x64@0.17.10: resolution: {integrity: sha512-0m0YX1IWSLG9hWh7tZa3kdAugFbZFFx9XrvfpaCMMvrswSTvUZypp0NFKriUurHpBA3xsHVE9Qb/0u2Bbi/otg==} engines: {node: '>=12'} cpu: [x64] @@ -534,25 +556,25 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.10: - resolution: {integrity: sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==} + /@esbuild/linux-arm64@0.17.10: + resolution: {integrity: sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.17.10: - resolution: {integrity: sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==} + /@esbuild/linux-arm@0.17.10: + resolution: {integrity: sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.17.10: + /@esbuild/linux-ia32@0.17.10: resolution: {integrity: sha512-1vKYCjfv/bEwxngHERp7huYfJ4jJzldfxyfaF7hc3216xiDA62xbXJfRlradiMhGZbdNLj2WA1YwYFzs9IWNPw==} engines: {node: '>=12'} cpu: [ia32] @@ -561,7 +583,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.10: + /@esbuild/linux-loong64@0.17.10: resolution: {integrity: sha512-mvwAr75q3Fgc/qz3K6sya3gBmJIYZCgcJ0s7XshpoqIAIBszzfXsqhpRrRdVFAyV1G9VUjj7VopL2HnAS8aHFA==} engines: {node: '>=12'} cpu: [loong64] @@ -570,7 +592,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.10: + /@esbuild/linux-mips64el@0.17.10: resolution: {integrity: sha512-XilKPgM2u1zR1YuvCsFQWl9Fc35BqSqktooumOY2zj7CSn5czJn279j9TE1JEqSqz88izJo7yE4x3LSf7oxHzg==} engines: {node: '>=12'} cpu: [mips64el] @@ -579,7 +601,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.10: + /@esbuild/linux-ppc64@0.17.10: resolution: {integrity: sha512-kM4Rmh9l670SwjlGkIe7pYWezk8uxKHX4Lnn5jBZYBNlWpKMBCVfpAgAJqp5doLobhzF3l64VZVrmGeZ8+uKmQ==} engines: {node: '>=12'} cpu: [ppc64] @@ -588,7 +610,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.10: + /@esbuild/linux-riscv64@0.17.10: resolution: {integrity: sha512-r1m9ZMNJBtOvYYGQVXKy+WvWd0BPvSxMsVq8Hp4GzdMBQvfZRvRr5TtX/1RdN6Va8JMVQGpxqde3O+e8+khNJQ==} engines: {node: '>=12'} cpu: [riscv64] @@ -597,7 +619,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.10: + /@esbuild/linux-s390x@0.17.10: resolution: {integrity: sha512-LsY7QvOLPw9WRJ+fU5pNB3qrSfA00u32ND5JVDrn/xG5hIQo3kvTxSlWFRP0NJ0+n6HmhPGG0Q4jtQsb6PFoyg==} engines: {node: '>=12'} cpu: [s390x] @@ -606,7 +628,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.10: + /@esbuild/linux-x64@0.17.10: resolution: {integrity: sha512-zJUfJLebCYzBdIz/Z9vqwFjIA7iSlLCFvVi7glMgnu2MK7XYigwsonXshy9wP9S7szF+nmwrelNaP3WGanstEg==} engines: {node: '>=12'} cpu: [x64] @@ -615,7 +637,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.10: + /@esbuild/netbsd-x64@0.17.10: resolution: {integrity: sha512-lOMkailn4Ok9Vbp/q7uJfgicpDTbZFlXlnKT2DqC8uBijmm5oGtXAJy2ZZVo5hX7IOVXikV9LpCMj2U8cTguWA==} engines: {node: '>=12'} cpu: [x64] @@ -624,7 +646,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.10: + /@esbuild/openbsd-x64@0.17.10: resolution: {integrity: sha512-/VE0Kx6y7eekqZ+ZLU4AjMlB80ov9tEz4H067Y0STwnGOYL8CsNg4J+cCmBznk1tMpxMoUOf0AbWlb1d2Pkbig==} engines: {node: '>=12'} cpu: [x64] @@ -633,7 +655,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.10: + /@esbuild/sunos-x64@0.17.10: resolution: {integrity: sha512-ERNO0838OUm8HfUjjsEs71cLjLMu/xt6bhOlxcJ0/1MG3hNqCmbWaS+w/8nFLa0DDjbwZQuGKVtCUJliLmbVgg==} engines: {node: '>=12'} cpu: [x64] @@ -642,7 +664,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.10: + /@esbuild/win32-arm64@0.17.10: resolution: {integrity: sha512-fXv+L+Bw2AeK+XJHwDAQ9m3NRlNemG6Z6ijLwJAAVdu4cyoFbBWbEtyZzDeL+rpG2lWI51cXeMt70HA8g2MqIg==} engines: {node: '>=12'} cpu: [arm64] @@ -651,7 +673,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.10: + /@esbuild/win32-ia32@0.17.10: resolution: {integrity: sha512-3s+HADrOdCdGOi5lnh5DMQEzgbsFsd4w57L/eLKKjMnN0CN4AIEP0DCP3F3N14xnxh3ruNc32A0Na9zYe1Z/AQ==} engines: {node: '>=12'} cpu: [ia32] @@ -660,7 +682,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.10: + /@esbuild/win32-x64@0.17.10: resolution: {integrity: sha512-oP+zFUjYNaMNmjTwlFtWep85hvwUu19cZklB3QsBOcZSs6y7hmH4LNCJ7075bsqzYaNvZFXJlAVaQ2ApITDXtw==} engines: {node: '>=12'} cpu: [x64] @@ -669,7 +691,7 @@ packages: dev: true optional: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -677,7 +699,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -686,28 +708,28 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@manypkg/find-root/1.1.0: + /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: '@babel/runtime': 7.20.13 @@ -716,7 +738,7 @@ packages: fs-extra: 8.1.0 dev: true - /@manypkg/get-packages/1.1.3: + /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: '@babel/runtime': 7.20.13 @@ -727,7 +749,7 @@ packages: read-yaml-file: 1.1.0 dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -735,12 +757,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -748,7 +770,7 @@ packages: fastq: 1.15.0 dev: true - /@rollup/plugin-alias/4.0.3_rollup@3.18.0: + /@rollup/plugin-alias@4.0.3(rollup@3.18.0): resolution: {integrity: sha512-ZuDWE1q4PQDhvm/zc5Prun8sBpLJy41DMptYrS6MhAy9s9kL/doN1613BWfEchGVfKxzliJ3BjbOPizXX38DbQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -761,7 +783,7 @@ packages: slash: 4.0.0 dev: true - /@rollup/plugin-commonjs/24.0.1_rollup@3.18.0: + /@rollup/plugin-commonjs@24.0.1(rollup@3.18.0): resolution: {integrity: sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==} engines: {node: '>=14.0.0'} peerDependencies: @@ -770,7 +792,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.18.0 + '@rollup/pluginutils': 5.0.2(rollup@3.18.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 @@ -779,7 +801,7 @@ packages: rollup: 3.18.0 dev: true - /@rollup/plugin-json/6.0.0_rollup@3.18.0: + /@rollup/plugin-json@6.0.0(rollup@3.18.0): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -788,11 +810,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.18.0 + '@rollup/pluginutils': 5.0.2(rollup@3.18.0) rollup: 3.18.0 dev: true - /@rollup/plugin-node-resolve/15.0.1_rollup@3.18.0: + /@rollup/plugin-node-resolve@15.0.1(rollup@3.18.0): resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -801,7 +823,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.18.0 + '@rollup/pluginutils': 5.0.2(rollup@3.18.0) '@types/resolve': 1.20.2 deepmerge: 4.3.0 is-builtin-module: 3.2.1 @@ -810,7 +832,7 @@ packages: rollup: 3.18.0 dev: true - /@rollup/plugin-replace/5.0.2_rollup@3.18.0: + /@rollup/plugin-replace@5.0.2(rollup@3.18.0): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -819,12 +841,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.18.0 + '@rollup/pluginutils': 5.0.2(rollup@3.18.0) magic-string: 0.27.0 rollup: 3.18.0 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.18.0: + /@rollup/pluginutils@5.0.2(rollup@3.18.0): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -839,7 +861,7 @@ packages: rollup: 3.18.0 dev: true - /@ts-morph/common/0.16.0: + /@ts-morph/common@0.16.0: resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} dependencies: fast-glob: 3.2.12 @@ -848,100 +870,100 @@ packages: path-browserify: 1.0.1 dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/is-ci/3.0.0: + /@types/is-ci@3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: ci-info: 3.8.0 dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node/12.20.55: + /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node/18.13.0: + /@types/node@18.13.0: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/resolve/1.20.2: + /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/semver/6.2.3: + /@types/semver@6.2.3: resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} dev: true - /@types/strip-bom/3.0.0: + /@types/strip-bom@3.0.0: resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} dev: true - /@types/strip-json-comments/0.0.30: + /@types/strip-json-comments@0.0.30: resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.1: + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: @@ -951,47 +973,47 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /better-path-resolve/1.0.0: + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} dependencies: is-windows: 1.0.2 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /breakword/1.0.5: + /breakword@1.0.5: resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} dependencies: wcwidth: 1.0.1 dev: true - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -999,22 +1021,22 @@ packages: caniuse-lite: 1.0.30001458 electron-to-chromium: 1.4.315 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -1023,16 +1045,16 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /caniuse-lite/1.0.30001458: + /caniuse-lite@1.0.30001458: resolution: {integrity: sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==} dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -1041,7 +1063,7 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -1049,21 +1071,21 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.2.0: + /chalk@5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cliui/6.0.0: + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: string-width: 4.2.3 @@ -1071,7 +1093,7 @@ packages: wrap-ansi: 6.2.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -1080,53 +1102,53 @@ packages: wrap-ansi: 7.0.0 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} dev: true - /code-block-writer/11.0.3: + /code-block-writer@11.0.3: resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 dev: true - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /consola/2.15.3: + /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /cross-spawn/5.1.0: + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 @@ -1134,19 +1156,19 @@ packages: which: 1.3.1 dev: true - /csv-generate/3.4.3: + /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} dev: true - /csv-parse/4.16.3: + /csv-parse@4.16.3: resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} dev: true - /csv-stringify/5.6.5: + /csv-stringify@5.6.5: resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} dev: true - /csv/5.5.3: + /csv@5.5.3: resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} engines: {node: '>= 0.1.90'} dependencies: @@ -1156,7 +1178,7 @@ packages: stream-transform: 2.1.3 dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1168,7 +1190,7 @@ packages: ms: 2.1.2 dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -1176,23 +1198,23 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /deepmerge/4.3.0: + /deepmerge@4.3.0: resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} engines: {node: '>=0.10.0'} dev: true - /defaults/1.0.4: + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -1200,27 +1222,27 @@ packages: object-keys: 1.1.1 dev: true - /defu/6.1.2: + /defu@6.1.2: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /editorconfig/0.15.3: + /editorconfig@0.15.3: resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} hasBin: true dependencies: @@ -1230,32 +1252,32 @@ packages: sigmund: 1.0.1 dev: true - /electron-to-chromium/1.4.315: + /electron-to-chromium@1.4.315: resolution: {integrity: sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.1: + /es-abstract@1.21.1: resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: @@ -1294,7 +1316,7 @@ packages: which-typed-array: 1.1.9 dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -1303,13 +1325,13 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-shim-unscopables/1.0.0: + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -1318,7 +1340,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild/0.17.10: + /esbuild@0.17.10: resolution: {integrity: sha512-n7V3v29IuZy5qgxx25TKJrEm0FHghAlS6QweUcyIgh/U0zYmQcvogWROitrTyZId1mHSkuhhuyEXtI9OXioq7A==} engines: {node: '>=12'} hasBin: true @@ -1348,31 +1370,31 @@ packages: '@esbuild/win32-x64': 0.17.10 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /extendable-error/0.1.7: + /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -1381,7 +1403,7 @@ packages: tmp: 0.0.33 dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -1392,20 +1414,20 @@ packages: micromatch: 4.0.5 dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -1413,7 +1435,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -1421,20 +1443,20 @@ packages: path-exists: 4.0.0 dev: true - /find-yarn-workspace-root2/1.2.16: + /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 dev: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /fs-extra/11.1.0: + /fs-extra@11.1.0: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} dependencies: @@ -1443,7 +1465,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/7.0.1: + /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -1452,7 +1474,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -1461,11 +1483,11 @@ packages: universalify: 0.1.2 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1473,11 +1495,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -1487,21 +1509,21 @@ packages: functions-have-names: 1.2.3 dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /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: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -1509,7 +1531,7 @@ packages: has-symbols: 1.0.3 dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -1517,14 +1539,14 @@ packages: get-intrinsic: 1.2.0 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob/8.1.0: + /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} dependencies: @@ -1535,19 +1557,19 @@ packages: once: 1.4.0 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -1559,7 +1581,7 @@ packages: slash: 3.0.0 dev: true - /globby/13.1.3: + /globby@13.1.3: resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -1570,110 +1592,110 @@ packages: slash: 4.0.0 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /hookable/5.4.2: + /hookable@5.4.2: resolution: {integrity: sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==} dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /human-id/1.0.2: + /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -1682,7 +1704,7 @@ packages: side-channel: 1.0.4 dev: true - /is-array-buffer/3.0.1: + /is-array-buffer@3.0.1: resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} dependencies: call-bind: 1.0.2 @@ -1690,17 +1712,17 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -1708,88 +1730,88 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-builtin-module/3.2.1: + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-ci/3.0.1: + /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.8.0 dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-reference/1.2.1: + /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: '@types/estree': 1.0.0 dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -1797,34 +1819,34 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-subdir/1.2.0: + /is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} dependencies: better-path-resolve: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -1835,41 +1857,42 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported/1.3.0: + /is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jiti/1.17.0: + /jiti@1.17.0: resolution: {integrity: sha512-CByzPgFqYoB9odEeef7GNmQ3S5THIBOtzRYoSCya2Sv27AuQxy2jgoFjQ6VTF53xsq1MXRm+YWNvOoDHUAteOw==} hasBin: true dev: true - /jiti/1.17.1: + /jiti@1.17.1: resolution: {integrity: sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==} hasBin: true dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + requiresBuild: true dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -1877,33 +1900,33 @@ packages: esprima: 4.0.1 dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -1911,21 +1934,21 @@ packages: graceful-fs: 4.2.10 dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur/4.1.5: + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /load-yaml-file/0.2.0: + /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} dependencies: @@ -1935,62 +1958,62 @@ packages: strip-bom: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.startcase/4.4.0: + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true - /lru-cache/4.1.5: + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /magic-string/0.27.0: + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.29.0: + /magic-string@0.29.0: resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /meow/6.1.1: + /meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} dependencies: @@ -2007,12 +2030,12 @@ packages: yargs-parser: 18.1.3 dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -2020,19 +2043,19 @@ packages: picomatch: 2.3.1 dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimatch/5.1.6: + /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -2041,18 +2064,18 @@ packages: kind-of: 6.0.3 dev: true - /mixme/0.5.5: + /mixme@0.5.5: resolution: {integrity: sha512-/6IupbRx32s7jjEwHcycXikJwFD5UujbVNuJFkeKLYje+92OvtuPniF6JhnFm5JCTDUhS+kYK3W/4BWYQYXz7w==} engines: {node: '>= 8.0.0'} dev: true - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mkdist/1.1.1_typescript@4.9.5: + /mkdist@1.1.1(typescript@4.9.5): resolution: {integrity: sha512-9cEzCsBD0qpybR/lJMB0vRIDZiHP7hJHTN2mQtFU2qt0vr7lFnghxersOJbKLshaDsl4GlnY2OBzmRRUTfuaDg==} hasBin: true peerDependencies: @@ -2074,7 +2097,7 @@ packages: typescript: 4.9.5 dev: true - /mlly/1.1.1: + /mlly@1.1.1: resolution: {integrity: sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==} dependencies: acorn: 8.8.2 @@ -2083,20 +2106,20 @@ packages: ufo: 1.1.1 dev: true - /mri/1.2.0: + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -2105,16 +2128,16 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -2124,13 +2147,13 @@ packages: object-keys: 1.1.1 dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /organize-imports-cli/0.10.0: + /organize-imports-cli@0.10.0: resolution: {integrity: sha512-cVyNEeiDxX/zA6gdK1QS2rr3TK1VymIkT0LagnAk4f6eE0IC0bo3BeUkMzm3q3GnCJzYC+6lfuMpBE0Cequ7Vg==} hasBin: true dependencies: @@ -2140,61 +2163,61 @@ packages: tsconfig: 7.0.0 dev: true - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} dev: true - /outdent/0.5.0: + /outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: true - /p-filter/2.1.0: + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} dependencies: p-map: 2.1.0 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -2204,49 +2227,49 @@ packages: lines-and-columns: 1.2.4 dev: true - /path-browserify/1.0.1: + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /pathe/1.1.0: + /pathe@1.1.0: resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /pkg-types/1.0.2: + /pkg-types@1.0.2: resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: jsonc-parser: 3.2.0 @@ -2254,7 +2277,7 @@ packages: pathe: 1.1.0 dev: true - /preferred-pm/3.0.3: + /preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} engines: {node: '>=10'} dependencies: @@ -2264,31 +2287,31 @@ packages: which-pm: 2.0.0 dev: true - /prettier/2.8.4: + /prettier@2.8.4: resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-bytes/6.1.0: + /pretty-bytes@6.1.0: resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==} engines: {node: ^14.13.1 || >=16.0.0} dev: true - /pseudomap/1.0.2: + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -2297,7 +2320,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -2307,7 +2330,7 @@ packages: type-fest: 0.6.0 dev: true - /read-yaml-file/1.1.0: + /read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} dependencies: @@ -2317,7 +2340,7 @@ packages: strip-bom: 3.0.0 dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -2325,11 +2348,11 @@ packages: strip-indent: 3.0.0 dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -2338,21 +2361,21 @@ packages: functions-have-names: 1.2.3 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -2361,12 +2384,12 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rollup-plugin-dts/5.2.0_fn2onl6nbsljlgjr3jlzr6w7we: + /rollup-plugin-dts@5.2.0(rollup@3.18.0)(typescript@4.9.5): resolution: {integrity: sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w==} engines: {node: '>=v14'} peerDependencies: @@ -2380,7 +2403,7 @@ packages: '@babel/code-frame': 7.18.6 dev: true - /rollup/3.18.0: + /rollup@3.18.0: resolution: {integrity: sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -2388,13 +2411,13 @@ packages: fsevents: 2.3.2 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -2402,41 +2425,41 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /scule/1.0.0: + /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -2444,29 +2467,29 @@ packages: object-inspect: 1.12.3 dev: true - /sigmund/1.0.1: + /sigmund@1.0.1: resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slash/4.0.0: + /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} dev: true - /smartwrap/2.0.2: + /smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} hasBin: true @@ -2479,46 +2502,46 @@ packages: yargs: 15.4.1 dev: true - /spawndamnit/2.0.0: + /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 dev: true - /spdx-correct/3.1.1: + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.12 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.12 dev: true - /spdx-license-ids/3.0.12: + /spdx-license-ids@3.0.12: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stream-transform/2.1.3: + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: mixme: 0.5.5 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -2527,7 +2550,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -2536,7 +2559,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -2544,7 +2567,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -2552,93 +2575,93 @@ packages: es-abstract: 1.21.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: true - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /term-size/2.2.1: + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} dev: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-morph/15.1.0: + /ts-morph@15.1.0: resolution: {integrity: sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==} dependencies: '@ts-morph/common': 0.16.0 code-block-writer: 11.0.3 dev: true - /tsconfig/7.0.0: + /tsconfig@7.0.0: resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} dependencies: '@types/strip-bom': 3.0.0 @@ -2647,7 +2670,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /tty-table/4.1.6: + /tty-table@4.1.6: resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} engines: {node: '>=8.0.0'} hasBin: true @@ -2661,22 +2684,22 @@ packages: yargs: 17.6.2 dev: true - /type-fest/0.13.1: + /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} dev: true - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -2684,17 +2707,17 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /ufo/1.1.1: + /ufo@1.1.1: resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -2703,16 +2726,16 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unbuild/1.1.2: + /unbuild@1.1.2: resolution: {integrity: sha512-EK5LeABThyn5KbX0eo5c7xKRQhnHVxKN8/e5Y+YQEf4ZobJB6OZ766756wbVqzIY/G/MvAfLbc6EwFPdSNnlpA==} hasBin: true dependencies: - '@rollup/plugin-alias': 4.0.3_rollup@3.18.0 - '@rollup/plugin-commonjs': 24.0.1_rollup@3.18.0 - '@rollup/plugin-json': 6.0.0_rollup@3.18.0 - '@rollup/plugin-node-resolve': 15.0.1_rollup@3.18.0 - '@rollup/plugin-replace': 5.0.2_rollup@3.18.0 - '@rollup/pluginutils': 5.0.2_rollup@3.18.0 + '@rollup/plugin-alias': 4.0.3(rollup@3.18.0) + '@rollup/plugin-commonjs': 24.0.1(rollup@3.18.0) + '@rollup/plugin-json': 6.0.0(rollup@3.18.0) + '@rollup/plugin-node-resolve': 15.0.1(rollup@3.18.0) + '@rollup/plugin-replace': 5.0.2(rollup@3.18.0) + '@rollup/pluginutils': 5.0.2(rollup@3.18.0) chalk: 5.2.0 consola: 2.15.3 defu: 6.1.2 @@ -2721,14 +2744,14 @@ packages: hookable: 5.4.2 jiti: 1.17.1 magic-string: 0.29.0 - mkdist: 1.1.1_typescript@4.9.5 + mkdist: 1.1.1(typescript@4.9.5) mlly: 1.1.1 mri: 1.2.0 pathe: 1.1.0 pkg-types: 1.0.2 pretty-bytes: 6.1.0 rollup: 3.18.0 - rollup-plugin-dts: 5.2.0_fn2onl6nbsljlgjr3jlzr6w7we + rollup-plugin-dts: 5.2.0(rollup@3.18.0)(typescript@4.9.5) scule: 1.0.0 typescript: 4.9.5 untyped: 1.2.2 @@ -2737,17 +2760,17 @@ packages: - supports-color dev: true - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /untyped/1.2.2: + /untyped@1.2.2: resolution: {integrity: sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==} dependencies: '@babel/core': 7.21.0 @@ -2758,7 +2781,7 @@ packages: - supports-color dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -2769,20 +2792,20 @@ packages: picocolors: 1.0.0 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -2792,11 +2815,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-pm/2.0.0: + /which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} dependencies: @@ -2804,7 +2827,7 @@ packages: path-exists: 4.0.0 dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -2816,14 +2839,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -2832,7 +2855,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -2841,7 +2864,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/8.1.0: + /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} dependencies: @@ -2850,28 +2873,28 @@ packages: strip-ansi: 7.0.1 dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true - /yallist/2.1.2: + /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yargs-parser/18.1.3: + /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} dependencies: @@ -2879,12 +2902,12 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: true - /yargs/15.4.1: + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} dependencies: @@ -2901,7 +2924,7 @@ packages: yargs-parser: 18.1.3 dev: true - /yargs/17.6.2: + /yargs@17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} dependencies: @@ -2914,7 +2937,7 @@ packages: yargs-parser: 21.1.1 dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true From c9e30431bf0ad78a963b3fc258d42cc5aa11aa8f Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Tue, 29 Aug 2023 16:32:15 -0300 Subject: [PATCH 17/24] refactor: prevent error on file root --- packages/core/src/prompts/path.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 35c341e2..f0e9c8fd 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -1,4 +1,4 @@ -import { existsSync, readdirSync } from 'node:fs'; +import { existsSync, readdirSync, statSync } from 'node:fs'; import { resolve } from 'node:path'; import Prompt, { PromptOptions } from './prompt'; import color from 'picocolors'; @@ -98,12 +98,12 @@ export default class PathPrompt extends Prompt { const pathEnd = this.value.replace(/.*\/(.*)$/, '$1'); let options: string[] = []; - if (existsSync(root)) { + if (statSync(root, { throwIfNoEntry: false })?.isDirectory()) { options = this.mapDir(root).map((node) => node.name); } const option = options.find((opt) => opt.startsWith(pathEnd)) ?? ''; - this.hint = option.replace(pathEnd, '') ?? ''; + this.hint = option.replace(pathEnd, ''); } private _changeInputValue(): void { From b2c639c39310f19cf01cae12fdf4f0cb82ab257b Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Tue, 29 Aug 2023 16:45:52 -0300 Subject: [PATCH 18/24] chore: update docs --- examples/basic/file-selection.ts | 6 +++--- packages/prompts/README.md | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/examples/basic/file-selection.ts b/examples/basic/file-selection.ts index e07d15a0..f7a2c77d 100644 --- a/examples/basic/file-selection.ts +++ b/examples/basic/file-selection.ts @@ -3,7 +3,7 @@ import * as p from '@clack/prompts'; (async () => { const selectResult = await p.path({ type: 'select', - message: 'Pick a file:', + message: 'Pick a file with select component:', initialValue: process.cwd(), onlyShowDir: false, maxItems: 15, @@ -15,12 +15,12 @@ import * as p from '@clack/prompts'; const inputResult = await p.path({ type: 'text', - message: 'Pick a file:', + message: 'Pick other file with input component:', onlyShowDir: false, placeholder: process.cwd(), }); if (p.isCancel(inputResult)) { - p.cancel('File selection canceled'); + p.cancel('File input canceled'); process.exit(0); } diff --git a/packages/prompts/README.md b/packages/prompts/README.md index 78da3544..5c990879 100644 --- a/packages/prompts/README.md +++ b/packages/prompts/README.md @@ -110,19 +110,39 @@ const additionalTools = await multiselect({ ### Path -The `path` component allows a user navigate thought directories and select the desired file/folder. The result is the absolute path of the selected item. +The `path` component allows user to select a file/folder using one of two approaches: + +#### Select: +Selecting the desired file/folder using arrow keys to navigate through directories. ```js import { path } from '@clack/prompts'; const projectPath = await path({ + type: 'select', message: 'Pick a project:', - initialValue: process.cwd() // current working dir, + initialValue: process.cwd(), // current working dir, onlyShowDir: true, maxItems: 12 }); ``` + +#### Text: +Typing the path with built-in autosuggestion and autocomplete features. + +```js +import { path } from '@clack/prompts'; + +const projectPath = await path({ + type: 'text', + message: 'Pick a project:', + initialValue: process.cwd(), // current working dir, + placeholder: './app', + onlyShowDir: true, +}); +``` + ### Spinner The `spinner` component surfaces a pending action, such as a long-running download or dependency installation. From b118f43cf65be2a2cacb3f8d0d176f1fdd4a4b5a Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Tue, 29 Aug 2023 17:05:16 -0300 Subject: [PATCH 19/24] feat: path validate --- packages/core/src/prompts/path.ts | 6 +++--- packages/prompts/README.md | 5 +++-- packages/prompts/src/index.ts | 10 +++++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index f0e9c8fd..9f246d6b 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -1,7 +1,7 @@ -import { existsSync, readdirSync, statSync } from 'node:fs'; +import { readdirSync, statSync } from 'node:fs'; import { resolve } from 'node:path'; -import Prompt, { PromptOptions } from './prompt'; import color from 'picocolors'; +import Prompt, { PromptOptions } from './prompt'; interface PathNode { name: string; @@ -234,7 +234,7 @@ export default class PathPrompt extends Prompt { }); this.on('finalize', () => { - this.value = resolve(this.value); + this.value = this.value ? resolve(this.value) : ''; }); } } diff --git a/packages/prompts/README.md b/packages/prompts/README.md index 5c990879..d927cba2 100644 --- a/packages/prompts/README.md +++ b/packages/prompts/README.md @@ -113,6 +113,7 @@ const additionalTools = await multiselect({ The `path` component allows user to select a file/folder using one of two approaches: #### Select: + Selecting the desired file/folder using arrow keys to navigate through directories. ```js @@ -123,12 +124,12 @@ const projectPath = await path({ message: 'Pick a project:', initialValue: process.cwd(), // current working dir, onlyShowDir: true, - maxItems: 12 + maxItems: 12, }); ``` - #### Text: + Typing the path with built-in autosuggestion and autocomplete features. ```js diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index b2147b42..3e63d390 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,7 +9,7 @@ import { SelectKeyPrompt, SelectPrompt, State, - TextPrompt, + TextPrompt } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; @@ -225,6 +225,7 @@ export type PathOptions = { | { type: 'text'; placeholder?: string; + validate?: (value: string) => string | void; } | { type: 'select'; @@ -251,6 +252,7 @@ export const path = (opts: PathOptions) => { initialValue: opts.initialValue, onlyShowDir: opts.onlyShowDir, placeholder: 'placeholder' in opts ? opts.placeholder : '', + validate: 'validate' in opts ? opts.validate : undefined, render() { const option = this.option; const map = (node: PathNode, index: number = 0, depth: number = 0): string => { @@ -276,6 +278,12 @@ export const path = (opts: PathOptions) => { S_BAR )}`, ].join('\n'); + case 'error': + return [ + title, + `${color.yellow(S_BAR)} ${this.value}`, + `${color.yellow(S_BAR_END)} ${color.yellow(this.error)}\n`, + ].join('\n'); default: if (opts.type === 'select') { return [ From 5487280647319e408baeb45b33a4234ed95b48f9 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Fri, 3 Nov 2023 18:11:40 -0300 Subject: [PATCH 20/24] feat: shell like input --- packages/core/src/prompts/path.ts | 96 +++++++++++++++++++++---------- packages/prompts/src/index.ts | 6 +- 2 files changed, 71 insertions(+), 31 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 9f246d6b..4c4a9441 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -29,8 +29,10 @@ export default class PathPrompt extends Prompt { public readonly onlyShowDir: boolean; public root: PathNode; public hint: string; + public hintOptions: string[]; public valueWithHint: string; + private _hintIndex: number; private _cursorMap: number[]; public get option() { @@ -77,7 +79,7 @@ export default class PathPrompt extends Prompt { return options; } - private get _selectValue(): string { + private get _selectedValue(): string { const value: string[] = []; let option: PathNode = this.root; for (const index of this._cursorMap) { @@ -90,51 +92,85 @@ export default class PathPrompt extends Prompt { } private _changeSelectValue(): void { - this.value = this._selectValue; + this.value = this._selectedValue; } - private _changeHint(): void { - const root = resolve(this.value.replace(/^(.*\/).*/, '$1')); - const pathEnd = this.value.replace(/.*\/(.*)$/, '$1'); + private get _valueDir(): string { + return this.value.replace(/^(.*)\/.*/, '$1').replace(/\s+$/, ''); + } - let options: string[] = []; - if (statSync(root, { throwIfNoEntry: false })?.isDirectory()) { - options = this.mapDir(root).map((node) => node.name); - } - const option = options.find((opt) => opt.startsWith(pathEnd)) ?? ''; + private get _valueEnd(): string { + return this.value.replace(/.*\/(.*)$/, '$1'); + } - this.hint = option.replace(pathEnd, ''); + private get _hintOptions(): string[] { + return statSync(this._valueDir, { throwIfNoEntry: false })?.isDirectory() + ? this._mapDir(this._valueDir) + .filter((node) => node.name.startsWith(this._valueEnd)) + .map((node) => node.name) + : []; + } + + private _changeInputHint(): void { + const hintOption = this._hintOptions[0] ?? ''; + this.hintOptions = []; + this.hint = hintOption.replace(this._valueEnd, ''); } private _changeInputValue(): void { - this._changeHint(); + let value: string; + let hint: string; + const cursor = color.inverse(color.hidden('_')); if (this.cursor >= this.value.length) { - this.valueWithHint = `${this.value}${color.inverse(this.hint.charAt(0))}${color.dim( - this.hint.slice(1) - )}`; + value = this.value; + hint = this.hint + ? `${color.inverse(this.hint.charAt(0))}${color.dim(this.hint.slice(1))}` + : cursor; } else { const s1 = this.value.slice(0, this.cursor); const s2 = this.value.slice(this.cursor); - this.valueWithHint = `${s1}${color.inverse(s2[0])}${s2.slice(1)}${color.dim(this.hint)}`; - } - if (!this.hint) { - this.valueWithHint += color.inverse(color.hidden('_')); + value = `${s1}${color.inverse(s2[0])}${s2.slice(1)}`; + hint = color.dim(this.hint); } + this.valueWithHint = value + hint; } private _changeValue(): void { - this.type === 'select' ? this._changeSelectValue() : this._changeInputValue(); + if (this.type === 'select') { + this._changeSelectValue(); + } else { + this._changeInputHint(); + this._changeInputValue(); + } } private _autocomplete(): void { const complete = this.value ? this.hint : this.placeholder; this.value += complete; this._cursor = this.value.length; + this.hint = ''; + this.hintOptions = []; this.rl.write(complete); this._changeInputValue(); } - private mapDir(path: string): PathNode[] { + private _suggestAutocomplete(): void { + const hintOptions = this._hintOptions; + if (hintOptions.length <= 1) { + this._autocomplete(); + } else if (this.hintOptions.length) { + this.hint = this.hintOptions[this._hintIndex].replace(this._valueEnd, ''); + this._changeInputValue(); + if (++this._hintIndex >= this.hintOptions.length) { + this._hintIndex = 0; + } + } else { + this._hintIndex = 0; + this.hintOptions = hintOptions; + } + } + + private _mapDir(path: string): PathNode[] { return readdirSync(path, { withFileTypes: true }) .map((item) => ({ name: item.name, @@ -158,12 +194,14 @@ export default class PathPrompt extends Prompt { const cwd = opts.initialValue ?? process.cwd(); this.root = { name: cwd, - children: this.mapDir(cwd), + children: this._mapDir(cwd), }; // Text this.placeholder = opts.placeholder ?? ''; this.hint = ''; + this.hintOptions = []; + this._hintIndex = 0; this.valueWithHint = ''; this._changeValue(); @@ -190,7 +228,7 @@ export default class PathPrompt extends Prompt { break; case 'right': if (this.option.node.children) { - const children = this.mapDir(this._selectValue); + const children = this._mapDir(this._selectedValue); this.option.node.children = children; this._cursorMap = children.length ? [...this._cursorMap, 0] : this._cursorMap; } @@ -204,7 +242,7 @@ export default class PathPrompt extends Prompt { const cwd = resolve(this.root.name, '..'); this.root = { name: cwd, - children: this.mapDir(cwd), + children: this._mapDir(cwd), }; } break; @@ -224,15 +262,13 @@ export default class PathPrompt extends Prompt { if (this.type !== 'text') return; if (key === '\t') { - this._autocomplete(); + this._suggestAutocomplete(); + } else { + this._changeInputHint(); + this._changeInputValue(); } }); - this.on('value', () => { - if (this.type !== 'text') return; - this._changeInputValue(); - }); - this.on('finalize', () => { this.value = this.value ? resolve(this.value) : ''; }); diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 3e63d390..bd2d7de9 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -306,8 +306,12 @@ export const path = (opts: PathOptions) => { return [ title, `${color.cyan(S_BAR)} ${this.value ? this.valueWithHint : placeholder}`, + this.hintOptions.length && + `${color.cyan(S_BAR)} ${this.hintOptions.slice(0, 10).map(color.dim).join(' ')}`, color.cyan(S_BAR_END), - ].join('\n'); + ] + .filter(Boolean) + .join('\n'); } }, }).prompt(); From ec70704de1e7d99423c098529a8450eb9664ba8d Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 9 Nov 2023 15:14:15 -0300 Subject: [PATCH 21/24] feat: highlight current hint option --- packages/core/src/prompts/path.ts | 14 +++++++------- packages/prompts/src/index.ts | 7 +++++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 4c4a9441..6e4c25c7 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -31,8 +31,8 @@ export default class PathPrompt extends Prompt { public hint: string; public hintOptions: string[]; public valueWithHint: string; + public hintIndex: number; - private _hintIndex: number; private _cursorMap: number[]; public get option() { @@ -159,13 +159,13 @@ export default class PathPrompt extends Prompt { if (hintOptions.length <= 1) { this._autocomplete(); } else if (this.hintOptions.length) { - this.hint = this.hintOptions[this._hintIndex].replace(this._valueEnd, ''); - this._changeInputValue(); - if (++this._hintIndex >= this.hintOptions.length) { - this._hintIndex = 0; + if (++this.hintIndex >= this.hintOptions.length) { + this.hintIndex = 0; } + this.hint = this.hintOptions[this.hintIndex].replace(this._valueEnd, ''); + this._changeInputValue(); } else { - this._hintIndex = 0; + this.hintIndex = -1; this.hintOptions = hintOptions; } } @@ -201,7 +201,7 @@ export default class PathPrompt extends Prompt { this.placeholder = opts.placeholder ?? ''; this.hint = ''; this.hintOptions = []; - this._hintIndex = 0; + this.hintIndex = -1; this.valueWithHint = ''; this._changeValue(); diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index bd2d7de9..499c7930 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -303,11 +303,14 @@ export const path = (opts: PathOptions) => { ? color.inverse(opts.placeholder[0]) + color.dim(opts.placeholder.slice(1)) : color.inverse(color.hidden('_')); + const hintOptions = this.hintOptions + .slice(0, 10) + .map((hint, index) => (index === this.hintIndex ? color.cyan(hint) : color.dim(hint))); + return [ title, `${color.cyan(S_BAR)} ${this.value ? this.valueWithHint : placeholder}`, - this.hintOptions.length && - `${color.cyan(S_BAR)} ${this.hintOptions.slice(0, 10).map(color.dim).join(' ')}`, + hintOptions.length ? `${color.cyan(S_BAR)} ${hintOptions.join(' ')}` : '', color.cyan(S_BAR_END), ] .filter(Boolean) From 3f1db88eff00aa7d6f35fa31ee886cc1d77ace19 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 9 Nov 2023 15:21:20 -0300 Subject: [PATCH 22/24] feat: maxHintOptions param --- packages/core/src/prompts/path.ts | 5 +++++ packages/prompts/src/index.ts | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 6e4c25c7..b741c9ac 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -20,6 +20,7 @@ type PathOptions = PromptOptions & | { type: 'select'; onlyShowDir?: boolean; + maxHintOptions?: number; } ); @@ -34,6 +35,7 @@ export default class PathPrompt extends Prompt { public hintIndex: number; private _cursorMap: number[]; + private _maxHintOptions: number; public get option() { let aux: PathNode = this.root; @@ -107,6 +109,7 @@ export default class PathPrompt extends Prompt { return statSync(this._valueDir, { throwIfNoEntry: false })?.isDirectory() ? this._mapDir(this._valueDir) .filter((node) => node.name.startsWith(this._valueEnd)) + .slice(0, this._maxHintOptions) .map((node) => node.name) : []; } @@ -202,6 +205,8 @@ export default class PathPrompt extends Prompt { this.hint = ''; this.hintOptions = []; this.hintIndex = -1; + this._maxHintOptions = + 'maxHintOptions' in opts && opts.maxHintOptions ? opts.maxHintOptions : Infinity; this.valueWithHint = ''; this._changeValue(); diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 499c7930..b54c3fa7 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,7 +9,7 @@ import { SelectKeyPrompt, SelectPrompt, State, - TextPrompt + TextPrompt, } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; @@ -251,6 +251,7 @@ export const path = (opts: PathOptions) => { type: opts.type, initialValue: opts.initialValue, onlyShowDir: opts.onlyShowDir, + maxHintOptions: 10, placeholder: 'placeholder' in opts ? opts.placeholder : '', validate: 'validate' in opts ? opts.validate : undefined, render() { @@ -303,9 +304,9 @@ export const path = (opts: PathOptions) => { ? color.inverse(opts.placeholder[0]) + color.dim(opts.placeholder.slice(1)) : color.inverse(color.hidden('_')); - const hintOptions = this.hintOptions - .slice(0, 10) - .map((hint, index) => (index === this.hintIndex ? color.cyan(hint) : color.dim(hint))); + const hintOptions = this.hintOptions.map((hint, index) => + index === this.hintIndex ? color.cyan(hint) : color.dim(hint) + ); return [ title, From dec422fc353a964eb0dcc010541136f41fd11460 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Thu, 9 Nov 2023 15:34:19 -0300 Subject: [PATCH 23/24] feat: reverse hint option selection --- packages/core/src/prompts/path.ts | 14 +++++++++----- packages/core/src/prompts/prompt.ts | 4 ++-- packages/core/src/prompts/select-key.ts | 6 +++--- packages/prompts/src/index.ts | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index b741c9ac..835ddc47 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -1,5 +1,6 @@ import { readdirSync, statSync } from 'node:fs'; import { resolve } from 'node:path'; +import { Key } from 'node:readline'; import color from 'picocolors'; import Prompt, { PromptOptions } from './prompt'; @@ -157,13 +158,16 @@ export default class PathPrompt extends Prompt { this._changeInputValue(); } - private _suggestAutocomplete(): void { + private _suggestAutocomplete(step: number): void { const hintOptions = this._hintOptions; if (hintOptions.length <= 1) { this._autocomplete(); } else if (this.hintOptions.length) { - if (++this.hintIndex >= this.hintOptions.length) { + this.hintIndex += step; + if (this.hintIndex >= this.hintOptions.length) { this.hintIndex = 0; + } else if (this.hintIndex < 0) { + this.hintIndex = this.hintOptions.length - 1; } this.hint = this.hintOptions[this.hintIndex].replace(this._valueEnd, ''); this._changeInputValue(); @@ -263,11 +267,11 @@ export default class PathPrompt extends Prompt { } }); - this.on('key', (key) => { + this.on('key', (char: string, key: Key) => { if (this.type !== 'text') return; - if (key === '\t') { - this._suggestAutocomplete(); + if (key.name === 'tab') { + this._suggestAutocomplete(key.shift ? -1 : 1); } else { this._changeInputHint(); this._changeInputValue(); diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index d8e44454..7ded94ab 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -172,8 +172,8 @@ export default class Prompt { this.emit('value', this.opts.placeholder); } } - if (char) { - this.emit('key', char.toLowerCase()); + if (char || key) { + this.emit('key', char?.toLowerCase(), key); } if (key?.name === 'return') { diff --git a/packages/core/src/prompts/select-key.ts b/packages/core/src/prompts/select-key.ts index daacfbb0..cc797172 100644 --- a/packages/core/src/prompts/select-key.ts +++ b/packages/core/src/prompts/select-key.ts @@ -14,9 +14,9 @@ export default class SelectKeyPrompt extends Prompt { const keys = this.options.map(({ value: [initial] }) => initial?.toLowerCase()); this.cursor = Math.max(keys.indexOf(opts.initialValue), 0); - this.on('key', (key) => { - if (!keys.includes(key)) return; - const value = this.options.find(({ value: [initial] }) => initial?.toLowerCase() === key); + this.on('key', (char) => { + if (!keys.includes(char)) return; + const value = this.options.find(({ value: [initial] }) => initial?.toLowerCase() === char); if (value) { this.value = value.value; this.state = 'submit'; diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index b54c3fa7..1102f289 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -9,7 +9,7 @@ import { SelectKeyPrompt, SelectPrompt, State, - TextPrompt, + TextPrompt } from '@clack/core'; import isUnicodeSupported from 'is-unicode-supported'; import color from 'picocolors'; From 8c854c104e2f4d4e7e9d850f5b3c0b2375d054b0 Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Fri, 10 Nov 2023 10:00:27 -0300 Subject: [PATCH 24/24] feat: indentify directories on hintOptions --- packages/core/src/prompts/path.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/prompts/path.ts b/packages/core/src/prompts/path.ts index 835ddc47..85cb66a1 100644 --- a/packages/core/src/prompts/path.ts +++ b/packages/core/src/prompts/path.ts @@ -111,7 +111,7 @@ export default class PathPrompt extends Prompt { ? this._mapDir(this._valueDir) .filter((node) => node.name.startsWith(this._valueEnd)) .slice(0, this._maxHintOptions) - .map((node) => node.name) + .map((node) => node.name + (!!node.children ? '/' : '')) : []; }