├── .gitignore ├── .mocharc.yml ├── .npmignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── dprint.json ├── package.json ├── src ├── compilerApi │ ├── Factory.ts │ ├── FactoryFunction.ts │ ├── TsNode.ts │ ├── TsNodeProperty.ts │ ├── TsParameter.ts │ ├── helpers.ts │ └── index.ts ├── generateCode.ts ├── index.ts └── tests │ ├── baselineTests.ts │ └── baselines │ ├── code-generation │ ├── typescript-3.2.1.baseline.ts │ ├── typescript-3.6.3.baseline.ts │ ├── typescript-4.8.3.baseline.ts │ ├── typescript-4.9.4.baseline.ts │ └── typescript-next.baseline.ts │ ├── factory-code-generation-3.6.3.baseline.ts │ ├── factory-code-generation-4.9.4.baseline.ts │ └── language-features.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn-error.log 3 | /dist 4 | -------------------------------------------------------------------------------- /.mocharc.yml: -------------------------------------------------------------------------------- 1 | require: 'ts-node/register' 2 | recursive: true 3 | reporter: progress 4 | timeout: 10000 5 | spec: src/tests/**/*.ts 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | src 3 | dist/tests 4 | .gitignore 5 | .mocharc.yml 6 | tsconfig.json 7 | yarn-error.log 8 | dprint.json 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "Run Tests", 8 | "runtimeExecutable": "npm", 9 | "runtimeArgs": ["run", "test:debug"], 10 | "port": 9229, 11 | "stopOnEntry": false 12 | }, 13 | { 14 | "type": "node", 15 | "request": "attach", 16 | "name": "Attach", 17 | "port": 9229, 18 | "stopOnEntry": false 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 David Sherret 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TypeScript Compiler API Factory Code Generator Generator 2 | 3 | Generates code that generates TypeScript Compiler API factory code from an AST. 4 | 5 | This serves the purpose of generating code that generates compiler API factory code from an AST based on specific TypeScript compiler API version. The generated code is used on [ts-ast-viewer.com](https://ts-ast-viewer.com). 6 | 7 | ## Benefits 8 | 9 | 1. Automatic (minimal) maintenance of future factory code functionality (`typescript@next` support). 10 | 2. Support all compiler API versions. 11 | 3. Reuses the AST used by the rest of the ts-ast-viewer.com site. So improves performance and allows showing the factory code for the selected node. Couldn't do that before because I was pegged to a specific compiler API version and had to reparse the source file specifically for the factory code generation. 12 | 13 | ## Use 14 | 15 | ### Setup 16 | 17 | First, save the TypeScript versions as aliases using yarn: 18 | 19 | ``` 20 | yarn add typescript-4.0.2@npm:typescript@4.0.2 21 | ``` 22 | 23 | ### Get and save the generated code for each compiler API version 24 | 25 | Then generate the code for each compiler api version and save it to a file: 26 | 27 | ```ts 28 | import * as fs from "fs"; 29 | import { generateCode } from "ts-factory-code-generator-generator"; 30 | 31 | const code = generateCode("typescript"); 32 | fs.writeFile("./factoryCodeGenerator.ts", { encoding: "utf-8" }, code, ...etc...); 33 | 34 | const codeFor4_0_2 = generateCode("typescript-4.0.2"); 35 | fs.writeFile("./factoryCodeGenerator-4.0.2.ts", { encoding: "utf-8" }, codeFor4_0_2, ...etc...); 36 | 37 | // ...etc... 38 | ``` 39 | 40 | ### Use the generated code to generate factory code 41 | 42 | Finally, generate the factory code from an AST for the appropriate compiler API version: 43 | 44 | ```ts 45 | import * as ts from "typescript-4.0.2"; 46 | import { generateFactoryCode } from "./factoryCodeGenerator-4.0.2"; 47 | 48 | // get ast 49 | const sourceFile = ts.createSourceFile("/file.ts", "4n + 5n;", ts.ScriptTarget.Latest); 50 | 51 | // get the generated factory code 52 | const factoryCode = generateFactoryCode(ts, sourceFile); // or provide a different node here 53 | console.log(factoryCode); 54 | ``` 55 | 56 | Outputs: 57 | 58 | 59 | 60 | ```ts 61 | [ 62 | factory.createExpressionStatement(ts.createBinary( 63 | factory.createBigIntLiteral("4n"), 64 | factory.createToken(ts.SyntaxKind.PlusToken), 65 | factory.createBigIntLiteral("5n") 66 | )) 67 | ]; 68 | ``` 69 | -------------------------------------------------------------------------------- /dprint.json: -------------------------------------------------------------------------------- 1 | { 2 | "lineWidth": 160, 3 | "includes": ["**/*.{ts,tsx,js,jsx,json,md}"], 4 | "excludes": [ 5 | "CHANGELOG.md", 6 | "**/node_modules", 7 | "**/*-lock.json", 8 | "dist", 9 | "src/tests/baselines" 10 | ], 11 | "plugins": [ 12 | "https://plugins.dprint.dev/typescript-0.79.0.wasm", 13 | "https://plugins.dprint.dev/json-0.17.0.wasm", 14 | "https://plugins.dprint.dev/markdown-0.15.1.wasm" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-factory-code-generator-generator", 3 | "version": "0.7.0", 4 | "description": "Generates code that generates TypeScript Compiler API factory code from an AST.", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "npx ttsc", 9 | "dopublish": "yarn build && echo \"Run: npm publish --otp\"", 10 | "test": "cross-env TS_NODE_COMPILER=\"ttypescript\" TS_NODE_TRANSPILE_ONLY=\"true\" mocha", 11 | "test:debug": "yarn run test --inspect-brk", 12 | "format": "dprint fmt" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/dsherret/ts-factory-code-generator-generator.git" 17 | }, 18 | "keywords": [ 19 | "typescript", 20 | "compiler", 21 | "API", 22 | "factory", 23 | "code", 24 | "generator" 25 | ], 26 | "author": "David Sherret", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/dsherret/ts-factory-code-generator-generator/issues" 30 | }, 31 | "homepage": "https://github.com/dsherret/ts-factory-code-generator-generator#readme", 32 | "dependencies": { 33 | "string-similarity": "^4.0.4", 34 | "ts-morph": "^17.0.1" 35 | }, 36 | "devDependencies": { 37 | "@types/chai": "^4.3.0", 38 | "@types/mocha": "^9.1.0", 39 | "@types/node": "^17.0.21", 40 | "@types/string-similarity": "^4.0.0", 41 | "@types/ts-nameof": "^4.2.1", 42 | "chai": "^4.3.6", 43 | "cross-env": "^7.0.3", 44 | "mocha": "^9.2.1", 45 | "ts-nameof": "^5.0.0", 46 | "ts-node": "^10.6.0", 47 | "ttypescript": "^1.5.13", 48 | "typescript": "^4.9.4", 49 | "typescript-3.2.1": "npm:typescript@3.2.1", 50 | "typescript-3.6.3": "npm:typescript@3.6.3", 51 | "typescript-4.8.3": "npm:typescript@4.8.3", 52 | "typescript-4.9.4": "npm:typescript@4.9.4", 53 | "typescript-next": "npm:typescript@next" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/compilerApi/Factory.ts: -------------------------------------------------------------------------------- 1 | import { FunctionDeclaration, MethodSignature, Symbol, Type } from "ts-morph"; 2 | import { FactoryFunction } from "./FactoryFunction"; 3 | import { TsNode } from "./TsNode"; 4 | import { TsNodeProperty } from "./TsNodeProperty"; 5 | 6 | export class Factory { 7 | private readonly factoryFunctions = new Map(); 8 | private readonly nodes = new Map(); 9 | private readonly nodeProperties = new Map(); 10 | 11 | getFactoryFunction(declaration: FunctionDeclaration | MethodSignature) { 12 | let func = this.factoryFunctions.get(declaration); 13 | if (func == null) { 14 | func = new FactoryFunction(this, declaration); 15 | this.factoryFunctions.set(declaration, func); 16 | } 17 | return func; 18 | } 19 | 20 | getNode(type: Type) { 21 | let node = this.nodes.get(type); 22 | if (node == null) { 23 | node = new TsNode(this, type); 24 | this.nodes.set(type, node); 25 | } 26 | return node; 27 | } 28 | 29 | hasNode(type: Type) { 30 | return this.nodes.has(type); 31 | } 32 | 33 | getNodeProperty(symbol: Symbol) { 34 | let prop = this.nodeProperties.get(symbol); 35 | if (prop == null) { 36 | prop = new TsNodeProperty(this, symbol); 37 | this.nodeProperties.set(symbol, prop); 38 | } 39 | return prop; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/compilerApi/FactoryFunction.ts: -------------------------------------------------------------------------------- 1 | import { FunctionDeclaration, MethodSignature, Node, SyntaxKind, ts } from "ts-morph"; 2 | import { Factory } from "./Factory"; 3 | import { TsParameter } from "./TsParameter"; 4 | 5 | // It will be a method signature in TS 4.0 6 | 7 | export class FactoryFunction { 8 | constructor(private readonly factory: Factory, private readonly declaration: FunctionDeclaration | MethodSignature) { 9 | } 10 | 11 | getName() { 12 | if (Node.isFunctionDeclaration(this.declaration)) { 13 | return this.declaration.getNameOrThrow(); 14 | } 15 | return this.declaration.getName(); 16 | } 17 | 18 | getParameters() { 19 | const params = this.declaration.getParameters().map(p => new TsParameter(this.factory, this, p)); 20 | if (this.getName() === nameof(ts.createNumericLiteral)) { 21 | return params.filter(p => p.getName() !== "numericLiteralFlags"); 22 | } 23 | if (this.getName() === nameof(ts.createStringLiteral)) { 24 | return params.filter(p => p.getName() !== "isSingleQuote"); 25 | } 26 | if ( 27 | this.getName() === nameof(ts.createTemplateHead) || this.getName() === nameof(ts.createTemplateMiddle) 28 | || this.getName() === nameof(ts.createTemplateTail) 29 | ) { 30 | return params.filter(p => p.getName() !== "templateFlags"); 31 | } 32 | return params; 33 | } 34 | 35 | getNode() { 36 | return this.factory.getNode(this.declaration.getReturnType()); 37 | } 38 | 39 | getKindNames() { 40 | const kindNames = this.getNode().getKindNames(); 41 | 42 | if (this.getName() === nameof(ts.createKeywordTypeNode)) { 43 | return kindNames.filter(kindName => { 44 | switch (kindName) { 45 | case nameof(SyntaxKind.NullKeyword): // use createNull 46 | case nameof(SyntaxKind.ThisKeyword): // use createThis 47 | case nameof(SyntaxKind.VoidKeyword): // use createVoid 48 | return false; 49 | default: 50 | return true; 51 | } 52 | }); 53 | } 54 | 55 | return kindNames; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/compilerApi/TsNode.ts: -------------------------------------------------------------------------------- 1 | import { compareTwoStrings } from "string-similarity"; 2 | import { InterfaceDeclaration, Node, Symbol, SyntaxKind, ts, Type, TypeNode } from "ts-morph"; 3 | import { Factory } from "./Factory"; 4 | import { resolveTypeToTypeParamConstraintIfNecessary } from "./helpers"; 5 | import { TsParameter } from "./TsParameter"; 6 | 7 | export class TsNode { 8 | private readonly declaration: InterfaceDeclaration; 9 | 10 | constructor(private readonly factory: Factory, private readonly type: Type) { 11 | const symbol = getSymbol(); 12 | const dec = symbol.getDeclarations()[0]; // this does return more than one for Node, but don't care... 13 | 14 | if (!Node.isInterfaceDeclaration(dec)) { 15 | throw new Error(`Expected the type ${type.getText()} to be of an interface declaration.`); 16 | } 17 | 18 | this.declaration = dec; 19 | 20 | function getSymbol() { 21 | if (type.isIntersection()) { 22 | return type.getIntersectionTypes()[0].getSymbolOrThrow(); 23 | } 24 | const symbol = type.getSymbol(); 25 | if (symbol == null) { 26 | throw new Error(`Could not find symbol for type ${type.getText()}`); 27 | } 28 | return symbol; 29 | } 30 | } 31 | 32 | getName() { 33 | return this.declaration.getName(); 34 | } 35 | 36 | getPropertyForParam(param: TsParameter) { 37 | return this.factory.getNodeProperty(getExplicitProperty.call(this) || getPropertyByEstimate.call(this)); 38 | 39 | function getExplicitProperty(this: TsNode) { 40 | const propertyName = getExplicitPropertyName.call(this); 41 | return propertyName == null ? undefined : this.type.getProperty(propertyName); 42 | } 43 | 44 | function getExplicitPropertyName(this: TsNode) { 45 | const nodeName = this.getName(); 46 | const paramName = param.getName(); 47 | 48 | if (nodeName === nameof() && paramName === "value") { 49 | return nameof(n => n.text); 50 | } 51 | if (nodeName === nameof() && paramName === "value") { 52 | return nameof(n => n.text); 53 | } 54 | if (nodeName === nameof() && paramName === "defaultType") { 55 | return nameof(n => n.default); 56 | } 57 | if ((nodeName === nameof() || nodeName === "ElementAccessChain") && paramName === "index") { 58 | return nameof(n => n.argumentExpression); 59 | } 60 | if ((nodeName === nameof() || nodeName === "CallChain") && paramName === "argumentsArray") { 61 | return nameof(n => n.arguments); 62 | } 63 | if (nodeName === nameof() && paramName === "argumentsArray") { 64 | return nameof(n => n.arguments); 65 | } 66 | if (nodeName === nameof() && paramName === "operator") { 67 | return nameof(n => n.operatorToken); 68 | } 69 | if (nodeName === "ImportTypeAssertionContainer" && paramName === "clause") { 70 | return "assertClause"; // nameof(n => n.assertClause); 71 | } 72 | 73 | return undefined; 74 | } 75 | 76 | function getPropertyByEstimate(this: TsNode) { 77 | // this is good enough 78 | let highestScore = 0; 79 | let foundProp: Symbol | undefined; 80 | for (const prop of this.type.getProperties()) { 81 | const score = compareTwoStrings(prop.getName(), param.getName()); 82 | if (score > highestScore) { 83 | highestScore = score; 84 | foundProp = prop; 85 | } 86 | } 87 | 88 | if (highestScore < 0.9) { 89 | throw new Error(`Could not find property for parameter: ${param.getName()} (${this.getName()})`); 90 | } 91 | 92 | return foundProp!; 93 | } 94 | } 95 | 96 | doesExtendNode(node: TsNode) { 97 | return this.type.getBaseTypes().some(t => t === node.type); 98 | } 99 | 100 | getKindNames() { 101 | if (this.getName() === nameof()) { 102 | return [nameof(SyntaxKind.JsxAttributes)]; 103 | } 104 | 105 | const kindType = this.getKindType(); 106 | 107 | if (kindType.isUnion()) { 108 | return Array.from(new Set(kindType.getUnionTypes().map(t => sanitizeName(t.getText(this.declaration))))); 109 | } 110 | 111 | return [sanitizeName(kindType.getText(this.declaration))]; 112 | 113 | function sanitizeName(name: string) { 114 | return name.replace(/SyntaxKind\./g, ""); 115 | } 116 | } 117 | 118 | getKindType() { 119 | // Find the type of the "kind" property. 120 | const kindType = this.type.getProperty("kind")!.getTypeAtLocation(this.declaration); 121 | return resolveTypeToTypeParamConstraintIfNecessary(kindType, this.declaration); 122 | } 123 | 124 | getTestFunctionName() { 125 | const tsSymbol = this.declaration.getSourceFile().getModuleOrThrow("ts").getSymbolOrThrow(); 126 | for (const symbol of tsSymbol.getExports()) { 127 | if (!symbol.getName().startsWith("is")) { 128 | continue; 129 | } 130 | const valueDec = symbol.getValueDeclaration(); 131 | if (valueDec == null || !Node.isFunctionDeclaration(valueDec)) { 132 | continue; 133 | } 134 | // todo: use typeChecker.getTypePredicateOfSignature once wrapped in ts-morph 135 | // todo: use TypePedicateNode once wrapped (but prefer using getTypePredicateOfSignature) 136 | const returnTypeNode = valueDec.getReturnTypeNode(); 137 | if (returnTypeNode == null || returnTypeNode.getKind() !== SyntaxKind.TypePredicate) { 138 | continue; 139 | } 140 | const typePredicateNode = returnTypeNode as any as TypeNode; 141 | const typePredicateType = typePredicateNode.getNodeProperty("type")?.getType(); 142 | 143 | if (typePredicateType != null && this.factory.hasNode(typePredicateType)) { 144 | const node = this.factory.getNode(typePredicateType); 145 | if (node === this) { 146 | return valueDec.getName(); 147 | } 148 | } 149 | } 150 | 151 | throw new Error("Could not find test function name"); 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/compilerApi/TsNodeProperty.ts: -------------------------------------------------------------------------------- 1 | import { Node, Symbol, Type } from "ts-morph"; 2 | import { Factory } from "./Factory"; 3 | import { resolveTypeToTypeParamConstraintIfNecessary } from "./helpers"; 4 | 5 | export class TsNodeProperty { 6 | private readonly type: Type; 7 | private readonly declaration: Node; 8 | 9 | constructor(private readonly factory: Factory, private readonly symbol: Symbol) { 10 | this.declaration = symbol.getDeclarations()[0]; 11 | this.type = this.declaration.getType(); 12 | } 13 | 14 | getName() { 15 | return this.symbol.getName(); 16 | } 17 | 18 | getType() { 19 | return resolveTypeToTypeParamConstraintIfNecessary(this.type, this.declaration.getParentOrThrow()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/compilerApi/TsParameter.ts: -------------------------------------------------------------------------------- 1 | import { ParameterDeclaration, Type } from "ts-morph"; 2 | import { Factory } from "./Factory"; 3 | import { FactoryFunction } from "./FactoryFunction"; 4 | 5 | export class TsParameter { 6 | private readonly type: Type; 7 | constructor( 8 | private readonly factory: Factory, 9 | private readonly parent: FactoryFunction, 10 | private readonly declaration: ParameterDeclaration, 11 | ) { 12 | this.type = declaration.getType(); 13 | } 14 | 15 | getName() { 16 | return this.declaration.getName()!; 17 | } 18 | 19 | getType() { 20 | return this.type; 21 | } 22 | 23 | getArrayElementType() { 24 | const type = this.type.getNonNullableType(); 25 | const typeText = type.getText(); 26 | if (!typeText.endsWith("[]")) { 27 | return undefined; 28 | } 29 | return type.getTypeArguments()[0]; 30 | } 31 | 32 | isArray() { 33 | return this.getArrayElementType() != null; 34 | } 35 | 36 | isLiteral() { 37 | return this.type.isLiteral(); 38 | } 39 | 40 | isNode() { 41 | return this.type.getProperty("kind") != null; 42 | } 43 | 44 | isString() { 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/compilerApi/helpers.ts: -------------------------------------------------------------------------------- 1 | import { Node, Type } from "ts-morph"; 2 | 3 | export function resolveTypeToTypeParamConstraintIfNecessary(type: Type, declaration: Node) { 4 | if (!Node.isTypeParametered(declaration)) { 5 | return type; 6 | } 7 | const typeText = type.getText(declaration); 8 | const typeParams = declaration.getTypeParameters(); 9 | const typeParam = typeParams.find(p => p.getName() === typeText); 10 | if (typeParam != null) { 11 | return typeParam.getConstraintOrThrow().getType(); 12 | } 13 | return type; 14 | } 15 | -------------------------------------------------------------------------------- /src/compilerApi/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Factory"; 2 | export * from "./FactoryFunction"; 3 | export * from "./TsNode"; 4 | export * from "./TsNodeProperty"; 5 | export * from "./TsParameter"; 6 | -------------------------------------------------------------------------------- /src/generateCode.ts: -------------------------------------------------------------------------------- 1 | import { CodeBlockWriter, FunctionDeclarationStructure, Node, Project, StructureKind, ts, Type } from "ts-morph"; 2 | import { Factory, FactoryFunction, TsParameter } from "./compilerApi"; 3 | 4 | export function generateCode(typeScriptModuleName = "typescript") { 5 | const factory = new Factory(); 6 | const project = new Project({ compilerOptions: { strictNullChecks: true } }); 7 | const newSourceFile = project.createSourceFile("____temp___.ts"); 8 | const tsSourceFile = project.addSourceFileAtPath(`node_modules/${typeScriptModuleName}/lib/typescript.d.ts`); 9 | const tsSymbol = tsSourceFile.getModuleOrThrow("ts").getSymbolOrThrow(); 10 | const nodeFactory = tsSymbol.getExport("NodeFactory"); 11 | 12 | const kindToFactoryFunctions = getKindToFactoryFunctions(); 13 | 14 | newSourceFile.addStatements([{ 15 | kind: StructureKind.ImportDeclaration, 16 | defaultImport: "CodeBlockWriter", 17 | moduleSpecifier: "code-block-writer", 18 | }, { 19 | kind: StructureKind.Function, 20 | isExported: true, 21 | name: "generateFactoryCode", 22 | parameters: [{ name: "ts", type: `typeof import("${typeScriptModuleName}")` }, { name: "initialNode", type: getTsTypeText("Node") }], 23 | statements: [ 24 | writer => { 25 | writer.writeLine(`const writer = new CodeBlockWriter({ newLine: "\\n", indentNumberOfSpaces: 2 });`); 26 | writer.writeLine("const syntaxKindToName = createSyntaxKindToNameMap();"); 27 | writer.blankLine(); 28 | writer.write("if (ts.isSourceFile(initialNode))").block(() => { 29 | writer.writeLine(`writer.write("[");`); 30 | writer.write("if (initialNode.statements.length > 0)").block(() => { 31 | writer.write("writer.indent(() => ").inlineBlock(() => { 32 | writer.write("for (let i = 0; i < initialNode.statements.length; i++)").block(() => { 33 | writer.writeLine("const statement = initialNode.statements[i];"); 34 | writer.writeLine("if (i > 0)"); 35 | writer.indent().write(`writer.write(",").newLine();`).newLine(); 36 | writer.writeLine(`writeNodeText(statement);`); 37 | }); 38 | }).write(").newLine();"); 39 | }); 40 | writer.writeLine(`writer.write("];");`); 41 | }); 42 | writer.write("else").block(() => { 43 | writer.writeLine("writeNodeText(initialNode);"); 44 | }); 45 | writer.writeLine("writer.newLineIfLastNot();"); 46 | writer.blankLine().writeLine("return writer.toString();"); 47 | }, 48 | writeNodeTextFunction(), 49 | writeNodeTextForTypeNodeFunction(), 50 | ...Array.from(new Set(Array.from(kindToFactoryFunctions.values()).reduce((a, b) => [...a, ...b], []))).map(getFunctionStructure), 51 | getSyntaxKindToNameFunction(), 52 | getNodeFlagValuesFunction(), 53 | getFlagValuesAsStringFunction(), 54 | getFlagValuesFunction(), 55 | ], 56 | }]); 57 | 58 | return newSourceFile.getFullText(); 59 | 60 | function getKindToFactoryFunctions() { 61 | const map = new Map(); 62 | 63 | for (const func of getInternal()) { 64 | for (const name of func.getKindNames()) { 65 | let factoryFunctions: FactoryFunction[]; 66 | if (map.has(name)) { 67 | if (isAllowedDuplicateFactoryFunction(func)) { 68 | factoryFunctions = map.get(name)!; 69 | } else { 70 | throw new Error(`Found duplicate name: ${name} (existing: ${map.get(name)!.map(f => f.getName())}, new: ${func.getName()})`); 71 | } 72 | } else { 73 | factoryFunctions = []; 74 | map.set(name, factoryFunctions); 75 | } 76 | 77 | factoryFunctions.push(func); 78 | } 79 | } 80 | 81 | return map; 82 | 83 | function* getInternal(): IterableIterator { 84 | const searchSymbols = nodeFactory == null ? tsSymbol.getExports() : nodeFactory.getMembers(); 85 | for (const symbol of searchSymbols) { 86 | if (!symbol.getName().startsWith("create")) { 87 | continue; 88 | } 89 | const decls = symbol.getDeclarations(); 90 | const valueDec = decls.find(decl => { 91 | if (!Node.isFunctionDeclaration(decl) && !Node.isMethodSignature(decl)) { 92 | return false; 93 | } 94 | const hasDeprecated = decl.getJsDocs().some(s => s.getTags().some(t => t.getTagName() === "deprecated")); 95 | return !hasDeprecated; 96 | }); 97 | if (valueDec == null || !Node.isFunctionDeclaration(valueDec) && !Node.isMethodSignature(valueDec)) { 98 | continue; 99 | } 100 | const returnType = valueDec.getReturnType(); 101 | if (returnType.getProperty("kind") == null) { 102 | continue; 103 | } 104 | // console.log(symbol.getName() + ": " + returnType.getText()); 105 | const factoryFunction = factory.getFactoryFunction(valueDec); 106 | if (isAllowedFactoryFunction(factoryFunction)) { 107 | yield factoryFunction; 108 | } 109 | } 110 | } 111 | } 112 | 113 | function writeNodeTextFunction(): FunctionDeclarationStructure { 114 | return { 115 | kind: StructureKind.Function, 116 | name: "writeNodeText", 117 | parameters: [{ name: "node", type: getTsTypeText("Node") }], 118 | statements: writer => { 119 | writer.write("switch (node.kind)").block(() => { 120 | for (const [syntaxKindName, factoryFuncs] of kindToFactoryFunctions.entries()) { 121 | if (factoryFuncs.length === 1) { 122 | const factoryFunc = factoryFuncs[0]; 123 | writer.writeLine(`case ts.SyntaxKind.${syntaxKindName}:`); 124 | writer.indent(() => { 125 | writeFunctionCall(writer, factoryFunc); 126 | writer.write("return;").newLine(); 127 | }); 128 | } else if (factoryFuncs.length === 2) { 129 | writer.writeLine(`case ts.SyntaxKind.${syntaxKindName}:`); 130 | writer.indent(() => { 131 | factoryFuncs.sort((a, b) => { 132 | if (a.getNode().doesExtendNode(b.getNode())) { 133 | return -1; 134 | } 135 | if (b.getNode().doesExtendNode(a.getNode())) { 136 | return 1; 137 | } else { 138 | throw new Error( 139 | `Unhandled scenario where neither ${a.getNode().getName()} or ` 140 | + `${b.getNode().getName()} extended each other`, 141 | ); 142 | } 143 | }); 144 | for (const factoryFunc of factoryFuncs) { 145 | if (factoryFunc.getKindNames().length !== 1) { 146 | throw new Error(`Unexpected: Factory function had more than one kind name ${factoryFunc.getName()}`); 147 | } 148 | 149 | writer.write(`if (ts.${factoryFunc.getNode().getTestFunctionName()}(node))`).block(() => { 150 | writeFunctionCall(writer, factoryFunc); 151 | writer.write("return;"); 152 | }); 153 | } 154 | 155 | writer.write(`throw new Error("Unhandled node: " + node.getText());`); 156 | }); 157 | } 158 | } 159 | writer.writeLine(`default:`); 160 | writer.indent(() => { 161 | writer.write("if (node.kind >= ts.SyntaxKind.FirstToken && node.kind <= ts.SyntaxKind.LastToken)").block(() => { 162 | writer.writeLine(`writer.write("${getFactoryName()}.createToken(ts.SyntaxKind.").write(syntaxKindToName[node.kind]).write(")");`); 163 | writer.writeLine("return;"); 164 | }); 165 | writer.writeLine(`writer.write("/* Unhandled node kind: ").write(syntaxKindToName[node.kind]).write(" */")`); 166 | }); 167 | }); 168 | }, 169 | }; 170 | 171 | function writeFunctionCall(writer: CodeBlockWriter, factoryFunc: FactoryFunction) { 172 | writer.write(`${factoryFunc.getName()}(node as ${getTsTypeText(factoryFunc.getNode().getName())});`).newLine(); 173 | } 174 | } 175 | 176 | function writeNodeTextForTypeNodeFunction(): FunctionDeclarationStructure { 177 | return { 178 | kind: StructureKind.Function, 179 | name: "writeNodeTextForTypeNode", 180 | parameters: [{ name: "node", type: getTsTypeText("TypeNode") }], 181 | statements: writer => { 182 | writer.write("if (node.kind >= ts.SyntaxKind.FirstKeyword && node.kind <= ts.SyntaxKind.LastKeyword)").block(() => { 183 | writer.writeLine(`writer.write("${getFactoryName()}.createKeywordTypeNode(ts.SyntaxKind.").write(syntaxKindToName[node.kind]).write(")");`); 184 | }).write("else").block(() => { 185 | writer.writeLine("writeNodeText(node);"); 186 | }); 187 | }, 188 | }; 189 | } 190 | 191 | function getFunctionStructure(func: FactoryFunction): FunctionDeclarationStructure { 192 | return { 193 | kind: StructureKind.Function, 194 | name: func.getName(), 195 | parameters: [{ name: "node", type: getTsTypeText(func.getNode().getName()) }], 196 | statements: writer => printBody(writer), 197 | }; 198 | 199 | function printBody(writer: CodeBlockWriter) { 200 | const params = func.getParameters(); 201 | writer.write(`writer.write("`); 202 | 203 | if (nodeFactory == null) { 204 | writer.write("ts"); // ts < 4.0 before API change 205 | } else { 206 | writer.write("factory"); 207 | } 208 | 209 | writer.write(`.${func.getName()}(");`).newLine(); 210 | if (params.length === 1) { 211 | printParamText(writer, params[0]); 212 | } else if (params.length > 1) { 213 | writer.writeLine(`writer.newLine();`); 214 | writer.write("writer.indent(() => ").inlineBlock(() => { 215 | for (let i = 0; i < params.length; i++) { 216 | const param = params[i]; 217 | if (i > 0) { 218 | writer.writeLine(`writer.write(",").newLine();`); 219 | } 220 | printParamText(writer, param); 221 | } 222 | }).write(");").newLine(); 223 | } 224 | writer.writeLine(`writer.write(")");`); 225 | } 226 | 227 | function printParamText(writer: CodeBlockWriter, param: TsParameter) { 228 | if (writeCustomParamText(writer, func, param)) { 229 | return; 230 | } 231 | 232 | const prop = func.getNode().getPropertyForParam(param); 233 | const propAccess = `node.${prop.getName()}`; 234 | const propType = prop.getType(); 235 | 236 | writeNullableIfNecessary(writer, propType, propAccess, () => writeTypeText()); 237 | 238 | function writeTypeText() { 239 | if (param.isArray()) { 240 | const arrayElementType = param.getArrayElementType()!; 241 | writeArrayText(writer, propAccess, () => writeTextForType("item", arrayElementType)); 242 | } else { 243 | writeTextForType(propAccess, propType.getNonNullableType()); 244 | } 245 | } 246 | 247 | // todo: rename 248 | function writeTextForType(text: string, type: Type) { 249 | if (isNodeTypeNodeType()) { 250 | writer.write(`writeNodeTextForTypeNode(${text})`); 251 | } else if (isNodeType()) { 252 | writer.write(`writeNodeText(${text})`); 253 | } else if (isSyntaxKindType()) { 254 | writer.write(`writer.write("ts.SyntaxKind.").write(syntaxKindToName[${text}])`); 255 | } else if (type.isString() || type.isStringLiteral()) { 256 | writer.write(`writer.quote(${text}.toString())`); 257 | } else if (type.isBoolean() || type.isBooleanLiteral()) { 258 | writer.write(`writer.write(${text}.toString())`); 259 | } else if (type.getText().endsWith(".NodeFlags")) { 260 | writer.write(`writer.write(getNodeFlagValues(${text} || 0));`); 261 | } else { 262 | console.error(`Could not find text for param ${func.getName()}::${param.getName()} -- ${type.getText()}`); 263 | writer.write(`writer.write("/* unknown */")`); 264 | } 265 | 266 | function isSyntaxKindType() { 267 | // good enough... 268 | return isSyntaxKind(type) || type.getUnionTypes().some(isSyntaxKind); 269 | 270 | function isSyntaxKind(t: Type) { 271 | return (t.isEnum() || t.isEnumLiteral()) && t.getText().includes(".SyntaxKind"); 272 | } 273 | } 274 | 275 | function isNodeTypeNodeType() { 276 | return isNodeType() && type.getText().endsWith(".TypeNode"); 277 | } 278 | 279 | function isNodeType() { 280 | // always default to using the node union type 281 | return type.getProperty("kind") != null 282 | || type.getUnionTypes().some(t => t.getProperty("kind") != null); 283 | } 284 | } 285 | } 286 | } 287 | 288 | function getSyntaxKindToNameFunction(): FunctionDeclarationStructure { 289 | return { 290 | kind: StructureKind.Function, 291 | name: "createSyntaxKindToNameMap", 292 | statements: writer => { 293 | writer.writeLine("const map: { [kind: number]: string } = {};"); 294 | writer.write("for (const name of Object.keys(ts.SyntaxKind).filter(k => isNaN(parseInt(k, 10))))").block(() => { 295 | writer.writeLine(`const value = (ts.SyntaxKind as any)[name] as number;`); 296 | writer.writeLine(`if (map[value] == null)`); 297 | writer.indent().write(`map[value] = name;`).newLine(); 298 | }); 299 | writer.write("return map;"); 300 | }, 301 | }; 302 | } 303 | 304 | function getNodeFlagValuesFunction(): FunctionDeclarationStructure { 305 | return { 306 | kind: StructureKind.Function, 307 | name: "getNodeFlagValues", 308 | parameters: [{ name: "value", type: "number" }], 309 | statements: writer => { 310 | writer.writeLine("// ignore the BlockScoped node flag"); 311 | writer.writeLine( 312 | `return getFlagValuesAsString(ts.NodeFlags, "ts.NodeFlags", ` 313 | + `value || 0, "None", getFlagValues(ts.NodeFlags, value).filter(v => v !== ts.NodeFlags.BlockScoped));`, 314 | ); 315 | }, 316 | }; 317 | } 318 | 319 | function getFlagValuesAsStringFunction(): FunctionDeclarationStructure { 320 | return { 321 | kind: StructureKind.Function, 322 | name: "getFlagValuesAsString", 323 | parameters: [ 324 | { name: "enumObj", type: "any" }, 325 | { name: "enumName", type: "string" }, 326 | { name: "value", type: "number" }, 327 | { name: "defaultName", type: "string" }, 328 | { name: "flagValues", hasQuestionToken: true, type: "number[]" }, 329 | ], 330 | statements: writer => { 331 | writer.writeLine("flagValues = flagValues || getFlagValues(enumObj, value);"); 332 | writer.writeLine("const members: string[] = [];"); 333 | writer.writeLine("for (const flagValue of flagValues)"); 334 | writer.indent().write(`members.push(enumName + "." + enumObj[flagValue]);`).newLine(); 335 | writer.writeLine("if (members.length === 0)"); 336 | writer.indent().write(`members.push(enumName + "." + defaultName);`).newLine(); 337 | writer.writeLine(`return members.join(" | ");`); 338 | }, 339 | }; 340 | } 341 | 342 | function getFlagValuesFunction(): FunctionDeclarationStructure { 343 | return { 344 | kind: StructureKind.Function, 345 | name: "getFlagValues", 346 | parameters: [ 347 | { name: "enumObj", type: "any" }, 348 | { name: "value", type: "number" }, 349 | ], 350 | statements: writer => { 351 | writer.writeLine("const members: number[] = [];"); 352 | writer.write("for (const prop in enumObj)").block(() => { 353 | writer.writeLine(`if (typeof enumObj[prop] === "string")`); 354 | writer.indent().write("continue;").newLine(); 355 | writer.writeLine("if ((enumObj[prop] & value) !== 0)"); 356 | writer.indent().write(`members.push(enumObj[prop]);`).newLine(); 357 | }); 358 | writer.writeLine(`return members;`); 359 | }, 360 | }; 361 | } 362 | 363 | function getTsTypeText(typeText: string) { 364 | return `import("${typeScriptModuleName}").${typeText}`; 365 | } 366 | 367 | function writeCustomParamText(writer: CodeBlockWriter, func: FactoryFunction, param: TsParameter) { 368 | const funcName = func.getName(); 369 | const paramName = param.getName(); 370 | const initialLength = writer.getLength(); 371 | 372 | const isPropertyDecl = funcName === nameof(ts.createProperty) || funcName === nameof(f => f.createPropertyDeclaration); 373 | if (isPropertyDecl && paramName === "questionOrExclamationToken") { 374 | writer.writeLine("if (node.questionToken != null)"); 375 | writer.indent().write(`writer.write("${getFactoryName()}.createToken(ts.SyntaxKind.QuestionToken)");`).newLine(); 376 | writer.writeLine("else if (node.exclamationToken != null)"); 377 | writer.indent().write(`writer.write("${getFactoryName()}.createToken(ts.SyntaxKind.ExclamationToken)");`).newLine(); 378 | writer.writeLine("else"); 379 | writer.indent().write(`writer.write("undefined");`).newLine(); 380 | } 381 | 382 | const isMultiLineFunc = funcName === nameof(ts.createObjectLiteral) 383 | || funcName === nameof(ts.createArrayLiteral) 384 | || funcName === nameof(ts.createBlock) 385 | || funcName === nameof(f => f.createObjectLiteralExpression) 386 | || funcName === nameof(f => f.createArrayLiteralExpression); 387 | if (isMultiLineFunc && paramName === "multiLine") { 388 | writer.write("writer.write(((node as any).multiLine || false).toString())"); 389 | } 390 | 391 | // if (paramName === "modifiers") { 392 | // writeNullableIfNecessary(writer, param.getType(), "node.modifiers", () => { 393 | // writeArrayText( 394 | // writer, 395 | // "node.modifiers", 396 | // () => writer.writeLine(`writer.write("${getFactoryName()}.createModifier(ts.SyntaxKind." + syntaxKindToName[item.kind] + ")");`), 397 | // ); 398 | // }); 399 | // } 400 | 401 | return writer.getLength() !== initialLength; 402 | } 403 | 404 | function writeArrayText(writer: CodeBlockWriter, propAccess: string, writeItemText: () => void) { 405 | writer.writeLine(`writer.write("[");`); 406 | writer.write(`if (${propAccess}.length === 1)`).block(() => { 407 | writer.writeLine(`const item = ${propAccess}![0];`); 408 | writeItemText(); 409 | }); 410 | writer.write(`else if (${propAccess}.length > 1)`).block(() => { 411 | writer.write("writer.indent(() => ").inlineBlock(() => { 412 | writer.write(`for (let i = 0; i < ${propAccess}!.length; i++)`).block(() => { 413 | writer.write(`const item = ${propAccess}![i];`); 414 | writer.writeLine("if (i > 0)"); 415 | writer.indent().write(`writer.write(",").newLine();`).newLine(); 416 | writeItemText(); 417 | }); 418 | }).write(");").newLine(); 419 | }); 420 | writer.writeLine(`writer.write("]");`); 421 | } 422 | 423 | function writeNullableIfNecessary(writer: CodeBlockWriter, type: Type, propAccess: string, writeTypeText: () => void) { 424 | if (type.isNullable()) { 425 | writer.writeLine(`if (${propAccess} == null)`); 426 | writer.indent().write(`writer.write("undefined");`).newLine(); 427 | writer.write("else").block(() => { 428 | writeTypeText(); 429 | }); 430 | } else { 431 | writeTypeText(); 432 | } 433 | } 434 | 435 | function getFactoryName() { 436 | if (nodeFactory == null) { 437 | return "ts"; 438 | } else { 439 | return "factory"; 440 | } 441 | } 442 | 443 | function isAllowedFactoryFunction(func: FactoryFunction) { 444 | const name = func.getName(); 445 | if (name.startsWith("createJSDoc")) { 446 | return false; 447 | } 448 | 449 | // some of these could probably be figured out by inspecting 450 | // the code, but this is the lazy way to do it... I'll just 451 | // manually maintain this list. 452 | switch (func.getName()) { 453 | // handled by createTrue, createFalse, createBigIntLiteral, createNumericLiteral 454 | case nameof(ts.createLiteral): 455 | // handled by createVoid 456 | case nameof(ts.createVoidZero): 457 | // handled by createBinary 458 | case nameof(ts.createAssignment): 459 | case nameof(n => n.createBitwiseAnd): 460 | case nameof(n => n.createBitwiseNot): 461 | case nameof(n => n.createBitwiseOr): 462 | case nameof(n => n.createBitwiseXor): 463 | case nameof(n => n.createDivide): 464 | case nameof(n => n.createExponent): 465 | case nameof(n => n.createModulo): 466 | case nameof(n => n.createEquality): 467 | case nameof(n => n.createInequality): 468 | case nameof(n => n.createStrictEquality): 469 | case nameof(n => n.createLessThan): 470 | case nameof(n => n.createLessThanEquals): 471 | case nameof(n => n.createGreaterThan): 472 | case nameof(n => n.createGreaterThanEquals): 473 | case nameof(n => n.createLeftShift): 474 | case nameof(n => n.createRightShift): 475 | case nameof(n => n.createUnsignedRightShift): 476 | case nameof(n => n.createMultiply): 477 | case nameof(ts.createLogicalAnd): 478 | case nameof(ts.createLogicalOr): 479 | case nameof(ts.createLogicalNot): 480 | case nameof(ts.createAdd): 481 | case nameof(ts.createSubtract): 482 | case nameof(ts.createStrictEquality): 483 | case nameof(ts.createStrictInequality): 484 | case nameof(ts.createLessThan): 485 | case nameof(ts.createComma): 486 | // handled by createCall 487 | case nameof(ts.createImmediatelyInvokedFunctionExpression): 488 | case nameof(ts.createImmediatelyInvokedArrowFunction): 489 | // handled by createPrefixUnaryExpression 490 | case nameof(n => n.createPrefixDecrement): 491 | case nameof(n => n.createPrefixIncrement): 492 | case nameof(n => n.createPrefixMinus): 493 | case nameof(n => n.createPrefixPlus): 494 | // handled by createPostfixUnaryExpression 495 | case nameof(n => n.createPostfixDecrement): 496 | case nameof(n => n.createPostfixIncrement): 497 | // handled by createUnionTypeNode and createIntersectionTypeNode 498 | case "createUnionOrIntersectionTypeNode": // doesn't exist anymore in 4.0? 499 | // handled by createPostfix 500 | case nameof(ts.createPostfixIncrement): 501 | // handled by createExportDeclaration 502 | case nameof(ts.createExternalModuleExport): 503 | // handled by createExportAssignment 504 | case nameof(ts.createExportDefault): 505 | // handled by createBinary 506 | case "createNullishCoalesce": // nameof(ts.createNullishCoalesce): 507 | // handled by other more specific functions 508 | case "createJSDocTag": // todo: nameof 509 | // handled by createStringLiteral 510 | case nameof(ts.createStringLiteralFromNode): 511 | // not used 512 | case nameof(ts.createNode): 513 | case nameof(ts.createSourceFile): 514 | case nameof(ts.createLanguageServiceSourceFile): 515 | case nameof(ts.createTempVariable): 516 | case nameof(ts.createLoopVariable): 517 | case nameof(ts.createUniqueName): 518 | case nameof(ts.createOptimisticUniqueName): 519 | case nameof(ts.createFileLevelUniqueName): 520 | case nameof(ts.createModifiersFromModifierFlags): 521 | case nameof(ts.createInputFiles): 522 | case nameof(ts.createBundle): 523 | case nameof(ts.createUnparsedSourceFile): 524 | case nameof(ts.createNotEmittedStatement): 525 | case nameof(ts.createPartiallyEmittedExpression): 526 | case "createUniquePrivateName": // handled by createPrivateIdentifier 527 | // custom handled 528 | case nameof(ts.createToken): 529 | case nameof(ts.createModifier): 530 | return false; 531 | // only use this if the new createTypePredicateNodeWithModifier function doesn't exist 532 | case nameof(ts.createTypePredicateNode): 533 | // todo: nameof 534 | return tsSymbol.getExport("createTypePredicateNodeWithModifier") == null; 535 | // deprecated 536 | case "createJSDocParamTag": 537 | // todo: nameof 538 | return tsSymbol.getExport("createJSDocParameterTag") == null; 539 | } 540 | 541 | return true; 542 | } 543 | 544 | function isAllowedDuplicateFactoryFunction(func: FactoryFunction) { 545 | // todo: nameof 546 | switch (func.getName()) { 547 | case "createPropertyAccess": 548 | case "createPropertyAccessChain": 549 | return true; 550 | case "createElementAccess": 551 | case "createElementAccessChain": 552 | return true; 553 | case "createCall": 554 | case "createCallChain": 555 | return true; 556 | case "createNonNullExpression": 557 | case "createNonNullChain": 558 | return true; 559 | } 560 | 561 | return false; 562 | } 563 | } 564 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { generateCode } from "./generateCode"; 2 | -------------------------------------------------------------------------------- /src/tests/baselineTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as fs from "fs"; 3 | import * as path from "path"; 4 | import { Project } from "ts-morph"; 5 | import * as ts363 from "typescript-3.6.3"; 6 | import * as ts494 from "typescript-4.9.4"; 7 | import { generateCode } from "../generateCode"; 8 | import { generateFactoryCode as generateFactoryCodeTs363 } from "./baselines/code-generation/typescript-3.6.3.baseline"; 9 | import { generateFactoryCode as generateFactoryCodeTs494 } from "./baselines/code-generation/typescript-4.9.4.baseline"; 10 | 11 | describe(nameof(generateCode), () => { 12 | it("should equal the baseline for 3.2.1", () => { 13 | runBaseLineForPackage("typescript-3.2.1"); 14 | }); 15 | 16 | it("should equal the baseline for 3.6.3", () => { 17 | runBaseLineForPackage("typescript-3.6.3"); 18 | }); 19 | 20 | // uses NodeFactory at this point 21 | it("should equal the baseline for 4.8.3", () => { 22 | runBaseLineForPackage("typescript-4.8.3"); 23 | }); 24 | 25 | it("should equal the baseline for 4.9.4", () => { 26 | runBaseLineForPackage("typescript-4.9.4"); 27 | }); 28 | 29 | it("should equal the baseline for @next", () => { 30 | runBaseLineForPackage("typescript-next"); 31 | }); 32 | 33 | function runBaseLineForPackage(packageName: string) { 34 | // get generated code 35 | const result = generateCode(packageName); 36 | 37 | // ensure no diagnostics 38 | ensureNoDiagnostics(result); 39 | 40 | // compare 41 | const specFileName = path.join(__dirname, `baselines/code-generation/${packageName}.baseline.ts`); 42 | const specText = fs.readFileSync(specFileName, { encoding: "utf8" }); 43 | fs.writeFileSync(specFileName, result, { encoding: "utf8" }); // overwrite 44 | expect(result).to.equal(specText); 45 | } 46 | }); 47 | 48 | describe(nameof(generateFactoryCodeTs494), () => { 49 | it("should generate factory code from the provided source file", () => { 50 | // get generated code 51 | const languageFeaturesFileName = path.join(__dirname, "baselines/language-features.ts"); 52 | const languageFeaturesText = fs.readFileSync(languageFeaturesFileName, { encoding: "utf8" }); 53 | const languageFeaturesSourceFile = ts494.createSourceFile("languageFeatures.ts", languageFeaturesText, ts494.ScriptTarget.Latest, false); 54 | const result = `import * as ts from "typescript-4.9.4";\n\n` 55 | + "const factory = ts.factory;\n" 56 | + generateFactoryCodeTs494(ts494, languageFeaturesSourceFile); 57 | 58 | // ensure no diagnostics 59 | ensureNoDiagnostics(result); 60 | 61 | // compare 62 | const specFileName = path.join(__dirname, "baselines/factory-code-generation-4.9.4.baseline.ts"); 63 | const specText = fs.readFileSync(specFileName, { encoding: "utf8" }); 64 | fs.writeFileSync(specFileName, result, { encoding: "utf8" }); // overwrite 65 | expect(result).to.equal(specText); 66 | }); 67 | }); 68 | 69 | describe(nameof(generateFactoryCodeTs363), () => { 70 | it("should generate factory code from the provided source file", () => { 71 | // get generated code 72 | const languageFeaturesFileName = path.join(__dirname, "baselines/language-features.ts"); 73 | const languageFeaturesText = fs.readFileSync(languageFeaturesFileName, { encoding: "utf8" }); 74 | const languageFeaturesSourceFile = ts363.createSourceFile("languageFeatures.ts", languageFeaturesText, ts363.ScriptTarget.Latest, false); 75 | const result = `import * as ts from "typescript-3.6.3";\n\n` + generateFactoryCodeTs363(ts363, languageFeaturesSourceFile); 76 | 77 | // ensure no diagnostics 78 | ensureNoDiagnostics(result); 79 | 80 | // compare 81 | const specFileName = path.join(__dirname, "baselines/factory-code-generation-3.6.3.baseline.ts"); 82 | const specText = fs.readFileSync(specFileName, { encoding: "utf8" }); 83 | fs.writeFileSync(specFileName, result, { encoding: "utf8" }); // overwrite 84 | expect(result).to.equal(specText); 85 | }); 86 | }); 87 | 88 | function ensureNoDiagnostics(fileText: string) { 89 | const project = new Project({ compilerOptions: { strictNullChecks: true } }); 90 | const sourceFile = project.createSourceFile("__test__.ts", fileText); 91 | const diagnostics = sourceFile.getPreEmitDiagnostics(); 92 | if (diagnostics.length > 0) { 93 | console.log(project.formatDiagnosticsWithColorAndContext(diagnostics)); 94 | throw "ERROR"; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/tests/baselines/factory-code-generation-3.6.3.baseline.ts: -------------------------------------------------------------------------------- 1 | import * as ts from "typescript-3.6.3"; 2 | 3 | [ 4 | ts.createInterfaceDeclaration( 5 | undefined, 6 | [ts.createToken(ts.SyntaxKind.ExportKeyword)], 7 | ts.createIdentifier("Interface"), 8 | undefined, 9 | undefined, 10 | [ 11 | ts.createPropertySignature( 12 | undefined, 13 | ts.createIdentifier("prop"), 14 | undefined, 15 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 16 | undefined 17 | ), 18 | ts.createPropertySignature( 19 | [ts.createToken(ts.SyntaxKind.ReadonlyKeyword)], 20 | ts.createIdentifier("readonlyProp"), 21 | undefined, 22 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 23 | undefined 24 | ), 25 | ts.createIndexSignature( 26 | undefined, 27 | undefined, 28 | [ts.createParameter( 29 | undefined, 30 | undefined, 31 | undefined, 32 | ts.createIdentifier("test"), 33 | undefined, 34 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 35 | undefined 36 | )], 37 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 38 | ) 39 | ] 40 | ), 41 | ts.createInterfaceDeclaration( 42 | undefined, 43 | undefined, 44 | ts.createIdentifier("OtherInterface"), 45 | undefined, 46 | undefined, 47 | [ 48 | ts.createMethodSignature( 49 | undefined, 50 | [ts.createParameter( 51 | undefined, 52 | undefined, 53 | undefined, 54 | ts.createIdentifier("p"), 55 | undefined, 56 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 57 | undefined 58 | )], 59 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 60 | ts.createIdentifier("method"), 61 | undefined 62 | ), 63 | ts.createConstructSignature( 64 | undefined, 65 | [ts.createParameter( 66 | undefined, 67 | undefined, 68 | undefined, 69 | ts.createIdentifier("p"), 70 | undefined, 71 | ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), 72 | undefined 73 | )], 74 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 75 | ) 76 | ] 77 | ), 78 | ts.createClassDeclaration( 79 | undefined, 80 | undefined, 81 | ts.createIdentifier("Class"), 82 | undefined, 83 | undefined, 84 | [ 85 | ts.createProperty( 86 | undefined, 87 | undefined, 88 | ts.createIdentifier("prop"), 89 | ts.createToken(ts.SyntaxKind.ExclamationToken), 90 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 91 | undefined 92 | ), 93 | ts.createConstructor( 94 | undefined, 95 | undefined, 96 | [ts.createParameter( 97 | undefined, 98 | undefined, 99 | undefined, 100 | ts.createIdentifier("testing"), 101 | undefined, 102 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 103 | undefined 104 | )], 105 | ts.createBlock( 106 | [], 107 | true 108 | ) 109 | ), 110 | ts.createMethod( 111 | undefined, 112 | undefined, 113 | undefined, 114 | ts.createIdentifier("method"), 115 | undefined, 116 | undefined, 117 | [], 118 | undefined, 119 | ts.createBlock( 120 | [ts.createReturn(ts.createNumericLiteral("5"))], 121 | true 122 | ) 123 | ) 124 | ] 125 | ), 126 | ts.createClassDeclaration( 127 | undefined, 128 | [ts.createToken(ts.SyntaxKind.DeclareKeyword)], 129 | ts.createIdentifier("Class2"), 130 | undefined, 131 | undefined, 132 | [ 133 | ts.createProperty( 134 | undefined, 135 | [ts.createToken(ts.SyntaxKind.ReadonlyKeyword)], 136 | ts.createIdentifier("other"), 137 | undefined, 138 | ts.createUnionTypeNode([ 139 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 140 | ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword) 141 | ]), 142 | undefined 143 | ), 144 | ts.createMethod( 145 | undefined, 146 | undefined, 147 | undefined, 148 | ts.createIdentifier("method"), 149 | undefined, 150 | undefined, 151 | [ts.createParameter( 152 | undefined, 153 | undefined, 154 | undefined, 155 | ts.createIdentifier("p"), 156 | undefined, 157 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 158 | undefined 159 | )], 160 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 161 | undefined 162 | ) 163 | ] 164 | ), 165 | ts.createVariableStatement( 166 | undefined, 167 | ts.createVariableDeclarationList( 168 | [ts.createVariableDeclaration( 169 | ts.createIdentifier("myVar"), 170 | undefined, 171 | ts.createNumericLiteral("6") 172 | )], 173 | ts.NodeFlags.Const 174 | ) 175 | ), 176 | ts.createVariableStatement( 177 | undefined, 178 | ts.createVariableDeclarationList( 179 | [ 180 | ts.createVariableDeclaration( 181 | ts.createIdentifier("myVar2"), 182 | undefined, 183 | ts.createNumericLiteral("6") 184 | ), 185 | ts.createVariableDeclaration( 186 | ts.createIdentifier("myVar3"), 187 | ts.createUnionTypeNode([ 188 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 189 | ts.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword) 190 | ]), 191 | undefined 192 | ) 193 | ], 194 | ts.NodeFlags.Let 195 | ) 196 | ), 197 | ts.createVariableStatement( 198 | undefined, 199 | ts.createVariableDeclarationList( 200 | [ts.createVariableDeclaration( 201 | ts.createIdentifier("otherVar"), 202 | undefined, 203 | ts.createBinary( 204 | ts.createNumericLiteral("4"), 205 | ts.createToken(ts.SyntaxKind.PlusToken), 206 | ts.createBinary( 207 | ts.createNumericLiteral("5"), 208 | ts.createToken(ts.SyntaxKind.AsteriskToken), 209 | ts.createNumericLiteral("12") 210 | ) 211 | ) 212 | )], 213 | ts.NodeFlags.None 214 | ) 215 | ), 216 | ts.createFunctionDeclaration( 217 | undefined, 218 | undefined, 219 | undefined, 220 | ts.createIdentifier("Function"), 221 | undefined, 222 | [ts.createParameter( 223 | undefined, 224 | undefined, 225 | undefined, 226 | ts.createIdentifier("p"), 227 | undefined, 228 | ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 229 | undefined 230 | )], 231 | ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), 232 | ts.createBlock( 233 | [ts.createReturn(ts.createNumericLiteral("5"))], 234 | true 235 | ) 236 | ), 237 | ts.createFunctionDeclaration( 238 | undefined, 239 | undefined, 240 | undefined, 241 | ts.createIdentifier("test"), 242 | undefined, 243 | [], 244 | undefined, 245 | ts.createBlock( 246 | [], 247 | false 248 | ) 249 | ) 250 | ]; 251 | -------------------------------------------------------------------------------- /src/tests/baselines/factory-code-generation-4.9.4.baseline.ts: -------------------------------------------------------------------------------- 1 | import * as ts from "typescript-4.9.4"; 2 | 3 | const factory = ts.factory; 4 | [ 5 | factory.createInterfaceDeclaration( 6 | [factory.createToken(ts.SyntaxKind.ExportKeyword)], 7 | factory.createIdentifier("Interface"), 8 | undefined, 9 | undefined, 10 | [ 11 | factory.createPropertySignature( 12 | undefined, 13 | factory.createIdentifier("prop"), 14 | undefined, 15 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 16 | ), 17 | factory.createPropertySignature( 18 | [factory.createToken(ts.SyntaxKind.ReadonlyKeyword)], 19 | factory.createIdentifier("readonlyProp"), 20 | undefined, 21 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 22 | ), 23 | factory.createIndexSignature( 24 | undefined, 25 | [factory.createParameterDeclaration( 26 | undefined, 27 | undefined, 28 | factory.createIdentifier("test"), 29 | undefined, 30 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 31 | undefined 32 | )], 33 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 34 | ) 35 | ] 36 | ), 37 | factory.createInterfaceDeclaration( 38 | undefined, 39 | factory.createIdentifier("OtherInterface"), 40 | undefined, 41 | undefined, 42 | [ 43 | factory.createMethodSignature( 44 | undefined, 45 | factory.createIdentifier("method"), 46 | undefined, 47 | undefined, 48 | [factory.createParameterDeclaration( 49 | undefined, 50 | undefined, 51 | factory.createIdentifier("p"), 52 | undefined, 53 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 54 | undefined 55 | )], 56 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 57 | ), 58 | factory.createConstructSignature( 59 | undefined, 60 | [factory.createParameterDeclaration( 61 | undefined, 62 | undefined, 63 | factory.createIdentifier("p"), 64 | undefined, 65 | factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), 66 | undefined 67 | )], 68 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) 69 | ) 70 | ] 71 | ), 72 | factory.createClassDeclaration( 73 | undefined, 74 | factory.createIdentifier("Class"), 75 | undefined, 76 | undefined, 77 | [ 78 | factory.createPropertyDeclaration( 79 | undefined, 80 | factory.createIdentifier("prop"), 81 | factory.createToken(ts.SyntaxKind.ExclamationToken), 82 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 83 | undefined 84 | ), 85 | factory.createConstructorDeclaration( 86 | undefined, 87 | [factory.createParameterDeclaration( 88 | undefined, 89 | undefined, 90 | factory.createIdentifier("testing"), 91 | undefined, 92 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 93 | undefined 94 | )], 95 | factory.createBlock( 96 | [], 97 | true 98 | ) 99 | ), 100 | factory.createMethodDeclaration( 101 | undefined, 102 | undefined, 103 | factory.createIdentifier("method"), 104 | undefined, 105 | undefined, 106 | [], 107 | undefined, 108 | factory.createBlock( 109 | [factory.createReturnStatement(factory.createNumericLiteral("5"))], 110 | true 111 | ) 112 | ) 113 | ] 114 | ), 115 | factory.createClassDeclaration( 116 | [factory.createToken(ts.SyntaxKind.DeclareKeyword)], 117 | factory.createIdentifier("Class2"), 118 | undefined, 119 | undefined, 120 | [ 121 | factory.createPropertyDeclaration( 122 | [factory.createToken(ts.SyntaxKind.ReadonlyKeyword)], 123 | factory.createIdentifier("other"), 124 | undefined, 125 | factory.createUnionTypeNode([ 126 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 127 | factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword) 128 | ]), 129 | undefined 130 | ), 131 | factory.createMethodDeclaration( 132 | undefined, 133 | undefined, 134 | factory.createIdentifier("method"), 135 | undefined, 136 | undefined, 137 | [factory.createParameterDeclaration( 138 | undefined, 139 | undefined, 140 | factory.createIdentifier("p"), 141 | undefined, 142 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 143 | undefined 144 | )], 145 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 146 | undefined 147 | ) 148 | ] 149 | ), 150 | factory.createVariableStatement( 151 | undefined, 152 | factory.createVariableDeclarationList( 153 | [factory.createVariableDeclaration( 154 | factory.createIdentifier("myVar"), 155 | undefined, 156 | undefined, 157 | factory.createNumericLiteral("6") 158 | )], 159 | ts.NodeFlags.Const 160 | ) 161 | ), 162 | factory.createVariableStatement( 163 | undefined, 164 | factory.createVariableDeclarationList( 165 | [ 166 | factory.createVariableDeclaration( 167 | factory.createIdentifier("myVar2"), 168 | undefined, 169 | undefined, 170 | factory.createNumericLiteral("6") 171 | ), 172 | factory.createVariableDeclaration( 173 | factory.createIdentifier("myVar3"), 174 | undefined, 175 | factory.createUnionTypeNode([ 176 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 177 | factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword) 178 | ]), 179 | undefined 180 | ) 181 | ], 182 | ts.NodeFlags.Let 183 | ) 184 | ), 185 | factory.createVariableStatement( 186 | undefined, 187 | factory.createVariableDeclarationList( 188 | [factory.createVariableDeclaration( 189 | factory.createIdentifier("otherVar"), 190 | undefined, 191 | undefined, 192 | factory.createBinaryExpression( 193 | factory.createNumericLiteral("4"), 194 | factory.createToken(ts.SyntaxKind.PlusToken), 195 | factory.createBinaryExpression( 196 | factory.createNumericLiteral("5"), 197 | factory.createToken(ts.SyntaxKind.AsteriskToken), 198 | factory.createNumericLiteral("12") 199 | ) 200 | ) 201 | )], 202 | ts.NodeFlags.None 203 | ) 204 | ), 205 | factory.createFunctionDeclaration( 206 | undefined, 207 | undefined, 208 | factory.createIdentifier("Function"), 209 | undefined, 210 | [factory.createParameterDeclaration( 211 | undefined, 212 | undefined, 213 | factory.createIdentifier("p"), 214 | undefined, 215 | factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), 216 | undefined 217 | )], 218 | factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), 219 | factory.createBlock( 220 | [factory.createReturnStatement(factory.createNumericLiteral("5"))], 221 | true 222 | ) 223 | ), 224 | factory.createFunctionDeclaration( 225 | undefined, 226 | undefined, 227 | factory.createIdentifier("test"), 228 | undefined, 229 | [], 230 | undefined, 231 | factory.createBlock( 232 | [], 233 | false 234 | ) 235 | ) 236 | ]; 237 | -------------------------------------------------------------------------------- /src/tests/baselines/language-features.ts: -------------------------------------------------------------------------------- 1 | export interface Interface { 2 | prop: string; 3 | readonly readonlyProp: string; 4 | [test: string]: string; 5 | } 6 | 7 | interface OtherInterface { 8 | method(p: string): string; 9 | new(p: number): string; 10 | } 11 | 12 | class Class { 13 | prop!: string; 14 | constructor(testing: string) { 15 | } 16 | method() { 17 | return 5; 18 | } 19 | } 20 | 21 | declare class Class2 { 22 | readonly other: string | void; 23 | method(p: string): string; 24 | } 25 | 26 | const myVar = 6; 27 | let myVar2 = 6, myVar3: string | undefined; 28 | var otherVar = 4 + 5 * 12; 29 | 30 | function Function(p: string): number { 31 | return 5; 32 | } 33 | 34 | function test() {} 35 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "commonjs", 5 | "strict": true, 6 | "esModuleInterop": true, 7 | "downlevelIteration": true, 8 | "rootDir": "./src", 9 | "outDir": "./dist", 10 | "declaration": true, 11 | "plugins": [{ "transform": "ts-nameof", "type": "raw" }] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.0" 14 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 15 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.4.14" 19 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 20 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@nodelib/fs.scandir@2.1.5": 31 | version "2.1.5" 32 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 33 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 34 | dependencies: 35 | "@nodelib/fs.stat" "2.0.5" 36 | run-parallel "^1.1.9" 37 | 38 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 39 | version "2.0.5" 40 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 41 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 42 | 43 | "@nodelib/fs.walk@^1.2.3": 44 | version "1.2.8" 45 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 46 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 47 | dependencies: 48 | "@nodelib/fs.scandir" "2.1.5" 49 | fastq "^1.6.0" 50 | 51 | "@ts-morph/common@~0.18.0": 52 | version "0.18.1" 53 | resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.18.1.tgz#ca40c3a62c3f9e17142e0af42633ad63efbae0ec" 54 | integrity sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA== 55 | dependencies: 56 | fast-glob "^3.2.12" 57 | minimatch "^5.1.0" 58 | mkdirp "^1.0.4" 59 | path-browserify "^1.0.1" 60 | 61 | "@ts-nameof/common@^4.2.0": 62 | version "4.2.1" 63 | resolved "https://registry.yarnpkg.com/@ts-nameof/common/-/common-4.2.1.tgz#76e6ab5b4a11c92b2a2a79bf133ae49b57d7efc3" 64 | integrity sha512-bWwYOFTTd6Nq7RUqJalIii1su3OyR+N1W0smp5PzHGUVycHuJ7MRiyCQrWgMt1lbbp3GY6cvCttm7Zo5E7A1xQ== 65 | 66 | "@ts-nameof/transforms-common@^4.2.1": 67 | version "4.2.1" 68 | resolved "https://registry.yarnpkg.com/@ts-nameof/transforms-common/-/transforms-common-4.2.1.tgz#a38c18ef62f921ffcea7b4a9a693cb63301e23d3" 69 | integrity sha512-mg6nkkHqNlKU1B15pEtiikSKadJSOxFFWpi7tEVB7Yhjx0PhoTcSe7oxK0fXHZGeoTGF2SMZjmCsGnbtfcgk6w== 70 | dependencies: 71 | "@ts-nameof/common" "^4.2.0" 72 | 73 | "@ts-nameof/transforms-ts@^4.2.1": 74 | version "4.2.1" 75 | resolved "https://registry.yarnpkg.com/@ts-nameof/transforms-ts/-/transforms-ts-4.2.1.tgz#a37921017694b75a3bc17fa6519408ee32298efd" 76 | integrity sha512-/zI2+DEQ1wvM0UQY5znG4efGbNSyBp+h4pzQZssGcst1748Np92RCWUnGfyV1qDlpIVma4S8Rx5HgkoDLPfMMg== 77 | dependencies: 78 | "@ts-nameof/common" "^4.2.0" 79 | "@ts-nameof/transforms-common" "^4.2.1" 80 | 81 | "@tsconfig/node10@^1.0.7": 82 | version "1.0.9" 83 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 84 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 85 | 86 | "@tsconfig/node12@^1.0.7": 87 | version "1.0.11" 88 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 89 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 90 | 91 | "@tsconfig/node14@^1.0.0": 92 | version "1.0.3" 93 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 94 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 95 | 96 | "@tsconfig/node16@^1.0.2": 97 | version "1.0.3" 98 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 99 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 100 | 101 | "@types/chai@^4.3.0": 102 | version "4.3.4" 103 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" 104 | integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== 105 | 106 | "@types/mocha@^9.1.0": 107 | version "9.1.1" 108 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 109 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 110 | 111 | "@types/node@^17.0.21": 112 | version "17.0.45" 113 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" 114 | integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== 115 | 116 | "@types/string-similarity@^4.0.0": 117 | version "4.0.0" 118 | resolved "https://registry.yarnpkg.com/@types/string-similarity/-/string-similarity-4.0.0.tgz#8cc03d5d1baad2b74530fe6c7d849d5768d391ad" 119 | integrity sha512-dMS4S07fbtY1AILG/RhuwmptmzK1Ql8scmAebOTJ/8iBtK/KI17NwGwKzu1uipjj8Kk+3mfPxum56kKZE93mzQ== 120 | 121 | "@types/ts-nameof@^4.2.1": 122 | version "4.2.1" 123 | resolved "https://registry.yarnpkg.com/@types/ts-nameof/-/ts-nameof-4.2.1.tgz#21bd84748601f3a220812152dc9bae7dc3051fa0" 124 | integrity sha512-NgMmD70b8NwX6BYhKh70xWkquAow6iq3kRAPp4sMAk4Mre9PrqZgvpq5+JbDLWIJPc4Q9ctkwSQjVAOlfuvlyQ== 125 | 126 | "@ungap/promise-all-settled@1.1.2": 127 | version "1.1.2" 128 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 129 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 130 | 131 | acorn-walk@^8.1.1: 132 | version "8.2.0" 133 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 134 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 135 | 136 | acorn@^8.4.1: 137 | version "8.8.1" 138 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 139 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 140 | 141 | ansi-colors@4.1.1: 142 | version "4.1.1" 143 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 144 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 145 | 146 | ansi-regex@^5.0.1: 147 | version "5.0.1" 148 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 149 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 150 | 151 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 152 | version "4.3.0" 153 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 154 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 155 | dependencies: 156 | color-convert "^2.0.1" 157 | 158 | anymatch@~3.1.2: 159 | version "3.1.3" 160 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 161 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 162 | dependencies: 163 | normalize-path "^3.0.0" 164 | picomatch "^2.0.4" 165 | 166 | arg@^4.1.0: 167 | version "4.1.3" 168 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 169 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 170 | 171 | argparse@^2.0.1: 172 | version "2.0.1" 173 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 174 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 175 | 176 | assertion-error@^1.1.0: 177 | version "1.1.0" 178 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 179 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 180 | 181 | balanced-match@^1.0.0: 182 | version "1.0.2" 183 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 184 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 185 | 186 | binary-extensions@^2.0.0: 187 | version "2.2.0" 188 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 189 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 190 | 191 | brace-expansion@^1.1.7: 192 | version "1.1.11" 193 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 194 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 195 | dependencies: 196 | balanced-match "^1.0.0" 197 | concat-map "0.0.1" 198 | 199 | brace-expansion@^2.0.1: 200 | version "2.0.1" 201 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 202 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 203 | dependencies: 204 | balanced-match "^1.0.0" 205 | 206 | braces@^3.0.2, braces@~3.0.2: 207 | version "3.0.2" 208 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 209 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 210 | dependencies: 211 | fill-range "^7.0.1" 212 | 213 | browser-stdout@1.3.1: 214 | version "1.3.1" 215 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 216 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 217 | 218 | camelcase@^6.0.0: 219 | version "6.3.0" 220 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 221 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 222 | 223 | chai@^4.3.6: 224 | version "4.3.7" 225 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" 226 | integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== 227 | dependencies: 228 | assertion-error "^1.1.0" 229 | check-error "^1.0.2" 230 | deep-eql "^4.1.2" 231 | get-func-name "^2.0.0" 232 | loupe "^2.3.1" 233 | pathval "^1.1.1" 234 | type-detect "^4.0.5" 235 | 236 | chalk@^4.1.0: 237 | version "4.1.2" 238 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 239 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 240 | dependencies: 241 | ansi-styles "^4.1.0" 242 | supports-color "^7.1.0" 243 | 244 | check-error@^1.0.2: 245 | version "1.0.2" 246 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 247 | integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== 248 | 249 | chokidar@3.5.3: 250 | version "3.5.3" 251 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 252 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 253 | dependencies: 254 | anymatch "~3.1.2" 255 | braces "~3.0.2" 256 | glob-parent "~5.1.2" 257 | is-binary-path "~2.1.0" 258 | is-glob "~4.0.1" 259 | normalize-path "~3.0.0" 260 | readdirp "~3.6.0" 261 | optionalDependencies: 262 | fsevents "~2.3.2" 263 | 264 | cliui@^7.0.2: 265 | version "7.0.4" 266 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 267 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 268 | dependencies: 269 | string-width "^4.2.0" 270 | strip-ansi "^6.0.0" 271 | wrap-ansi "^7.0.0" 272 | 273 | code-block-writer@^11.0.3: 274 | version "11.0.3" 275 | resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-11.0.3.tgz#9eec2993edfb79bfae845fbc093758c0a0b73b76" 276 | integrity sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw== 277 | 278 | color-convert@^2.0.1: 279 | version "2.0.1" 280 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 281 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 282 | dependencies: 283 | color-name "~1.1.4" 284 | 285 | color-name@~1.1.4: 286 | version "1.1.4" 287 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 288 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 289 | 290 | concat-map@0.0.1: 291 | version "0.0.1" 292 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 293 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 294 | 295 | create-require@^1.1.0: 296 | version "1.1.1" 297 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 298 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 299 | 300 | cross-env@^7.0.3: 301 | version "7.0.3" 302 | resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" 303 | integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== 304 | dependencies: 305 | cross-spawn "^7.0.1" 306 | 307 | cross-spawn@^7.0.1: 308 | version "7.0.3" 309 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 310 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 311 | dependencies: 312 | path-key "^3.1.0" 313 | shebang-command "^2.0.0" 314 | which "^2.0.1" 315 | 316 | debug@4.3.3: 317 | version "4.3.3" 318 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 319 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 320 | dependencies: 321 | ms "2.1.2" 322 | 323 | decamelize@^4.0.0: 324 | version "4.0.0" 325 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 326 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 327 | 328 | deep-eql@^4.1.2: 329 | version "4.1.3" 330 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" 331 | integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== 332 | dependencies: 333 | type-detect "^4.0.0" 334 | 335 | diff@5.0.0: 336 | version "5.0.0" 337 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 338 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 339 | 340 | diff@^4.0.1: 341 | version "4.0.2" 342 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 343 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 344 | 345 | emoji-regex@^8.0.0: 346 | version "8.0.0" 347 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 348 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 349 | 350 | escalade@^3.1.1: 351 | version "3.1.1" 352 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 353 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 354 | 355 | escape-string-regexp@4.0.0: 356 | version "4.0.0" 357 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 358 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 359 | 360 | fast-glob@^3.2.12: 361 | version "3.2.12" 362 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 363 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 364 | dependencies: 365 | "@nodelib/fs.stat" "^2.0.2" 366 | "@nodelib/fs.walk" "^1.2.3" 367 | glob-parent "^5.1.2" 368 | merge2 "^1.3.0" 369 | micromatch "^4.0.4" 370 | 371 | fastq@^1.6.0: 372 | version "1.14.0" 373 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" 374 | integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== 375 | dependencies: 376 | reusify "^1.0.4" 377 | 378 | fill-range@^7.0.1: 379 | version "7.0.1" 380 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 381 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 382 | dependencies: 383 | to-regex-range "^5.0.1" 384 | 385 | find-up@5.0.0: 386 | version "5.0.0" 387 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 388 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 389 | dependencies: 390 | locate-path "^6.0.0" 391 | path-exists "^4.0.0" 392 | 393 | flat@^5.0.2: 394 | version "5.0.2" 395 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 396 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 397 | 398 | fs.realpath@^1.0.0: 399 | version "1.0.0" 400 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 401 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 402 | 403 | fsevents@~2.3.2: 404 | version "2.3.2" 405 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 406 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 407 | 408 | function-bind@^1.1.1: 409 | version "1.1.1" 410 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 411 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 412 | 413 | get-caller-file@^2.0.5: 414 | version "2.0.5" 415 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 416 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 417 | 418 | get-func-name@^2.0.0: 419 | version "2.0.0" 420 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 421 | integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== 422 | 423 | glob-parent@^5.1.2, glob-parent@~5.1.2: 424 | version "5.1.2" 425 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 426 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 427 | dependencies: 428 | is-glob "^4.0.1" 429 | 430 | glob@7.2.0: 431 | version "7.2.0" 432 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 433 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 434 | dependencies: 435 | fs.realpath "^1.0.0" 436 | inflight "^1.0.4" 437 | inherits "2" 438 | minimatch "^3.0.4" 439 | once "^1.3.0" 440 | path-is-absolute "^1.0.0" 441 | 442 | glob@^7.1.6: 443 | version "7.2.3" 444 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 445 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 446 | dependencies: 447 | fs.realpath "^1.0.0" 448 | inflight "^1.0.4" 449 | inherits "2" 450 | minimatch "^3.1.1" 451 | once "^1.3.0" 452 | path-is-absolute "^1.0.0" 453 | 454 | growl@1.10.5: 455 | version "1.10.5" 456 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 457 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 458 | 459 | has-flag@^4.0.0: 460 | version "4.0.0" 461 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 462 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 463 | 464 | has@^1.0.3: 465 | version "1.0.3" 466 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 467 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 468 | dependencies: 469 | function-bind "^1.1.1" 470 | 471 | he@1.2.0: 472 | version "1.2.0" 473 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 474 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 475 | 476 | inflight@^1.0.4: 477 | version "1.0.6" 478 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 479 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 480 | dependencies: 481 | once "^1.3.0" 482 | wrappy "1" 483 | 484 | inherits@2: 485 | version "2.0.4" 486 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 487 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 488 | 489 | is-binary-path@~2.1.0: 490 | version "2.1.0" 491 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 492 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 493 | dependencies: 494 | binary-extensions "^2.0.0" 495 | 496 | is-core-module@^2.9.0: 497 | version "2.11.0" 498 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 499 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 500 | dependencies: 501 | has "^1.0.3" 502 | 503 | is-extglob@^2.1.1: 504 | version "2.1.1" 505 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 506 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 507 | 508 | is-fullwidth-code-point@^3.0.0: 509 | version "3.0.0" 510 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 511 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 512 | 513 | is-glob@^4.0.1, is-glob@~4.0.1: 514 | version "4.0.3" 515 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 516 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 517 | dependencies: 518 | is-extglob "^2.1.1" 519 | 520 | is-number@^7.0.0: 521 | version "7.0.0" 522 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 523 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 524 | 525 | is-plain-obj@^2.1.0: 526 | version "2.1.0" 527 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 528 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 529 | 530 | is-unicode-supported@^0.1.0: 531 | version "0.1.0" 532 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 533 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 534 | 535 | isexe@^2.0.0: 536 | version "2.0.0" 537 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 538 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 539 | 540 | js-yaml@4.1.0: 541 | version "4.1.0" 542 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 543 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 544 | dependencies: 545 | argparse "^2.0.1" 546 | 547 | locate-path@^6.0.0: 548 | version "6.0.0" 549 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 550 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 551 | dependencies: 552 | p-locate "^5.0.0" 553 | 554 | log-symbols@4.1.0: 555 | version "4.1.0" 556 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 557 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 558 | dependencies: 559 | chalk "^4.1.0" 560 | is-unicode-supported "^0.1.0" 561 | 562 | loupe@^2.3.1: 563 | version "2.3.6" 564 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" 565 | integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== 566 | dependencies: 567 | get-func-name "^2.0.0" 568 | 569 | make-error@^1.1.1: 570 | version "1.3.6" 571 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 572 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 573 | 574 | merge2@^1.3.0: 575 | version "1.4.1" 576 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 577 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 578 | 579 | micromatch@^4.0.4: 580 | version "4.0.5" 581 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 582 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 583 | dependencies: 584 | braces "^3.0.2" 585 | picomatch "^2.3.1" 586 | 587 | minimatch@4.2.1: 588 | version "4.2.1" 589 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" 590 | integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== 591 | dependencies: 592 | brace-expansion "^1.1.7" 593 | 594 | minimatch@^3.0.4, minimatch@^3.1.1: 595 | version "3.1.2" 596 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 597 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 598 | dependencies: 599 | brace-expansion "^1.1.7" 600 | 601 | minimatch@^5.1.0: 602 | version "5.1.2" 603 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" 604 | integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== 605 | dependencies: 606 | brace-expansion "^2.0.1" 607 | 608 | mkdirp@^1.0.4: 609 | version "1.0.4" 610 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 611 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 612 | 613 | mocha@^9.2.1: 614 | version "9.2.2" 615 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" 616 | integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== 617 | dependencies: 618 | "@ungap/promise-all-settled" "1.1.2" 619 | ansi-colors "4.1.1" 620 | browser-stdout "1.3.1" 621 | chokidar "3.5.3" 622 | debug "4.3.3" 623 | diff "5.0.0" 624 | escape-string-regexp "4.0.0" 625 | find-up "5.0.0" 626 | glob "7.2.0" 627 | growl "1.10.5" 628 | he "1.2.0" 629 | js-yaml "4.1.0" 630 | log-symbols "4.1.0" 631 | minimatch "4.2.1" 632 | ms "2.1.3" 633 | nanoid "3.3.1" 634 | serialize-javascript "6.0.0" 635 | strip-json-comments "3.1.1" 636 | supports-color "8.1.1" 637 | which "2.0.2" 638 | workerpool "6.2.0" 639 | yargs "16.2.0" 640 | yargs-parser "20.2.4" 641 | yargs-unparser "2.0.0" 642 | 643 | ms@2.1.2: 644 | version "2.1.2" 645 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 646 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 647 | 648 | ms@2.1.3: 649 | version "2.1.3" 650 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 651 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 652 | 653 | nanoid@3.3.1: 654 | version "3.3.1" 655 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 656 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 657 | 658 | normalize-path@^3.0.0, normalize-path@~3.0.0: 659 | version "3.0.0" 660 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 661 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 662 | 663 | once@^1.3.0: 664 | version "1.4.0" 665 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 666 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 667 | dependencies: 668 | wrappy "1" 669 | 670 | p-limit@^3.0.2: 671 | version "3.1.0" 672 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 673 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 674 | dependencies: 675 | yocto-queue "^0.1.0" 676 | 677 | p-locate@^5.0.0: 678 | version "5.0.0" 679 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 680 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 681 | dependencies: 682 | p-limit "^3.0.2" 683 | 684 | path-browserify@^1.0.1: 685 | version "1.0.1" 686 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" 687 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 688 | 689 | path-exists@^4.0.0: 690 | version "4.0.0" 691 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 692 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 693 | 694 | path-is-absolute@^1.0.0: 695 | version "1.0.1" 696 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 697 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 698 | 699 | path-key@^3.1.0: 700 | version "3.1.1" 701 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 702 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 703 | 704 | path-parse@^1.0.7: 705 | version "1.0.7" 706 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 707 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 708 | 709 | pathval@^1.1.1: 710 | version "1.1.1" 711 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 712 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 713 | 714 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 715 | version "2.3.1" 716 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 717 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 718 | 719 | queue-microtask@^1.2.2: 720 | version "1.2.3" 721 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 722 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 723 | 724 | randombytes@^2.1.0: 725 | version "2.1.0" 726 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 727 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 728 | dependencies: 729 | safe-buffer "^5.1.0" 730 | 731 | readdirp@~3.6.0: 732 | version "3.6.0" 733 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 734 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 735 | dependencies: 736 | picomatch "^2.2.1" 737 | 738 | require-directory@^2.1.1: 739 | version "2.1.1" 740 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 741 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 742 | 743 | resolve@>=1.9.0: 744 | version "1.22.1" 745 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 746 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 747 | dependencies: 748 | is-core-module "^2.9.0" 749 | path-parse "^1.0.7" 750 | supports-preserve-symlinks-flag "^1.0.0" 751 | 752 | reusify@^1.0.4: 753 | version "1.0.4" 754 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 755 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 756 | 757 | run-parallel@^1.1.9: 758 | version "1.2.0" 759 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 760 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 761 | dependencies: 762 | queue-microtask "^1.2.2" 763 | 764 | safe-buffer@^5.1.0: 765 | version "5.2.1" 766 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 767 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 768 | 769 | serialize-javascript@6.0.0: 770 | version "6.0.0" 771 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 772 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 773 | dependencies: 774 | randombytes "^2.1.0" 775 | 776 | shebang-command@^2.0.0: 777 | version "2.0.0" 778 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 779 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 780 | dependencies: 781 | shebang-regex "^3.0.0" 782 | 783 | shebang-regex@^3.0.0: 784 | version "3.0.0" 785 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 786 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 787 | 788 | string-similarity@^4.0.4: 789 | version "4.0.4" 790 | resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" 791 | integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== 792 | 793 | string-width@^4.1.0, string-width@^4.2.0: 794 | version "4.2.3" 795 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 796 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 797 | dependencies: 798 | emoji-regex "^8.0.0" 799 | is-fullwidth-code-point "^3.0.0" 800 | strip-ansi "^6.0.1" 801 | 802 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 803 | version "6.0.1" 804 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 805 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 806 | dependencies: 807 | ansi-regex "^5.0.1" 808 | 809 | strip-json-comments@3.1.1: 810 | version "3.1.1" 811 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 812 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 813 | 814 | supports-color@8.1.1: 815 | version "8.1.1" 816 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 817 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 818 | dependencies: 819 | has-flag "^4.0.0" 820 | 821 | supports-color@^7.1.0: 822 | version "7.2.0" 823 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 824 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 825 | dependencies: 826 | has-flag "^4.0.0" 827 | 828 | supports-preserve-symlinks-flag@^1.0.0: 829 | version "1.0.0" 830 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 831 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 832 | 833 | to-regex-range@^5.0.1: 834 | version "5.0.1" 835 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 836 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 837 | dependencies: 838 | is-number "^7.0.0" 839 | 840 | ts-morph@^17.0.1: 841 | version "17.0.1" 842 | resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-17.0.1.tgz#d85df4fcf9a1fcda1b331d52c00655f381c932d1" 843 | integrity sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g== 844 | dependencies: 845 | "@ts-morph/common" "~0.18.0" 846 | code-block-writer "^11.0.3" 847 | 848 | ts-nameof@^5.0.0: 849 | version "5.0.0" 850 | resolved "https://registry.yarnpkg.com/ts-nameof/-/ts-nameof-5.0.0.tgz#9ef33e9eeb4e0bf405073be35cf91ddf8952ac62" 851 | integrity sha512-KKebM+HvZdtiFLVUtkvTmlJNzmMPMMwzw7yCcTCA5XRmwDupX/JuPEfnXYpu/Bfb8d+voF1ih2fdizqgKSIO+g== 852 | dependencies: 853 | "@ts-nameof/common" "^4.2.0" 854 | "@ts-nameof/transforms-ts" "^4.2.1" 855 | glob "^7.1.6" 856 | 857 | ts-node@^10.6.0: 858 | version "10.9.1" 859 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 860 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 861 | dependencies: 862 | "@cspotcode/source-map-support" "^0.8.0" 863 | "@tsconfig/node10" "^1.0.7" 864 | "@tsconfig/node12" "^1.0.7" 865 | "@tsconfig/node14" "^1.0.0" 866 | "@tsconfig/node16" "^1.0.2" 867 | acorn "^8.4.1" 868 | acorn-walk "^8.1.1" 869 | arg "^4.1.0" 870 | create-require "^1.1.0" 871 | diff "^4.0.1" 872 | make-error "^1.1.1" 873 | v8-compile-cache-lib "^3.0.1" 874 | yn "3.1.1" 875 | 876 | ttypescript@^1.5.13: 877 | version "1.5.15" 878 | resolved "https://registry.yarnpkg.com/ttypescript/-/ttypescript-1.5.15.tgz#e45550ad69289d06d3bc3fd4a3c87e7c1ef3eba7" 879 | integrity sha512-48ykDNHzFnPMnv4hYX1P8Q84TvCZyL1QlFxeuxsuZ48X2+ameBgPenvmCkHJtoOSxpoWTWi8NcgNrRnVDOmfSg== 880 | dependencies: 881 | resolve ">=1.9.0" 882 | 883 | type-detect@^4.0.0, type-detect@^4.0.5: 884 | version "4.0.8" 885 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 886 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 887 | 888 | "typescript-3.2.1@npm:typescript@3.2.1": 889 | version "3.2.1" 890 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192" 891 | integrity sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg== 892 | 893 | "typescript-3.6.3@npm:typescript@3.6.3": 894 | version "3.6.3" 895 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" 896 | integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== 897 | 898 | "typescript-4.8.3@npm:typescript@4.8.3": 899 | version "4.8.3" 900 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88" 901 | integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== 902 | 903 | "typescript-4.9.4@npm:typescript@4.9.4", typescript@^4.9.4: 904 | version "4.9.4" 905 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" 906 | integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== 907 | 908 | "typescript-next@npm:typescript@next": 909 | version "5.0.0-dev.20221224" 910 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.0-dev.20221224.tgz#55b7b0d59f7eec36f55de021904ea7df63e8e50b" 911 | integrity sha512-yclncCjJ2couUTwRGHg3sLW23WD6jio63IifPtpQBfHiv+JKouRfrjZK5Mq2JUBAAuTh3r5Qov73YlIjCHQ4XA== 912 | 913 | v8-compile-cache-lib@^3.0.1: 914 | version "3.0.1" 915 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 916 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 917 | 918 | which@2.0.2, which@^2.0.1: 919 | version "2.0.2" 920 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 921 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 922 | dependencies: 923 | isexe "^2.0.0" 924 | 925 | workerpool@6.2.0: 926 | version "6.2.0" 927 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" 928 | integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== 929 | 930 | wrap-ansi@^7.0.0: 931 | version "7.0.0" 932 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 933 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 934 | dependencies: 935 | ansi-styles "^4.0.0" 936 | string-width "^4.1.0" 937 | strip-ansi "^6.0.0" 938 | 939 | wrappy@1: 940 | version "1.0.2" 941 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 942 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 943 | 944 | y18n@^5.0.5: 945 | version "5.0.8" 946 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 947 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 948 | 949 | yargs-parser@20.2.4: 950 | version "20.2.4" 951 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 952 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 953 | 954 | yargs-parser@^20.2.2: 955 | version "20.2.9" 956 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 957 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 958 | 959 | yargs-unparser@2.0.0: 960 | version "2.0.0" 961 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 962 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 963 | dependencies: 964 | camelcase "^6.0.0" 965 | decamelize "^4.0.0" 966 | flat "^5.0.2" 967 | is-plain-obj "^2.1.0" 968 | 969 | yargs@16.2.0: 970 | version "16.2.0" 971 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 972 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 973 | dependencies: 974 | cliui "^7.0.2" 975 | escalade "^3.1.1" 976 | get-caller-file "^2.0.5" 977 | require-directory "^2.1.1" 978 | string-width "^4.2.0" 979 | y18n "^5.0.5" 980 | yargs-parser "^20.2.2" 981 | 982 | yn@3.1.1: 983 | version "3.1.1" 984 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 985 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 986 | 987 | yocto-queue@^0.1.0: 988 | version "0.1.0" 989 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 990 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 991 | --------------------------------------------------------------------------------