From 3ce95d27603bd2b95f79d53dff25f5c26742083e Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Fri, 27 Dec 2019 20:37:21 -0300 Subject: [PATCH] feat(tauri.js) add `tauri info` command (#236) * feat(tauri.js) add `tauri info` command * fix(bug-report): add command information - thanks @nklayman for the reminder * fix(tauri-info): add cargo version * feat(tauri.js) add cargo.toml and tauri.conf.json info Co-authored-by: nothingismagick --- .github/ISSUE_TEMPLATE/bug_report.md | 9 +- cli/tauri.js/bin/tauri-info.js | 3 + cli/tauri.js/bin/tauri.js | 2 +- cli/tauri.js/src/api/info.ts | 132 +++++++++++++++++++++++++++ cli/tauri.js/webpack.config.js | 3 +- 5 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 cli/tauri.js/bin/tauri-info.js create mode 100644 cli/tauri.js/src/api/info.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f0c2f765a..a42514839 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,13 +23,16 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Platform (please complete the following information):** +**Platform and Versions (please complete the following information):** + OS: Node: NPM: Yarn: -Tauri Binding: -Bundle Target: +Rustc: **Additional context** Add any other context about the problem here. + +**Stack Trace** + \ No newline at end of file diff --git a/cli/tauri.js/bin/tauri-info.js b/cli/tauri.js/bin/tauri-info.js new file mode 100644 index 000000000..4dd109420 --- /dev/null +++ b/cli/tauri.js/bin/tauri-info.js @@ -0,0 +1,3 @@ +const info = require('../dist/api/info') + +info() diff --git a/cli/tauri.js/bin/tauri.js b/cli/tauri.js/bin/tauri.js index 95110fc8c..6e378375b 100755 --- a/cli/tauri.js/bin/tauri.js +++ b/cli/tauri.js/bin/tauri.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -const cmds = ['init', 'dev', 'build', 'help', 'icon'] +const cmds = ['init', 'dev', 'build', 'help', 'icon', 'info'] const cmd = process.argv[2] /** diff --git a/cli/tauri.js/src/api/info.ts b/cli/tauri.js/src/api/info.ts new file mode 100644 index 000000000..9f624059f --- /dev/null +++ b/cli/tauri.js/src/api/info.ts @@ -0,0 +1,132 @@ +import { TauriConfig } from './../types/config'; +const os = require('os') +const spawn = require('cross-spawn').sync +const chalk = require('chalk') +const path = require('path') +const fs = require('fs') + +interface DirInfo { + path: string + name: string + type?: 'folder'|'file' + children?: DirInfo[] +} + +function dirTree(filename: string): DirInfo { + const stats = fs.lstatSync(filename) + const info: DirInfo = { + path: filename, + name: path.basename(filename) + } + + if (stats.isDirectory()) { + info.type = 'folder' + info.children = fs.readdirSync(filename).map(function (child: string) { + return dirTree(filename + '/' + child) + }); + } else { + info.type = 'file' + } + + return info +} + +function getVersion (command: string, args: string[] = [], formatter?: (output: string) => string) { + try { + const child = spawn(command, [...args, '--version']) + if (child.status === 0) { + const output = String(child.output[1]) + return chalk.green(formatter === undefined ? output : formatter(output)).replace('\n', '') + } + return chalk.red('Not installed') + } + catch (err) { + return chalk.red('Not installed') + } +} + +interface Info { + section?: boolean + key: string + value?: string +} + +function printInfo (info: Info) { + console.log(`${info.section ? '\n' : ''}${info.key}${info.value === undefined ? '' : ' - ' + info.value}`) +} + +function printAppInfo(tauriDir: string) { + printInfo({ key: 'App', section: true }) + + try { + const toml = require('@tauri-apps/toml') + const tomlPath = path.join(tauriDir, 'Cargo.toml') + const tomlFile = fs.readFileSync(tomlPath) + // @ts-ignore + const tomlContents = toml.parse(tomlFile) + + const tauriVersion = () => { + const tauri = tomlContents.dependencies.tauri + if (tauri) { + if (tauri.version) { + return chalk.green(tauri.version) + } + if (tauri.path) { + try { + const tauriTomlPath = path.resolve(tauriDir, tauri.path, 'Cargo.toml') + const tauriTomlFile = fs.readFileSync(tauriTomlPath) + // @ts-ignore + const tauriTomlContents = toml.parse(tauriTomlFile) + return chalk.green(`${tauriTomlContents.package.version} (from source)`) + } catch (_) { } + } + } + return chalk.red('unknown') + } + + + printInfo({ key: ' tauri', value: tauriVersion() }) + } + catch (_) { } + + try { + const tauriMode = (config: TauriConfig): string => { + if (config.tauri.embeddedServer) { + return chalk.green(config.tauri.embeddedServer.active ? 'embedded-server' : 'no-server') + } + return chalk.red('unset') + } + const configPath = path.join(tauriDir, 'tauri.conf.json') + const config = __non_webpack_require__(configPath) as TauriConfig + printInfo({ key: ' mode', value: tauriMode(config) }) + printInfo({ key: ' build-type', value: config.tauri.bundle && config.tauri.bundle.active ? 'bundle' : 'build' }) + printInfo({ key: ' CSP', value: config.tauri.security ? config.tauri.security.csp : 'unset' }) + printInfo({ key: ' Windows', value: config.tauri.edge && config.tauri.edge.active ? 'Edge' : 'MSHTML' }) + printInfo({ key: ' distDir', value: config.build ? chalk.green(config.build.distDir) : chalk.red('unset') }) + printInfo({ key: ' devPath', value: config.build ? chalk.green(config.build.devPath) : chalk.red('unset') }) + } catch (_) { } +} + +module.exports = () => { + printInfo({ key: 'Operating System', value: chalk.green(`${os.type()}(${os.release()}) - ${os.platform()}/${os.arch()}`), section: true }) + printInfo({ key: 'Node.js environment', section: true }) + printInfo({ key: ' Node.js', value: chalk.green(process.version.slice(1)) }) + printInfo({ key: ' tauri.js', value: chalk.green(require('../../package.json').version) }) + printInfo({ key: 'Rust environment', section: true }) + printInfo({ key: ' rustc', value: getVersion('rustc', [], output => output.split(' ')[1]) }) + printInfo({ key: ' cargo', value: getVersion('cargo', [], output => output.split(' ')[1]) }) + printInfo({ key: ' tauri-cli', value: getVersion('cargo', ['tauri-cli']) }) + printInfo({ key: 'Global packages', section: true }) + printInfo({ key: ' NPM', value: getVersion('npm') }) + printInfo({ key: ' yarn', value: getVersion('yarn') }) + printInfo({ key: 'App directory structure', section: true }) + + const { appDir, tauriDir } = require('../helpers/app-paths') + const tree = dirTree(appDir) + for (const artifact of (tree.children || [])) { + if (artifact.type === 'folder') { + console.log(`/${artifact.name}`) + } + } + printAppInfo(tauriDir) +} diff --git a/cli/tauri.js/webpack.config.js b/cli/tauri.js/webpack.config.js index 0182c5706..b468c3cb8 100644 --- a/cli/tauri.js/webpack.config.js +++ b/cli/tauri.js/webpack.config.js @@ -7,7 +7,8 @@ module.exports = { 'api/dev': './src/api/dev.ts', 'api/init': './src/api/init.ts', 'api/tauricon': './src/api/tauricon.ts', - 'helpers/tauri-config': './src/helpers/tauri-config.ts' + 'helpers/tauri-config': './src/helpers/tauri-config.ts', + 'api/info': './src/api/info.ts' }, mode: process.env.NODE_ENV || 'development', devtool: 'source-map',