diff --git a/.npmignore b/.npmignore index 226b6e4..34edd7e 100644 --- a/.npmignore +++ b/.npmignore @@ -11,3 +11,5 @@ yarn-error.log .github .eslintrc.js .prettierrc +coverage +_ref diff --git a/README.md b/README.md index 0c87e1a..f4ee06c 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,9 @@ nmap gA (coc-codeaction) - `Open 'php.net' for 'xxxx'` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/6) - `Add @intelephense-ignore-line` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/16) - `Add @intelephense-ignore-next-line` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/16) +- `Insert PHP Getter` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/33#issuecomment-1140683583) +- `Insert PHP Setter` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/33#issuecomment-1140684502) +- `Insert PHP Getter & Setter` | [DEMO](https://github.com/yaegassy/coc-intelephense/pull/33#issuecomment-1140685034) **Code Actions (Server side)**: diff --git a/package.json b/package.json index 5683735..f653a69 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ "clean": "rimraf lib", "watch": "node esbuild.js --watch", "build": "node esbuild.js", - "prepare": "node esbuild.js" + "prepare": "node esbuild.js", + "test": "vitest run src/__tests__", + "test:watch": "vitest src/__tests__" }, "prettier": { "singleQuote": true, @@ -45,7 +47,8 @@ "eslint-plugin-prettier": "^4.0.0", "prettier": "^2.6.2", "rimraf": "^3.0.2", - "typescript": "^4.6.4" + "typescript": "^4.6.4", + "vitest": "^0.13.0" }, "activationEvents": [ "onLanguage:php" diff --git a/src/__tests__/fixtures/multipleNamespaceClass.php b/src/__tests__/fixtures/multipleNamespaceClass.php new file mode 100644 index 0000000..ba3f042 --- /dev/null +++ b/src/__tests__/fixtures/multipleNamespaceClass.php @@ -0,0 +1,48 @@ + { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getMethods(ast.children); + expect(res.length).toBe(2); +}); + +it('getMethod | Classes not contain namespaces', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNonNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getMethods(ast.children); + expect(res.length).toBe(2); +}); + +it('getMethod | Multiple classes contain namespace', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'multipleNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getMethods(ast.children); + expect(res.length).toBe(3); +}); + +it('getMethod | Multiple classes not contain namespace', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'multipleNonNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getMethods(ast.children); + expect(res.length).toBe(3); +}); + +it('getClassesNodes | Classes contain namespaces', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getClassesNodes(ast.children); + expect(res.length).toBe(1); +}); + +it('getClassesNodes | Classes not contain namespaces', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNonNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getClassesNodes(ast.children); + expect(res.length).toBe(1); +}); + +it('getClassesNodes | Multiple classes contain namespace', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'multipleNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getClassesNodes(ast.children); + expect(res.length).toBe(2); +}); + +it('getClassesNodes | Multiple classes not contain namespace', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'multipleNonNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getClassesNodes(ast.children); + expect(res.length).toBe(2); +}); + +it('getPropertiesWithClassInfo', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getPropertiesWithClassInfo(ast.children); + expect(res.length).toBe(7); +}); + +it('getConstructorPropertiesWithClassInfo', () => { + const file = fs.readFileSync(path.join(FIXTURES_DIR, 'standardNamespaceClass.php')); + const ast = getterSetterParser.getAst(file.toString()); + const res = getterSetterParser.getConstructorPropertiesWithClassInfo(ast.children); + expect(res.length).toBe(2); +}); diff --git a/src/actions/getterSetter.ts b/src/actions/getterSetter.ts new file mode 100644 index 0000000..4a39064 --- /dev/null +++ b/src/actions/getterSetter.ts @@ -0,0 +1,263 @@ +import { + CancellationToken, + CodeAction, + CodeActionContext, + CodeActionProvider, + Document, + DocumentSelector, + ExtensionContext, + languages, + Position, + Range, + TextDocument, + TextEdit, + workspace, +} from 'coc.nvim'; + +import * as getterSetterParser from '../parsers/getterSetter'; + +// REF: https://www.php-fig.org/psr/psr-12/#24-indenting +const GETTER_SETTER_INDENT_SPACE = 4; + +type GetterSetterItemType = { + methodName: string; + propertyName: string; + propertyType: string | string[] | null; + propertyNullable: boolean; + propertyDocVarType: string | null; +}; + +export function activate(context: ExtensionContext) { + const documentSelector: DocumentSelector = [{ language: 'php', scheme: 'file' }]; + + context.subscriptions.push( + languages.registerCodeActionProvider(documentSelector, new GetterSetterCodeActionProvider(), 'php-tools') + ); +} + +class GetterSetterCodeActionProvider implements CodeActionProvider { + constructor() {} + + public async provideCodeActions( + document: TextDocument, + range: Range, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + context: CodeActionContext, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + token: CancellationToken + ) { + const codeActions: CodeAction[] = []; + const doc = workspace.getDocument(document.uri); + + if (this.lineRange(range) || this.selectedRange(doc, range)) { + const ast = getterSetterParser.getAst(document.getText()); + if (!ast) return []; + + if (!getterSetterParser.isClassRegion(document.getText(), range.start.line + 1, range.end.line + 1)) { + return []; + } + + const propertiesFeatureItems = getterSetterParser.getPropertiesWithClassInfo(ast.children); + const constructorFeatureItems = getterSetterParser.getConstructorPropertiesWithClassInfo(ast.children); + const featureItems = propertiesFeatureItems.concat(constructorFeatureItems); + + const methods = getterSetterParser.getMethods(ast.children); + const getterItems: GetterSetterItemType[] = []; + const setterItems: GetterSetterItemType[] = []; + + featureItems.forEach((f) => { + // No match if multiple class exists in the range + if (f.classStartLine <= range.start.line + 1 && f.classEndLine >= range.end.line) { + // No match if the range does not contain the property + if (f.propertyStartLine >= range.start.line + 1 && f.propertyEndLine <= range.end.line) { + const name = f.propertyName + .split('_') + .map((str) => str.charAt(0).toLocaleUpperCase() + str.slice(1)) + .join(''); + + // Do not add methods that already exist + let existsSameGetter = false; + let existsSameSetter = false; + methods.forEach((m) => { + if (f.classStartLine <= m.startLine && f.classEndLine >= m.endLine) { + if ('get' + name === m.name) existsSameGetter = true; + if ('set' + name === m.name) existsSameSetter = true; + } + }); + if (!existsSameGetter) { + getterItems.push({ + methodName: 'get' + name, + propertyName: f.propertyName, + propertyNullable: f.propertyNullable, + propertyType: f.propertyType, + propertyDocVarType: f.propertyDocVarType, + }); + } + if (!existsSameSetter) { + setterItems.push({ + methodName: 'set' + name, + propertyName: f.propertyName, + propertyNullable: f.propertyNullable, + propertyType: f.propertyType, + propertyDocVarType: f.propertyDocVarType, + }); + } + } + } + }); + + const insertLine = featureItems ? featureItems[0].classEndLine : undefined; + const getterNewText = this.generateGetterNewText(getterItems); + const setterNewText = this.generateSetterNewText(setterItems); + + if (getterNewText && insertLine) { + const editPosition = Position.create(insertLine - 1, 0); + const getterEdit = TextEdit.insert(editPosition, getterNewText); + + const codeAction: CodeAction = { + title: 'Insert PHP Getter', + edit: { + changes: { + [doc.uri]: [getterEdit], + }, + }, + }; + codeActions.push(codeAction); + } + + if (setterNewText && insertLine) { + const editPosition = Position.create(insertLine - 1, 0); + const setterEdit = TextEdit.insert(editPosition, setterNewText); + + const codeAction: CodeAction = { + title: 'Insert PHP Setter', + edit: { + changes: { + [doc.uri]: [setterEdit], + }, + }, + }; + codeActions.push(codeAction); + } + + if (getterNewText && setterNewText && insertLine) { + const editPosition = Position.create(insertLine - 1, 0); + const getterSetterNewText = getterNewText + setterNewText; + const getterSetterEdit = TextEdit.insert(editPosition, getterSetterNewText); + + const codeAction: CodeAction = { + title: 'Insert Getter & Setter', + edit: { + changes: { + [doc.uri]: [getterSetterEdit], + }, + }, + }; + codeActions.push(codeAction); + } + } + + return codeActions; + } + + private generateGetterNewText(items: GetterSetterItemType[]) { + const newTextLines: string[] = []; + + items.forEach((item) => { + const lines: string[] = []; + const indentSpace = ' '.repeat(GETTER_SETTER_INDENT_SPACE); + + lines.push('\n'); + + if (item.propertyType === null && item.propertyDocVarType) { + lines.push(`${indentSpace}/**\n`); + lines.push(`${indentSpace} * @return ${item.propertyDocVarType}\n`); + lines.push(`${indentSpace} */\n`); + } + + if (item.propertyType && Array.isArray(item.propertyType)) { + const property = item.propertyType.join('|'); + lines.push(`${indentSpace}public function ${item.methodName}(): ${property}\n`); + } else if (item.propertyType && typeof item.propertyType === 'string') { + lines.push( + `${indentSpace}public function ${item.methodName}(): ${item.propertyNullable ? '?' : ''}${ + item.propertyType + }\n` + ); + } else { + lines.push(`${indentSpace}public function ${item.methodName}()\n`); + } + + lines.push(`${indentSpace}{\n`); + lines.push(`${indentSpace}${indentSpace}return ${'$this->' + item.propertyName};\n`); + lines.push(`${indentSpace}}\n`); + + newTextLines.push(...lines); + }); + + return newTextLines ? newTextLines.join('') : undefined; + } + + private generateSetterNewText(items: GetterSetterItemType[]) { + const newTextLines: string[] = []; + + items.forEach((item) => { + const lines: string[] = []; + const indentSpace = ' '.repeat(GETTER_SETTER_INDENT_SPACE); + + lines.push('\n'); + + if (item.propertyType === null && item.propertyDocVarType) { + lines.push(`${indentSpace}/**\n`); + lines.push(`${indentSpace} * @param ${item.propertyDocVarType} $${item.propertyName}\n`); + lines.push(`${indentSpace} */\n`); + } + + if (item.propertyType && Array.isArray(item.propertyType)) { + const property = item.propertyType.join('|'); + lines.push( + `${indentSpace}public function ${item.methodName}(${item.propertyNullable ? '?' : ''}${property} $${ + item.propertyName + })\n` + ); + } else if (item.propertyType && typeof item.propertyType === 'string') { + lines.push( + `${indentSpace}public function ${item.methodName}(${item.propertyNullable ? '?' : ''}${item.propertyType} $${ + item.propertyName + })\n` + ); + } else { + lines.push(`${indentSpace}public function ${item.methodName}($${item.propertyName})\n`); + } + + lines.push(`${indentSpace}{\n`); + lines.push(`${indentSpace}${indentSpace}${'$this->' + item.propertyName} = $${item.propertyName};\n`); + lines.push(`${indentSpace}}\n`); + + newTextLines.push(...lines); + }); + + return newTextLines ? newTextLines.join('') : undefined; + } + + private wholeRange(doc: Document, range: Range): boolean { + const whole = Range.create(0, 0, doc.lineCount, 0); + return ( + whole.start.line === range.start.line && + whole.start.character === range.start.character && + whole.end.line === range.end.line && + whole.end.character === whole.end.character + ); + } + + private lineRange(r: Range): boolean { + return ( + (r.start.line + 1 === r.end.line && r.start.character === 0 && r.end.character === 0) || + (r.start.line === r.end.line && r.start.character === 0) + ); + } + + private selectedRange(doc: Document, range: Range): boolean { + return range.start.line < range.end.line && !this.wholeRange(doc, range); + } +} diff --git a/src/index.ts b/src/index.ts index ab4a353..3a33fc6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,6 +19,7 @@ import { } from 'coc.nvim'; import fs from 'fs'; import * as ignoreCommentCodeActionFeature from './actions/ignoreComment'; +import * as getterSetterCodeActionFeature from './actions/getterSetter'; import * as openPHPNetCodeActionFeature from './actions/openPHPNet'; import * as composerCommandFeature from './commands/composer'; import * as pestCommandFeature from './commands/pest'; @@ -101,6 +102,7 @@ export async function activate(context: ExtensionContext): Promise { // Add code action by "client" side openPHPNetCodeActionFeature.activate(context); ignoreCommentCodeActionFeature.activate(context); + getterSetterCodeActionFeature.activate(context); } function createClient(context: ExtensionContext, clearCache: boolean) { diff --git a/src/parsers/getterSetter.ts b/src/parsers/getterSetter.ts new file mode 100644 index 0000000..53b690a --- /dev/null +++ b/src/parsers/getterSetter.ts @@ -0,0 +1,391 @@ +import { + Class, + Comment, + CommentBlock, + Engine, + Identifier, + Method, + Name, + Namespace, + Node, + Property, + PropertyStatement, + TypeReference, +} from 'php-parser'; + +const parserEngine = new Engine({ + parser: { + extractDoc: true, + php7: true, + locations: true, + suppressErrors: true, + }, + ast: { + all_tokens: true, + withPositions: true, + }, +}); + +type MethodType = { + name: string; + startLine: number; + endLine: number; + comments: string[]; +}; + +type PropertyType = { + propertyName: string; + propertyStartLine: number; + propertyEndLine: number; + propertyNullable: boolean; + propertyType: string | string[] | null; + propertyDocVarType: string | null; +}; + +type ClassInfoType = { + className: string; + classStartLine: number; + classEndLine: number; +}; + +type PropertyWithClassInfoType = PropertyType & ClassInfoType; + +export function getAst(code: string) { + try { + return parserEngine.parseEval(stripPHPTag(code)); + } catch (e) { + return undefined; + } + + function stripPHPTag(code: string): string { + return code.replace('', ''); + } +} + +export function isClassRegion(code: string, startLine: number, endLine: number) { + let flag = false; + + const ast = getAst(code); + if (!ast) return flag; + + const classNode = getClassesNodes(ast.children); + + classNode.forEach((c) => { + if (c.loc && c.loc.start.line <= startLine && c.loc.end.line >= endLine) { + flag = true; + } + }); + + return flag; +} + +function matchVarType(docLine: string, variable?: string) { + let varType: string | null = null; + + const patterns = [ + `@var\\s+(\\S+)\\s+(\\\$${variable})\\s+(.*)$`, + `@var\\s+(\\S+)\\s+(\\\$${variable})$`, + `@var\\s+(\\S+)$`, + ]; + + if (docLine.includes('@var')) { + patterns.forEach((p) => { + const reg = new RegExp(p); + const m = reg.exec(docLine); + if (m) { + varType = m[1]; + } + }); + } + + return varType; +} + +export function getMethods(nodes: Node[]) { + const methods: MethodType[] = []; + + function wrapper(node: Node) { + if (node.kind === 'class') { + const classNode = node as Class; + classNode.body.forEach((node) => { + const methodData = getMethod(node); + if (methodData) { + methods.push(methodData); + } + }); + } + } + + nodes.forEach((node) => { + if (node.kind === 'namespace') { + const namespaceNode = node as Namespace; + namespaceNode.children.forEach((node) => { + wrapper(node); + }); + } + }); + + nodes.forEach((node) => { + wrapper(node); + }); + + return methods; +} + +function getMethod(node: Node) { + if (node.kind !== 'method') return; + + const methodNode = node as Method; + if (!methodNode.loc) return; + + const identifer = methodNode.name as Identifier; + + const name = identifer.name; + const startLine = methodNode.loc.start.line; + const endLine = methodNode.loc.end.line; + const comments: string[] = []; + if (methodNode.leadingComments) { + const leadingComments = methodNode.leadingComments; + leadingComments.forEach((comment) => { + comments.push(comment.value); + }); + } + const methodData: MethodType = { + name, + startLine, + endLine, + comments, + }; + return methodData; +} + +export function getClassesNodes(node: Node[]) { + const classNodes: Class[] = []; + + function wrapper(node: Node) { + if (node.kind === 'class') { + const classNode = node as Class; + classNodes.push(classNode); + } + } + + node.forEach((node) => { + if (node.kind === 'namespace') { + const namespaceNode = node as Namespace; + namespaceNode.children.forEach((node) => { + wrapper(node); + }); + } + }); + + node.forEach((node) => { + wrapper(node); + }); + + return classNodes; +} + +export function getPropertiesWithClassInfo(nodes: Node[]) { + const propertiesWithClassInfo: PropertyWithClassInfoType[] = []; + + const classNodes = getClassesNodes(nodes); + classNodes.forEach((classNode) => { + const identiferNode = classNode.name as Identifier; + const className = identiferNode.name; + const classStartLine = classNode.loc ? classNode.loc.start.line : 0; + const classEndLine = classNode.loc ? classNode.loc.end.line : 0; + + classNode.body.forEach((declaration) => { + const propertiesData = getProperties(declaration); + if (propertiesData) { + propertiesData.forEach((p) => { + propertiesWithClassInfo.push({ + className: className, + classStartLine: classStartLine, + classEndLine: classEndLine, + ...p, + }); + }); + } + }); + }); + + return propertiesWithClassInfo; +} + +function getProperties(node: Node) { + const propertiesData: PropertyType[] = []; + if (node.kind !== 'propertystatement') return propertiesData; + + const propertyStatementNode = node as PropertyStatement; + const parentNode = node; + + propertyStatementNode.properties.forEach((node) => { + if (node.kind === 'property') { + const propertyNode = node as Property; + const identifiierNode = propertyNode.name as unknown as Identifier; + + const name = identifiierNode.name; + const nullable = propertyNode.nullable; + const startLine = propertyNode.loc ? propertyNode.loc.start.line : 0; + const endLine = propertyNode.loc ? propertyNode.loc.end.line : 0; + let type: string | string[] | null = null; + let docVarType: string | null = null; + const comments: string[] = []; + + if (propertyNode.type) { + if (Array.isArray(propertyNode.type)) { + // multiple array type exist?, noop... + } else { + if (propertyNode.type.kind === 'typereference') { + const typereferenceNode = propertyNode.type as TypeReference; + type = typereferenceNode.name; + } else if (propertyNode.type.kind === 'name') { + const nameNode = propertyNode.type as Name; + type = nameNode.name; + } else if (propertyNode.type.kind === 'uniontype') { + if ('types' in propertyNode.type) { + const uniontypeTypesNode = propertyNode.type['types'] as TypeReference[]; + const items: string[] = []; + uniontypeTypesNode.forEach((node) => { + items.push(node.name); + }); + type = items; + } + } + } + } + + if (parentNode.leadingComments) { + const leadingComments = parentNode['leadingComments'] as CommentBlock[]; + leadingComments.forEach((c) => { + if (c.kind === 'commentblock') { + const commentNode = c as Comment; + comments.push(commentNode.value); + } + }); + + comments.forEach((comment) => { + const splitComments = comment.split('\n'); + splitComments.forEach((c) => { + if (!docVarType) { + docVarType = matchVarType(c, name); + } + }); + }); + } + + const propertyData: PropertyType = { + propertyName: name, + propertyNullable: nullable, + propertyType: type, + propertyStartLine: startLine, + propertyEndLine: endLine, + propertyDocVarType: docVarType, + }; + + propertiesData.push(propertyData); + } + }); + + return propertiesData; +} + +export function getConstructorPropertiesWithClassInfo(nodes: Node[]) { + const propertiesWithClassInfo: PropertyWithClassInfoType[] = []; + + function wrapper(node: Node) { + if (node.kind === 'class') { + const classNode = node as Class; + const identiferNode = classNode.name as Identifier; + const className = identiferNode.name; + const classStartLine = classNode.loc ? classNode.loc.start.line : 0; + const classEndLine = classNode.loc ? classNode.loc.end.line : 0; + const propertiesData = getConstructorProperties(classNode); + + propertiesData.forEach((p) => { + propertiesWithClassInfo.push({ + ...p, + className: className, + classStartLine: classStartLine, + classEndLine: classEndLine, + }); + }); + } + } + + nodes.forEach((node) => { + if (node.kind === 'namespace') { + const namespaceNode = node as Namespace; + namespaceNode.children.forEach((node) => { + wrapper(node); + }); + } + }); + + nodes.forEach((node) => { + wrapper(node); + }); + + return propertiesWithClassInfo; +} + +function getConstructorProperties(classNode: Class) { + const propertiesData: PropertyType[] = []; + + classNode.body.forEach((declaration) => { + if (declaration.kind === 'method') { + const methodNode = declaration as Method; + const identifer = methodNode.name as Identifier; + if (identifer.name === '__construct') { + methodNode.arguments.forEach((parameter) => { + if ('flags' in parameter) { + const identifiierNode = parameter.name as unknown as Identifier; + + const name = identifiierNode.name; + const nullable = parameter.nullable; + const startLine = parameter.loc ? parameter.loc.start.line : 0; + const endLine = parameter.loc ? parameter.loc.end.line : 0; + let type: string | string[] | null = null; + + if (parameter.type) { + if (Array.isArray(parameter.type)) { + // multiple array type exist?, noop... + } else { + if (parameter.type.kind === 'typereference') { + const typereferenceNode = parameter.type as TypeReference; + type = typereferenceNode.name; + } else if (parameter.type.kind === 'name') { + const nameNode = parameter.type as Name; + type = nameNode.name; + } else if (parameter.type.kind === 'uniontype') { + if ('types' in parameter.type) { + const uniontypeTypesNode = parameter.type['types'] as TypeReference[]; + const items: string[] = []; + uniontypeTypesNode.forEach((node) => { + items.push(node.name); + }); + type = items; + } + } + } + } + + const propertyData: PropertyType = { + propertyName: name, + propertyNullable: nullable, + propertyStartLine: startLine, + propertyEndLine: endLine, + propertyType: type, + propertyDocVarType: null, + }; + + propertiesData.push(propertyData); + } + }); + } + } + }); + + return propertiesData; +} diff --git a/tsconfig.json b/tsconfig.json index c97d3b6..84737bd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,5 +11,6 @@ "noImplicitAny": false, "esModuleInterop": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["node_modules", "src/__tests__/**/*"] } diff --git a/yarn.lock b/yarn.lock index e6d61bb..012a9d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -157,6 +157,18 @@ domhandler "^4.2.0" selderee "^0.6.0" +"@types/chai-subset@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" + integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -321,6 +333,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + async-hook-jl@^1.7.6: version "1.7.6" resolved "https://registry.yarnpkg.com/async-hook-jl/-/async-hook-jl-1.7.6.tgz#4fd25c2f864dbaf279c610d73bf97b1b28595e68" @@ -393,6 +410,19 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chai@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + chalk@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -401,6 +431,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + cls-hooked@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908" @@ -502,6 +537,13 @@ debug@^4.3.4: dependencies: ms "2.1.2" +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -625,101 +667,227 @@ esbuild-android-64@0.14.39: resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.39.tgz#09f12a372eed9743fd77ff6d889ac14f7b340c21" integrity sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ== +esbuild-android-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.42.tgz#d7ab3d44d3671218d22bce52f65642b12908d954" + integrity sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A== + esbuild-android-arm64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.39.tgz#f608d00ea03fe26f3b1ab92a30f99220390f3071" integrity sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA== +esbuild-android-arm64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.42.tgz#45336d8bec49abddb3a022996a23373f45a57c27" + integrity sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg== + esbuild-darwin-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.39.tgz#31528daa75b4c9317721ede344195163fae3e041" integrity sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g== +esbuild-darwin-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.42.tgz#6dff5e44cd70a88c33323e2f5fb598e40c68a9e0" + integrity sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA== + esbuild-darwin-arm64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.39.tgz#247f770d86d90a215fa194f24f90e30a0bd97245" integrity sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw== +esbuild-darwin-arm64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.42.tgz#2c7313e1b12d2fa5b889c03213d682fb92ca8c4f" + integrity sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA== + esbuild-freebsd-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.39.tgz#479414d294905055eb396ebe455ed42213284ee0" integrity sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ== +esbuild-freebsd-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.42.tgz#ad1c5a564a7e473b8ce95ee7f76618d05d6daffc" + integrity sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw== + esbuild-freebsd-arm64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.39.tgz#cedeb10357c88533615921ae767a67dc870a474c" integrity sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg== +esbuild-freebsd-arm64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.42.tgz#4bdb480234144f944f1930829bace7561135ddc7" + integrity sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA== + esbuild-linux-32@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.39.tgz#d9f008c4322d771f3958f59c1eee5a05cdf92485" integrity sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg== +esbuild-linux-32@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.42.tgz#ef18fd19f067e9d2b5f677d6b82fa81519f5a8c2" + integrity sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg== + esbuild-linux-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz#ba58d7f66858913aeb1ab5c6bde1bbd824731795" integrity sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ== +esbuild-linux-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.42.tgz#d84e7333b1c1b22cf8b5b9dbb5dd9b2ecb34b79f" + integrity sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA== + esbuild-linux-arm64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.39.tgz#708785a30072702b5b1c16b65cf9c25c51202529" integrity sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ== +esbuild-linux-arm64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.42.tgz#dc19e282f8c4ffbaa470c02a4d171e4ae0180cca" + integrity sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA== + esbuild-linux-arm@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.39.tgz#4e8b5deaa7ab60d0d28fab131244ef82b40684f4" integrity sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ== +esbuild-linux-arm@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.42.tgz#d49870e63e2242b8156bf473f2ee5154226be328" + integrity sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg== + esbuild-linux-mips64le@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.39.tgz#6f3bf3023f711084e5a1e8190487d2020f39f0f7" integrity sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw== +esbuild-linux-mips64le@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.42.tgz#f4e6ff9bf8a6f175470498826f48d093b054fc22" + integrity sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg== + esbuild-linux-ppc64le@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.39.tgz#900e718a4ea3f6aedde8424828eeefdd4b48d4b9" integrity sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ== +esbuild-linux-ppc64le@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.42.tgz#ac9c66fc80ba9f8fda15a4cc08f4e55f6c0aed63" + integrity sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg== + esbuild-linux-riscv64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.39.tgz#dcbff622fa37047a75d2ff7a1d8d2949d80277e4" integrity sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA== +esbuild-linux-riscv64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.42.tgz#21e0ae492a3a9bf4eecbfc916339a66e204256d0" + integrity sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ== + esbuild-linux-s390x@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.39.tgz#3f725a7945b419406c99d93744b28552561dcdfd" integrity sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA== +esbuild-linux-s390x@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.42.tgz#06d40b957250ffd9a2183bfdfc9a03d6fd21b3e8" + integrity sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ== + esbuild-netbsd-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.39.tgz#e10e40b6a765798b90d4eb85901cc85c8b7ff85e" integrity sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA== +esbuild-netbsd-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.42.tgz#185664f05f10914f14ed43bd9e22b7de584267f7" + integrity sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw== + esbuild-openbsd-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.39.tgz#935ec143f75ce10bd9cdb1c87fee00287eb0edbc" integrity sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA== +esbuild-openbsd-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.42.tgz#c29006f659eb4e55283044bbbd4eb4054fae8839" + integrity sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA== + esbuild-sunos-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.39.tgz#0e7aa82b022a2e6d55b0646738b2582c2d72c3c0" integrity sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg== +esbuild-sunos-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.42.tgz#aa9eec112cd1e7105e7bb37000eca7d460083f8f" + integrity sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ== + esbuild-windows-32@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.39.tgz#3f1538241f31b538545f4b5841b248cac260fa35" integrity sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q== +esbuild-windows-32@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.42.tgz#c3fc450853c61a74dacc5679de301db23b73e61e" + integrity sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g== + esbuild-windows-64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.39.tgz#b100c59f96d3c2da2e796e42fee4900d755d3e03" integrity sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow== +esbuild-windows-64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.42.tgz#b877aa37ff47d9fcf0ccb1ca6a24b31475a5e555" + integrity sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA== + esbuild-windows-arm64@0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.39.tgz#00268517e665b33c89778d61f144e4256b39f631" integrity sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA== +esbuild-windows-arm64@0.14.42: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz#79da8744626f24bc016dc40d016950b5a4a2bac5" + integrity sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw== + +esbuild@^0.14.27: + version "0.14.42" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.42.tgz#98587df0b024d5f6341b12a1d735a2bff55e1836" + integrity sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw== + optionalDependencies: + esbuild-android-64 "0.14.42" + esbuild-android-arm64 "0.14.42" + esbuild-darwin-64 "0.14.42" + esbuild-darwin-arm64 "0.14.42" + esbuild-freebsd-64 "0.14.42" + esbuild-freebsd-arm64 "0.14.42" + esbuild-linux-32 "0.14.42" + esbuild-linux-64 "0.14.42" + esbuild-linux-arm "0.14.42" + esbuild-linux-arm64 "0.14.42" + esbuild-linux-mips64le "0.14.42" + esbuild-linux-ppc64le "0.14.42" + esbuild-linux-riscv64 "0.14.42" + esbuild-linux-s390x "0.14.42" + esbuild-netbsd-64 "0.14.42" + esbuild-openbsd-64 "0.14.42" + esbuild-sunos-64 "0.14.42" + esbuild-windows-32 "0.14.42" + esbuild-windows-64 "0.14.42" + esbuild-windows-arm64 "0.14.42" + esbuild@^0.14.39: version "0.14.39" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.39.tgz#c926b2259fe6f6d3a94f528fb42e103c5a6d909a" @@ -996,11 +1164,26 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1076,6 +1259,13 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -1170,6 +1360,13 @@ intelephense@^1.8.2: vscode-languageserver-types "3.17.0-next.1" vscode-uri "~3.0.2" +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1268,6 +1465,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +local-pkg@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.1.tgz#e7b0d7aa0b9c498a1110a5ac5b00ba66ef38cfff" + integrity sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -1278,6 +1480,13 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -1360,6 +1569,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -1436,11 +1650,21 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +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== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -1451,6 +1675,11 @@ php-parser@^3.1.0-beta.8: resolved "https://registry.yarnpkg.com/php-parser/-/php-parser-3.1.0-beta.8.tgz#fc2bda8b5e310a115dcbe4a3c85bb13131f7b2c4" integrity sha512-TA4zYkVGv0Daail0yGZIUUxYWt37hz5nfaLgx17Tn25wdyoW4xtjv6UphrtyFCxNL1sZgJvSb5Q83zw76ZP/uA== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -1461,6 +1690,15 @@ picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +postcss@^8.4.13: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + 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" @@ -1576,6 +1814,15 @@ resolve-from@^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.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -1593,6 +1840,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup@^2.59.0: + version "2.75.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.75.3.tgz#11bd3e8ace526911feea8af17f2a286fbfdb4cf8" + integrity sha512-YA29fLU6MAYSaDxIQYrGGOcbXlDmG96h0krGGYObroezcQ0KgEPM3+7MtKD/qeuUbFuAJXvKZee5dA1dpwq1PQ== + optionalDependencies: + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -1663,6 +1917,11 @@ slash@^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" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -1702,11 +1961,26 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +tinypool@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.1.3.tgz#b5570b364a1775fd403de5e7660b325308fee26b" + integrity sha512-2IfcQh7CP46XGWGGbdyO4pjcKqsmVqFAPcXfPxcPXmOWt9cYkTP9HcDmGgsfijYoAEc4z9qcpM/BaBz46Y9/CQ== + +tinyspy@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-0.3.2.tgz#2f95cb14c38089ca690385f339781cd35faae566" + integrity sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1753,6 +2027,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@^4.0.0, type-detect@^4.0.5: + 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" @@ -1799,6 +2078,32 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vite@^2.9.9: + version "2.9.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.9.tgz#8b558987db5e60fedec2f4b003b73164cb081c5e" + integrity sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.13" + resolve "^1.22.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +vitest@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.13.0.tgz#8c2e8a555bb6d7ac016408ffdc41d270bf69f37c" + integrity sha512-vuYt3+G25MMnANgyMHHG3VK86C9K/VFi/8uH5myQ2v660W4WArv99ElakPlVFxxSXXM1jqQPiPj2ht35Bod9LQ== + dependencies: + "@types/chai" "^4.3.1" + "@types/chai-subset" "^1.3.3" + chai "^4.3.6" + debug "^4.3.4" + local-pkg "^0.4.1" + tinypool "^0.1.3" + tinyspy "^0.3.2" + vite "^2.9.9" + vscode-css-languageservice@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.0.tgz#cd172d13e9e7ae23ba567c73778aee10475ff716"