diff --git a/packages/test-acts/.eslintrc.cjs b/packages/test-acts/.eslintrc.cjs new file mode 100644 index 0000000..986818e --- /dev/null +++ b/packages/test-acts/.eslintrc.cjs @@ -0,0 +1,38 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + ], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint", + ], + "rules": { + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "off", + }, + "settings": { + + } +} diff --git a/packages/test-acts/README.md b/packages/test-acts/README.md index 9455b38..80a894b 100644 --- a/packages/test-acts/README.md +++ b/packages/test-acts/README.md @@ -1,4 +1,6 @@ -# Test Acts +# Cantos: Write Better Tests + +Or, the poor men's Homer. Test Acts is a minimalistic, framework-agnostic, typesafe, and lightweight (~3kb) test planner to support your TDD ( Test-driven Development) and BDD (Behavior-driven Development) workflows. @@ -63,8 +65,13 @@ import {A} from 'test-acts' ## Examples +### Use satisfies to get intellisense for UserAct +```ts + +``` +- It works great with CoPilot because it has a clear structure to infer from. ## Glossary diff --git a/packages/test-acts/package.json b/packages/test-acts/package.json index 6810a1a..d49ad10 100644 --- a/packages/test-acts/package.json +++ b/packages/test-acts/package.json @@ -26,16 +26,25 @@ "devDependencies": { "@types/node": "^20.9.0", "@types/uuid": "^9.0.7", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "@vitest/coverage-v8": "^0.34.6", "@vitest/ui": "^1.0.0-beta.4", + "eslint": "^8.53.0", "type-fest": "^4.7.1", - "typescript": "^5.0.2", + "typescript": "^5", "vite": "^4.4.5", "vite-plugin-dts": "^3.6.3", - "vitest": "^1.0.0-beta.4" + "vite-plugin-eslint": "^1.8.1", + "vitest": "^1.0.0-beta.4", + "yaml": "^2.3.4" }, "dependencies": { "mermaid": "^10.6.1", "uuid": "^9.0.1" - } + }, + "peerDependencies": { + "typescript": "^5" + }, + "license": "MIT" } diff --git a/packages/test-acts/src/act/interfaces.ts b/packages/test-acts/src/act/interfaces.ts new file mode 100644 index 0000000..7915988 --- /dev/null +++ b/packages/test-acts/src/act/interfaces.ts @@ -0,0 +1,107 @@ +import {Story, TestKind} from "@src/act/stories.ts"; +import {Genres} from "@src/act/story-kinds.ts"; +import {Scenes} from "@src/entrance.ts"; +import {IStoryScripts} from "@src/act/story-types.ts"; +import {StoryStatus} from "@src/act/status.ts"; +import {StoryOptions} from "@src/act/story-options.ts"; + +export interface Test { + /** + * The type of tests. + */ + kind: TestKind; + /** + * The condition when the test is considered done. + */ + doneWhen?: string; + /** + * The issues that this test it closes. + */ + closeIssues?: string[]; + +} +/** + * Bare Act is the base structure for any entity or behavior without methods or nested entities. + */ +export interface IStoryScript { + /** + * Description of the entity. + * + * @remarks + * This field is intended to be used as the description of a test. + * According to the actual type of entity, it should be worded accordingly. + * + * @example + * ```ts + * // For an entity, it should be worded as a noun. + * const aDogEntity = createEntity({ + * describe: "a dog", + * }) + * + * // For a behavior, it should be worded as a verb or an expectation. + * const shouldBark = createBehavior({ + * describe: "should bark", // alternatively: "barks", "can bark", "barking", etc. + * action: () => { + * // ... + * } + * }) + * ``` + */ + story: string; + /** + * Story-by-Story options that can override the global story options. + */ + options?: StoryOptions; + genre?: Genres; + tests?: Record + /** + * The name of a subject in this act. + * + * @remarks + * When used in full description of the act, the subject, if provided, will be inserted as the subject of the description. + */ + protagonist?: string; + parentPath?: string; + explain?: string; + /** + * The condition when the story is considered done. + */ + done?: string; + /** + * The current status of the story + */ + status?: StoryStatus | string; + lastUpdate?: string; + + priority?: number; + + context?: IStoryScript[]; + when?: IStoryScript[]; + then?: IStoryScript[]; + scenes?: IStoryScripts; + tellAs?: (fn: (entity: Story) => string) => string; +} + +export interface IStory extends IStoryScript { + scenes: Scenes; + readonly testId: () => string; + path: () => string; + nextActToDo: () => Story | undefined; + + /** + * Simply tell the story, using teller preference {@link StoryTellingOptions} to decide whether to tell the short or long version. + */ + tell: () => string; + + /** + * Tell the shorter version of the story using the story text. + */ + short: () => string; + /** + * Tell the longer version of the story using the `contexts`, `when`, and `then`, in the form of, for example, `Given ... When ... Then ...`. + * + * @remarks + * If a long description is not provided, it will fallback to the short version. + */ + long: () => string; +} diff --git a/packages/test-acts/src/act/status.ts b/packages/test-acts/src/act/status.ts new file mode 100644 index 0000000..b215578 --- /dev/null +++ b/packages/test-acts/src/act/status.ts @@ -0,0 +1,9 @@ +export enum StoryStatus { + NO_STATUS = 'NO_STATUS', + BACKLOG = 'BACKLOG', + DESIGN = 'DESIGN', + IN_PROGRESS = 'IN_PROGRESS', + REVIEW = 'REVIEW', + DONE = 'DONE', + ARCHIVED = 'ARCHIVED', +} diff --git a/packages/test-acts/src/act/stories.ts b/packages/test-acts/src/act/stories.ts new file mode 100644 index 0000000..11b166b --- /dev/null +++ b/packages/test-acts/src/act/stories.ts @@ -0,0 +1,140 @@ +import {PartialDeep, ReadonlyDeep} from "type-fest"; +import {ACT_DEFAULT_DESCRIPTIONS} from "@src/consts.ts"; +import {Scenes} from "@src/entrance.ts"; + +import {IStory, IStoryScript, Test} from "@src/act/interfaces.ts"; +import {Genres} from "@src/act/story-kinds.ts"; +import {getPath, populateActPath} from "@src/act/utils.ts"; +import {TestKind} from "@src/act/test-kinds.ts"; +import {printTag, printTestTags, tellStory} from "@src/act/storyteller.ts"; +import {IStoryScripts} from "@src/act/story-types.ts"; +import {NameList} from "@src/util-types.ts"; +import {StoryOptions, StoryVersion} from "@src/act/story-options.ts"; +import {StoryStatus} from "@src/act/status.ts"; + + +class StoryScript implements IStoryScript { + story: string = ACT_DEFAULT_DESCRIPTIONS.DEFAULT_NARRATIVE; + parentPath?: string | undefined; + genre?: Genres = Genres.ACT; + implemented?: boolean = false; + protagonist?: string = "it"; + explain?: string; + options?: StoryOptions; + + constructor( + entity: Partial, + opt?: StoryOptions, + ) { + if (opt?.defaultKind) { + this.genre = opt.defaultKind; + } + Object.assign(this, entity); + + + } +} + +export class Story extends StoryScript implements IStory { + options?: StoryOptions; + scenes: Scenes = {}; + context?: StoryScript[]; + when?: StoryScript[]; + then?: StoryScript[]; + status?: StoryStatus | string; + priority?: number; + + path = () => getPath(this.story, this.parentPath) + // get a getter to get test id + testId = this.path; + tellAs: (fn: (entity: Story) => string) => string; + + nextActToDo(): Story | undefined { + return undefined + } + + long = () => tellStory(this, StoryVersion.LONG); + + short = () => tellStory(this, StoryVersion.SHORT) + tell = () => tellStory(this, StoryVersion.NO_PREFERENCE); + + /** + * Tell the story but with test kinds as tag prefixes, e.g. `[UNIT] [E2E] Story` + * @param tests + */ + tellForTest = (tests: Test[]) => [printTestTags(tests), tellStory(this, StoryVersion.NO_PREFERENCE)].join(' '); + + /** + * Print test's kinds as tags, e.g. `[UNIT] [E2E]` + */ + printTestTags = (tests: Test[]) => printTestTags(tests); + + /** + * Print the story as a tag, e.g. `[STORY]` + * + */ + printAsTag = () => printTag(this.tell()); + + // Get the next act according to the priority and the implementation status of the act. + + + constructor( + entity: PartialDeep, + opt?: StoryOptions, + ) { + // if the provided story script has individual options set, use it to override the global options for this story + const storyOptions = entity.options || opt; + + super(entity, storyOptions); + Object.assign(this, entity); + + // store options + this.options = storyOptions; + + // populate entity + populateActPath(this); + + // Use describeAs function if provided + this.tellAs = (fn) => fn(this); + + } + + +} + +/** + * Type for acts created with user-defined act records. + * + * @remarks + * Represents an enhanced version of an `IActRecord` with additional methods from the `Act` class. + * This type recursively applies itself to each nested act within the `acts` property, ensuring that + * each nested act also receives the benefit of intellisense. + * + * The `acts` property is a mapped type that iterates over each key in the original `acts` property + * of the provided `IActRecord`. For each key, it checks if the corresponding value extends `IActRecord`. + * If it does, the type is recursively applied to this value, enhancing it with `Act` methods. + * If it does not extend `IActRecord`, the type for that key is set to `never`, indicating an invalid type. + * + * This approach allows the `UserAct` type to maintain the original structure of the `IActRecord`, + * including any nested acts, while also adding the methods and properties defined in the `Act` class. + * As a result, instances of `ActWithMethods` have both the data structure defined by their specific `IActRecord` + * implementation and the functionality provided by `Act`. + * + * @template T - A type extending `IActRecord` that represents the structure of the act record. + * This generic type allows `ActWithMethods` to be applied to any specific implementation + * of `IActRecord`, preserving its unique structure. + */ +export type UserStory = ReadonlyDeep & Story & { + scenes: { [K in keyof T['scenes']]: T['scenes'][K] extends IStoryScript ? ReadonlyDeep> : never }; +}; + +export type UserStories = ReadonlyDeep<{ [K in keyof T]: ReadonlyDeep> }>; + +export type UserNameList = ReadonlyDeep<{ + [K in keyof T]: ReadonlyDeep> +}>; + +export {TestKind}; + diff --git a/packages/test-acts/src/act/story-kinds.ts b/packages/test-acts/src/act/story-kinds.ts new file mode 100644 index 0000000..cbce61b --- /dev/null +++ b/packages/test-acts/src/act/story-kinds.ts @@ -0,0 +1,41 @@ + + + +/** + * Types for Act kinds. + */ +export enum GenreEntity { + ACT = "ACT", + ENTITY = "ENTITY", + BEHAVIOR = "BEHAVIOR", + DOMAIN = "DOMAIN", + BACKGROUND = "BACKGROUND", +} + + +export enum GenreGherkin { + SCENARIO = "SCENARIO", + GIVEN = "GIVEN", + WHEN = "WHEN", + THEN = "THEN", +} + +export enum GenreUserStory { + EPIC = "EPIC", + STORY = "STORY", + FEATURE = "FEAT", + STEP = "STEP", + AS_A_USER = "AS A USER", + I_WANT_TO = "I WANT TO", + SO_THAT = "SO THAT", +} + +export type GenreBDD = GenreGherkin | GenreUserStory; + +export const Genres = { + ...GenreEntity, + ...GenreGherkin, + ...GenreUserStory, +} + +export type Genres = GenreEntity | GenreBDD; diff --git a/packages/test-acts/src/act/story-options.ts b/packages/test-acts/src/act/story-options.ts new file mode 100644 index 0000000..f289cd3 --- /dev/null +++ b/packages/test-acts/src/act/story-options.ts @@ -0,0 +1,27 @@ +import {Genres} from "@src/act/story-kinds.ts"; + +export enum StoryVersion { + NO_PREFERENCE = "NO_PREFERENCE", + SHORT = "SHORT", + LONG = "LONG", +} + +export enum StoryTag { + Genre = "Genre", + Status = "Status", + Priority = "Priority", +} + +export interface StoryTellingOptions { + /** + * Whether to tell the story in short or long version when unspecified, i.e. when calling `tell()` + */ + prefer?: StoryVersion + tags?: StoryTag[] +} + +export interface StoryOptions { + defaultKind?: Genres + capitalizeKeywords?: boolean + teller?: StoryTellingOptions +} diff --git a/packages/test-acts/src/act/story-types.ts b/packages/test-acts/src/act/story-types.ts new file mode 100644 index 0000000..0c26b80 --- /dev/null +++ b/packages/test-acts/src/act/story-types.ts @@ -0,0 +1,14 @@ +import {IStoryScript} from "@src/act/interfaces.ts"; + +/** + * Export type alises for easier use for user-defined data. + */ +type IStoryScripts = Record; + +/** + * Type for used defined input data for an Act. + */ +type StoryScript = IStoryScript; + +export type {StoryScript, IStoryScripts} + diff --git a/packages/test-acts/src/act/storyteller.ts b/packages/test-acts/src/act/storyteller.ts new file mode 100644 index 0000000..e89751d --- /dev/null +++ b/packages/test-acts/src/act/storyteller.ts @@ -0,0 +1,134 @@ +import {StoryScript} from "@src/index.ts"; +import {ACT_DEFAULT_DESCRIPTIONS, GWT_DESCRIPTIONS, STORY_TELLER} from "@src/consts.ts"; +import {Story} from "@src/act/stories.ts"; +import {StoryTag, StoryVersion} from "@src/act/story-options.ts"; +import {Test} from "@src/act/interfaces.ts"; + +enum STATEMENT_TYPE { + GIVEN, + WHEN, + THEN, +} + +export const printTag = (tagText: string) => STORY_TELLER.LEFT_BRACKET + tagText.toUpperCase() + STORY_TELLER.RIGHT_BRACKET; + +export const printTags = (tags: string[]) => tags.map(tag => printTag(tag)).join(STORY_TELLER.SPACE); + +export const printTestTags = (tests: Test[]) => { + const tags = tests.map(test => test.kind); + return tags.length > 0 ? printTags(tags) : ''; +} + +function gatherTags(story: Story, tags: StoryTag[]): string { + const allTags: string [] = []; + + for (const tag of tags) { + let tagText = ''; + switch (tag) { + case StoryTag.Genre: + tagText = story.genre ? story.genre : ''; + break; + case StoryTag.Status: + tagText = story.status ? story.status : ''; + break; + case StoryTag.Priority: + tagText = story.priority ? story.priority.toString() : ''; + break; + } + + const tagTextTrimmed = tagText.trim(); + + if (tagTextTrimmed.length > 0) { + allTags.push(tagTextTrimmed); + + } + + } + + return allTags.length > 0 ? printTags(allTags) : ''; +} + +export function tellStory(story: Story, version: StoryVersion): string { + const opt = story.options; + let storyText = ''; + switch (version) { + case StoryVersion.SHORT: + storyText = story.story; + break; + case StoryVersion.LONG: + storyText = gatherAllActsStatements(story); + break; + // if no preference specified, use the option preference or default to short + case StoryVersion.NO_PREFERENCE: + default: + storyText = opt?.teller?.prefer === StoryVersion.LONG ? gatherAllActsStatements(story) : story.story; + break; + } + if (opt?.teller?.tags) { + storyText = gatherTags(story, opt?.teller?.tags) + STORY_TELLER.SPACE + storyText; + } + return storyText; + + +} + +export function getActStatements(acts: StoryScript[] | undefined, prefixType: STATEMENT_TYPE, actName?: string): string | undefined { + if (!acts) { + return undefined; + } + + const actsLength = acts.length; + if (actsLength === 0) { + return undefined; + } + + let prefix = ""; + switch (prefixType) { + case STATEMENT_TYPE.GIVEN: + prefix = GWT_DESCRIPTIONS.GIVEN + break; + case STATEMENT_TYPE.WHEN: + prefix = GWT_DESCRIPTIONS.WHEN + break; + case STATEMENT_TYPE.THEN: + prefix = GWT_DESCRIPTIONS.THEN + break; + default: + break; + } + + const statement = acts.map((given, index) => { + let statement = given.story.trim(); + // there are more than one given + if (actsLength > 1) { + // if it's not the first given, add a comma + statement = index === 0 ? statement : `, ${statement}`; + // if it's the second last given, add an "and" after the comma + statement = index === actsLength - 2 ? `${statement} and` : statement; + // if it's the last given, add a period after the comma + statement = index === actsLength - 1 ? `${statement}.` : statement; + } + return statement.trim(); + }).join(); + + return `${prefix.toLowerCase()} ${actName ? actName + ' ' : ''}${statement}`; +} + +export function gatherAllActsStatements(entity: Story): string { + const actName = entity.protagonist ?? ACT_DEFAULT_DESCRIPTIONS.DEFAULT_ACT_NAME; + const statements = [ + getActStatements(entity.context, STATEMENT_TYPE.GIVEN), + getActStatements(entity.when, STATEMENT_TYPE.WHEN), + getActStatements(entity.then, STATEMENT_TYPE.THEN, actName), + ] + + const collectedStatements = statements.filter(statement => statement).join(", ").trim(); + // if no collect statement or the statement is empty, fallback to description + if (!collectedStatements || collectedStatements === "") { + return entity.story; + } else { + // return with first letter capitalized + return collectedStatements.charAt(0).toUpperCase() + collectedStatements.slice(1); + } + +} diff --git a/packages/test-acts/src/act/test-kinds.ts b/packages/test-acts/src/act/test-kinds.ts new file mode 100644 index 0000000..bdaae27 --- /dev/null +++ b/packages/test-acts/src/act/test-kinds.ts @@ -0,0 +1,25 @@ +export enum TestKinds { + /** + * Quick and dirty way to determine whether something works at all. + */ + SMOKE = 'SMOKE', + /** + * Default kind for an Act. + */ + CORNER_CASE = 'CORNER', + UNIT = 'UNIT', + INTEGRATION = 'INTEGRATE', + END_TO_END = 'E2E', + PERFORMANCE = 'PERF', + REGRESSION = 'REGRESS', + SECURITY = 'SECURITY', + STRESS = 'STRESS', + ACCEPTANCE = 'ACCEPTANCE', +} + +export const TestKind = { + ...TestKinds, +} + +export type TestKind = TestKinds; + diff --git a/packages/test-acts/src/act/utils.ts b/packages/test-acts/src/act/utils.ts new file mode 100644 index 0000000..b5cb9c5 --- /dev/null +++ b/packages/test-acts/src/act/utils.ts @@ -0,0 +1,31 @@ +import {IStory} from "@src/act/interfaces.ts"; + +export function populatePath(entity: T, parentPath?: string): T { + // Add name to parentPath if any + return { + ...entity, + path: getPath(entity.story, parentPath), + } +} + + +export function populateActPath(actor: IStory): IStory { + const actorPath = actor.story; + // populate entity acts + for (const actKey in actor.scenes) { + actor.scenes[actKey] = populatePath(actor.scenes[actKey], actorPath); + } + return populatePath(actor); +} + + +/** + * Util classes + * @param entityDescribe + * @param parentPath + */ + +export function getPath(entityDescribe: string, parentPath: string | undefined): string { + return parentPath ? `${parentPath}.${entityDescribe}` : entityDescribe; +} + diff --git a/packages/test-acts/src/acts.ts b/packages/test-acts/src/acts.ts deleted file mode 100644 index e6b072d..0000000 --- a/packages/test-acts/src/acts.ts +++ /dev/null @@ -1,335 +0,0 @@ -import {PartialDeep, ReadonlyDeep} from "type-fest"; -import {ACTS, STATEMENTS} from "@src/consts.ts"; - - -/** - * Represents a collection of behaviors. - */ -export type Acts = Record; -export type ActRecords = Record; -export type PartialActs = Record>; - -export enum ActKindEntity { - ACT = "ACT", - ENTITY = "ENTITY", - BEHAVIOR = "BEHAVIOR", - // TODO: make sure all items under givens are all of this type. - FEATURE = "FEATURE", - DOMAIN = "DOMAIN", - BACKGROUND = "BACKGROUND", -} - - -export enum ActKindGherkin { - SCENARIO = "SCENARIO", - GIVEN = "GIVEN", - WHEN = "WHEN", - THEN = "THEN", -} - -export enum ActKindUserStory { - STORY = "STORY", - FEATURE = "FEATURE", - STEP = "STEP", - AS_A_USER = "AS_A_USER", - I_WANT_TO = "I_WANT_TO", - SO_THAT = "SO_THAT", -} - -export type ActKindBDD = ActKindGherkin | ActKindUserStory; - -export const ActKind = { - ...ActKindEntity, - ...ActKindGherkin, - ...ActKindUserStory, -} - -export type ActKind = ActKindEntity | ActKindBDD; - - -export enum TestKindTestType { - /** - * Quick and dirty way to determine whether something works at all. - */ - SMOKE, - /** - * Default kind for an Act. - */ - CORNER_CASE, - UNIT, - INTEGRATION, - END_TO_END, - PERFORMANCE, - REGRESSION, - SECURITY, - STRESS, - USABILITY, -} - -export const TestKind = { - ...TestKindTestType, -} - -export type TestKind = TestKindTestType; - - -/** - * Bare Act is the base structure for any entity or behavior without methods or nested entities. - */ -export interface IActRecord { - /** - * Description of the entity. - * - * @remarks - * This field is intended to be used as the description of a test. - * According to the actual type of entity, it should be worded accordingly. - * - * @example - * ```ts - * // For an entity, it should be worded as a noun. - * const aDogEntity = createEntity({ - * describe: "a dog", - * }) - * - * // For a behavior, it should be worded as a verb or an expectation. - * const shouldBark = createBehavior({ - * describe: "should bark", // alternatively: "barks", "can bark", "barking", etc. - * action: () => { - * // ... - * } - * }) - * ``` - */ - describe: string; - actKind?: ActKind; - testKind?: TestKind []; - /** - * Whether the act is already implemented. - * - * @default false - */ - implemented?: boolean; - /** - * The name of a subject in this act. - * - * @remarks - * When used in full description of the act, the subject, if provided, will be inserted as the subject of the description. - */ - subject?: string; - parentPath?: string; - explain?: string; - lastUpdate?: string; - - priority?: number; - - contexts?: IActRecord[]; - triggers?: IActRecord[]; - outcomes?: IActRecord[]; - acts?: ActRecords; -} - - -/** - * Represents the base structure for any event within the system. - */ -export interface IAct extends IActRecord { - acts: Acts; - readonly testId: () => string; - path: () => string; - nextActToDo: ( - ) => Act | undefined; -} - - -class ActRecord implements IActRecord { - describe: string = ACTS.BARE_ACT_DESCRIBE; - parentPath?: string | undefined; - actKind?: ActKind = ActKind.ACT; - testKind?: TestKind [] = []; - implemented?: boolean = false; - subject?: string = "it"; - explain?: string; - - constructor( - entity: Partial, - opt?: ActOptions, - ) { - if (opt?.defaultKind) { - this.actKind = opt.defaultKind; - } - Object.assign(this, entity); - } -} - -type ActType = Act; - -export type {ActType} - -class Act extends ActRecord implements IAct { - acts: Acts = {}; - contexts?: ActRecord[]; - triggers?: ActRecord[]; - outcomes?: ActRecord[]; - - path = () => getPath(this.describe, this.parentPath) - // get a getter to get test id - testId = this.path; - describeAs: (fn: (entity: Act) => string) => string; - - nextActToDo(): Act | undefined { - return undefined - } - - // Get the next act according to the priority and the implementation status of the act. - - - constructor( - entity: PartialDeep, - opt?: ActOptions, - ) { - super(entity, opt); - Object.assign(this, entity); - - // populate entity - populateActPath(this); - - // Use describeAs function if provided - this.describeAs = (fn) => fn(this); - } - - describeFully = () => gatherAllActsStatements(this); - - -} - - -enum STATEMENT_TYPE { - GIVEN, - WHEN, - THEN, -} - -function gatherAllActsStatements(entity: Act): string { - const actName = entity.subject ?? ACTS.DEFAULT_ACT_NAME; - const statements = [ - getActStatements(entity.contexts, STATEMENT_TYPE.GIVEN), - getActStatements(entity.triggers, STATEMENT_TYPE.WHEN), - getActStatements(entity.outcomes, STATEMENT_TYPE.THEN, actName), - ] - - const collectedStatements = statements.filter(statement => statement).join(", ").trim(); - // if no collect statement or the statement is empty, fallback to description - if (!collectedStatements || collectedStatements === "") { - return entity.describe; - } else { - // return with first letter capitalized - return collectedStatements.charAt(0).toUpperCase() + collectedStatements.slice(1); - } - -} - -function getActStatements(acts: ActRecord[] | undefined, prefixType: STATEMENT_TYPE, actName?: string): string | undefined { - if (!acts) { - return undefined; - } - - const actsLength = acts.length; - if (actsLength === 0) { - return undefined; - } - - let prefix = ""; - switch (prefixType) { - case STATEMENT_TYPE.GIVEN: - prefix = STATEMENTS.GIVEN - break; - case STATEMENT_TYPE.WHEN: - prefix = STATEMENTS.WHEN - break; - case STATEMENT_TYPE.THEN: - prefix = STATEMENTS.THEN - break; - default: - break; - } - - const statement = acts.map((given, index) => { - let statement = given.describe.trim(); - // there are more than one given - if (actsLength > 1) { - // if it's not the first given, add a comma - statement = index === 0 ? statement : `, ${statement}`; - // if it's the second last given, add an "and" after the comma - statement = index === actsLength - 2 ? `${statement} and` : statement; - // if it's the last given, add a period after the comma - statement = index === actsLength - 1 ? `${statement}.` : statement; - } - return statement.trim(); - }).join(); - - return `${prefix.toLowerCase()} ${actName ? actName + ' ' : ''}${statement}`; -} - -export function createActs(partialActs: T): ReadonlyDeep { - const acts: T = {} as T; - for (const actKey in partialActs) { - acts[actKey as keyof T] = new Act(partialActs[actKey]) as T[keyof T]; - } - return acts as ReadonlyDeep; -} - -function createActRecursive(partialAct: PartialDeep): T { - const act = new Act(partialAct); - for (const actKey in act.acts) { - act.acts[actKey] = createActRecursive(act.acts[actKey]); - } - return act as T; -} - -export interface ActOptions { - defaultKind?: ActKind - capitalizeKeywords?: boolean -} - -/** - * This function creates an Act from a PartialAct. - * @param partialEntity - The PartialAct to be converted into an Act. - * @param opt - Optional parameters. - * @returns A ReadonlyDeep Act. - */ -export function createAct(partialEntity: T, opt?: ActOptions): ReadonlyDeep { - const newAct = new Act(partialEntity, opt); - for (const actKey in newAct.acts) { - newAct.acts[actKey] = createActRecursive(newAct.acts[actKey]); - } - return newAct as ReadonlyDeep; -} - -function populateActPath(actor: IAct): IAct { - const actorPath = actor.describe; - // populate entity acts - for (const actKey in actor.acts) { - actor.acts[actKey] = populatePath(actor.acts[actKey], actorPath); - } - return populatePath(actor); -} - - -/** - * Util classes - * @param entityDescribe - * @param parentPath - */ - -function getPath(entityDescribe: string, parentPath: string | undefined): string { - return parentPath ? `${parentPath}.${entityDescribe}` : entityDescribe; -} - -function populatePath(entity: T, parentPath?: string): T { - // Add name to parentPath if any - return { - ...entity, - path: getPath(entity.describe, parentPath), - } -} - diff --git a/packages/test-acts/src/commons.ts b/packages/test-acts/src/commons.ts index 4e92788..7bd2426 100644 --- a/packages/test-acts/src/commons.ts +++ b/packages/test-acts/src/commons.ts @@ -1,18 +1,21 @@ -import {Acts, createActs} from "./acts.ts"; -import {COMMON_ACTS} from "@src/consts.ts"; +import {COMMON_TEST_DESCRIPTIONS, COMMON_TEST_TAGS} from "@src/consts.ts"; +import {IStoryScripts} from "@src/act/story-types.ts"; +import {loadList} from "@src/entrance.ts"; /** * */ -export const CommonActs = createActs({ - shouldWork: { - describe: COMMON_ACTS.SHOULD_WORK, - } -}); +export const CommonDescribe = loadList(COMMON_TEST_DESCRIPTIONS); -export const customizeCommonBehaviors = (behaviors: Partial) => { +export const CommonTest = loadList(COMMON_TEST_TAGS) + +export const customizeCommonTests = (behaviors: T) => { return { - ...CommonActs, + ...CommonDescribe, ...behaviors, } } + + + + diff --git a/packages/test-acts/src/consts.ts b/packages/test-acts/src/consts.ts index f9876bc..57a8f8b 100644 --- a/packages/test-acts/src/consts.ts +++ b/packages/test-acts/src/consts.ts @@ -1,14 +1,40 @@ -export const ACTS = { - BARE_ACT_DESCRIBE: "Bare Act", +import {TestKinds} from "@src/act/test-kinds.ts"; + +export const ACT_DEFAULT_DESCRIPTIONS = { + DEFAULT_NARRATIVE: "The story goes", DEFAULT_ACT_NAME: "it", } -export const STATEMENTS = { +export const STORY_TELLER = { + LEFT_BRACKET: "[", + RIGHT_BRACKET: "]", + SPACE : " ", +} + +export const GWT_DESCRIPTIONS = { GIVEN: "Given that", WHEN: "When", THEN: "Then", } -export const COMMON_ACTS = { +export const COMMON_TEST_DESCRIPTIONS = { SHOULD_WORK: "should work", + SHOULD_FAIL: "should fail", + SHOULD_BE_TRUTHY: "should be truthy", + SHOULD_BE_FALSY: "should be falsy", + SHOULD_RENDER: "should render", + SHOULD_NOT_RENDER: "should not render", + SHOULD_PROVIDE_RESULT: "should provide result", + SHOULD_NOT_PROVIDE_RESULT: "should not provide result", +} +export const COMMON_TEST_TAGS = { + INTEGRATION: TestKinds.INTEGRATION, + UNIT: TestKinds.UNIT, + SMOKE: TestKinds.SMOKE, + END_TO_END: TestKinds.END_TO_END, + PERFORMANCE: TestKinds.PERFORMANCE, + REGRESSION: TestKinds.REGRESSION, + SECURITY: TestKinds.SECURITY, + STRESS: TestKinds.STRESS, + } diff --git a/packages/test-acts/src/diagram.ts b/packages/test-acts/src/diagram.ts index 686b237..7605456 100644 --- a/packages/test-acts/src/diagram.ts +++ b/packages/test-acts/src/diagram.ts @@ -1,13 +1,13 @@ -import type { ActType} from "."; +import {Story} from "@src/act/stories.ts"; -export const drawEntity = (entity: ActType) : string => { +export const drawEntity = (entity: Story) : string => { let mermaidCode = `graph LR\n`; - mermaidCode += ` ${entity.describe.replace(/\s+/g, '_')}["${entity.describe}"]\n`; + mermaidCode += ` ${entity.story.replace(/\s+/g, '_')}["${entity.story}"]\n`; - for (const actKey in entity.acts) { - if (entity.acts.hasOwnProperty(actKey)) { - const act = entity.acts[actKey]; - mermaidCode += ` ${entity.describe.replace(/\s+/g, '_')} --> ${actKey.replace(/\s+/g, '_')}["${act.describe}"]\n`; + for (const actKey in entity.scenes) { + if (entity.scenes.hasOwnProperty(actKey)) { + const act = entity.scenes[actKey]; + mermaidCode += ` ${entity.story.replace(/\s+/g, '_')} --> ${actKey.replace(/\s+/g, '_')}["${act.story}"]\n`; } } diff --git a/packages/test-acts/src/entrance.ts b/packages/test-acts/src/entrance.ts new file mode 100644 index 0000000..106813c --- /dev/null +++ b/packages/test-acts/src/entrance.ts @@ -0,0 +1,60 @@ +// Utility function to map descriptions to act records +// Utility function to map descriptions to act records +import {NameList} from "@src/util-types.ts"; +import {Story, UserStory, UserStories, UserNameList} from "@src/act/stories.ts"; + +import {IStory, IStoryScript} from "@src/act/interfaces.ts"; +import {IStoryScripts} from "@src/act/story-types.ts"; +import {PartialDeep} from "type-fest"; +import {StoryOptions} from "@src/act/story-options.ts"; + +type StoryField = {story: string} +function mapNameList(tell: T): Record { + return Object.keys(tell).reduce((acc, key) => { + acc[key as keyof T] = {story: tell[key as keyof T]}; + return acc; + }, {} as Record); +} + +export function loadList(descriptions: T): UserNameList { + const result = mapNameList(descriptions); + return loadScriptRecord(result) as UserNameList; +} + +/** + * This function creates an Act from a PartialAct. + * @param partialEntity - The PartialAct to be converted into an Act. + * @param opt - Optional parameters. + * @returns A ReadonlyDeep Act. + */ +export function loadScript(partialEntity: T, opt?: StoryOptions): UserStory { + const newAct = new Story(partialEntity, opt); + for (const actKey in newAct.scenes) { + newAct.scenes[actKey] = instantiateStoriesRecursively(newAct.scenes[actKey]); + } + return newAct as UserStory; +} + +export function loadScriptRecord(actRecords: T): UserStories { + const acts = {} as { + [key in keyof T]: UserStory]> + }; + for (const actKey in actRecords) { + acts[actKey as keyof T] = loadScript(actRecords[actKey]) + } + return acts as UserStories; +} + +function instantiateStoriesRecursively(partialAct: PartialDeep): T { + const act = new Story(partialAct); + for (const actKey in act.scenes) { + act.scenes[actKey] = instantiateStoriesRecursively(act.scenes[actKey]); + } + return act as T; +} + +/** + * Types for Records. + */ +export type Scenes = Record; +// Export entrance methods diff --git a/packages/test-acts/src/index.ts b/packages/test-acts/src/index.ts index d95d59c..8a81c7c 100644 --- a/packages/test-acts/src/index.ts +++ b/packages/test-acts/src/index.ts @@ -1,11 +1,19 @@ -import {CommonActs, customizeCommonBehaviors} from "./commons" +import {UserStory} from "./act/stories.ts"; +import {StoryScript} from "@src/act/story-types.ts"; -// Export types -import type {ActType} from "./acts" -import * as Acts from "./acts" +// Re-export entrance methods +export * from "./entrance.ts"; + +// import and export entrance as Acts or A +import * as entrance from "./entrance.ts"; +import { CommonDescribe, CommonTest, customizeCommonTests } from "./commons.ts"; -export {CommonActs as CA, customizeCommonBehaviors, Acts, Acts as A} +export {entrance as Acts, entrance as A}; -export type {ActType} +// Export types +export type { StoryScript, UserStory,} + +// export Common Test helpers +export {CommonDescribe as CD, CommonTest as CT, CommonDescribe, CommonTest, customizeCommonTests} diff --git a/packages/test-acts/src/parser/yaml-parser.ts b/packages/test-acts/src/parser/yaml-parser.ts new file mode 100644 index 0000000..4d46036 --- /dev/null +++ b/packages/test-acts/src/parser/yaml-parser.ts @@ -0,0 +1,14 @@ +import YAML from 'yaml'; +import * as fs from "fs"; + +export const loadFile = (filePath: string) => { + return fs.readFileSync(filePath, 'utf-8'); +} + +export const parseYamlFile = (filePath: string) => { + return parseYaml(loadFile(filePath)); + +} +export const parseYaml = (yamlString: string) => { + return YAML.parse(yamlString); +} diff --git a/packages/test-acts/src/util-types.ts b/packages/test-acts/src/util-types.ts new file mode 100644 index 0000000..8ff237a --- /dev/null +++ b/packages/test-acts/src/util-types.ts @@ -0,0 +1 @@ +export type NameList = Record; diff --git a/packages/test-acts/tests/fixtures/act-fixture.ts b/packages/test-acts/tests/fixtures/act-fixture.ts deleted file mode 100644 index 241d2a3..0000000 --- a/packages/test-acts/tests/fixtures/act-fixture.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { createAct } from "@src/acts.ts" - -export const ActFixture = createAct({ - describe: "Act Test Fixture", - acts: { - describe: { - describe: "can be described as", - }, - describeAs: { - describe: "can be described as", - }, - DESCRIBE_FULLY_FALL_BACK: { - describe: "can fallback to description if no full statements are provided", - }, - describeFully: { - describe: "can be described fully", - contexts: [ - { - describe: "a given is provided" - } - ], - triggers: [ - { - describe: "asked to describe itself fully" - } - ], - outcomes: [ - { - describe: "should describe itself fully" - } - ] - } - } -}) - - diff --git a/packages/test-acts/tests/fixtures/common-acts-fixture.ts b/packages/test-acts/tests/fixtures/common-acts-fixture.ts index 8c3f411..37ff496 100644 --- a/packages/test-acts/tests/fixtures/common-acts-fixture.ts +++ b/packages/test-acts/tests/fixtures/common-acts-fixture.ts @@ -1,10 +1,10 @@ -import {Acts} from "@src/index.ts"; +import {loadScript} from "@src/entrance.ts"; -export const CommonActsFixture = Acts.createAct({ - describe: "Common Acts Fixture", - acts: { +export const CommonActsFixture = loadScript({ + story: "Common Acts Fixture", + scenes: { shouldWork: { - describe: "Common Acts Should Work" + story: "Common Acts Should Work" } } }); diff --git a/packages/test-acts/tests/fixtures/example-fixture.ts b/packages/test-acts/tests/fixtures/example-fixture.ts deleted file mode 100644 index 7be8f80..0000000 --- a/packages/test-acts/tests/fixtures/example-fixture.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {Acts} from "@src/index.ts"; - -/** - * The fixture for the examples shown in the README.md - */ -export const ExampleFixture = Acts.createAct({ - describe: "Example Fixture", - acts: { - HELPER_ACT: { - describe: "can be a helper", - } - } -}); - diff --git a/packages/test-acts/tests/fixtures/story-test-fixture.ts b/packages/test-acts/tests/fixtures/story-test-fixture.ts new file mode 100644 index 0000000..c123f37 --- /dev/null +++ b/packages/test-acts/tests/fixtures/story-test-fixture.ts @@ -0,0 +1,36 @@ +import {loadScript} from "@src/entrance.ts"; + +export const StoryTestFixture = loadScript({ + story: "Story Test Fixture", + scenes: { + describe: { + story: "can be described", + }, + describeAs: { + story: "can be described as", + }, + TELL_LONG_STORY_FALLBACK: { + story: "can fallback to description if no full statements are provided", + }, + describeFully: { + story: "can be described fully", + context: [ + { + story: "a given is provided" + } + ], + when: [ + { + story: "asked to describe itself fully" + } + ], + then: [ + { + story: "should describe itself fully" + } + ] + } + } +}) + + diff --git a/packages/test-acts/tests/fixtures/todo-story.ts b/packages/test-acts/tests/fixtures/todo-story.ts new file mode 100644 index 0000000..4309fb2 --- /dev/null +++ b/packages/test-acts/tests/fixtures/todo-story.ts @@ -0,0 +1,26 @@ +import {loadScript, StoryScript} from "@src/index.ts"; + + +const rawFixture = { + story: "Stories about a TODO list app", + when: [ + ], + scenes: { + FIRST_ACT: { + story: "A user can add a TODO item", + scenes: { + FIRST_GRAND_SON_ACT: { + story: "can be a sub-act", + } + } + } + } +} satisfies StoryScript; + +/** + * The fixture for the examples shown in the README.md + */ +export const ExampleFixture = loadScript(rawFixture) + + + diff --git a/packages/test-acts/tests/fixtures/writer/example-cast.yaml b/packages/test-acts/tests/fixtures/writer/example-cast.yaml new file mode 100644 index 0000000..1355f89 --- /dev/null +++ b/packages/test-acts/tests/fixtures/writer/example-cast.yaml @@ -0,0 +1,3 @@ +actors: + - Alice: "Alice" + - Bob diff --git a/packages/test-acts/tests/fixtures/writer/example-stories.yaml b/packages/test-acts/tests/fixtures/writer/example-stories.yaml new file mode 100644 index 0000000..87efaa9 --- /dev/null +++ b/packages/test-acts/tests/fixtures/writer/example-stories.yaml @@ -0,0 +1,3 @@ +acts: Act Test Fixture + - name: test + diff --git a/packages/test-acts/tests/units/act.test.ts b/packages/test-acts/tests/units/act.test.ts index a8ee299..41cc742 100644 --- a/packages/test-acts/tests/units/act.test.ts +++ b/packages/test-acts/tests/units/act.test.ts @@ -1,19 +1,21 @@ import {describe, expect, it} from "vitest"; -import {ActFixture as af} from "../fixtures/act-fixture.ts"; +import {StoryTestFixture as af} from "../fixtures/story-test-fixture.ts"; -describe(af.describe, () => { - it(af.acts.describeAs.describe, () => { +describe(af.story, () => { + it(af.scenes.describeAs.story, () => { const randomString = Math.random().toString(); - expect(af.describeAs((entity) => entity.describe + randomString).toLowerCase()).toBe((af.describe + randomString).toLowerCase()); + expect(af.tellAs((entity) => entity.story + randomString).toLowerCase()).toBe((af.story + randomString).toLowerCase()); }); - it(af.acts.describeFully.describe, () => { - const describeFullyTestAct = af.acts.describeFully; - expect(describeFullyTestAct.describeFully()).toBe("Given that a given is provided, when asked to describe itself fully, then it should describe itself fully"); + it(af.scenes.describeFully.story, () => { + const describeFullyTestAct = af.scenes.describeFully; + expect(describeFullyTestAct.long()).toBe("Given that a given is provided, when asked to describe itself fully, then it should describe itself fully"); }) - it(af.acts.DESCRIBE_FULLY_FALL_BACK.describe, () => { - expect(af.acts.DESCRIBE_FULLY_FALL_BACK.describeFully()).toBe(af.acts.DESCRIBE_FULLY_FALL_BACK.describe); + it(af.scenes.TELL_LONG_STORY_FALLBACK.story, () => { + expect(af.scenes.TELL_LONG_STORY_FALLBACK.long()).toBe(af.scenes.TELL_LONG_STORY_FALLBACK.story); }) }); + + diff --git a/packages/test-acts/tests/units/common-act.test.ts b/packages/test-acts/tests/units/common-act.test.ts index f6e336a..c740e8a 100644 --- a/packages/test-acts/tests/units/common-act.test.ts +++ b/packages/test-acts/tests/units/common-act.test.ts @@ -1,11 +1,11 @@ import {describe, expect, it} from "vitest"; -import {CA} from "@src/index.ts"; -import {COMMON_ACTS} from "@src/consts.ts"; +import {COMMON_TEST_DESCRIPTIONS} from "@src/consts.ts"; import {CommonActsFixture} from "../fixtures/common-acts-fixture.ts"; +import {CD} from "@src/index.ts"; -describe(CommonActsFixture.describe, () => { - it(CA.shouldWork.describe, () => { - expect(CA.shouldWork.describe).toBe(COMMON_ACTS.SHOULD_WORK); +describe(CommonActsFixture.story, () => { + it(CD.SHOULD_WORK.story, () => { + expect(CD.SHOULD_WORK.story).toBe(COMMON_TEST_DESCRIPTIONS.SHOULD_WORK); }); diff --git a/packages/test-acts/tests/units/examples.test.ts b/packages/test-acts/tests/units/examples.test.ts deleted file mode 100644 index 0e5a6ec..0000000 --- a/packages/test-acts/tests/units/examples.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {describe, expect, it} from "vitest"; - -describe("Example Fixture", () => { - describe("HELPER_ACT", () => { - it("can be a helper", () => { - expect(true).toBe(true); - }); - }); -}); diff --git a/packages/test-acts/tests/units/story-teller.test.ts b/packages/test-acts/tests/units/story-teller.test.ts new file mode 100644 index 0000000..51f69c7 --- /dev/null +++ b/packages/test-acts/tests/units/story-teller.test.ts @@ -0,0 +1,61 @@ +import {describe, expect, it} from "vitest"; +import {loadScript} from "@src/entrance.ts"; +import {StoryScript} from "@src/act/story-types.ts"; +import {GenreUserStory} from "@src/act/story-kinds.ts"; +import {StoryTag} from "@src/act/story-options.ts"; +import {TestKinds} from "@src/act/test-kinds.ts"; +import {CommonDescribe, CommonTest} from "@src/index"; + +const storyTellerScript = { + story: "Story Teller", + scenes: { + + storyTags: { + story: "User can specify tags to print at the beginning of the story", + explain: "For example, when the user specified \"Genre\", the printed story, no matter long or short, will have [GenreName] in front of it", + genre: GenreUserStory.FEATURE, + options: { + teller: { + tags: [StoryTag.Genre, StoryTag.Priority] + } + } + }, + storyTestTags: { + story: "User can print any tests associated with a story when they need to on the fly", + tests: { + unit: { + kind: TestKinds.UNIT, + }, + stress: { + kind: TestKinds.STRESS, + doneWhen: "It can handle 5000 people querying at the same time" + } + }, + } + } +} satisfies StoryScript + +const storyTellerStory = loadScript(storyTellerScript); + + +describe(storyTellerStory.short(), () => { + it(CommonDescribe.SHOULD_WORK.story, () => { + expect(CommonDescribe.SHOULD_WORK.story).toBe(CommonDescribe.SHOULD_WORK.story); + }); + + it(storyTellerStory.scenes.storyTags.tell(), () => { + const storyTags = storyTellerStory.scenes.storyTags; + expect(storyTags.tell()).toBe(`[FEAT] ${storyTags.story}`); + }); + + it(storyTellerStory.scenes.storyTestTags.tell(), () => { + const storyTestTags = storyTellerStory.scenes.storyTestTags; + expect(storyTestTags.printTestTags([storyTestTags.tests.unit])).toBe(CommonTest.UNIT.printAsTag()); + + expect(storyTestTags.tellForTest([storyTestTags.tests.unit])).toBe(`${CommonTest.UNIT.printAsTag()} ${storyTestTags.story}`); + }); + +}); + + + diff --git a/packages/test-acts/vite.config.ts b/packages/test-acts/vite.config.ts index 281eade..f558dd7 100644 --- a/packages/test-acts/vite.config.ts +++ b/packages/test-acts/vite.config.ts @@ -1,8 +1,8 @@ -import {defineConfig} from "vitest/config"; +import {defineConfig, UserConfig} from "vitest/config"; import * as path from "path"; import dts from 'vite-plugin-dts'; - -export default defineConfig({ +import eslintPlugin from "vite-plugin-eslint"; +export const viteConfig: UserConfig = { resolve: { alias: { '@src': path.resolve(__dirname, './src') @@ -19,7 +19,7 @@ export default defineConfig({ external: ['./tests'] } }, - plugins: [dts()], + plugins: [dts(), eslintPlugin()], test: { include: ['**/*.test.tsx', '**/*.test.ts'], setupFiles: [ @@ -30,4 +30,5 @@ export default defineConfig({ include: ['**/*.ts'], } }, -}); +} +export default defineConfig(viteConfig); diff --git a/yarn.lock b/yarn.lock index 829d5d2..bb2b6f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -135,6 +140,57 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== + "@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -234,7 +290,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -247,6 +303,14 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== +"@rollup/pluginutils@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@rollup/pluginutils@^5.0.5": version "5.0.5" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" @@ -321,7 +385,15 @@ dependencies: "@types/ms" "*" -"@types/estree@^1.0.0": +"@types/eslint@^8.4.5": + version "8.44.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" + integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -331,6 +403,11 @@ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== +"@types/json-schema@*", "@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/mdast@^3.0.0": version "3.0.15" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" @@ -350,6 +427,11 @@ dependencies: undici-types "~5.26.4" +"@types/semver@^7.5.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" + integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== + "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.10" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" @@ -360,6 +442,96 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== +"@typescript-eslint/eslint-plugin@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz#cfe2bd34e26d2289212946b96ab19dcad64b661a" + integrity sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.10.0" + "@typescript-eslint/type-utils" "6.10.0" + "@typescript-eslint/utils" "6.10.0" + "@typescript-eslint/visitor-keys" "6.10.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.10.0.tgz#578af79ae7273193b0b6b61a742a2bc8e02f875a" + integrity sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog== + dependencies: + "@typescript-eslint/scope-manager" "6.10.0" + "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/visitor-keys" "6.10.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz#b0276118b13d16f72809e3cecc86a72c93708540" + integrity sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg== + dependencies: + "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/visitor-keys" "6.10.0" + +"@typescript-eslint/type-utils@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" + integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== + dependencies: + "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/utils" "6.10.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" + integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== + +"@typescript-eslint/typescript-estree@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz#667381eed6f723a1a8ad7590a31f312e31e07697" + integrity sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg== + dependencies: + "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/visitor-keys" "6.10.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" + integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.10.0" + "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/typescript-estree" "6.10.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz#b9eaf855a1ac7e95633ae1073af43d451e8f84e3" + integrity sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg== + dependencies: + "@typescript-eslint/types" "6.10.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@vitest/coverage-v8@^0.34.6": version "0.34.6" resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz#931d9223fa738474e00c08f52b84e0f39cedb6d1" @@ -492,6 +664,11 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.8.tgz#f044942142e1d3a395f24132e6203a784838542d" integrity sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.2.0: version "8.3.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" @@ -502,7 +679,7 @@ acorn@^8.10.0, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== -ajv@~6.12.6: +ajv@^6.12.4, ajv@~6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -512,11 +689,28 @@ ajv@~6.12.6: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -524,6 +718,11 @@ argparse@~1.0.9: dependencies: sprintf-js "~1.0.2" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -561,6 +760,11 @@ cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + chai@^4.3.10: version "4.3.10" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" @@ -574,6 +778,14 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.0.8" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" @@ -586,6 +798,18 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colors@~1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" @@ -630,6 +854,15 @@ cose-base@^2.2.0: dependencies: layout-base "^2.0.0" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -941,7 +1174,7 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== -debug@^4.0.0, debug@^4.1.1, debug@^4.3.4: +debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -962,6 +1195,11 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + delaunator@5: version "5.0.0" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" @@ -984,6 +1222,20 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dompurify@^3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae" @@ -1022,17 +1274,112 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -estree-walker@^2.0.2: +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.53.0: + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -fast-deep-equal@^3.1.1: +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.3.0: +fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -1048,6 +1395,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -1060,6 +1412,13 @@ fflate@^0.8.0: resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.1.tgz#1ed92270674d2ad3c73f077cd0acf26486dae6c9" integrity sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1067,7 +1426,24 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -flatted@^3.2.7: +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.7, flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== @@ -1108,7 +1484,14 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.1.4: +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -1120,11 +1503,35 @@ glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^13.19.0: + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1159,11 +1566,29 @@ iconv-lite@0.6: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1199,7 +1624,7 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1211,6 +1636,16 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -1247,11 +1682,28 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -1264,6 +1716,13 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + khroma@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" @@ -1289,11 +1748,26 @@ layout-base@^2.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + local-pkg@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -1309,6 +1783,11 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash@^4.17.21, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -1367,7 +1846,7 @@ mdast-util-to-string@^3.1.0: dependencies: "@types/mdast" "^3.0.0" -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -1600,7 +2079,7 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -1649,6 +2128,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + non-layered-tidy-tree-layout@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" @@ -1661,6 +2145,25 @@ once@^1.3.0: dependencies: wrappy "1" +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" @@ -1668,21 +2171,50 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pathe@^1.1.0, pathe@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" @@ -1698,7 +2230,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.3.1: +picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -1721,6 +2253,11 @@ postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + pretty-format@^29.5.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -1745,6 +2282,11 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve@~1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -1767,11 +2309,25 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + robust-predicates@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== +rollup@^2.77.2: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + rollup@^3.27.1: version "3.29.4" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" @@ -1810,6 +2366,18 @@ semver@^7.5.3, semver@^7.5.4, semver@~7.5.4: dependencies: lru-cache "^6.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" @@ -1824,6 +2392,11 @@ sirv@^2.0.3: mrmime "^1.0.0" totalist "^3.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -1854,7 +2427,14 @@ string-argv@~0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -strip-json-comments@~3.1.1: +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -1892,6 +2472,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + tinybench@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e" @@ -1919,22 +2504,39 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.7.1.tgz#dbe462c5f350d708ec6ca6fe8925b5b6541ca9a7" integrity sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A== -typescript@^5.0.2: +typescript@^5: version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== @@ -2026,6 +2628,15 @@ vite-plugin-dts@^3.6.3: kolorist "^1.8.0" vue-tsc "^1.8.20" +vite-plugin-eslint@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz#0381b8272e7f0fd8b663311b64f7608d55d8b04c" + integrity sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang== + dependencies: + "@rollup/pluginutils" "^4.2.1" + "@types/eslint" "^8.4.5" + rollup "^2.77.2" + "vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0-0", vite@^4.4.5: version "4.5.0" resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" @@ -2086,6 +2697,13 @@ web-worker@^1.2.0: resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + why-is-node-running@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" @@ -2104,6 +2722,16 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"