├── src ├── types.ts ├── commands │ ├── serverRestart.ts │ ├── builtinInstallRequirementsTools.ts │ ├── serverResyncAnsibleInventory.ts │ ├── serverShowMetaData.ts │ ├── ansibleDocShowSnippets.ts │ └── ansibleDocShowInfo.ts ├── actions │ ├── ignoringRules.ts │ └── showWebDocumentation.ts ├── installer.ts ├── tool.ts └── index.ts ├── .npmignore ├── tsconfig.json ├── .eslintrc.js ├── esbuild.js ├── LICENSE ├── .gitignore ├── README.md ├── package.json └── yarn.lock /src/types.ts: -------------------------------------------------------------------------------- 1 | export type PythonPaths = { 2 | env: string; 3 | real: string; 4 | }; 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | node_modules 3 | tsconfig.json 4 | *.map 5 | .tags 6 | .DS_Store 7 | webpack.config.js 8 | esbuild.js 9 | yarn.lock 10 | yarn-error.log 11 | .github 12 | .eslintrc.js 13 | .prettierrc 14 | _ref 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "lib": ["es2017", "es2018", "DOM"], 5 | "module": "commonjs", 6 | "declaration": false, 7 | "sourceMap": true, 8 | "outDir": "lib", 9 | "strict": true, 10 | "moduleResolution": "node", 11 | "noImplicitAny": false, 12 | "esModuleInterop": true 13 | }, 14 | "include": ["src"] 15 | } 16 | -------------------------------------------------------------------------------- /src/commands/serverRestart.ts: -------------------------------------------------------------------------------- 1 | import { commands, ExtensionContext, LanguageClient, workspace } from 'coc.nvim'; 2 | 3 | export function activate(context: ExtensionContext, client: LanguageClient) { 4 | context.subscriptions.push( 5 | commands.registerCommand('ansible.server.restart', async () => { 6 | // Refresh the diagnostics by setting undefined for coc.nvim 7 | const { document } = await workspace.getCurrentState(); 8 | client.diagnostics?.set(document.uri, undefined); 9 | 10 | // Stop and Start 11 | await client.stop(); 12 | client.start(); 13 | }) 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | node: true, 4 | }, 5 | parser: '@typescript-eslint/parser', 6 | extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], 7 | rules: { 8 | '@typescript-eslint/ban-ts-comment': 'off', 9 | '@typescript-eslint/no-explicit-any': 'off', 10 | '@typescript-eslint/no-non-null-assertion': 'off', 11 | '@typescript-eslint/no-namespace': 'off', 12 | '@typescript-eslint/no-empty-function': 'off', 13 | '@typescript-eslint/explicit-function-return-type': 'off', 14 | '@typescript-eslint/explicit-module-boundary-types': 'off', 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /src/commands/builtinInstallRequirementsTools.ts: -------------------------------------------------------------------------------- 1 | import { commands, ExtensionContext, LanguageClient, ServiceStat } from 'coc.nvim'; 2 | import { installWrapper } from '../installer'; 3 | import type { PythonPaths } from '../types'; 4 | 5 | export function activate(context: ExtensionContext, pythonCommandPaths: PythonPaths, client: LanguageClient) { 6 | context.subscriptions.push( 7 | commands.registerCommand('ansible.builtin.installRequirementsTools', async () => { 8 | if (client.serviceState !== ServiceStat.Stopped) { 9 | await client.stop(); 10 | } 11 | 12 | if (pythonCommandPaths) { 13 | await installWrapper(pythonCommandPaths.real, context); 14 | } 15 | client.start(); 16 | }) 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/commands/serverResyncAnsibleInventory.ts: -------------------------------------------------------------------------------- 1 | import { commands, ExtensionContext, LanguageClient, NotificationType, workspace } from 'coc.nvim'; 2 | 3 | export async function activate(context: ExtensionContext, client: LanguageClient) { 4 | await client.onReady(); 5 | 6 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 7 | client.onNotification(new NotificationType(`resync/ansible-inventory`), (event) => {}); 8 | 9 | context.subscriptions.push( 10 | commands.registerCommand('ansible.server.resyncAnsibleInventory', async () => { 11 | const { document } = await workspace.getCurrentState(); 12 | if (document.languageId !== 'ansible') return; 13 | 14 | client.sendNotification(new NotificationType(`resync/ansible-inventory`)); 15 | }) 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /esbuild.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires */ 2 | async function start(watch) { 3 | await require('esbuild').build({ 4 | entryPoints: ['src/index.ts'], 5 | bundle: true, 6 | watch, 7 | minify: process.env.NODE_ENV === 'production', 8 | sourcemap: process.env.NODE_ENV === 'development', 9 | mainFields: ['module', 'main'], 10 | external: ['coc.nvim'], 11 | platform: 'node', 12 | target: 'node14.14', 13 | outfile: 'lib/index.js', 14 | }); 15 | } 16 | 17 | let watch = false; 18 | if (process.argv.length > 2 && process.argv[2] === '--watch') { 19 | console.log('watching...'); 20 | watch = { 21 | onRebuild(error) { 22 | if (error) { 23 | console.error('watch build failed:', error); 24 | } else { 25 | console.log('watch build succeeded'); 26 | } 27 | }, 28 | }; 29 | } 30 | 31 | start(watch).catch((e) => { 32 | console.error(e); 33 | }); 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 yaegassy 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 | -------------------------------------------------------------------------------- /src/commands/serverShowMetaData.ts: -------------------------------------------------------------------------------- 1 | import { commands, ExtensionContext, LanguageClient, NotificationType, workspace } from 'coc.nvim'; 2 | 3 | export async function activate(context: ExtensionContext, client: LanguageClient) { 4 | await client.onReady(); 5 | 6 | client.onNotification(new NotificationType(`update/ansible-metadata`), async (ansibleMetaDataList: any) => { 7 | const outputText = JSON.stringify(ansibleMetaDataList, null, 2); 8 | 9 | await workspace.nvim 10 | .command( 11 | 'belowright vnew ansible-server-metadata | setlocal buftype=nofile bufhidden=hide noswapfile filetype=json' 12 | ) 13 | .then(async () => { 14 | const buf = await workspace.nvim.buffer; 15 | buf.setLines(outputText.split('\n'), { start: 0, end: -1 }); 16 | }); 17 | }); 18 | 19 | context.subscriptions.push( 20 | commands.registerCommand('ansible.server.showMetaData', async () => { 21 | const { document } = await workspace.getCurrentState(); 22 | if (document.languageId !== 'ansible') return; 23 | 24 | client.sendNotification(new NotificationType(`update/ansible-metadata`), [document.uri.toString()]); 25 | }) 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | _ref 3 | _check 4 | 5 | ### https://raw.github.com/github/gitignore/b0012e4930d0a8c350254a3caeedf7441ea286a3/Node.gitignore 6 | 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | .pnpm-debug.log* 15 | 16 | # Diagnostic reports (https://nodejs.org/api/report.html) 17 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 18 | 19 | # Runtime data 20 | pids 21 | *.pid 22 | *.seed 23 | *.pid.lock 24 | 25 | # Directory for instrumented libs generated by jscoverage/JSCover 26 | lib-cov 27 | 28 | # Coverage directory used by tools like istanbul 29 | coverage 30 | *.lcov 31 | 32 | # nyc test coverage 33 | .nyc_output 34 | 35 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 36 | .grunt 37 | 38 | # Bower dependency directory (https://bower.io/) 39 | bower_components 40 | 41 | # node-waf configuration 42 | .lock-wscript 43 | 44 | # Compiled binary addons (https://nodejs.org/api/addons.html) 45 | build/Release 46 | 47 | # Dependency directories 48 | node_modules/ 49 | jspm_packages/ 50 | 51 | # Snowpack dependency directory (https://snowpack.dev/) 52 | web_modules/ 53 | 54 | # TypeScript cache 55 | *.tsbuildinfo 56 | 57 | # Optional npm cache directory 58 | .npm 59 | 60 | # Optional eslint cache 61 | .eslintcache 62 | 63 | # Microbundle cache 64 | .rpt2_cache/ 65 | .rts2_cache_cjs/ 66 | .rts2_cache_es/ 67 | .rts2_cache_umd/ 68 | 69 | # Optional REPL history 70 | .node_repl_history 71 | 72 | # Output of 'npm pack' 73 | *.tgz 74 | 75 | # Yarn Integrity file 76 | .yarn-integrity 77 | 78 | # dotenv environment variables file 79 | .env 80 | .env.test 81 | .env.production 82 | 83 | # parcel-bundler cache (https://parceljs.org/) 84 | .cache 85 | .parcel-cache 86 | 87 | # Next.js build output 88 | .next 89 | out 90 | 91 | # Nuxt.js build / generate output 92 | .nuxt 93 | dist 94 | 95 | # Gatsby files 96 | .cache/ 97 | # Comment in the public line in if your project uses Gatsby and not Next.js 98 | # https://nextjs.org/blog/next-9-1#public-directory-support 99 | # public 100 | 101 | # vuepress build output 102 | .vuepress/dist 103 | 104 | # Serverless directories 105 | .serverless/ 106 | 107 | # FuseBox cache 108 | .fusebox/ 109 | 110 | # DynamoDB Local files 111 | .dynamodb/ 112 | 113 | # TernJS port file 114 | .tern-port 115 | 116 | # Stores VSCode versions used for testing VSCode extensions 117 | .vscode-test 118 | 119 | # yarn v2 120 | .yarn/cache 121 | .yarn/unplugged 122 | .yarn/build-state.yml 123 | .yarn/install-state.gz 124 | .pnp.* 125 | 126 | 127 | -------------------------------------------------------------------------------- /src/actions/ignoringRules.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CodeAction, 3 | CodeActionContext, 4 | CodeActionProvider, 5 | DocumentSelector, 6 | ExtensionContext, 7 | languages, 8 | OutputChannel, 9 | Range, 10 | TextDocument, 11 | TextEdit, 12 | workspace, 13 | } from 'coc.nvim'; 14 | 15 | export function activate(context: ExtensionContext, outputChannel: OutputChannel) { 16 | const documentSelector: DocumentSelector = [ 17 | { scheme: 'file', language: 'ansible' }, 18 | { scheme: 'file', language: 'yaml.ansible' }, 19 | ]; 20 | 21 | context.subscriptions.push( 22 | languages.registerCodeActionProvider( 23 | documentSelector, 24 | new IgnoringRulesCodeActionProvider(outputChannel), 25 | 'ansible' 26 | ) 27 | ); 28 | } 29 | 30 | class IgnoringRulesCodeActionProvider implements CodeActionProvider { 31 | private readonly source = 'ansible'; 32 | private diagnosticCollection = languages.createDiagnosticCollection(this.source); 33 | private outputChannel: OutputChannel; 34 | 35 | constructor(outputChannel: OutputChannel) { 36 | this.outputChannel = outputChannel; 37 | } 38 | 39 | public async provideCodeActions(document: TextDocument, range: Range, context: CodeActionContext) { 40 | const doc = workspace.getDocument(document.uri); 41 | const wholeRange = Range.create(0, 0, doc.lineCount, 0); 42 | let whole = false; 43 | if ( 44 | range.start.line === wholeRange.start.line && 45 | range.start.character === wholeRange.start.character && 46 | range.end.line === wholeRange.end.line && 47 | range.end.character === wholeRange.end.character 48 | ) { 49 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 50 | whole = true; 51 | } 52 | const codeActions: CodeAction[] = []; 53 | 54 | /** Ignoring rules for current line (# noqa [ruleId] */ 55 | if (this.lineRange(range) && context.diagnostics.length > 0) { 56 | const line = doc.getline(range.start.line); 57 | if (line && line.length) { 58 | let existsAnsibleDiagnostics = false; 59 | const ruleIds: (string | number)[] = []; 60 | context.diagnostics.forEach((d) => { 61 | if (d.source === 'ansible-lint') { 62 | existsAnsibleDiagnostics = true; 63 | if (d.code) { 64 | const ruleId = d.code; 65 | if (ruleId) ruleIds.push(ruleId); 66 | } 67 | } 68 | }); 69 | 70 | if (existsAnsibleDiagnostics) { 71 | ruleIds.forEach((id) => { 72 | let newText = ''; 73 | if (line.match(/# noqa/)) { 74 | newText = `${line} ${id}${range.start.line + 1 === range.end.line ? '\n' : ''}`; 75 | } else { 76 | newText = `${line} # noqa ${id}${range.start.line + 1 === range.end.line ? '\n' : ''}`; 77 | } 78 | 79 | const edit = TextEdit.replace(range, newText); 80 | 81 | codeActions.push({ 82 | title: `Ignoring rules for current line (# noqa ${id})`, 83 | edit: { 84 | changes: { 85 | [doc.uri]: [edit], 86 | }, 87 | }, 88 | }); 89 | }); 90 | } 91 | } 92 | } 93 | 94 | return codeActions; 95 | } 96 | 97 | private lineRange(r: Range): boolean { 98 | return ( 99 | (r.start.line + 1 === r.end.line && r.start.character === 0 && r.end.character === 0) || 100 | (r.start.line === r.end.line && r.start.character === 0) 101 | ); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/installer.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionContext, window, workspace } from 'coc.nvim'; 2 | 3 | import child_process from 'child_process'; 4 | import path from 'path'; 5 | import { rimrafSync } from 'rimraf'; 6 | import util from 'util'; 7 | 8 | const exec = util.promisify(child_process.exec); 9 | 10 | export async function installLsRequirementsTools(pythonCommand: string, context: ExtensionContext): Promise { 11 | const pathVenv = path.join(context.storagePath, 'ansible', 'venv'); 12 | 13 | let pathVenvPython = path.join(context.storagePath, 'ansible', 'venv', 'bin', 'python'); 14 | if (process.platform === 'win32') { 15 | pathVenvPython = path.join(context.storagePath, 'ansible', 'venv', 'Scripts', 'python'); 16 | } 17 | 18 | const statusItem = window.createStatusBarItem(0, { progress: true }); 19 | statusItem.text = `Install Ansible Server requirements tools...`; 20 | statusItem.show(); 21 | 22 | const extensionConfig = workspace.getConfiguration('ansible'); 23 | const isWithYamlLint = extensionConfig.get('builtin.isWithYamllint'); 24 | const installAnsibleStr = _installToolVersionStr('ansible', extensionConfig.get('builtin.ansibleVersion')); 25 | const installAnsibleLintStr = _installToolVersionStr( 26 | 'ansible-lint', 27 | extensionConfig.get('builtin.ansibleLintVersion') 28 | ); 29 | const installYamllintStr = _installToolVersionStr('yamllint', extensionConfig.get('builtin.yamllintVersion')); 30 | 31 | const installCmd = 32 | `"${pythonCommand}" -m venv ${pathVenv} && ` + 33 | `${pathVenvPython} -m pip install -U pip ${installAnsibleStr} ${installAnsibleLintStr}`; 34 | 35 | if (isWithYamlLint) { 36 | installCmd.concat(' ', installYamllintStr); 37 | } 38 | 39 | rimrafSync(pathVenv); 40 | try { 41 | window.showInformationMessage(`Install Ansible Server requirements tools...`); 42 | await exec(installCmd); 43 | statusItem.hide(); 44 | window.showInformationMessage(`Ansible Server requirements tools: installed!`); 45 | } catch (error) { 46 | statusItem.hide(); 47 | window.showErrorMessage(`Ansible Server requirements tools: install failed. | ${error}`); 48 | throw new Error(); 49 | } 50 | } 51 | 52 | function _installToolVersionStr(name: string, version?: string): string { 53 | let installStr: string; 54 | 55 | if (version) { 56 | installStr = `${name}==${version}`; 57 | } else { 58 | installStr = `${name}`; 59 | } 60 | 61 | return installStr; 62 | } 63 | 64 | export async function installWrapper(pythonCommand: string, context: ExtensionContext) { 65 | const msg = 'Install Ansible Server requirements tools?'; 66 | const ret = await window.showPrompt(msg); 67 | if (ret) { 68 | let isFinished = false; 69 | 70 | try { 71 | // Timer 72 | const start = new Date(); 73 | let lap: Date; 74 | 75 | const timerId = setInterval(() => { 76 | lap = new Date(); 77 | window.showWarningMessage( 78 | `ansible | Install requirements tools... (${Math.floor((lap.getTime() - start.getTime()) / 1000)} sec)` 79 | ); 80 | 81 | if (isFinished) { 82 | const stop = new Date(); 83 | // Complete message 84 | window.showWarningMessage( 85 | `ansible | Installation is complete! (${Math.floor((stop.getTime() - start.getTime()) / 1000)} sec)` 86 | ); 87 | clearInterval(timerId); 88 | } 89 | }, 2000); 90 | 91 | await installLsRequirementsTools(pythonCommand, context); 92 | isFinished = true; 93 | } catch (e) { 94 | return; 95 | } 96 | } else { 97 | return; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/actions/showWebDocumentation.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CodeAction, 3 | CodeActionContext, 4 | CodeActionProvider, 5 | Diagnostic, 6 | DocumentSelector, 7 | ExtensionContext, 8 | languages, 9 | OutputChannel, 10 | Range, 11 | TextDocument, 12 | workspace, 13 | } from 'coc.nvim'; 14 | 15 | type AdditionalDiagnostic = { 16 | codeDescription?: { 17 | href?: string; 18 | }; 19 | }; 20 | 21 | type ALSDiagnostic = Diagnostic & AdditionalDiagnostic; 22 | 23 | type AnsibleLintRules = { 24 | id: string | number; 25 | href: string; 26 | }; 27 | 28 | export function activate(context: ExtensionContext, outputChannel: OutputChannel) { 29 | const documentSelector: DocumentSelector = [ 30 | { scheme: 'file', language: 'ansible' }, 31 | { scheme: 'file', language: 'yaml.ansible' }, 32 | ]; 33 | 34 | context.subscriptions.push( 35 | languages.registerCodeActionProvider( 36 | documentSelector, 37 | new ShowWebDocumentationCodeActionProvider(outputChannel), 38 | 'ansible' 39 | ) 40 | ); 41 | } 42 | 43 | class ShowWebDocumentationCodeActionProvider implements CodeActionProvider { 44 | private readonly source = 'ansible'; 45 | private diagnosticCollection = languages.createDiagnosticCollection(this.source); 46 | private outputChannel: OutputChannel; 47 | 48 | constructor(outputChannel: OutputChannel) { 49 | this.outputChannel = outputChannel; 50 | } 51 | 52 | public async provideCodeActions(document: TextDocument, range: Range, context: CodeActionContext) { 53 | const doc = workspace.getDocument(document.uri); 54 | const wholeRange = Range.create(0, 0, doc.lineCount, 0); 55 | let whole = false; 56 | if ( 57 | range.start.line === wholeRange.start.line && 58 | range.start.character === wholeRange.start.character && 59 | range.end.line === wholeRange.end.line && 60 | range.end.character === wholeRange.end.character 61 | ) { 62 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 63 | whole = true; 64 | } 65 | const codeActions: CodeAction[] = []; 66 | 67 | /** Show web documentation for [ruleId] */ 68 | if (this.lineRange(range) && context.diagnostics.length > 0) { 69 | const line = doc.getline(range.start.line); 70 | if (line && line.length) { 71 | let existsAnsibleDiagnostics = false; 72 | 73 | const ansibleLintRules: AnsibleLintRules[] = []; 74 | context.diagnostics.forEach((d) => { 75 | if (d.source === 'ansible-lint') { 76 | existsAnsibleDiagnostics = true; 77 | 78 | if ('codeDescription' in d) { 79 | const alsDiagnostic = d as ALSDiagnostic; 80 | if (alsDiagnostic.codeDescription?.href) { 81 | if (alsDiagnostic.code) { 82 | ansibleLintRules.push({ 83 | id: alsDiagnostic.code, 84 | href: alsDiagnostic.codeDescription.href, 85 | }); 86 | } 87 | } 88 | } 89 | } 90 | }); 91 | 92 | if (existsAnsibleDiagnostics) { 93 | ansibleLintRules.forEach((r) => { 94 | const title = `Show web documentation for ${r.id}`; 95 | 96 | const command = { 97 | title: '', 98 | command: 'vscode.open', 99 | arguments: [r.href], 100 | }; 101 | 102 | const action: CodeAction = { 103 | title, 104 | command, 105 | }; 106 | 107 | codeActions.push(action); 108 | }); 109 | } 110 | } 111 | } 112 | 113 | return codeActions; 114 | } 115 | 116 | private lineRange(r: Range): boolean { 117 | return ( 118 | (r.start.line + 1 === r.end.line && r.start.character === 0 && r.end.character === 0) || 119 | (r.start.line === r.end.line && r.start.character === 0) 120 | ); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/commands/ansibleDocShowSnippets.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BasicList, 3 | commands, 4 | ExtensionContext, 5 | ListAction, 6 | ListContext, 7 | ListItem, 8 | listManager, 9 | Neovim, 10 | Terminal, 11 | window, 12 | workspace, 13 | } from 'coc.nvim'; 14 | 15 | import cp from 'child_process'; 16 | 17 | let terminal: Terminal | undefined; 18 | 19 | type FeatureListItemType = { 20 | name: string; 21 | description: string; 22 | }; 23 | 24 | export function activate(context: ExtensionContext, ansibleDocPath: string) { 25 | const ansibleDocList = new AnsibleDocShowSnippetsList(workspace.nvim, ansibleDocPath); 26 | listManager.registerList(ansibleDocList); 27 | 28 | context.subscriptions.push( 29 | commands.registerCommand('ansible.ansbileDoc.showSnippets', async () => { 30 | // Only snippets is module, inventory and lookup are supported. 31 | // See: https://docs.ansible.com/ansible/latest/cli/ansible-doc.html 32 | const pluginType = ['module', 'inventory', 'lookup']; 33 | 34 | const picked = await window.showMenuPicker(pluginType, `Choose Plugin Type`); 35 | 36 | if (picked !== -1) { 37 | ansibleDocList.choosedPluginType = pluginType[picked]; 38 | await workspace.nvim.command(`CocList ansibleDocShowSnippets`); 39 | } 40 | }) 41 | ); 42 | } 43 | 44 | class AnsibleDocShowSnippetsList extends BasicList { 45 | public readonly name = 'ansibleDocShowSnippets'; 46 | public readonly description = 'snippets for ansible-doc'; 47 | public readonly defaultAction = 'execute'; 48 | public actions: ListAction[] = []; 49 | 50 | public ansibleDocPath: string; 51 | public choosedPluginType = 'module'; 52 | 53 | constructor(nvim: Neovim, ansibleDocPath: string) { 54 | super(nvim); 55 | 56 | this.ansibleDocPath = ansibleDocPath; 57 | 58 | this.addAction('execute', (item: ListItem) => { 59 | const pluginName = item.label.split(':')[0]; 60 | runAnsibleDocShowSnippetsInTerminal(pluginName, this.ansibleDocPath, this.choosedPluginType); 61 | }); 62 | } 63 | 64 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 65 | public async loadItems(context: ListContext): Promise { 66 | const listItems: ListItem[] = []; 67 | const plugins = await getAnsibleDocListItems(this.ansibleDocPath, this.choosedPluginType); 68 | plugins.forEach((p) => listItems.push({ label: `${p.name}: [${p.description}]`, filterText: p.name })); 69 | return listItems; 70 | } 71 | } 72 | 73 | async function getAnsibleDocListItems(ansibleDocPath: string, pluginType: string) { 74 | return new Promise((resolve) => { 75 | cp.exec(`${ansibleDocPath} -l -j -t ${pluginType}`, (err, stdout) => { 76 | if (err) resolve([]); 77 | 78 | if (stdout.length > 0) { 79 | try { 80 | const ansibleDocListJSONData = JSON.parse(stdout); 81 | const featureResults: FeatureListItemType[] = []; 82 | Object.keys(ansibleDocListJSONData).forEach((key) => { 83 | featureResults.push({ 84 | name: key, 85 | description: ansibleDocListJSONData[key], 86 | }); 87 | }); 88 | resolve(featureResults); 89 | } catch (e) { 90 | resolve([]); 91 | } 92 | } else { 93 | resolve([]); 94 | } 95 | }); 96 | }); 97 | } 98 | 99 | async function runAnsibleDocShowSnippetsInTerminal( 100 | pluginName: string, 101 | ansibleDocPath: string, 102 | choosedPluginType: string 103 | ) { 104 | const args: string[] = []; 105 | args.push('-t', choosedPluginType); 106 | args.push('-s'); 107 | args.push(pluginName); 108 | 109 | if (terminal) { 110 | if (terminal.bufnr) { 111 | await workspace.nvim.command(`bd! ${terminal.bufnr}`); 112 | } 113 | terminal.dispose(); 114 | terminal = undefined; 115 | } 116 | terminal = await window.createTerminal({ name: 'ansibleDocShowSnippets', cwd: workspace.root }); 117 | terminal.sendText(`${ansibleDocPath} ${args.join(' ')}`); 118 | const enableSplitRight = workspace.getConfiguration('ansible').get('ansibleDoc.enableSplitRight', true); 119 | if (enableSplitRight) terminal.hide(); 120 | await workspace.nvim.command('stopinsert'); 121 | if (enableSplitRight) { 122 | await workspace.nvim.command(`vert bel sb ${terminal.bufnr}`); 123 | await workspace.nvim.command(`wincmd p`); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/commands/ansibleDocShowInfo.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BasicList, 3 | commands, 4 | ExtensionContext, 5 | ListAction, 6 | ListContext, 7 | ListItem, 8 | listManager, 9 | Neovim, 10 | Terminal, 11 | window, 12 | workspace, 13 | } from 'coc.nvim'; 14 | 15 | import cp from 'child_process'; 16 | 17 | let terminal: Terminal | undefined; 18 | 19 | type FeatureListItemType = { 20 | name: string; 21 | description: string; 22 | }; 23 | 24 | export function activate(context: ExtensionContext, ansibleDocPath: string) { 25 | const ansibleDocList = new AnsibleDocShowInfoList(workspace.nvim, ansibleDocPath); 26 | listManager.registerList(ansibleDocList); 27 | 28 | context.subscriptions.push( 29 | commands.registerCommand('ansible.ansbileDoc.showInfo', async () => { 30 | const pluginType = [ 31 | 'module', 32 | 'become', 33 | 'cache', 34 | 'callback', 35 | 'cliconf', 36 | 'connection', 37 | 'httpapi', 38 | 'inventory', 39 | 'lookup', 40 | 'netconf', 41 | 'shell', 42 | 'vars', 43 | 'strategy', 44 | 'role', 45 | 'keyword', 46 | ]; 47 | 48 | const picked = await window.showMenuPicker(pluginType, `Choose Plugin Type`); 49 | 50 | if (picked !== -1) { 51 | ansibleDocList.choosedPluginType = pluginType[picked]; 52 | await workspace.nvim.command(`CocList ansibleDocShowInfo`); 53 | } 54 | }) 55 | ); 56 | } 57 | 58 | class AnsibleDocShowInfoList extends BasicList { 59 | public readonly name = 'ansibleDocShowInfo'; 60 | public readonly description = 'information for ansible-doc'; 61 | public readonly defaultAction = 'execute'; 62 | public actions: ListAction[] = []; 63 | 64 | public ansibleDocPath: string; 65 | public choosedPluginType = 'module'; 66 | 67 | constructor(nvim: Neovim, ansibleDocPath: string) { 68 | super(nvim); 69 | 70 | this.ansibleDocPath = ansibleDocPath; 71 | 72 | this.addAction('execute', (item: ListItem) => { 73 | const pluginName = item.label.split(':')[0]; 74 | runAnsibleDocShowInfoInTerminal(pluginName, this.ansibleDocPath, this.choosedPluginType); 75 | }); 76 | } 77 | 78 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 79 | public async loadItems(context: ListContext): Promise { 80 | const listItems: ListItem[] = []; 81 | const plugins = await getAnsibleDocListItems(this.ansibleDocPath, this.choosedPluginType); 82 | plugins.forEach((p) => listItems.push({ label: `${p.name}: [${p.description}]`, filterText: p.name })); 83 | return listItems; 84 | } 85 | } 86 | 87 | async function getAnsibleDocListItems(ansibleDocPath: string, pluginType: string) { 88 | return new Promise((resolve) => { 89 | cp.exec(`${ansibleDocPath} -l -j -t ${pluginType}`, (err, stdout) => { 90 | if (err) resolve([]); 91 | 92 | if (stdout.length > 0) { 93 | try { 94 | const ansibleDocListJSONData = JSON.parse(stdout); 95 | const featureResults: FeatureListItemType[] = []; 96 | Object.keys(ansibleDocListJSONData).forEach((key) => { 97 | featureResults.push({ 98 | name: key, 99 | description: ansibleDocListJSONData[key], 100 | }); 101 | }); 102 | resolve(featureResults); 103 | } catch (e) { 104 | resolve([]); 105 | } 106 | } else { 107 | resolve([]); 108 | } 109 | }); 110 | }); 111 | } 112 | 113 | async function runAnsibleDocShowInfoInTerminal(pluginName: string, ansibleDocPath: string, choosedPluginType: string) { 114 | const args: string[] = []; 115 | args.push('-t', choosedPluginType); 116 | args.push(pluginName); 117 | 118 | if (terminal) { 119 | if (terminal.bufnr) { 120 | await workspace.nvim.command(`bd! ${terminal.bufnr}`); 121 | } 122 | terminal.dispose(); 123 | terminal = undefined; 124 | } 125 | terminal = await window.createTerminal({ name: 'ansibleDocShowInfo', cwd: workspace.root }); 126 | terminal.sendText(`${ansibleDocPath} ${args.join(' ')}`); 127 | const enableSplitRight = workspace.getConfiguration('ansible').get('ansibleDoc.enableSplitRight', true); 128 | if (enableSplitRight) terminal.hide(); 129 | await workspace.nvim.command('stopinsert'); 130 | if (enableSplitRight) { 131 | await workspace.nvim.command(`vert bel sb ${terminal.bufnr}`); 132 | await workspace.nvim.command(`wincmd p`); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/tool.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceConfiguration } from 'coc.nvim'; 2 | 3 | import child_process from 'child_process'; 4 | import fs from 'fs'; 5 | import path from 'path'; 6 | import util from 'util'; 7 | import which from 'which'; 8 | 9 | import type { PythonPaths } from './types'; 10 | 11 | const exec = util.promisify(child_process.exec); 12 | 13 | export function getCurrentPythonPath(config: WorkspaceConfiguration): PythonPaths | undefined { 14 | let pythonPaths: PythonPaths | undefined; 15 | 16 | let pythonPath = config.get('python.interpreterPath', ''); 17 | if (pythonPath) { 18 | pythonPaths = { 19 | env: pythonPath, 20 | real: fs.realpathSync(pythonPath), 21 | }; 22 | return pythonPaths; 23 | } 24 | 25 | try { 26 | pythonPath = which.sync('python3'); 27 | pythonPaths = { 28 | env: pythonPath, 29 | real: fs.realpathSync(pythonPath), 30 | }; 31 | return pythonPaths; 32 | } catch (e) { 33 | // noop 34 | } 35 | 36 | try { 37 | pythonPath = which.sync('python'); 38 | pythonPaths = { 39 | env: pythonPath, 40 | real: fs.realpathSync(pythonPath), 41 | }; 42 | return pythonPaths; 43 | } catch (e) { 44 | // noop 45 | } 46 | 47 | return pythonPaths; 48 | } 49 | 50 | export function getCurrentPythonPath2(config: WorkspaceConfiguration, isRealpath?: boolean): string { 51 | let pythonPath = config.get('python.interpreterPath', ''); 52 | if (pythonPath) { 53 | return pythonPath; 54 | } 55 | 56 | try { 57 | pythonPath = which.sync('python3'); 58 | if (isRealpath) { 59 | pythonPath = fs.realpathSync(pythonPath); 60 | } 61 | return pythonPath; 62 | } catch (e) { 63 | // noop 64 | } 65 | 66 | try { 67 | pythonPath = which.sync('python'); 68 | if (isRealpath) { 69 | pythonPath = fs.realpathSync(pythonPath); 70 | } 71 | return pythonPath; 72 | } catch (e) { 73 | // noop 74 | } 75 | 76 | return pythonPath; 77 | } 78 | 79 | export function getBuiltinPythonPath(extensionStoragePath: string): string { 80 | let builtinPythonPath = ''; 81 | 82 | if (process.platform === 'win32') { 83 | builtinPythonPath = path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'python.exe'); 84 | } else { 85 | builtinPythonPath = path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'python'); 86 | } 87 | 88 | return builtinPythonPath; 89 | } 90 | 91 | export function getBuiltinToolPath(extensionStoragePath: string, toolName: string): string { 92 | let toolPath = ''; 93 | 94 | if (toolName === 'ansible') { 95 | if ( 96 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible.exe')) || 97 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible')) 98 | ) { 99 | if (process.platform === 'win32') { 100 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible.exe'); 101 | } else { 102 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible'); 103 | } 104 | } 105 | } 106 | 107 | if (toolName === 'ansible-lint') { 108 | if ( 109 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible-lint.exe')) || 110 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible-lint')) 111 | ) { 112 | if (process.platform === 'win32') { 113 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible-lint.exe'); 114 | } else { 115 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible-lint'); 116 | } 117 | } 118 | } 119 | 120 | if (toolName === 'ansible-doc') { 121 | if ( 122 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible-doc.exe')) || 123 | fs.existsSync(path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible-doc')) 124 | ) { 125 | if (process.platform === 'win32') { 126 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'Scripts', 'ansible-doc.exe'); 127 | } else { 128 | toolPath = path.join(extensionStoragePath, 'ansible', 'venv', 'bin', 'ansible-doc'); 129 | } 130 | } 131 | } 132 | 133 | return toolPath; 134 | } 135 | 136 | export async function existsPythonImportModule(pythonPath: string, moduleName: string): Promise { 137 | const checkCmd = `${pythonPath} -c "import ${moduleName}"`; 138 | try { 139 | await exec(checkCmd); 140 | return true; 141 | } catch (error) { 142 | return false; 143 | } 144 | } 145 | 146 | export async function existsCmdWithHelpOpt(command: string): Promise { 147 | const checkCmd = `${command} -h`; 148 | try { 149 | await exec(checkCmd); 150 | return true; 151 | } catch (error) { 152 | return false; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # coc-ansible 2 | 3 | [ansible-language-server](https://github.com/ansible/ansible-language-server) extension for [coc.nvim](https://github.com/neoclide/coc.nvim) 4 | 5 | coc-ansible-demo 6 | 7 | ## Install 8 | 9 | **CocInstall**: 10 | 11 | ```vim 12 | :CocInstall @yaegassy/coc-ansible 13 | ``` 14 | 15 | > scoped packages 16 | 17 | **vim-plug**: 18 | 19 | ```vim 20 | Plug 'yaegassy/coc-ansible', {'do': 'yarn install --frozen-lockfile'} 21 | ``` 22 | 23 | ## Note 24 | 25 | ### [!! Very important !!] Filetype related 26 | 27 | 1. The "filetype" must be `yaml.ansible` for this extension to work. 28 | 29 | If you install ansible's vim plugin, `yaml.ansible` filetype will be added automatically, which is very useful (e.g. [pearofducks/ansible-vim](https://github.com/pearofducks/ansible-vim) or [sheerun/vim-polyglot](https://github.com/sheerun/vim-polyglot)). 30 | 31 | 2. You also need to set `g:coc_filetype_map` in `.vimrc/init.vim`. 32 | 33 | ```vim 34 | let g:coc_filetype_map = { 35 | \ 'yaml.ansible': 'ansible', 36 | \ } 37 | ``` 38 | 39 | ## Requirements (Tools) 40 | 41 | - [Ansible 2.9+](https://docs.ansible.com/ansible/latest/index.html) 42 | - [Ansible Lint](https://ansible-lint.readthedocs.io/en/latest/) (required, unless you disable linter support) 43 | - [TIPS] `coc-ansible` will **automatically disable the feature** if `ansible-lint` is not found 44 | - [yamllint](https://yamllint.readthedocs.io/en/stable/) (optional) 45 | 46 | > If you also install `yamllint`, `ansible-lint` will detect it and incorporate into the linting process. Any findings reported by `yamllint` will be exposed in coc.nvim as errors/warnings. 47 | 48 | ## Bult-in install 49 | 50 | coc-ansible allows you to create an extension-only "venv" and install `ansible`, `ansible-lint` and `yamllint`. 51 | 52 | `yamllint` will be installed by setting `ansible.builtin.isWithYamllint` to `true` (default: `false`). 53 | 54 | You can also specify the version of each tool. (setting: `ansible.bultin.ansibleVersion`, `ansible.bultin.ansibleLintVersion`, `ansible.bultin.yamllintVersion`) 55 | 56 | --- 57 | 58 | The first time you use coc-ansible, if ansible, ansible-lint is not detected, you will be prompted to do a built-in installation. 59 | 60 | You can also run the installation command manually. 61 | 62 | ``` 63 | :CocCommand ansible.builtin.installRequirementsTools 64 | ``` 65 | 66 | ## Configuration options 67 | 68 | - `ansible.enable`: Enable coc-ansible extension, default: `true` 69 | - `ansible.disableProgressNotifications`: Disable progress notifications from ansible-language-server, default: `false` 70 | - `ansible.builtin.isWithYamllint`: Whether to install yamllint the built-in installer, default: `false` 71 | - `ansible.builtin.ansibleVersion`: Version of `ansible` for built-in install, default: `""` 72 | - `ansible.builtin.ansibleLintVersion`: Version of `ansible-lint` for built-in install, default: `""` 73 | - `ansible.builtin.force`: Whether to force builtin tools instead those in the PATH, default: `false` 74 | - `ansible.builtin.yamllintVersion`: Version of `yamllint` for built-in install, default: `""` 75 | - `ansible.ansible.useFullyQualifiedCollectionNames`: Always use fully qualified collection names (FQCN) when inserting a module name. Disabling it will only use FQCNs when necessary, default: `true` 76 | - `ansible.python.interpreterPath`: Path to the python/python3 executable. This settings may be used to make the extension work with ansible and ansible-lint installations in a python virtual environment, default: `""` 77 | - `ansible.validation.enabled`: Toggle validation provider. If enabled and ansible-lint is disabled, validation falls back to ansible-playbook --syntax-check, default: `true` 78 | - `ansible.validation.lint.enabled`: Toggle usage of ansible-lint, default: `true` 79 | - `ansible.validation.lint.arguments`: Optional command line arguments to be appended to ansible-lint invocation, default `""` 80 | - `ansible.completion.provideRedirectModules`: Toggle redirected module provider when completing modules, default: `true` 81 | - `ansible.completion.provideModuleOptionAliases`: Toggle alias provider when completing module options, default: `true` 82 | - `ansible.ansibleDoc.path`: Path to the ansible-doc executable, default: `ansible-doc` 83 | - `ansible.ansibleDoc.enableSplitRight`: Use vertical belowright for ansible-doc terminal window, default: `true` 84 | - `ansible.ansibleNavigator.path`: Points to the ansible-navigator executable, default: `"ansible-navigator"` 85 | - `ansible.dev.serverPath`: Absolute path to ansible language server module. If it is not set, use the extention's server module. (For develop and check), default: `""` 86 | - `ansibleServer.trace.server`: Traces the communication between coc.nvim and the ansible language server, default: `"off"` 87 | 88 | ## Commands 89 | 90 | **Command List**: 91 | 92 | > :CocCommand [CommandName] 93 | > 94 | > **e.g.** :CocCommand ansible.server.restart 95 | 96 | - `ansible.builtin.installRequirementsTools`: Install `ansible`, `ansible-lint` and `yamllint` (optional) with extension's venv 97 | - It will be installed in this path: 98 | - Mac/Linux: 99 | - `~/.config/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/bin/ansible` 100 | - `~/.config/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/bin/ansible-lint` 101 | - `~/.config/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/bin/yamllint` 102 | - Windows: 103 | - `~/AppData/Local/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/Scripts/ansible.exe` 104 | - `~/AppData/Local/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/Scripts/ansible-lint.exe` 105 | - `~/AppData/Local/coc/extensions/@yaegassy/coc-ansible-data/ansible/venv/Scripts/yamllint.exe` 106 | - **[Note]** `ansible` is a very large tool and will take some time to install 107 | - `ansible.server.restart`: Restart ansible language server 108 | - `ansible.server.showMetaData`: Show ansible-metadata for ansible language server | [DEMO](https://github.com/yaegassy/coc-ansible/pull/24) 109 | - `ansible.server.resyncAnsibleInventory`: Resync Ansible Inventory | [DEMO](https://github.com/yaegassy/coc-ansible/pull/25) 110 | - `ansible.ansbileDoc.showInfo`: Run the `ansible-doc` command in a terminal window with various options to display information about the plugins | [DEMO](https://github.com/yaegassy/coc-ansible/pull/22#issuecomment-1178586815) 111 | - `ansible.ansbileDoc.showSnippets`: Run the `ansible-doc` command in a terminal window with various options to display a snippets of the plugins | [DEMO](https://github.com/yaegassy/coc-ansible/pull/22#issuecomment-1178587359) 112 | 113 | **Example of command key mapping**: 114 | 115 | ```vim 116 | " Quickly view a list of all coc.nvim commands 117 | nnoremap :CocCommand 118 | ``` 119 | 120 | ## Code Actions 121 | 122 | **Example key mapping (Code Action related)**: 123 | 124 | ```vim 125 | nmap ga (coc-codeaction-line) 126 | ``` 127 | 128 | **Usage**: 129 | 130 | In the line with diagnostic message, enter the mapped key (e.g. `ga`) and you will see a list of code actions that can be performed. 131 | 132 | **Actions**: 133 | 134 | - `Ignoring rules for current line (# noqa [ruleId])` | [DEMO](https://github.com/yaegassy/coc-ansible/pull/13) 135 | - Requires `ansible-lint` "v6.8.1" or later. 136 | - `Show web documentation for [ruleId]` | [DEMO](https://github.com/yaegassy/coc-ansible/pull/21#issue-1296813716) 137 | - Requires `ansible-lint` "v6.8.1" or later. 138 | 139 | ## Thanks 140 | 141 | - [ansible/ansible-language-server](https://github.com/ansible/ansible-language-server) 142 | - [ansible/vscode-ansible](https://github.com/ansible/vscode-ansible) 143 | 144 | ## License 145 | 146 | MIT 147 | 148 | --- 149 | 150 | > This extension is built with [create-coc-extension](https://github.com/fannheyward/create-coc-extension) 151 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CancellationToken, 3 | ConfigurationParams, 4 | ExtensionContext, 5 | LanguageClient, 6 | LanguageClientOptions, 7 | ServerOptions, 8 | Thenable, 9 | TransportKind, 10 | window, 11 | workspace, 12 | } from 'coc.nvim'; 13 | import fs from 'fs'; 14 | import path from 'path'; 15 | import { installWrapper } from './installer'; 16 | import { 17 | existsCmdWithHelpOpt, 18 | existsPythonImportModule, 19 | getBuiltinPythonPath, 20 | getBuiltinToolPath, 21 | getCurrentPythonPath, 22 | } from './tool'; 23 | 24 | import * as ignoringRulesCodeActionFeature from './actions/ignoringRules'; 25 | import * as showWebDocumentationCodeActionFeature from './actions/showWebDocumentation'; 26 | import * as ansibleDocShowInfoCommandFeature from './commands/ansibleDocShowInfo'; 27 | import * as ansibleDocShowSnippetsCommandFeature from './commands/ansibleDocShowSnippets'; 28 | import * as builtinInstallRequirementsToolsCommandFeature from './commands/builtinInstallRequirementsTools'; 29 | import * as serverRestartCommandFeature from './commands/serverRestart'; 30 | import * as serverResyncAnsibleInventoryCommandFeature from './commands/serverResyncAnsibleInventory'; 31 | import * as serverShowMetaDataCommandFeature from './commands/serverShowMetaData'; 32 | 33 | let client: LanguageClient; 34 | let extensionStoragePath: string; 35 | let pythonInterpreterPath: string; 36 | let existsAnsibleCmd: boolean; 37 | let existsAnsibleLintCmd: boolean; 38 | let existsAnsibleDocCmd: boolean; 39 | let existsAnsibleLintModule: boolean; 40 | 41 | // MEMO: client logging 42 | const outputChannel = window.createOutputChannel('ansible-client'); 43 | 44 | export async function activate(context: ExtensionContext): Promise { 45 | const extensionConfig = workspace.getConfiguration('ansible'); 46 | const isEnable = extensionConfig.enable; 47 | if (!isEnable) return; 48 | 49 | extensionStoragePath = context.storagePath; 50 | if (!fs.existsSync(extensionStoragePath)) { 51 | fs.mkdirSync(extensionStoragePath, { recursive: true }); 52 | } 53 | 54 | outputChannel.appendLine(`${'#'.repeat(10)} ansible-client\n`); 55 | 56 | const pythonCommandPaths = getCurrentPythonPath(extensionConfig); 57 | 58 | const ansiblePath = extensionConfig.get('ansible.path', 'ansible'); 59 | const ansibleLintPath = extensionConfig.get('ansible.validation.lint.path', 'ansible-lint'); 60 | const ansibleDocPath = extensionConfig.get('ansibleDoc.path', 'ansible-doc'); 61 | const forceBuiltinTools = extensionConfig.get('builtin.force', false); 62 | 63 | pythonInterpreterPath = extensionConfig.get('python.interpreterPath', ''); 64 | 65 | existsAnsibleCmd = await existsCmdWithHelpOpt(ansiblePath); 66 | existsAnsibleLintCmd = await existsCmdWithHelpOpt(ansibleLintPath); 67 | existsAnsibleDocCmd = await existsCmdWithHelpOpt(ansibleDocPath); 68 | 69 | outputChannel.appendLine(`==== environment ====\n`); 70 | outputChannel.appendLine(`pythonCommandPaths(env): ${pythonCommandPaths ? pythonCommandPaths.env : 'None'}`); 71 | outputChannel.appendLine(`pythonCommandPaths(real): ${pythonCommandPaths ? pythonCommandPaths.real : 'None'}`); 72 | outputChannel.appendLine(`pythonInterpreterPath(custom): ${pythonInterpreterPath ? pythonInterpreterPath : 'None'}`); 73 | outputChannel.appendLine(`existsAnsibleCmd: ${existsAnsibleCmd}`); 74 | outputChannel.appendLine(`existsAnsibleLintCmd: ${existsAnsibleLintCmd}`); 75 | outputChannel.appendLine(`existsAnsibleDocCmd: ${existsAnsibleDocCmd}`); 76 | outputChannel.appendLine(`forceBuiltinTools: ${forceBuiltinTools}`); 77 | 78 | let existsExtAnsibleCmd = false; 79 | let ansibleBuiltinPath = ''; 80 | let ansibleLintBuiltinPath = ''; 81 | let ansibleDocBuiltinPath = ''; 82 | 83 | if (!pythonInterpreterPath) { 84 | if (!existsAnsibleCmd || !existsAnsibleLintCmd || forceBuiltinTools) { 85 | ansibleBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible'); 86 | ansibleLintBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible-lint'); 87 | ansibleDocBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible-doc'); 88 | if (ansibleBuiltinPath) { 89 | existsExtAnsibleCmd = true; 90 | 91 | outputChannel.appendLine(`\n==== use builtin tool ====\n`); 92 | outputChannel.appendLine(`ansibleBuiltinPath: ${ansibleBuiltinPath}`); 93 | outputChannel.appendLine(`ansibleLintBuiltinPath: ${ansibleLintBuiltinPath ? ansibleLintBuiltinPath : 'None'}`); 94 | outputChannel.appendLine(`ansibleDocBuiltinPath: ${ansibleDocBuiltinPath ? ansibleDocBuiltinPath : 'None'}`); 95 | } 96 | } 97 | 98 | if (!existsAnsibleCmd && !existsExtAnsibleCmd) { 99 | if (pythonCommandPaths) { 100 | // Install... 101 | await installWrapper(pythonCommandPaths.real, context); 102 | 103 | // Exists check 104 | ansibleBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible'); 105 | ansibleLintBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible-lint'); 106 | ansibleDocBuiltinPath = getBuiltinToolPath(extensionStoragePath, 'ansible-doc'); 107 | if (ansibleBuiltinPath) { 108 | existsExtAnsibleCmd = true; 109 | 110 | outputChannel.appendLine(`\n==== use builtin tool ====\n`); 111 | outputChannel.appendLine(`ansibleBuiltinPath: ${ansibleBuiltinPath}`); 112 | outputChannel.appendLine( 113 | `ansibleLintBuiltinPath: ${ansibleLintBuiltinPath ? ansibleLintBuiltinPath : 'None'}` 114 | ); 115 | outputChannel.appendLine(`ansibleDocBuiltinPath: ${ansibleDocBuiltinPath ? ansibleDocBuiltinPath : 'None'}`); 116 | } 117 | } else { 118 | window.showErrorMessage('python3/python command not found'); 119 | return; 120 | } 121 | } 122 | 123 | if (!existsAnsibleCmd && !existsExtAnsibleCmd) { 124 | window.showErrorMessage('"ansible" is not found. Please install "ansible".'); 125 | return; 126 | } 127 | } 128 | 129 | // If "pythonInterpreterPath" is set, check the exists of the module 130 | if (pythonInterpreterPath) { 131 | const ansibleModule = await existsPythonImportModule(pythonInterpreterPath, 'ansible'); 132 | existsAnsibleLintModule = await existsPythonImportModule(pythonInterpreterPath, 'ansiblelint'); 133 | 134 | outputChannel.appendLine(`\n==== use pythonInterpreterPath module ====\n`); 135 | outputChannel.appendLine(`ansibleModule: ${ansibleModule ? ansibleModule : 'None'}`); 136 | outputChannel.appendLine(`ansibleLintModule: ${existsAnsibleLintModule ? existsAnsibleLintModule : 'None'}`); 137 | 138 | if (!ansibleModule) { 139 | window.showErrorMessage('Exit because "ansible" does not exist.'); 140 | return; 141 | } 142 | } 143 | 144 | let serverModule: string; 145 | const devServerPath = extensionConfig.get('dev.serverPath', ''); 146 | if (devServerPath && devServerPath !== '' && fs.existsSync(devServerPath)) { 147 | serverModule = devServerPath; 148 | } else { 149 | serverModule = context.asAbsolutePath( 150 | path.join('node_modules', '@ansible', 'ansible-language-server', 'out', 'server', 'src', 'server.js') 151 | ); 152 | } 153 | 154 | const debugOptions = { execArgv: ['--nolazy', '--inspect=6010'] }; 155 | 156 | const serverOptions: ServerOptions = { 157 | run: { module: serverModule, transport: TransportKind.ipc }, 158 | debug: { 159 | module: serverModule, 160 | transport: TransportKind.ipc, 161 | options: debugOptions, 162 | }, 163 | }; 164 | 165 | const documentSelector = [ 166 | { scheme: 'file', language: 'ansible' }, 167 | { scheme: 'file', language: 'yaml.ansible' }, 168 | ]; 169 | 170 | const clientOptions: LanguageClientOptions = { 171 | documentSelector, 172 | disabledFeatures: getLanguageClientDisabledFeatures(), 173 | middleware: { 174 | workspace: { 175 | configuration, 176 | }, 177 | }, 178 | }; 179 | 180 | client = new LanguageClient('ansibleServer', 'Ansible Server', serverOptions, clientOptions); 181 | client.start(); 182 | 183 | // commands 184 | serverRestartCommandFeature.activate(context, client); 185 | serverShowMetaDataCommandFeature.activate(context, client); 186 | serverResyncAnsibleInventoryCommandFeature.activate(context, client); 187 | if (pythonCommandPaths) { 188 | builtinInstallRequirementsToolsCommandFeature.activate(context, pythonCommandPaths, client); 189 | } 190 | if (existsAnsibleCmd) { 191 | ansibleDocShowInfoCommandFeature.activate(context, ansibleDocPath); 192 | ansibleDocShowSnippetsCommandFeature.activate(context, ansibleDocPath); 193 | } else if (ansibleDocBuiltinPath) { 194 | ansibleDocShowInfoCommandFeature.activate(context, ansibleDocBuiltinPath); 195 | ansibleDocShowSnippetsCommandFeature.activate(context, ansibleDocBuiltinPath); 196 | } 197 | 198 | // code actions 199 | ignoringRulesCodeActionFeature.activate(context, outputChannel); 200 | showWebDocumentationCodeActionFeature.activate(context, outputChannel); 201 | } 202 | 203 | export function deactivate(): Thenable | undefined { 204 | if (!client) { 205 | return undefined; 206 | } 207 | return client.stop(); 208 | } 209 | 210 | function toJSONObject(obj: any): any { 211 | if (obj) { 212 | if (Array.isArray(obj)) { 213 | return obj.map(toJSONObject); 214 | } else if (typeof obj === 'object') { 215 | const res = Object.create(null); 216 | for (const key in obj) { 217 | if (Object.prototype.hasOwnProperty.call(obj, key)) { 218 | res[key] = toJSONObject(obj[key]); 219 | } 220 | } 221 | return res; 222 | } 223 | } 224 | return obj; 225 | } 226 | 227 | // MEMO: "coc-pyright" implementation as a reference. Thanks, fannheyward 228 | function configuration(params: ConfigurationParams, token: CancellationToken, next: any) { 229 | const ansibleItem = params.items.find((x) => x.section === 'ansible'); 230 | 231 | if (ansibleItem) { 232 | const custom = () => { 233 | const extensionConfig = toJSONObject(workspace.getConfiguration(ansibleItem.section, ansibleItem.scopeUri)); 234 | 235 | // [patch] In coc-ansible, this setting is a fixed value. 236 | extensionConfig['ansible']['path'] = 'ansible'; 237 | extensionConfig['validation']['lint']['path'] = 'ansible-lint'; 238 | 239 | if (!pythonInterpreterPath && !existsAnsibleCmd) { 240 | // [patch] Use extension venv 241 | extensionConfig['python']['interpreterPath'] = getBuiltinPythonPath(extensionStoragePath); 242 | } else if (pythonInterpreterPath) { 243 | // [patch] If "ansible-lint" is not found, this feature will be set to false. 244 | if (!existsAnsibleLintModule) { 245 | extensionConfig['validation']['lint']['enabled'] = false; 246 | } 247 | } else { 248 | // [patch] If "ansible-lint" is not found, this feature will be set to false. 249 | if (!existsAnsibleLintCmd) { 250 | extensionConfig['validation']['lint']['enabled'] = false; 251 | } 252 | } 253 | 254 | return [extensionConfig]; 255 | }; 256 | return custom(); 257 | } 258 | 259 | return next(params, token); 260 | } 261 | 262 | function getLanguageClientDisabledFeatures() { 263 | const r: string[] = []; 264 | if (getConfigDisableProgressNotifications()) r.push('progress'); 265 | return r; 266 | } 267 | 268 | function getConfigDisableProgressNotifications() { 269 | return workspace.getConfiguration('ansible').get('disableProgressNotifications', false); 270 | } 271 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@yaegassy/coc-ansible", 3 | "version": "0.14.3", 4 | "description": "ansible-language-server extension for coc.nvim", 5 | "author": "yaegassy ", 6 | "license": "MIT", 7 | "main": "lib/index.js", 8 | "keywords": [ 9 | "coc.nvim", 10 | "ansible", 11 | "vim", 12 | "neovim" 13 | ], 14 | "engines": { 15 | "coc": "^0.0.80" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/yaegassy/coc-ansible" 20 | }, 21 | "publishConfig": { 22 | "access": "public" 23 | }, 24 | "scripts": { 25 | "lint": "eslint src --ext ts", 26 | "clean": "rimraf lib", 27 | "watch": "node esbuild.js --watch", 28 | "build": "node esbuild.js", 29 | "prepare": "node esbuild.js" 30 | }, 31 | "prettier": { 32 | "singleQuote": true, 33 | "printWidth": 120, 34 | "semi": true 35 | }, 36 | "devDependencies": { 37 | "@types/node": "^18.16.19", 38 | "@types/which": "^2.0.1", 39 | "@typescript-eslint/eslint-plugin": "^6.0.0", 40 | "@typescript-eslint/parser": "^6.0.0", 41 | "coc.nvim": "^0.0.82", 42 | "esbuild": "^0.16.17", 43 | "eslint": "^8.43.0", 44 | "eslint-config-prettier": "^8.8.0", 45 | "eslint-plugin-prettier": "^4.2.1", 46 | "prettier": "^2.8.8", 47 | "rimraf": "^5.0.1", 48 | "typescript": "~5.0.4", 49 | "which": "^2.0.2" 50 | }, 51 | "activationEvents": [ 52 | "onLanguage:ansible", 53 | "onLanguage:yaml.ansible" 54 | ], 55 | "contributes": { 56 | "jsonValidation": [ 57 | { 58 | "fileMatch": [ 59 | ".ansible-navigator.json", 60 | "ansible-navigator.json" 61 | ], 62 | "url": "https://raw.githubusercontent.com/ansible/ansible-navigator/main/src/ansible_navigator/data/ansible-navigator.json" 63 | } 64 | ], 65 | "yamlValidation": [ 66 | { 67 | "fileMatch": [ 68 | "execution-environment.yml" 69 | ], 70 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/execution-environment.json" 71 | }, 72 | { 73 | "fileMatch": [ 74 | "meta/runtime.yml" 75 | ], 76 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/meta-runtime.json" 77 | }, 78 | { 79 | "fileMatch": [ 80 | ".ansible-navigator.yaml", 81 | ".ansible-navigator.yml", 82 | "ansible-navigator.yaml", 83 | "ansible-navigator.yml" 84 | ], 85 | "url": "https://raw.githubusercontent.com/ansible/ansible-navigator/main/src/ansible_navigator/data/ansible-navigator.json" 86 | }, 87 | { 88 | "fileMatch": "requirements.yml", 89 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/requirements.json" 90 | }, 91 | { 92 | "fileMatch": "meta/main.yml", 93 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/meta.json" 94 | }, 95 | { 96 | "fileMatch": [ 97 | "playbooks/vars/*.yml", 98 | "playbooks/vars/*.yaml", 99 | "vars/*.yml", 100 | "vars/*.yaml", 101 | "defaults/*.yml", 102 | "defaults/*.yaml", 103 | "host_vars/*.yml", 104 | "host_vars/*.yaml", 105 | "group_vars/*.yml", 106 | "group_vars/*.yaml" 107 | ], 108 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/vars.json" 109 | }, 110 | { 111 | "fileMatch": [ 112 | ".ansible-lint", 113 | ".config/ansible-lint.yml" 114 | ], 115 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible-lint-config.json" 116 | }, 117 | { 118 | "fileMatch": [ 119 | "molecule/*/molecule.yml" 120 | ], 121 | "url": "https://raw.githubusercontent.com/ansible-community/molecule/main/src/molecule/data/molecule.json" 122 | }, 123 | { 124 | "fileMatch": [ 125 | "galaxy.yml" 126 | ], 127 | "url": "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/galaxy.json" 128 | }, 129 | { 130 | "fileMatch": [ 131 | "rulebooks/*.yaml", 132 | "rulebooks/*.yml" 133 | ], 134 | "url": "https://raw.githubusercontent.com/ansible/ansible-rulebook/main/schema/ruleset_schema.json" 135 | } 136 | ], 137 | "rootPatterns": [ 138 | { 139 | "filetype": "ansible", 140 | "patterns": [ 141 | "ansible.cfg", 142 | ".ansible-lint" 143 | ] 144 | }, 145 | { 146 | "filetype": "yaml.ansible", 147 | "patterns": [ 148 | "ansible.cfg", 149 | ".ansible-lint" 150 | ] 151 | } 152 | ], 153 | "configuration": { 154 | "type": "object", 155 | "title": "coc-ansible configuration", 156 | "properties": { 157 | "ansible.enable": { 158 | "type": "boolean", 159 | "default": true, 160 | "description": "Enable coc-ansible extension." 161 | }, 162 | "ansible.disableProgressNotifications": { 163 | "type": "boolean", 164 | "default": false, 165 | "description": "Disable progress notifications from ansible-language-server" 166 | }, 167 | "ansible.builtin.isWithYamllint": { 168 | "type": "boolean", 169 | "default": false, 170 | "description": "Whether to install yamllint the built-in installer." 171 | }, 172 | "ansible.builtin.ansibleVersion": { 173 | "type": "string", 174 | "default": "", 175 | "description": "Version of ansible for built-in install." 176 | }, 177 | "ansible.builtin.ansibleLintVersion": { 178 | "type": "string", 179 | "default": "", 180 | "description": "Version of ansible-lint for built-in install." 181 | }, 182 | "ansible.builtin.force": { 183 | "type": "string", 184 | "default": "", 185 | "description": "Whether to force builtin tools instead those in the PATH" 186 | }, 187 | "ansible.builtin.yamllintVersion": { 188 | "type": "string", 189 | "default": "", 190 | "description": "Version of yamllint for built-in install." 191 | }, 192 | "ansible.ansible.path": { 193 | "scope": "resource", 194 | "type": "string", 195 | "default": "ansible", 196 | "description": "Path to the ansible executable. All subcommands are expected to have adjacent locations." 197 | }, 198 | "ansible.ansible.useFullyQualifiedCollectionNames": { 199 | "scope": "resource", 200 | "type": "boolean", 201 | "default": true, 202 | "description": "Always use fully qualified collection names (FQCN) when inserting a module name. Disabling it will only use FQCNs when necessary." 203 | }, 204 | "ansible.python.interpreterPath": { 205 | "scope": "resource", 206 | "type": "string", 207 | "default": "", 208 | "description": "Path to the python/python3 executable. This settings may be used to make the extension work with ansible and ansible-lint installations in a python virtual environment" 209 | }, 210 | "ansible.python.activationScript": { 211 | "scope": "resource", 212 | "type": "string", 213 | "default": "", 214 | "description": "Path to the virtual environment activation script. Use only if you have a custom activation script. It will be sourced using bash before executing Ansible commands. When set, the Interpreter Path setting is ignored." 215 | }, 216 | "ansible.validation.enabled": { 217 | "scope": "resource", 218 | "type": "boolean", 219 | "default": true, 220 | "description": "Toggle validation provider. If enabled and ansible-lint is disabled, validation falls back to ansible-playbook --syntax-check." 221 | }, 222 | "ansible.validation.lint.enabled": { 223 | "scope": "resource", 224 | "type": "boolean", 225 | "default": true, 226 | "description": "Toggle usage of ansible-lint." 227 | }, 228 | "ansible.validation.lint.path": { 229 | "scope": "resource", 230 | "type": "string", 231 | "default": "ansible-lint", 232 | "description": "Path to the ansible-lint executable." 233 | }, 234 | "ansible.validation.lint.arguments": { 235 | "scope": "resource", 236 | "type": "string", 237 | "default": "", 238 | "description": "Optional command line arguments to be appended to ansible-lint invocation." 239 | }, 240 | "ansible.ansibleDoc.path": { 241 | "scope": "resource", 242 | "type": "string", 243 | "default": "ansible-doc", 244 | "description": "Path to the ansible-doc executable." 245 | }, 246 | "ansible.ansibleDoc.enableSplitRight": { 247 | "type": "boolean", 248 | "default": true, 249 | "description": "Use vertical belowright for ansible-doc terminal window." 250 | }, 251 | "ansible.ansibleNavigator.path": { 252 | "default": "ansible-navigator", 253 | "description": "Points to the ansible-navigator executable.", 254 | "scope": "machine-overridable", 255 | "type": "string" 256 | }, 257 | "ansible.executionEnvironment.containerEngine": { 258 | "scope": "resource", 259 | "type": "string", 260 | "enum": [ 261 | "auto", 262 | "podman", 263 | "docker" 264 | ], 265 | "default": "auto", 266 | "description": "Specify the container engine (auto=podman then docker)." 267 | }, 268 | "ansible.executionEnvironment.enabled": { 269 | "scope": "resource", 270 | "type": "boolean", 271 | "default": false, 272 | "description": "Enable or disable the use of an execution environment." 273 | }, 274 | "ansible.executionEnvironment.image": { 275 | "scope": "resource", 276 | "type": "string", 277 | "default": "quay.io/ansible/creator-ee:latest", 278 | "description": "Specify the name of the execution environment image." 279 | }, 280 | "ansible.executionEnvironment.containerOptions": { 281 | "scope": "resource", 282 | "type": "string", 283 | "default": "", 284 | "description": "Extra parameters passed to the container engine command example: '--net=host'" 285 | }, 286 | "ansible.executionEnvironment.pull.arguments": { 287 | "scope": "resource", 288 | "type": "string", 289 | "default": "", 290 | "description": "Specify any additional parameters that should be added to the pull command when pulling an execution environment from a container registry. e.g. '--tls-verify=false'" 291 | }, 292 | "ansible.executionEnvironment.pullPolicy": { 293 | "scope": "resource", 294 | "type": "string", 295 | "enum": [ 296 | "always", 297 | "missing", 298 | "never", 299 | "tag" 300 | ], 301 | "default": "missing", 302 | "description": "Specify the image pull policy.\nalways: Always pull the image when extension is activated or reloaded\nmissing: Pull if not locally available\nnever: Never pull the image\ntag: If the image tag is 'latest', always pull the image, otherwise pull if not locally available" 303 | }, 304 | "ansible.executionEnvironment.volumeMounts": { 305 | "scope": "resource", 306 | "type": "array", 307 | "items": { 308 | "type": "object", 309 | "properties": { 310 | "src": { 311 | "type": "string", 312 | "description": "The name of the local volume or path to be mounted within execution environment." 313 | }, 314 | "dest": { 315 | "type": "string", 316 | "description": "The path where the file or directory are mounted in the container." 317 | }, 318 | "options": { 319 | "type": "string", 320 | "description": "The field is optional, and is a comma-separated list of options, such as ro,Z" 321 | } 322 | } 323 | } 324 | }, 325 | "ansible.completion.provideRedirectModules": { 326 | "scope": "resource", 327 | "type": "boolean", 328 | "default": true, 329 | "description": "Toggle redirected module provider when completing modules." 330 | }, 331 | "ansible.completion.provideModuleOptionAliases": { 332 | "scope": "resource", 333 | "type": "boolean", 334 | "default": true, 335 | "description": "Toggle alias provider when completing module options." 336 | }, 337 | "ansible.dev.serverPath": { 338 | "type": "string", 339 | "default": "", 340 | "description": "Absolute path to ansible language server module. If it is not set, use the extention's server module. (For develop and check)" 341 | }, 342 | "ansibleServer.trace.server": { 343 | "type": "string", 344 | "enum": [ 345 | "off", 346 | "messages", 347 | "verbose" 348 | ], 349 | "default": "off", 350 | "description": "Traces the communication between coc.nvim and the ansible language server." 351 | } 352 | } 353 | }, 354 | "commands": [ 355 | { 356 | "command": "ansible.builtin.installRequirementsTools", 357 | "title": "Install ansible, ansible-lint and yamllint(optional) with extension's venv" 358 | }, 359 | { 360 | "command": "ansible.server.restart", 361 | "title": "Restart ansible language server" 362 | }, 363 | { 364 | "command": "ansible.server.showMetaData", 365 | "title": "Show ansible-metadata for ansible language server" 366 | }, 367 | { 368 | "command": "ansible.server.resyncAnsibleInventory", 369 | "title": "Resync Ansible Inventory" 370 | }, 371 | { 372 | "command": "ansible.ansbileDoc.showInfo", 373 | "title": "Run the `ansible-doc` command in a terminal window with various options to display information about the plugins" 374 | }, 375 | { 376 | "command": "ansible.ansbileDoc.showSnippets", 377 | "title": "Run the `ansible-doc` command in a terminal window with various options to display a snippets of the plugins." 378 | } 379 | ] 380 | }, 381 | "dependencies": { 382 | "@ansible/ansible-language-server": "^1.2.3" 383 | }, 384 | "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" 385 | } 386 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ansible/ansible-language-server@^1.2.3": 6 | version "1.2.3" 7 | resolved "https://registry.yarnpkg.com/@ansible/ansible-language-server/-/ansible-language-server-1.2.3.tgz#37ce4aa9c80fddb23329e4573369a1fb44abc038" 8 | integrity sha512-id3vsEqrYCGKQ2qXk9bN7LH0lurplD5OXf1yu9mgp7WYO7GIxmQkXcsYcXWxS+2hVKqiSZvAIqtZIUWnIP7SxQ== 9 | dependencies: 10 | "@flatten-js/interval-tree" "^1.1.3" 11 | antsibull-docs "^1.0.1" 12 | axios "^1.6.8" 13 | glob "^10.3.12" 14 | ini "^4.1.2" 15 | lodash "^4.17.21" 16 | uuid "^9.0.1" 17 | vscode-languageserver "^9.0.1" 18 | vscode-languageserver-textdocument "^1.0.11" 19 | vscode-uri "^3.0.8" 20 | yaml "^2.4.2" 21 | 22 | "@esbuild/android-arm64@0.16.17": 23 | version "0.16.17" 24 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" 25 | integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== 26 | 27 | "@esbuild/android-arm@0.16.17": 28 | version "0.16.17" 29 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" 30 | integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== 31 | 32 | "@esbuild/android-x64@0.16.17": 33 | version "0.16.17" 34 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" 35 | integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== 36 | 37 | "@esbuild/darwin-arm64@0.16.17": 38 | version "0.16.17" 39 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" 40 | integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== 41 | 42 | "@esbuild/darwin-x64@0.16.17": 43 | version "0.16.17" 44 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" 45 | integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== 46 | 47 | "@esbuild/freebsd-arm64@0.16.17": 48 | version "0.16.17" 49 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" 50 | integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== 51 | 52 | "@esbuild/freebsd-x64@0.16.17": 53 | version "0.16.17" 54 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" 55 | integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== 56 | 57 | "@esbuild/linux-arm64@0.16.17": 58 | version "0.16.17" 59 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" 60 | integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== 61 | 62 | "@esbuild/linux-arm@0.16.17": 63 | version "0.16.17" 64 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" 65 | integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== 66 | 67 | "@esbuild/linux-ia32@0.16.17": 68 | version "0.16.17" 69 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" 70 | integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== 71 | 72 | "@esbuild/linux-loong64@0.16.17": 73 | version "0.16.17" 74 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" 75 | integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== 76 | 77 | "@esbuild/linux-mips64el@0.16.17": 78 | version "0.16.17" 79 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" 80 | integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== 81 | 82 | "@esbuild/linux-ppc64@0.16.17": 83 | version "0.16.17" 84 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" 85 | integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== 86 | 87 | "@esbuild/linux-riscv64@0.16.17": 88 | version "0.16.17" 89 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" 90 | integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== 91 | 92 | "@esbuild/linux-s390x@0.16.17": 93 | version "0.16.17" 94 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" 95 | integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== 96 | 97 | "@esbuild/linux-x64@0.16.17": 98 | version "0.16.17" 99 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" 100 | integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== 101 | 102 | "@esbuild/netbsd-x64@0.16.17": 103 | version "0.16.17" 104 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" 105 | integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== 106 | 107 | "@esbuild/openbsd-x64@0.16.17": 108 | version "0.16.17" 109 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" 110 | integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== 111 | 112 | "@esbuild/sunos-x64@0.16.17": 113 | version "0.16.17" 114 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" 115 | integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== 116 | 117 | "@esbuild/win32-arm64@0.16.17": 118 | version "0.16.17" 119 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" 120 | integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== 121 | 122 | "@esbuild/win32-ia32@0.16.17": 123 | version "0.16.17" 124 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" 125 | integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== 126 | 127 | "@esbuild/win32-x64@0.16.17": 128 | version "0.16.17" 129 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" 130 | integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== 131 | 132 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 133 | version "4.4.0" 134 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 135 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 136 | dependencies: 137 | eslint-visitor-keys "^3.3.0" 138 | 139 | "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": 140 | version "4.10.0" 141 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" 142 | integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== 143 | 144 | "@eslint/eslintrc@^2.1.4": 145 | version "2.1.4" 146 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 147 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 148 | dependencies: 149 | ajv "^6.12.4" 150 | debug "^4.3.2" 151 | espree "^9.6.0" 152 | globals "^13.19.0" 153 | ignore "^5.2.0" 154 | import-fresh "^3.2.1" 155 | js-yaml "^4.1.0" 156 | minimatch "^3.1.2" 157 | strip-json-comments "^3.1.1" 158 | 159 | "@eslint/js@8.57.0": 160 | version "8.57.0" 161 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" 162 | integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== 163 | 164 | "@flatten-js/interval-tree@^1.1.3": 165 | version "1.1.3" 166 | resolved "https://registry.yarnpkg.com/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz#7d9b4bb92042c6bbcefae5bbb822b5ec3c073e88" 167 | integrity sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A== 168 | 169 | "@humanwhocodes/config-array@^0.11.14": 170 | version "0.11.14" 171 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" 172 | integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== 173 | dependencies: 174 | "@humanwhocodes/object-schema" "^2.0.2" 175 | debug "^4.3.1" 176 | minimatch "^3.0.5" 177 | 178 | "@humanwhocodes/module-importer@^1.0.1": 179 | version "1.0.1" 180 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 181 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 182 | 183 | "@humanwhocodes/object-schema@^2.0.2": 184 | version "2.0.3" 185 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 186 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 187 | 188 | "@isaacs/cliui@^8.0.2": 189 | version "8.0.2" 190 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 191 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 192 | dependencies: 193 | string-width "^5.1.2" 194 | string-width-cjs "npm:string-width@^4.2.0" 195 | strip-ansi "^7.0.1" 196 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 197 | wrap-ansi "^8.1.0" 198 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 199 | 200 | "@nodelib/fs.scandir@2.1.5": 201 | version "2.1.5" 202 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 203 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 204 | dependencies: 205 | "@nodelib/fs.stat" "2.0.5" 206 | run-parallel "^1.1.9" 207 | 208 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 209 | version "2.0.5" 210 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 211 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 212 | 213 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 214 | version "1.2.8" 215 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 216 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 217 | dependencies: 218 | "@nodelib/fs.scandir" "2.1.5" 219 | fastq "^1.6.0" 220 | 221 | "@pkgjs/parseargs@^0.11.0": 222 | version "0.11.0" 223 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 224 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 225 | 226 | "@types/json-schema@^7.0.12": 227 | version "7.0.15" 228 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 229 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 230 | 231 | "@types/node@^18.16.19": 232 | version "18.19.33" 233 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.33.tgz#98cd286a1b8a5e11aa06623210240bcc28e95c48" 234 | integrity sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A== 235 | dependencies: 236 | undici-types "~5.26.4" 237 | 238 | "@types/semver@^7.5.0": 239 | version "7.5.8" 240 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" 241 | integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== 242 | 243 | "@types/which@^2.0.1": 244 | version "2.0.2" 245 | resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.2.tgz#54541d02d6b1daee5ec01ac0d1b37cecf37db1ae" 246 | integrity sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw== 247 | 248 | "@typescript-eslint/eslint-plugin@^6.0.0": 249 | version "6.21.0" 250 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" 251 | integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== 252 | dependencies: 253 | "@eslint-community/regexpp" "^4.5.1" 254 | "@typescript-eslint/scope-manager" "6.21.0" 255 | "@typescript-eslint/type-utils" "6.21.0" 256 | "@typescript-eslint/utils" "6.21.0" 257 | "@typescript-eslint/visitor-keys" "6.21.0" 258 | debug "^4.3.4" 259 | graphemer "^1.4.0" 260 | ignore "^5.2.4" 261 | natural-compare "^1.4.0" 262 | semver "^7.5.4" 263 | ts-api-utils "^1.0.1" 264 | 265 | "@typescript-eslint/parser@^6.0.0": 266 | version "6.21.0" 267 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" 268 | integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== 269 | dependencies: 270 | "@typescript-eslint/scope-manager" "6.21.0" 271 | "@typescript-eslint/types" "6.21.0" 272 | "@typescript-eslint/typescript-estree" "6.21.0" 273 | "@typescript-eslint/visitor-keys" "6.21.0" 274 | debug "^4.3.4" 275 | 276 | "@typescript-eslint/scope-manager@6.21.0": 277 | version "6.21.0" 278 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" 279 | integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== 280 | dependencies: 281 | "@typescript-eslint/types" "6.21.0" 282 | "@typescript-eslint/visitor-keys" "6.21.0" 283 | 284 | "@typescript-eslint/type-utils@6.21.0": 285 | version "6.21.0" 286 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" 287 | integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== 288 | dependencies: 289 | "@typescript-eslint/typescript-estree" "6.21.0" 290 | "@typescript-eslint/utils" "6.21.0" 291 | debug "^4.3.4" 292 | ts-api-utils "^1.0.1" 293 | 294 | "@typescript-eslint/types@6.21.0": 295 | version "6.21.0" 296 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" 297 | integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== 298 | 299 | "@typescript-eslint/typescript-estree@6.21.0": 300 | version "6.21.0" 301 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" 302 | integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== 303 | dependencies: 304 | "@typescript-eslint/types" "6.21.0" 305 | "@typescript-eslint/visitor-keys" "6.21.0" 306 | debug "^4.3.4" 307 | globby "^11.1.0" 308 | is-glob "^4.0.3" 309 | minimatch "9.0.3" 310 | semver "^7.5.4" 311 | ts-api-utils "^1.0.1" 312 | 313 | "@typescript-eslint/utils@6.21.0": 314 | version "6.21.0" 315 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" 316 | integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== 317 | dependencies: 318 | "@eslint-community/eslint-utils" "^4.4.0" 319 | "@types/json-schema" "^7.0.12" 320 | "@types/semver" "^7.5.0" 321 | "@typescript-eslint/scope-manager" "6.21.0" 322 | "@typescript-eslint/types" "6.21.0" 323 | "@typescript-eslint/typescript-estree" "6.21.0" 324 | semver "^7.5.4" 325 | 326 | "@typescript-eslint/visitor-keys@6.21.0": 327 | version "6.21.0" 328 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" 329 | integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== 330 | dependencies: 331 | "@typescript-eslint/types" "6.21.0" 332 | eslint-visitor-keys "^3.4.1" 333 | 334 | "@ungap/structured-clone@^1.2.0": 335 | version "1.2.0" 336 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 337 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 338 | 339 | acorn-jsx@^5.3.2: 340 | version "5.3.2" 341 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 342 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 343 | 344 | acorn@^8.9.0: 345 | version "8.11.3" 346 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 347 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 348 | 349 | ajv@^6.12.4: 350 | version "6.12.6" 351 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 352 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 353 | dependencies: 354 | fast-deep-equal "^3.1.1" 355 | fast-json-stable-stringify "^2.0.0" 356 | json-schema-traverse "^0.4.1" 357 | uri-js "^4.2.2" 358 | 359 | ansi-regex@^5.0.1: 360 | version "5.0.1" 361 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 362 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 363 | 364 | ansi-regex@^6.0.1: 365 | version "6.0.1" 366 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 367 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 368 | 369 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 370 | version "4.3.0" 371 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 372 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 373 | dependencies: 374 | color-convert "^2.0.1" 375 | 376 | ansi-styles@^6.1.0: 377 | version "6.2.1" 378 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 379 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 380 | 381 | antsibull-docs@^1.0.1: 382 | version "1.0.1" 383 | resolved "https://registry.yarnpkg.com/antsibull-docs/-/antsibull-docs-1.0.1.tgz#2b747edda34a1f0b1fba6cfdf053394417df7c3a" 384 | integrity sha512-vajxNVLFT2iJ/Nybec4YQlBErsOZEZ+C8RAuv1zEuFqkSW8dunZeJr6owhV9N4hTMsMBZiqCMpVBB85bIbDItQ== 385 | 386 | argparse@^2.0.1: 387 | version "2.0.1" 388 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 389 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 390 | 391 | array-union@^2.1.0: 392 | version "2.1.0" 393 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 394 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 395 | 396 | asynckit@^0.4.0: 397 | version "0.4.0" 398 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 399 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 400 | 401 | axios@^1.6.8: 402 | version "1.6.8" 403 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" 404 | integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== 405 | dependencies: 406 | follow-redirects "^1.15.6" 407 | form-data "^4.0.0" 408 | proxy-from-env "^1.1.0" 409 | 410 | balanced-match@^1.0.0: 411 | version "1.0.2" 412 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 413 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 414 | 415 | brace-expansion@^1.1.7: 416 | version "1.1.11" 417 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 418 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 419 | dependencies: 420 | balanced-match "^1.0.0" 421 | concat-map "0.0.1" 422 | 423 | brace-expansion@^2.0.1: 424 | version "2.0.1" 425 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 426 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 427 | dependencies: 428 | balanced-match "^1.0.0" 429 | 430 | braces@^3.0.2: 431 | version "3.0.2" 432 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 433 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 434 | dependencies: 435 | fill-range "^7.0.1" 436 | 437 | callsites@^3.0.0: 438 | version "3.1.0" 439 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 440 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 441 | 442 | chalk@^4.0.0: 443 | version "4.1.2" 444 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 445 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 446 | dependencies: 447 | ansi-styles "^4.1.0" 448 | supports-color "^7.1.0" 449 | 450 | coc.nvim@^0.0.82: 451 | version "0.0.82" 452 | resolved "https://registry.yarnpkg.com/coc.nvim/-/coc.nvim-0.0.82.tgz#5230e2eb17e8499a60a97b46d844f2d08c593b29" 453 | integrity sha512-+70ap6FH8FSdaQ0CPijaasQzg6ue84j4/LkX6ZSpALX7YKBcGGDkCcd6adgaC/86b/ZqT3iTTEbMh3mdaI5qPA== 454 | 455 | color-convert@^2.0.1: 456 | version "2.0.1" 457 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 458 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 459 | dependencies: 460 | color-name "~1.1.4" 461 | 462 | color-name@~1.1.4: 463 | version "1.1.4" 464 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 465 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 466 | 467 | combined-stream@^1.0.8: 468 | version "1.0.8" 469 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 470 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 471 | dependencies: 472 | delayed-stream "~1.0.0" 473 | 474 | concat-map@0.0.1: 475 | version "0.0.1" 476 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 477 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 478 | 479 | cross-spawn@^7.0.0, cross-spawn@^7.0.2: 480 | version "7.0.3" 481 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 482 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 483 | dependencies: 484 | path-key "^3.1.0" 485 | shebang-command "^2.0.0" 486 | which "^2.0.1" 487 | 488 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 489 | version "4.3.4" 490 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 491 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 492 | dependencies: 493 | ms "2.1.2" 494 | 495 | deep-is@^0.1.3: 496 | version "0.1.4" 497 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 498 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 499 | 500 | delayed-stream@~1.0.0: 501 | version "1.0.0" 502 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 503 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 504 | 505 | dir-glob@^3.0.1: 506 | version "3.0.1" 507 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 508 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 509 | dependencies: 510 | path-type "^4.0.0" 511 | 512 | doctrine@^3.0.0: 513 | version "3.0.0" 514 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 515 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 516 | dependencies: 517 | esutils "^2.0.2" 518 | 519 | eastasianwidth@^0.2.0: 520 | version "0.2.0" 521 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 522 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 523 | 524 | emoji-regex@^8.0.0: 525 | version "8.0.0" 526 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 527 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 528 | 529 | emoji-regex@^9.2.2: 530 | version "9.2.2" 531 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 532 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 533 | 534 | esbuild@^0.16.17: 535 | version "0.16.17" 536 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" 537 | integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== 538 | optionalDependencies: 539 | "@esbuild/android-arm" "0.16.17" 540 | "@esbuild/android-arm64" "0.16.17" 541 | "@esbuild/android-x64" "0.16.17" 542 | "@esbuild/darwin-arm64" "0.16.17" 543 | "@esbuild/darwin-x64" "0.16.17" 544 | "@esbuild/freebsd-arm64" "0.16.17" 545 | "@esbuild/freebsd-x64" "0.16.17" 546 | "@esbuild/linux-arm" "0.16.17" 547 | "@esbuild/linux-arm64" "0.16.17" 548 | "@esbuild/linux-ia32" "0.16.17" 549 | "@esbuild/linux-loong64" "0.16.17" 550 | "@esbuild/linux-mips64el" "0.16.17" 551 | "@esbuild/linux-ppc64" "0.16.17" 552 | "@esbuild/linux-riscv64" "0.16.17" 553 | "@esbuild/linux-s390x" "0.16.17" 554 | "@esbuild/linux-x64" "0.16.17" 555 | "@esbuild/netbsd-x64" "0.16.17" 556 | "@esbuild/openbsd-x64" "0.16.17" 557 | "@esbuild/sunos-x64" "0.16.17" 558 | "@esbuild/win32-arm64" "0.16.17" 559 | "@esbuild/win32-ia32" "0.16.17" 560 | "@esbuild/win32-x64" "0.16.17" 561 | 562 | escape-string-regexp@^4.0.0: 563 | version "4.0.0" 564 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 565 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 566 | 567 | eslint-config-prettier@^8.8.0: 568 | version "8.10.0" 569 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" 570 | integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== 571 | 572 | eslint-plugin-prettier@^4.2.1: 573 | version "4.2.1" 574 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" 575 | integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== 576 | dependencies: 577 | prettier-linter-helpers "^1.0.0" 578 | 579 | eslint-scope@^7.2.2: 580 | version "7.2.2" 581 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 582 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 583 | dependencies: 584 | esrecurse "^4.3.0" 585 | estraverse "^5.2.0" 586 | 587 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 588 | version "3.4.3" 589 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 590 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 591 | 592 | eslint@^8.43.0: 593 | version "8.57.0" 594 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" 595 | integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== 596 | dependencies: 597 | "@eslint-community/eslint-utils" "^4.2.0" 598 | "@eslint-community/regexpp" "^4.6.1" 599 | "@eslint/eslintrc" "^2.1.4" 600 | "@eslint/js" "8.57.0" 601 | "@humanwhocodes/config-array" "^0.11.14" 602 | "@humanwhocodes/module-importer" "^1.0.1" 603 | "@nodelib/fs.walk" "^1.2.8" 604 | "@ungap/structured-clone" "^1.2.0" 605 | ajv "^6.12.4" 606 | chalk "^4.0.0" 607 | cross-spawn "^7.0.2" 608 | debug "^4.3.2" 609 | doctrine "^3.0.0" 610 | escape-string-regexp "^4.0.0" 611 | eslint-scope "^7.2.2" 612 | eslint-visitor-keys "^3.4.3" 613 | espree "^9.6.1" 614 | esquery "^1.4.2" 615 | esutils "^2.0.2" 616 | fast-deep-equal "^3.1.3" 617 | file-entry-cache "^6.0.1" 618 | find-up "^5.0.0" 619 | glob-parent "^6.0.2" 620 | globals "^13.19.0" 621 | graphemer "^1.4.0" 622 | ignore "^5.2.0" 623 | imurmurhash "^0.1.4" 624 | is-glob "^4.0.0" 625 | is-path-inside "^3.0.3" 626 | js-yaml "^4.1.0" 627 | json-stable-stringify-without-jsonify "^1.0.1" 628 | levn "^0.4.1" 629 | lodash.merge "^4.6.2" 630 | minimatch "^3.1.2" 631 | natural-compare "^1.4.0" 632 | optionator "^0.9.3" 633 | strip-ansi "^6.0.1" 634 | text-table "^0.2.0" 635 | 636 | espree@^9.6.0, espree@^9.6.1: 637 | version "9.6.1" 638 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 639 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 640 | dependencies: 641 | acorn "^8.9.0" 642 | acorn-jsx "^5.3.2" 643 | eslint-visitor-keys "^3.4.1" 644 | 645 | esquery@^1.4.2: 646 | version "1.5.0" 647 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 648 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 649 | dependencies: 650 | estraverse "^5.1.0" 651 | 652 | esrecurse@^4.3.0: 653 | version "4.3.0" 654 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 655 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 656 | dependencies: 657 | estraverse "^5.2.0" 658 | 659 | estraverse@^5.1.0, estraverse@^5.2.0: 660 | version "5.3.0" 661 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 662 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 663 | 664 | esutils@^2.0.2: 665 | version "2.0.3" 666 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 667 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 668 | 669 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 670 | version "3.1.3" 671 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 672 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 673 | 674 | fast-diff@^1.1.2: 675 | version "1.3.0" 676 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" 677 | integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== 678 | 679 | fast-glob@^3.2.9: 680 | version "3.3.2" 681 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 682 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 683 | dependencies: 684 | "@nodelib/fs.stat" "^2.0.2" 685 | "@nodelib/fs.walk" "^1.2.3" 686 | glob-parent "^5.1.2" 687 | merge2 "^1.3.0" 688 | micromatch "^4.0.4" 689 | 690 | fast-json-stable-stringify@^2.0.0: 691 | version "2.1.0" 692 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 693 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 694 | 695 | fast-levenshtein@^2.0.6: 696 | version "2.0.6" 697 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 698 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 699 | 700 | fastq@^1.6.0: 701 | version "1.17.1" 702 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 703 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 704 | dependencies: 705 | reusify "^1.0.4" 706 | 707 | file-entry-cache@^6.0.1: 708 | version "6.0.1" 709 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 710 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 711 | dependencies: 712 | flat-cache "^3.0.4" 713 | 714 | fill-range@^7.0.1: 715 | version "7.0.1" 716 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 717 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 718 | dependencies: 719 | to-regex-range "^5.0.1" 720 | 721 | find-up@^5.0.0: 722 | version "5.0.0" 723 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 724 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 725 | dependencies: 726 | locate-path "^6.0.0" 727 | path-exists "^4.0.0" 728 | 729 | flat-cache@^3.0.4: 730 | version "3.2.0" 731 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 732 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 733 | dependencies: 734 | flatted "^3.2.9" 735 | keyv "^4.5.3" 736 | rimraf "^3.0.2" 737 | 738 | flatted@^3.2.9: 739 | version "3.3.1" 740 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 741 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 742 | 743 | follow-redirects@^1.15.6: 744 | version "1.15.6" 745 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" 746 | integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== 747 | 748 | foreground-child@^3.1.0: 749 | version "3.1.1" 750 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" 751 | integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== 752 | dependencies: 753 | cross-spawn "^7.0.0" 754 | signal-exit "^4.0.1" 755 | 756 | form-data@^4.0.0: 757 | version "4.0.0" 758 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 759 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 760 | dependencies: 761 | asynckit "^0.4.0" 762 | combined-stream "^1.0.8" 763 | mime-types "^2.1.12" 764 | 765 | fs.realpath@^1.0.0: 766 | version "1.0.0" 767 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 768 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 769 | 770 | glob-parent@^5.1.2: 771 | version "5.1.2" 772 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 773 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 774 | dependencies: 775 | is-glob "^4.0.1" 776 | 777 | glob-parent@^6.0.2: 778 | version "6.0.2" 779 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 780 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 781 | dependencies: 782 | is-glob "^4.0.3" 783 | 784 | glob@^10.3.12, glob@^10.3.7: 785 | version "10.3.15" 786 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" 787 | integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== 788 | dependencies: 789 | foreground-child "^3.1.0" 790 | jackspeak "^2.3.6" 791 | minimatch "^9.0.1" 792 | minipass "^7.0.4" 793 | path-scurry "^1.11.0" 794 | 795 | glob@^7.1.3: 796 | version "7.2.3" 797 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 798 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 799 | dependencies: 800 | fs.realpath "^1.0.0" 801 | inflight "^1.0.4" 802 | inherits "2" 803 | minimatch "^3.1.1" 804 | once "^1.3.0" 805 | path-is-absolute "^1.0.0" 806 | 807 | globals@^13.19.0: 808 | version "13.24.0" 809 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 810 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 811 | dependencies: 812 | type-fest "^0.20.2" 813 | 814 | globby@^11.1.0: 815 | version "11.1.0" 816 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 817 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 818 | dependencies: 819 | array-union "^2.1.0" 820 | dir-glob "^3.0.1" 821 | fast-glob "^3.2.9" 822 | ignore "^5.2.0" 823 | merge2 "^1.4.1" 824 | slash "^3.0.0" 825 | 826 | graphemer@^1.4.0: 827 | version "1.4.0" 828 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 829 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 830 | 831 | has-flag@^4.0.0: 832 | version "4.0.0" 833 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 834 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 835 | 836 | ignore@^5.2.0, ignore@^5.2.4: 837 | version "5.3.1" 838 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" 839 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 840 | 841 | import-fresh@^3.2.1: 842 | version "3.3.0" 843 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 844 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 845 | dependencies: 846 | parent-module "^1.0.0" 847 | resolve-from "^4.0.0" 848 | 849 | imurmurhash@^0.1.4: 850 | version "0.1.4" 851 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 852 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 853 | 854 | inflight@^1.0.4: 855 | version "1.0.6" 856 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 857 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 858 | dependencies: 859 | once "^1.3.0" 860 | wrappy "1" 861 | 862 | inherits@2: 863 | version "2.0.4" 864 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 865 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 866 | 867 | ini@^4.1.2: 868 | version "4.1.2" 869 | resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.2.tgz#7f646dbd9caea595e61f88ef60bfff8b01f8130a" 870 | integrity sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw== 871 | 872 | is-extglob@^2.1.1: 873 | version "2.1.1" 874 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 875 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 876 | 877 | is-fullwidth-code-point@^3.0.0: 878 | version "3.0.0" 879 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 880 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 881 | 882 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 883 | version "4.0.3" 884 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 885 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 886 | dependencies: 887 | is-extglob "^2.1.1" 888 | 889 | is-number@^7.0.0: 890 | version "7.0.0" 891 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 892 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 893 | 894 | is-path-inside@^3.0.3: 895 | version "3.0.3" 896 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 897 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 898 | 899 | isexe@^2.0.0: 900 | version "2.0.0" 901 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 902 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 903 | 904 | jackspeak@^2.3.6: 905 | version "2.3.6" 906 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" 907 | integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== 908 | dependencies: 909 | "@isaacs/cliui" "^8.0.2" 910 | optionalDependencies: 911 | "@pkgjs/parseargs" "^0.11.0" 912 | 913 | js-yaml@^4.1.0: 914 | version "4.1.0" 915 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 916 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 917 | dependencies: 918 | argparse "^2.0.1" 919 | 920 | json-buffer@3.0.1: 921 | version "3.0.1" 922 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 923 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 924 | 925 | json-schema-traverse@^0.4.1: 926 | version "0.4.1" 927 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 928 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 929 | 930 | json-stable-stringify-without-jsonify@^1.0.1: 931 | version "1.0.1" 932 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 933 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 934 | 935 | keyv@^4.5.3: 936 | version "4.5.4" 937 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 938 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 939 | dependencies: 940 | json-buffer "3.0.1" 941 | 942 | levn@^0.4.1: 943 | version "0.4.1" 944 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 945 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 946 | dependencies: 947 | prelude-ls "^1.2.1" 948 | type-check "~0.4.0" 949 | 950 | locate-path@^6.0.0: 951 | version "6.0.0" 952 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 953 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 954 | dependencies: 955 | p-locate "^5.0.0" 956 | 957 | lodash.merge@^4.6.2: 958 | version "4.6.2" 959 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 960 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 961 | 962 | lodash@^4.17.21: 963 | version "4.17.21" 964 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 965 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 966 | 967 | lru-cache@^10.2.0: 968 | version "10.2.2" 969 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" 970 | integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== 971 | 972 | merge2@^1.3.0, merge2@^1.4.1: 973 | version "1.4.1" 974 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 975 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 976 | 977 | micromatch@^4.0.4: 978 | version "4.0.5" 979 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 980 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 981 | dependencies: 982 | braces "^3.0.2" 983 | picomatch "^2.3.1" 984 | 985 | mime-db@1.52.0: 986 | version "1.52.0" 987 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 988 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 989 | 990 | mime-types@^2.1.12: 991 | version "2.1.35" 992 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 993 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 994 | dependencies: 995 | mime-db "1.52.0" 996 | 997 | minimatch@9.0.3: 998 | version "9.0.3" 999 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 1000 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 1001 | dependencies: 1002 | brace-expansion "^2.0.1" 1003 | 1004 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1005 | version "3.1.2" 1006 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1007 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1008 | dependencies: 1009 | brace-expansion "^1.1.7" 1010 | 1011 | minimatch@^9.0.1: 1012 | version "9.0.4" 1013 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" 1014 | integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== 1015 | dependencies: 1016 | brace-expansion "^2.0.1" 1017 | 1018 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: 1019 | version "7.1.1" 1020 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" 1021 | integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== 1022 | 1023 | ms@2.1.2: 1024 | version "2.1.2" 1025 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1026 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1027 | 1028 | natural-compare@^1.4.0: 1029 | version "1.4.0" 1030 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1031 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1032 | 1033 | once@^1.3.0: 1034 | version "1.4.0" 1035 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1036 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1037 | dependencies: 1038 | wrappy "1" 1039 | 1040 | optionator@^0.9.3: 1041 | version "0.9.4" 1042 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1043 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1044 | dependencies: 1045 | deep-is "^0.1.3" 1046 | fast-levenshtein "^2.0.6" 1047 | levn "^0.4.1" 1048 | prelude-ls "^1.2.1" 1049 | type-check "^0.4.0" 1050 | word-wrap "^1.2.5" 1051 | 1052 | p-limit@^3.0.2: 1053 | version "3.1.0" 1054 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1055 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1056 | dependencies: 1057 | yocto-queue "^0.1.0" 1058 | 1059 | p-locate@^5.0.0: 1060 | version "5.0.0" 1061 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1062 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1063 | dependencies: 1064 | p-limit "^3.0.2" 1065 | 1066 | parent-module@^1.0.0: 1067 | version "1.0.1" 1068 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1069 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1070 | dependencies: 1071 | callsites "^3.0.0" 1072 | 1073 | path-exists@^4.0.0: 1074 | version "4.0.0" 1075 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1076 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1077 | 1078 | path-is-absolute@^1.0.0: 1079 | version "1.0.1" 1080 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1081 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1082 | 1083 | path-key@^3.1.0: 1084 | version "3.1.1" 1085 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1086 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1087 | 1088 | path-scurry@^1.11.0: 1089 | version "1.11.1" 1090 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" 1091 | integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== 1092 | dependencies: 1093 | lru-cache "^10.2.0" 1094 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1095 | 1096 | path-type@^4.0.0: 1097 | version "4.0.0" 1098 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1099 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1100 | 1101 | picomatch@^2.3.1: 1102 | version "2.3.1" 1103 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1104 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1105 | 1106 | prelude-ls@^1.2.1: 1107 | version "1.2.1" 1108 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1109 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1110 | 1111 | prettier-linter-helpers@^1.0.0: 1112 | version "1.0.0" 1113 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1114 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1115 | dependencies: 1116 | fast-diff "^1.1.2" 1117 | 1118 | prettier@^2.8.8: 1119 | version "2.8.8" 1120 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 1121 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 1122 | 1123 | proxy-from-env@^1.1.0: 1124 | version "1.1.0" 1125 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1126 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1127 | 1128 | punycode@^2.1.0: 1129 | version "2.3.1" 1130 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1131 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1132 | 1133 | queue-microtask@^1.2.2: 1134 | version "1.2.3" 1135 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1136 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1137 | 1138 | resolve-from@^4.0.0: 1139 | version "4.0.0" 1140 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1141 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1142 | 1143 | reusify@^1.0.4: 1144 | version "1.0.4" 1145 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1146 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1147 | 1148 | rimraf@^3.0.2: 1149 | version "3.0.2" 1150 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1151 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1152 | dependencies: 1153 | glob "^7.1.3" 1154 | 1155 | rimraf@^5.0.1: 1156 | version "5.0.7" 1157 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" 1158 | integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== 1159 | dependencies: 1160 | glob "^10.3.7" 1161 | 1162 | run-parallel@^1.1.9: 1163 | version "1.2.0" 1164 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1165 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1166 | dependencies: 1167 | queue-microtask "^1.2.2" 1168 | 1169 | semver@^7.5.4: 1170 | version "7.6.2" 1171 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" 1172 | integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== 1173 | 1174 | shebang-command@^2.0.0: 1175 | version "2.0.0" 1176 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1177 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1178 | dependencies: 1179 | shebang-regex "^3.0.0" 1180 | 1181 | shebang-regex@^3.0.0: 1182 | version "3.0.0" 1183 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1184 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1185 | 1186 | signal-exit@^4.0.1: 1187 | version "4.1.0" 1188 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 1189 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1190 | 1191 | slash@^3.0.0: 1192 | version "3.0.0" 1193 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1194 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1195 | 1196 | "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: 1197 | version "4.2.3" 1198 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1199 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1200 | dependencies: 1201 | emoji-regex "^8.0.0" 1202 | is-fullwidth-code-point "^3.0.0" 1203 | strip-ansi "^6.0.1" 1204 | 1205 | string-width@^5.0.1, string-width@^5.1.2: 1206 | version "5.1.2" 1207 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 1208 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1209 | dependencies: 1210 | eastasianwidth "^0.2.0" 1211 | emoji-regex "^9.2.2" 1212 | strip-ansi "^7.0.1" 1213 | 1214 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1215 | version "6.0.1" 1216 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1217 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1218 | dependencies: 1219 | ansi-regex "^5.0.1" 1220 | 1221 | strip-ansi@^7.0.1: 1222 | version "7.1.0" 1223 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1224 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1225 | dependencies: 1226 | ansi-regex "^6.0.1" 1227 | 1228 | strip-json-comments@^3.1.1: 1229 | version "3.1.1" 1230 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1231 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1232 | 1233 | supports-color@^7.1.0: 1234 | version "7.2.0" 1235 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1236 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1237 | dependencies: 1238 | has-flag "^4.0.0" 1239 | 1240 | text-table@^0.2.0: 1241 | version "0.2.0" 1242 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1243 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1244 | 1245 | to-regex-range@^5.0.1: 1246 | version "5.0.1" 1247 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1248 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1249 | dependencies: 1250 | is-number "^7.0.0" 1251 | 1252 | ts-api-utils@^1.0.1: 1253 | version "1.3.0" 1254 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" 1255 | integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== 1256 | 1257 | type-check@^0.4.0, type-check@~0.4.0: 1258 | version "0.4.0" 1259 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1260 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1261 | dependencies: 1262 | prelude-ls "^1.2.1" 1263 | 1264 | type-fest@^0.20.2: 1265 | version "0.20.2" 1266 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1267 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1268 | 1269 | typescript@~5.0.4: 1270 | version "5.0.4" 1271 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" 1272 | integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== 1273 | 1274 | undici-types@~5.26.4: 1275 | version "5.26.5" 1276 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1277 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1278 | 1279 | uri-js@^4.2.2: 1280 | version "4.4.1" 1281 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1282 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1283 | dependencies: 1284 | punycode "^2.1.0" 1285 | 1286 | uuid@^9.0.1: 1287 | version "9.0.1" 1288 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" 1289 | integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== 1290 | 1291 | vscode-jsonrpc@8.2.0: 1292 | version "8.2.0" 1293 | resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz#f43dfa35fb51e763d17cd94dcca0c9458f35abf9" 1294 | integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== 1295 | 1296 | vscode-languageserver-protocol@3.17.5: 1297 | version "3.17.5" 1298 | resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz#864a8b8f390835572f4e13bd9f8313d0e3ac4bea" 1299 | integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== 1300 | dependencies: 1301 | vscode-jsonrpc "8.2.0" 1302 | vscode-languageserver-types "3.17.5" 1303 | 1304 | vscode-languageserver-textdocument@^1.0.11: 1305 | version "1.0.11" 1306 | resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" 1307 | integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== 1308 | 1309 | vscode-languageserver-types@3.17.5: 1310 | version "3.17.5" 1311 | resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" 1312 | integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== 1313 | 1314 | vscode-languageserver@^9.0.1: 1315 | version "9.0.1" 1316 | resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz#500aef82097eb94df90d008678b0b6b5f474015b" 1317 | integrity sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== 1318 | dependencies: 1319 | vscode-languageserver-protocol "3.17.5" 1320 | 1321 | vscode-uri@^3.0.8: 1322 | version "3.0.8" 1323 | resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" 1324 | integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== 1325 | 1326 | which@^2.0.1, which@^2.0.2: 1327 | version "2.0.2" 1328 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1329 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1330 | dependencies: 1331 | isexe "^2.0.0" 1332 | 1333 | word-wrap@^1.2.5: 1334 | version "1.2.5" 1335 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1336 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1337 | 1338 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 1339 | version "7.0.0" 1340 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1341 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1342 | dependencies: 1343 | ansi-styles "^4.0.0" 1344 | string-width "^4.1.0" 1345 | strip-ansi "^6.0.0" 1346 | 1347 | wrap-ansi@^8.1.0: 1348 | version "8.1.0" 1349 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 1350 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 1351 | dependencies: 1352 | ansi-styles "^6.1.0" 1353 | string-width "^5.0.1" 1354 | strip-ansi "^7.0.1" 1355 | 1356 | wrappy@1: 1357 | version "1.0.2" 1358 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1359 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1360 | 1361 | yaml@^2.4.2: 1362 | version "2.4.2" 1363 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" 1364 | integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== 1365 | 1366 | yocto-queue@^0.1.0: 1367 | version "0.1.0" 1368 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1369 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1370 | --------------------------------------------------------------------------------