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

@@ -1,18 +1,16 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
"@typescript-eslint/semi": "warn",
"curly": "warn",
"eqeqeq": "warn",
"no-throw-literal": "warn",
"semi": "off"
}
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"plugins": ["@typescript-eslint"],
"rules": {
"@typescript-eslint/semi": "warn",
"curly": "warn",
"eqeqeq": "warn",
"no-throw-literal": "warn",
"semi": "off"
}
}

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

View File

@@ -10,12 +10,12 @@ jobs:
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v2
- name: setup node
uses: actions/setup-node@v1
with:
node-version: 14
- name: install dependencies
run: yarn
- name: compile extension
run: yarn compile
- uses: actions/checkout@v2
- name: setup node
uses: actions/setup-node@v1
with:
node-version: 14
- name: install dependencies
run: yarn
- name: compile extension
run: yarn compile

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"
]
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": ["dbaeumer.vscode-eslint"]
}

57
.vscode/launch.json vendored
View File

@@ -3,34 +3,31 @@
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
"preLaunchTask": "${defaultBuildTask}"
},
{
"name": "Extension Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
],
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"preLaunchTask": "${defaultBuildTask}"
}
]
"version": "0.2.0",
"configurations": [
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--disable-extensions"
],
"outFiles": ["${workspaceFolder}/out/**/*.js"],
"preLaunchTask": "${defaultBuildTask}"
},
{
"name": "Extension Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
],
"outFiles": ["${workspaceFolder}/out/test/**/*.js"],
"preLaunchTask": "${defaultBuildTask}"
}
]
}

18
.vscode/settings.json vendored
View File

@@ -1,12 +1,12 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.exclude": {
"out": false // set this to true to hide the "out" folder with the compiled JS files
},
"search.exclude": {
"out": true // set this to false to include "out" folder in search results
},
// Turn off tsc task auto detection since we have the necessary tasks as npm scripts
"typescript.tsc.autoDetect": "off",
"npm.runInTerminal": false
"files.exclude": {
"out": false // set this to true to hide the "out" folder with the compiled JS files
},
"search.exclude": {
"out": true // set this to false to include "out" folder in search results
},
// Turn off tsc task auto detection since we have the necessary tasks as npm scripts
"typescript.tsc.autoDetect": "off",
"npm.runInTerminal": false
}

32
.vscode/tasks.json vendored
View File

@@ -1,20 +1,20 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "watch",
"problemMatcher": "$tsc-watch",
"isBackground": true,
"presentation": {
"reveal": "never"
},
"group": {
"kind": "build",
"isDefault": true
}
}
]
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "watch",
"problemMatcher": "$tsc-watch",
"isBackground": true,
"presentation": {
"reveal": "never"
},
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

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,77 +43,174 @@ 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 => {
let installCommand: string;
let onInstall = () => { };
if (__isVueCliApp(projectPath)) {
installCommand = 'vue add tauri';
} else {
installCommand = __usePnpm(projectPath)
? 'pnpm add -D @tauri-apps/cli'
: __useYarn(projectPath)
? 'yarn add @tauri-apps/cli --dev'
: `${__getNpmBin()} install @tauri-apps/cli --save-dev`;
onInstall = () => {
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));
}
__runTauriScript(['init'], { cwd: projectPath, noOutputWindow: true });
};
__pickProjectAndRunTauriScript(
(projectPath) => {
let installCommand: string;
let onInstall = () => {};
if (__isVueCliApp(projectPath)) {
installCommand = 'vue add tauri';
} else {
installCommand = __usePnpm(projectPath)
? 'pnpm add -D @tauri-apps/cli'
: __useYarn(projectPath)
? 'yarn add @tauri-apps/cli --dev'
: `${__getNpmBin()} install @tauri-apps/cli --save-dev`;
onInstall = () => {
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)
);
}
__runTauriScript(['init'], {
cwd: projectPath,
noOutputWindow: true,
});
};
}
const [command, ...args] = installCommand.split(' ');
__runScript(command, args, {
cwd: projectPath,
noOutputWindow: command === 'vue',
}).then(onInstall);
},
() => {
const paths = __getNpmProjectsPaths();
return paths.filter((p) => {
return !fs.existsSync(path.join(p, 'src-tauri'));
});
}
const [command, ...args] = (installCommand).split(' ');
__runScript(command, args, { cwd: projectPath, noOutputWindow: command === 'vue' }).then(onInstall);
}, () => {
const paths = __getNpmProjectsPaths();
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,21 +281,31 @@ 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 => {
return new Promise((resolve, reject) => {
process.on('exit', code => {
if (code) {
reject();
} else {
resolve();
}
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) => {
if (code) {
reject();
} else {
resolve();
}
});
});
});
});
}
);
}
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

@@ -3,21 +3,21 @@ import * as path from 'path';
import { runTests } from '@vscode/test-electron';
async function main() {
try {
// The folder containing the Extension Manifest package.json
// Passed to `--extensionDevelopmentPath`
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
try {
// The folder containing the Extension Manifest package.json
// Passed to `--extensionDevelopmentPath`
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
// The path to test runner
// Passed to --extensionTestsPath
const extensionTestsPath = path.resolve(__dirname, './suite/index');
// The path to test runner
// Passed to --extensionTestsPath
const extensionTestsPath = path.resolve(__dirname, './suite/index');
// Download VS Code, unzip it and run the integration test
await runTests({ extensionDevelopmentPath, extensionTestsPath });
} catch (err) {
console.error('Failed to run tests');
process.exit(1);
}
// Download VS Code, unzip it and run the integration test
await runTests({ extensionDevelopmentPath, extensionTestsPath });
} catch (err) {
console.error('Failed to run tests');
process.exit(1);
}
}
main();

View File

@@ -6,10 +6,12 @@ import * as vscode from 'vscode';
// import * as myExtension from '../../extension';
suite('Extension Test Suite', () => {
vscode.window.showInformationMessage('Start all tests.');
vscode.window.showInformationMessage('Start all tests.');
test('Sample test', () => {
vscode.window.showInformationMessage(JSON.stringify(vscode.workspace.workspaceFolders));
setTimeout(() => { }, 2000);
});
test('Sample test', () => {
vscode.window.showInformationMessage(
JSON.stringify(vscode.workspace.workspaceFolders)
);
setTimeout(() => {}, 2000);
});
});

View File

@@ -3,36 +3,36 @@ import * as Mocha from 'mocha';
import * as glob from 'glob';
export function run(): Promise<void> {
// Create the mocha test
const mocha = new Mocha({
ui: 'tdd',
color: true
});
// Create the mocha test
const mocha = new Mocha({
ui: 'tdd',
color: true,
});
const testsRoot = path.resolve(__dirname, '..');
const testsRoot = path.resolve(__dirname, '..');
return new Promise((c, e) => {
glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
if (err) {
return e(err);
}
return new Promise((c, e) => {
glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
if (err) {
return e(err);
}
// Add files to the test suite
files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
// Add files to the test suite
files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f)));
try {
// Run the mocha test
mocha.run(failures => {
if (failures > 0) {
e(new Error(`${failures} tests failed.`));
} else {
c();
}
});
} catch (err) {
console.error(err);
e(err);
}
});
});
try {
// Run the mocha test
mocha.run((failures) => {
if (failures > 0) {
e(new Error(`${failures} tests failed.`));
} else {
c();
}
});
} catch (err) {
console.error(err);
e(err);
}
});
});
}

View File

@@ -1,21 +1,16 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"outDir": "out",
"lib": [
"es6"
],
"sourceMap": true,
"rootDir": "src",
"strict": true /* enable all strict type-checking options */
/* Additional Checks */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
},
"exclude": [
"node_modules",
".vscode-test"
]
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"outDir": "out",
"lib": ["es6"],
"sourceMap": true,
"rootDir": "src",
"strict": true /* enable all strict type-checking options */
/* Additional Checks */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
},
"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"