feat: provide schema for config based on tauri-build version (#162)

* feat: provide schema for config based on cli version

* fallback to latest release

* enable commented code

* get schema based on tauri-build version

* change url

* handle schema get request error

* Update versioned-schema.md

* Update extension.ts
This commit is contained in:
Amr Bashir
2022-09-19 15:08:43 +02:00
committed by GitHub
parent a8a8a393b5
commit f85fc5c174
22 changed files with 475 additions and 273 deletions

View File

@@ -3,7 +3,7 @@
"pkgManagers": {
"javascript": {
"version": true,
"publish": false
"publish": []
}
},
"packages": {

View File

@@ -1,16 +1,17 @@
# Changes
##### via https://github.com/jbolda/covector
As you create PRs and make changes that require a version bump, please add a new markdown file in this folder. You do not note the version *number*, but rather the type of bump that you expect: major, minor, or patch. The filename is not important, as long as it is a `.md`, but we recommend it represents the overall change for our sanity.
As you create PRs and make changes that require a version bump, please add a new markdown file in this folder. You do not note the version _number_, but rather the type of bump that you expect: major, minor, or patch. The filename is not important, as long as it is a `.md`, but we recommend it represents the overall change for our sanity.
When you select the version bump required, you do *not* need to consider depedencies. Only note the package with the actual change, and any packages that depend on that package will be bumped automatically in the process.
When you select the version bump required, you do _not_ need to consider depedencies. Only note the package with the actual change, and any packages that depend on that package will be bumped automatically in the process.
Use the following format:
```md
---
"tauri-log-plugin": minor
'tauri-log-plugin': minor
---
Change summary goes here
```

View File

@@ -0,0 +1,5 @@
---
"tauri-vscode": "minor"
---
Provide schema for `tauri.conf.json` based on `tauri-build` version.

View File

@@ -5,9 +5,7 @@
"ecmaVersion": 6,
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"plugins": ["@typescript-eslint"],
"rules": {
"@typescript-eslint/semi": "warn",
"curly": "warn",

View File

@@ -22,13 +22,26 @@ jobs:
id: covector
with:
token: ${{ secrets.GITHUB_TOKEN }}
command: 'version'
command: 'version-or-publish'
createRelease: false
- name: Create Pull Request With Versions Bumped
if: steps.covector.outputs.commandRan == 'version'
uses: tauri-apps/create-pull-request@v3.4.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: covector/version-updates
title: Apply Version Updates From Current Changes
commit-message: "apply version updates"
labels: "version updates"
commit-message: 'apply version updates'
labels: 'version updates'
body: ${{ steps.covector.outputs.change }}
- name: Trigger publish.yml workflow
if: |
steps.covector.outputs.successfulPublish == 'true' &&
contains(steps.covector.outputs.packagesPublished, 'tauri-vscode')
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.TAURI_BOT_PAT }}
repo: tauri-apps/tauri-vscode
event-type: publish

View File

@@ -1,7 +1,7 @@
on:
push:
branches:
- release
workflow_dispatch:
repository_dispatch:
types: [publish]
name: Publish Extension

6
.prettierrc Normal file
View File

@@ -0,0 +1,6 @@
{
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}

View File

@@ -1,7 +1,5 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"dbaeumer.vscode-eslint"
]
"recommendations": ["dbaeumer.vscode-eslint"]
}

11
.vscode/launch.json vendored
View File

@@ -11,11 +11,10 @@
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
"--extensionDevelopmentPath=${workspaceFolder}",
"--disable-extensions"
],
"outFiles": ["${workspaceFolder}/out/**/*.js"],
"preLaunchTask": "${defaultBuildTask}"
},
{
@@ -27,9 +26,7 @@
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
],
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"outFiles": ["${workspaceFolder}/out/test/**/*.js"],
"preLaunchTask": "${defaultBuildTask}"
}
]

View File

@@ -33,7 +33,8 @@
"onCommand:tauri.deps-update",
"onCommand:tauri.dev",
"onCommand:tauri.build",
"onCommand:tauri.build-debug"
"onCommand:tauri.build-debug",
"onFileSystem:tauri"
],
"main": "./out/extension.js",
"contributes": {
@@ -45,7 +46,7 @@
"tauri.*.conf.json",
"tauri.*.conf.json5"
],
"url": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/tooling/cli/schema.json"
"url": "tauri://schemas/config.json"
}
],
"commands": [
@@ -95,6 +96,7 @@
"vscode:prepublish": "yarn run compile",
"compile": "tsc -p ./",
"lint": "eslint src --ext ts",
"format": "prettier ./**/*.{json,ts,js} -w --ignore-path .gitignore",
"watch": "tsc -watch -p ./",
"pretest": "yarn run compile && yarn run lint",
"test": "node ./out/test/runTest.js"
@@ -109,9 +111,12 @@
"@vscode/test-electron": "2.1.5",
"eslint": "8.23.1",
"mocha": "10.0.0",
"prettier": "^2.7.1",
"typescript": "4.8.3"
},
"dependencies": {
"@types/semver": "^7.3.12",
"axios": "^0.27.2",
"glob": "8.0.3",
"run-in-terminal": "^0.0.3"
},

View File

@@ -1,5 +1,3 @@
{
"extends": [
"config:base"
]
"extends": ["config:base"]
}

View File

@@ -1,9 +1,6 @@
{
"Create a covector change file": {
"prefix": [
"covector",
"---"
],
"prefix": ["covector", "---"],
"body": [
"---",
"\"${3:$WORKSPACE_NAME}\": \"${1|patch,minor,major|}\"",

View File

@@ -1,10 +1,6 @@
{
"Create a tauri command": {
"prefix": [
"command",
"#[tauri::command]",
"#[command]"
],
"prefix": ["command", "#[tauri::command]", "#[command]"],
"body": [
"#[tauri::command]",
"async fn ${1:command_name}<R: Runtime>(app: tauri::AppHandle<R>, window: tauri::Window<R>) -> Result<(), String> {",
@@ -14,11 +10,7 @@
"description": "Communicate between the UI and the Rust code"
},
"Create a stateful tauri command": {
"prefix": [
"command",
"#[tauri::command]",
"#[command]"
],
"prefix": ["command", "#[tauri::command]", "#[command]"],
"body": [
"#[derive(Default)]",
"struct MyState {",

View File

@@ -3,6 +3,7 @@ import { exec, ChildProcess } from 'child_process';
import { runInTerminal } from 'run-in-terminal';
import { join } from 'path';
import { existsSync, readFileSync } from 'fs';
import axios from 'axios';
const glob = require('glob');
const path = require('path');
const fs = require('fs');
@@ -20,11 +21,12 @@ const runningProcesses: Map<number, Process> = new Map();
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
registerCommands(context);
registerSchemasHandler(context);
outputChannel = vscode.window.createOutputChannel('tauri');
context.subscriptions.push(outputChannel);
vscode.window.onDidCloseTerminal(closedTerminal => {
vscode.window.onDidCloseTerminal((closedTerminal) => {
if (terminal === closedTerminal) {
terminal = null;
}
@@ -41,18 +43,114 @@ export function deactivate() {
function registerCommands(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('tauri.init', runTauriInit),
vscode.commands.registerCommand('tauri.deps-install', runTauriDepsInstall),
vscode.commands.registerCommand('tauri.deps-update', runTauriDepsUpdate),
vscode.commands.registerCommand('tauri.dev', runTauriDev),
vscode.commands.registerCommand('tauri.build', runTauriBuild),
vscode.commands.registerCommand('tauri.build-debug', runTauriBuildDebug)
);
}
function registerSchemasHandler(context: vscode.ExtensionContext) {
vscode.workspace.registerTextDocumentContentProvider(
'tauri',
new (class implements vscode.TextDocumentContentProvider {
onDidChangeEmitter = new vscode.EventEmitter<vscode.Uri>();
onDidChange = this.onDidChangeEmitter.event;
async provideTextDocumentContent(uri: vscode.Uri): Promise<string> {
if (uri.authority === 'schemas' && uri.path === '/config.json') {
// get schema form local file in node_modules
const schemaFile = (
await vscode.workspace.findFiles(
'**/node_modules/@tauri-apps/cli/schema.json'
)
)[0];
if (schemaFile) return readFileSync(schemaFile.fsPath, 'utf-8');
async function getSchemaFromRelease(version: string) {
const res = await axios.get(
`https://github.com/tauri-apps/tauri/releases/download/tauri-build-v${version}/schema.json`
);
return res.status == 200 ? JSON.stringify(res.data) : null;
}
// get schema form github release based on tauri-build version in Cargo.lock
const cargoLockPath = (
await vscode.workspace.findFiles('**/Cargo.lock')
)[0];
if (cargoLockPath) {
const cargoLock = readFileSync(cargoLockPath.fsPath, 'utf-8');
const matches =
/\[\[package\]\]\nname = "tauri-build"\nversion = "(.*)"/g.exec(
cargoLock
);
if (matches && matches[1]) {
const schema = await getSchemaFromRelease(matches[1]);
if (schema) return schema;
}
}
// get schema form github release based on tauri-build version in Cargo.toml
const cargoTomlPath = (
await vscode.workspace.findFiles('**/Cargo.toml')
)[0];
if (cargoTomlPath) {
const cargoToml = readFileSync(cargoTomlPath.fsPath, 'utf-8');
for (const regex of [
// specifying a dependency in Cargo.toml can be done in 4 ways
// 1st, tauri-build = "1.0.2"
/tauri-build *= *"(.*)"/g,
// 2nd, tauri-build = { version = "1.0.2" }
/tauri-build *= *{.*version = "(.*)".*}\n/g,
// 3rd,
// tauri-build = { features = [
// "f1",
// "f2"
// ], version = "1.0.2" }
/tauri-build *= *{[\s\S.]*version = "(.*)"[\s\S.]*}\n/g,
// 4th,
// [dependencies.tauri-build]
// \n version = "1.0.2"
/\[.*tauri-build\][\s\S.]*version = "(.*)"\n/g,
]) {
const matches = regex.exec(cargoToml);
if (matches && matches[1]) {
const schema = await getSchemaFromRelease(matches[1]);
if (schema) return schema;
}
}
}
// fallback to latest release
let res = await axios.get(
`https://api.github.com/repos/tauri-apps/tauri/releases`
);
let tag_name = (res.data as Array<{ tag_name: string }>).find((e) =>
e.tag_name.startsWith('tauri-build-v')
)?.tag_name;
if (tag_name) {
const matches =
/((\d|x|\*)+\.(\d|x|\*)+\.(\d|x|\*)+(-[a-zA-Z-0-9]*(.[0-9]+))*)/g.exec(
tag_name
);
if (matches && matches[1]) {
const schema = await getSchemaFromRelease(matches[1]);
if (schema) return schema;
}
}
}
return '';
}
})()
);
}
function runTauriInit(): void {
__pickProjectAndRunTauriScript(projectPath => {
__pickProjectAndRunTauriScript(
(projectPath) => {
let installCommand: string;
let onInstall = () => { };
let onInstall = () => {};
if (__isVueCliApp(projectPath)) {
installCommand = 'vue add tauri';
} else {
@@ -62,56 +160,57 @@ function runTauriInit(): void {
? 'yarn add @tauri-apps/cli --dev'
: `${__getNpmBin()} install @tauri-apps/cli --save-dev`;
onInstall = () => {
const packageJson = JSON.parse(fs.readFileSync(`${projectPath}/package.json`));
const packageJson = JSON.parse(
fs.readFileSync(`${projectPath}/package.json`)
);
if (!packageJson.scripts) {
packageJson.scripts = {};
}
if (!packageJson.scripts['tauri']) {
packageJson.scripts['tauri'] = 'tauri';
fs.writeFileSync(`${projectPath}/package.json`, JSON.stringify(packageJson, null, 4));
fs.writeFileSync(
`${projectPath}/package.json`,
JSON.stringify(packageJson, null, 4)
);
}
__runTauriScript(['init'], { cwd: projectPath, noOutputWindow: true });
__runTauriScript(['init'], {
cwd: projectPath,
noOutputWindow: true,
});
};
}
const [command, ...args] = (installCommand).split(' ');
__runScript(command, args, { cwd: projectPath, noOutputWindow: command === 'vue' }).then(onInstall);
}, () => {
const [command, ...args] = installCommand.split(' ');
__runScript(command, args, {
cwd: projectPath,
noOutputWindow: command === 'vue',
}).then(onInstall);
},
() => {
const paths = __getNpmProjectsPaths();
return paths.filter(p => {
return paths.filter((p) => {
return !fs.existsSync(path.join(p, 'src-tauri'));
});
});
}
function runTauriDepsInstall(): void {
const projectPaths = __getTauriProjectsPaths();
if (projectPaths.length === 0) {
vscode.window.showErrorMessage('Tauri project not found');
return;
}
__runTauriScript(['deps', 'install'], { cwd: projectPaths[0] });
}
function runTauriDepsUpdate(): void {
const projectPaths = __getTauriProjectsPaths();
if (projectPaths.length === 0) {
vscode.window.showErrorMessage('Tauri project not found');
return;
}
__runTauriScript(['deps', 'update'], { cwd: projectPaths[0] });
);
}
function runTauriDev(): void {
__pickProjectAndRunTauriScript(projectPath => __runTauriScript(['dev'], { cwd: projectPath }));
__pickProjectAndRunTauriScript((projectPath) =>
__runTauriScript(['dev'], { cwd: projectPath })
);
}
function runTauriBuild(): void {
__pickProjectAndRunTauriScript(projectPath => __runTauriScript(['build'], { cwd: projectPath }));
__pickProjectAndRunTauriScript((projectPath) =>
__runTauriScript(['build'], { cwd: projectPath })
);
}
function runTauriBuildDebug(): void {
__pickProjectAndRunTauriScript(projectPath => __runTauriScript(['build', '--debug'], { cwd: projectPath }));
__pickProjectAndRunTauriScript((projectPath) =>
__runTauriScript(['build', '--debug'], { cwd: projectPath })
);
}
function __isVueCliApp(cwd: string): boolean {
@@ -120,13 +219,16 @@ function __isVueCliApp(cwd: string): boolean {
}
interface PackageJson {
dependencies: {
[name: string]: any;
};
devDependencies: {
[name: string]: any
}
[name: string]: any;
};
}
function __getPackageJson(cwd: string): PackageJson | null {
const packagePath = join(cwd, 'package.json');
function __getPackageJson(path: string): PackageJson | null {
const packagePath = join(path, 'package.json');
if (existsSync(packagePath)) {
const packageStr = readFileSync(packagePath).toString();
return JSON.parse(packageStr) as PackageJson;
@@ -143,13 +245,14 @@ function __getNpmProjectsPaths(): string[] {
const paths = [];
for (const folder of folders) {
const npmProjectRoots: string[] = glob.sync(folder.uri.fsPath.split('\\').join('/') + '/**/package.json')
const npmProjectRoots: string[] = glob
.sync(folder.uri.fsPath.split('\\').join('/') + '/**/package.json')
.map((p: string) => path.dirname(p));
paths.push(...npmProjectRoots.filter(p => !p.includes('node_modules')));
paths.push(...npmProjectRoots.filter((p) => !p.includes('node_modules')));
}
if (paths.length === 0) {
return folders.map(f => f.uri.fsPath);
return folders.map((f) => f.uri.fsPath);
}
return paths;
@@ -163,9 +266,10 @@ function __getTauriProjectsPaths(): string[] {
const paths = [];
for (const folder of folders) {
const tauriProjectRoots: string[] = glob.sync(folder.uri.fsPath.split('\\').join('/') + '/**/src-tauri')
const tauriProjectRoots: string[] = glob
.sync(folder.uri.fsPath.split('\\').join('/') + '/**/src-tauri')
.map((p: string) => path.dirname(p));
paths.push(...tauriProjectRoots.filter(p => !p.includes('node_modules')));
paths.push(...tauriProjectRoots.filter((p) => !p.includes('node_modules')));
}
return paths;
}
@@ -177,10 +281,15 @@ function __isMultiRoot(): boolean {
return false;
}
function __runCommandInTerminal(command: string, args: string[], cwd: string | undefined): Promise<void> {
return runInTerminal(command, args, { cwd, env: process.env }).then(process => {
function __runCommandInTerminal(
command: string,
args: string[],
cwd: string | undefined
): Promise<void> {
return runInTerminal(command, args, { cwd, env: process.env }).then(
(process) => {
return new Promise((resolve, reject) => {
process.on('exit', code => {
process.on('exit', (code) => {
if (code) {
reject();
} else {
@@ -188,10 +297,15 @@ function __runCommandInTerminal(command: string, args: string[], cwd: string | u
}
});
});
});
}
);
}
function __runCommandInIntegratedTerminal(command: string, args: string[], cwd: string | undefined): Promise<void> {
function __runCommandInIntegratedTerminal(
command: string,
args: string[],
cwd: string | undefined
): Promise<void> {
if (!terminal) {
terminal = vscode.window.createTerminal('tauri');
}
@@ -206,7 +320,11 @@ function __runCommandInIntegratedTerminal(command: string, args: string[], cwd:
return Promise.resolve();
}
function __runCommandInOutputWindow(command: string, args: string[], cwd: string | undefined): Promise<void> {
function __runCommandInOutputWindow(
command: string,
args: string[],
cwd: string | undefined
): Promise<void> {
return new Promise((resolve, reject) => {
const cmd = command + ' ' + args.join(' ');
const p = exec(cmd, { cwd, env: process.env });
@@ -243,8 +361,8 @@ function __runCommandInOutputWindow(command: string, args: string[], cwd: string
}
interface TauriProject {
label: string
projectPath: string
label: string;
projectPath: string;
}
function __useTerminal() {
@@ -264,17 +382,22 @@ function __getNpmBin() {
}
function __getPackageManagerBin(projectPath: string) {
return __usePnpm(projectPath) ? 'pnpm' : __useYarn(projectPath) ? 'yarn' : __getNpmBin();
return __usePnpm(projectPath)
? 'pnpm'
: __useYarn(projectPath)
? 'yarn'
: __getNpmBin();
}
interface RunOptions {
noOutputWindow?: boolean
cwd: string
noOutputWindow?: boolean;
cwd: string;
}
function __runScript(command: string, args: string[], options: RunOptions) {
vscode.window.showInformationMessage(`Running \`${command} ${args.join(' ')}\` in ${options.cwd}`);
vscode.window.showInformationMessage(
`Running \`${command} ${args.join(' ')}\` in ${options.cwd}`
);
return vscode.workspace.saveAll().then(() => {
if (__useTerminal() || options.noOutputWindow) {
@@ -293,13 +416,24 @@ function __runScript(command: string, args: string[], options: RunOptions) {
function __runTauriScript(args: string[], options: RunOptions): void {
if (__isVueCliApp(options.cwd)) {
const [cmd, ...cmgArgs] = args;
__runScript(__getPackageManagerBin(options.cwd), ['run', `tauri:${cmd === 'dev' ? 'serve' : cmd}`, ...cmgArgs], options);
__runScript(
__getPackageManagerBin(options.cwd),
['run', `tauri:${cmd === 'dev' ? 'serve' : cmd}`, ...cmgArgs],
options
);
} else {
__runScript(__getPackageManagerBin(options.cwd), ['run', 'tauri', ...args], options);
__runScript(
__getPackageManagerBin(options.cwd),
['run', 'tauri', ...args],
options
);
}
}
function __pickProjectAndRunTauriScript(runner: (projectPath: string) => void, getProjectPathsFn = __getTauriProjectsPaths): void {
function __pickProjectAndRunTauriScript(
runner: (projectPath: string) => void,
getProjectPathsFn = __getTauriProjectsPaths
): void {
const tauriProjectsPaths = getProjectPathsFn();
const projectList: TauriProject[] = [];
@@ -314,7 +448,7 @@ function __pickProjectAndRunTauriScript(runner: (projectPath: string) => void, g
projectList.push({
label,
projectPath: p
projectPath: p,
});
}
@@ -326,7 +460,7 @@ function __pickProjectAndRunTauriScript(runner: (projectPath: string) => void, g
if (projectList.length === 1) {
runner(projectList[0].projectPath);
} else {
vscode.window.showQuickPick(projectList).then(project => {
vscode.window.showQuickPick(projectList).then((project) => {
if (project) {
runner(project.projectPath);
}

View File

@@ -9,7 +9,9 @@ suite('Extension Test Suite', () => {
vscode.window.showInformationMessage('Start all tests.');
test('Sample test', () => {
vscode.window.showInformationMessage(JSON.stringify(vscode.workspace.workspaceFolders));
setTimeout(() => { }, 2000);
vscode.window.showInformationMessage(
JSON.stringify(vscode.workspace.workspaceFolders)
);
setTimeout(() => {}, 2000);
});
});

View File

@@ -6,7 +6,7 @@ export function run(): Promise<void> {
// Create the mocha test
const mocha = new Mocha({
ui: 'tdd',
color: true
color: true,
});
const testsRoot = path.resolve(__dirname, '..');
@@ -18,11 +18,11 @@ export function run(): Promise<void> {
}
// Add files to the test suite
files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f)));
try {
// Run the mocha test
mocha.run(failures => {
mocha.run((failures) => {
if (failures > 0) {
e(new Error(`${failures} tests failed.`));
} else {

View File

@@ -3,9 +3,7 @@
"module": "commonjs",
"target": "es6",
"outDir": "out",
"lib": [
"es6"
],
"lib": ["es6"],
"sourceMap": true,
"rootDir": "src",
"strict": true /* enable all strict type-checking options */
@@ -14,8 +12,5 @@
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
},
"exclude": [
"node_modules",
".vscode-test"
]
"exclude": ["node_modules", ".vscode-test"]
}

View File

@@ -100,6 +100,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.59.tgz#823f238b9063ccc3b3b7f13186f143a57926c4f6"
integrity sha512-6u+36Dj3aDzhfBVUf/mfmc92OEdzQ2kx2jcXGdigfl70E/neV21ZHE6UCz4MDzTRcVqGAM27fk+DLXvyDsn3Jw==
"@types/semver@^7.3.12":
version "7.3.12"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c"
integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==
"@types/vscode@1.66.0":
version "1.66.0"
resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.66.0.tgz#e90e1308ad103f2bd31b72c17b8031b4cec0713d"
@@ -263,6 +268,19 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
axios@^0.27.2:
version "0.27.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies:
follow-redirects "^1.14.9"
form-data "^4.0.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -381,6 +399,13 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
@@ -412,6 +437,11 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
diff@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
@@ -642,6 +672,20 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
follow-redirects@^1.14.9:
version "1.15.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -932,6 +976,18 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
minimatch@5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
@@ -1088,6 +1144,11 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prettier@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"