From f0b519f11b4c7108a140e7ad22cfb29dad41d7ff Mon Sep 17 00:00:00 2001 From: afc163 Date: Wed, 11 Sep 2024 19:09:46 +0800 Subject: [PATCH] chore: add biome and github action (#102) --- .github/dependabot.yml | 2 +- .github/workflows/test.yml | 22 ++++ .gitignore | 1 + .prettierrc | 14 --- .travis.yml | 4 - _config.yml | 1 - bin/fanyi.js | 111 +++++++++++--------- biome.json | 23 ++++ bun.lockb | Bin 0 -> 193482 bytes index.js | 80 +++++++------- lib/print.js | 140 +++++++++++-------------- package.json | 139 +++++++++++------------- renovate.json | 3 - tests/__snapshots__/index.test.ts.snap | 45 ++++++++ tests/data.js | 83 --------------- tests/index.js | 34 ------ tests/index.test.ts | 42 ++++++++ 17 files changed, 362 insertions(+), 382 deletions(-) create mode 100644 .github/workflows/test.yml delete mode 100644 .prettierrc delete mode 100644 .travis.yml delete mode 100644 _config.yml create mode 100644 biome.json create mode 100755 bun.lockb delete mode 100644 renovate.json create mode 100644 tests/__snapshots__/index.test.ts.snap delete mode 100644 tests/data.js delete mode 100644 tests/index.js create mode 100644 tests/index.test.ts diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5990d9c..5f0889c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,7 @@ version: 2 updates: - - package-ecosystem: "" # See documentation for possible values + - package-ecosystem: "npm" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "weekly" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..545e95a --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +name: Test + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm ci + - run: npm run lint + - run: npm run coverage + - uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index e2d2e2c..b06c203 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ node_modules/ .settings .yml package-lock.json +coverage \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 84d393d..0000000 --- a/.prettierrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 100, - "proseWrap": "never", - "overrides": [ - { - "files": ".prettierrc", - "options": { - "parser": "json" - } - } - ] -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 794673b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js - -node_js: - - 16 diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 277f1f2..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman diff --git a/bin/fanyi.js b/bin/fanyi.js index 8c7868e..21ba1e3 100755 --- a/bin/fanyi.js +++ b/bin/fanyi.js @@ -1,76 +1,85 @@ #!/usr/bin/env node -const program = require("commander"); -const chalk = require("chalk"); -const updateNotifier = require("update-notifier"); -const pkg = require("../package.json"); -const config = require("../lib/config"); -const { searchList } = require("../lib/searchHistory"); +const { program } = require('commander'); +const chalk = require('chalk'); +const updateNotifier = require('update-notifier'); +const pkg = require('../package.json'); +const config = require('../lib/config'); +const { searchList } = require('../lib/searchHistory'); updateNotifier({ pkg }).notify(); -program.version(pkg.version); +program + .name(pkg.name) + .description(pkg.description) + .version(pkg.version) + .action(() => { + // If the input is "fanyi", no parameters, ignore. + if (process.argv.length > 2) { + return runFY(); + } + }); program - .command("config") - .description("Set the global options") - .option("-c, --color", "Output with color") - .option("-C, --no-color", "Output without color") - .option("-i, --iciba", "Enable the iciba translation engine") - .option("-I, --no-iciba", "Disable the iciba translation engine") - .action((args) => { - // hack - // If the input is "fanyi config", then translate the word config. - if (process.argv.length === 3) { - return runFY(); - } - const { color, iciba } = args; - const options = resolveOptions({ color, iciba }); - return config.write(options); - }); + .command('config') + .description('Set the global options') + .option('-c, --color', 'Output with color') + .option('-C, --no-color', 'Output without color') + .option('-i, --iciba', 'Enable the iciba translation engine') + .option('-I, --no-iciba', 'Disable the iciba translation engine') + .action((args) => { + // hack + // If the input is "fanyi config", then translate the word config. + if (process.argv.length === 3) { + return runFY(); + } + const { color, iciba } = args; + const options = resolveOptions({ color, iciba }); + return config.write(options); + }); program - .command("list") - .option("-d, --someDay ", "查看指定某天的查询记录") - .option("-r, --recentDays [number]", "查看最近几天内的数据", 0) - .option("-all --show-file [boolean]", "查看全部数据,即单词存放的位置", false) - .action((args) => { - searchList(args); - }); + .command('list') + .option('-d, --someDay ', '查看指定某天的查询记录') + .option('-r, --recentDays [number]', '查看最近几天内的数据', 0) + .option('-all --show-file [boolean]', '查看全部数据,即单词存放的位置', false) + .action((args) => { + searchList(args); + }); -program.on("--help", () => { - console.log(""); - console.log(chalk.gray("Examples:")); - console.log(`${chalk.cyan(" $ ")}fanyi word`); - console.log(`${chalk.cyan(" $ ")}fanyi world peace`); - console.log(`${chalk.cyan(" $ ")}fanyi chinglish`); - console.log(""); +program.on('--help', () => { + console.log(''); + console.log(chalk.gray('Examples:')); + console.log(`${chalk.cyan(' $ ')}fanyi word`); + console.log(`${chalk.cyan(' $ ')}fanyi world peace`); + console.log(`${chalk.cyan(' $ ')}fanyi chinglish`); + console.log(''); }); program.parse(process.argv); if (!process.argv.slice(2).length) { - program.outputHelp(); + program.help(); } async function runFY(options = {}) { - const defaultOptions = await config.load(); - const mergedOptions = { ...defaultOptions, ...options }; - const fanyi = require(".."); - fanyi(program.args.join(" "), mergedOptions); + const defaultOptions = await config.load(); + const mergedOptions = { ...defaultOptions, ...options }; + const fanyi = require('..'); + fanyi(program.args.join(' '), mergedOptions); } function resolveOptions(options) { - const opts = {}; - const filteredKeys = Object.keys(options).filter( - (key) => isBoolean(options[key]) || typeof options[key] === "string", - ); - for (const key of filteredKeys) { - opts[key] = options[key]; - } - return opts; + const opts = {}; + const filteredKeys = Object.keys(options).filter( + (key) => isBoolean(options[key]) || typeof options[key] === 'string', + ); + for (const key of filteredKeys) { + opts[key] = options[key]; + } + return opts; } function isBoolean(val) { - return typeof val === "boolean"; + return typeof val === 'boolean'; } diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..8f01047 --- /dev/null +++ b/biome.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "organizeImports": { + "enabled": true + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "lineWidth": 100, + "indentWidth": 2 + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..388ba423914bb0eff9c00791c1eb092df6c291c8 GIT binary patch literal 193482 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�)>BhcyWW1^RKO%Pw^F8j*=t! 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 literal 0 HcmV?d00001 diff --git a/index.js b/index.js index a004bc5..efc7744 100644 --- a/index.js +++ b/index.js @@ -1,49 +1,49 @@ -const needle = require("needle"); -const chalk = require("chalk"); -const SOURCE = require("./lib/source"); -const print = require("./lib/print"); -const parseString = require("xml2js").parseString; -const ora = require("ora"); +const needle = require('needle'); +const chalk = require('chalk'); +const SOURCE = require('./lib/source'); +const print = require('./lib/print'); +const parseString = require('xml2js').parseString; +const ora = require('ora'); module.exports = (word, options, callback) => { - console.log(""); - const { iciba } = options; - const requestCounts = [iciba].filter(isTrueOrUndefined).length; - const spinner = ora().start(); + console.log(''); + const { iciba } = options; + const requestCounts = [iciba].filter(isTrueOrUndefined).length; + const spinner = ora().start(); - let count = 0; - const callbackAll = () => { - count += 1; - if (count >= requestCounts) { - spinner.stop(); - spinner.clear(); - callback?.(); - } - }; + let count = 0; + const callbackAll = () => { + count += 1; + if (count >= requestCounts) { + spinner.stop(); + spinner.clear(); + callback?.(); + } + }; - const endcodedWord = encodeURIComponent(word); + const endcodedWord = encodeURIComponent(word); - // iciba - isTrueOrUndefined(iciba) && - needle.get( - SOURCE.iciba.replace("${word}", endcodedWord), - { parse: false }, - (error, response) => { - if (error) { - console.log(chalk.yellow("访问 iciba 失败,请检查网络")); - } else if (response.statusCode === 200) { - parseString(response.body, (err, result) => { - if (err) { - return; - } - print.iciba(result.dict, options); - }); - } - callbackAll(); - }, - ); + // iciba + isTrueOrUndefined(iciba) && + needle.get( + SOURCE.iciba.replace('${word}', endcodedWord), + { parse: false }, + (error, response) => { + if (error) { + console.log(chalk.yellow('访问 iciba 失败,请检查网络')); + } else if (response.statusCode === 200) { + parseString(response.body, (err, result) => { + if (err) { + return; + } + print.iciba(result.dict, options); + }); + } + callbackAll(); + }, + ); }; function isTrueOrUndefined(val) { - return val === true || val === undefined; + return val === true || val === undefined; } diff --git a/lib/print.js b/lib/print.js index 09c0a2a..c87749c 100644 --- a/lib/print.js +++ b/lib/print.js @@ -1,96 +1,84 @@ -const ora = require("ora"); -const gradient = require("gradient-string"); -const { saveHistory } = require("./searchHistory"); -const { HttpsProxyAgent } = require("https-proxy-agent"); -let chalk = require("chalk"); -require("isomorphic-unfetch"); +const { saveHistory } = require('./searchHistory'); +let chalk = require('chalk'); exports.iciba = (data, options = {}) => { - if (options.color === false) { - chalk = initChalkWithNoColor(); - } + if (options.color === false) { + chalk = initChalkWithNoColor(); + } - let firstLine = ""; - const means = []; + let firstLine = ''; + const means = []; - // word - firstLine += `${data.key} `; + // word + firstLine += `${data.key} `; - // maybe string - if (typeof data.ps === "string") { - data.ps = [data.ps]; - } - if (typeof data.pos === "string") { - data.pos = [data.pos]; - } - if (typeof data.acceptation === "string") { - data.acceptation = [data.acceptation]; - } + // maybe string + if (typeof data.ps === 'string') { + data.ps = [data.ps]; + } + if (typeof data.pos === 'string') { + data.pos = [data.pos]; + } + if (typeof data.acceptation === 'string') { + data.acceptation = [data.acceptation]; + } - // phonetic symbol - data.ps?.forEach((item, i) => { - firstLine += chalk.magenta(` ${i === 0 ? "英" : "美"}[ ${item} ] `); - }); + // phonetic symbol + data.ps?.forEach((item, i) => { + firstLine += chalk.magenta(` ${i === 0 ? '英' : '美'}[ ${item} ] `); + }); - log(firstLine + chalk.gray(" ~ iciba.com")); + log(firstLine + chalk.gray(' ~ iciba.com')); - // pos & acceptation - data.pos?.forEach((item, i) => { - if (typeof data.pos[i] !== "string" || !data.pos[i]) { - return; - } - log( - `${chalk.gray("- ")}${chalk.green(`${data.pos[i]} ${data.acceptation[i].trim()}`)}`, - ); - means.push(`${data.pos[i]} ${data.acceptation[i].trim()}`); - }); + // pos & acceptation + data.pos?.forEach((item, i) => { + if (typeof data.pos[i] !== 'string' || !data.pos[i]) { + return; + } + log(`${chalk.gray('- ')}${chalk.green(`${data.pos[i]} ${data.acceptation[i].trim()}`)}`); + means.push(`${data.pos[i]} ${data.acceptation[i].trim()}`); + }); - // sentence - if (data.sent?.length) { - log(); - } + // sentence + if (data.sent?.length) { + log(); + } - data.sent?.forEach((item, i) => { - if (typeof item.orig !== "string" && item.orig[0]) { - item.orig = item.orig[0].trim(); - } - if (typeof item.trans !== "string" && item.trans[0]) { - item.trans = item.trans[0].trim(); - } - log(`${chalk.gray(`${i + 1}. `)}${highlight(item.orig, data.key)}`); - log(` ${chalk.cyan(item.trans)}`); - }); + data.sent?.forEach((item, i) => { + if (typeof item.orig !== 'string' && item.orig[0]) { + item.orig = item.orig[0].trim(); + } + if (typeof item.trans !== 'string' && item.trans[0]) { + item.trans = item.trans[0].trim(); + } + log(`${chalk.gray(`${i + 1}. `)}${highlight(item.orig, data.key)}`); + log(` ${chalk.cyan(item.trans)}`); + }); - log(); - log(chalk.gray("-----")); - log(); - saveHistory(data.key[0], means); + log(); + log(chalk.gray('-----')); + log(); + saveHistory(data.key[0], means); }; function log(message, indentNum = 1) { - let indent = ""; - for (let i = 1; i < indentNum; i += 1) { - indent += " "; - } - console.log(indent, message || ""); + let indent = ''; + for (let i = 1; i < indentNum; i += 1) { + indent += ' '; + } + console.log(indent, message || ''); } -function highlight(string, key, defaultColor = "gray") { - return string - .replace( - new RegExp(`(.*)(${key})(.*)`, "gi"), - `$1$2${chalk[defaultColor]("$3")}`, - ) - .replace( - new RegExp(`(.*?)(${key})`, "gi"), - chalk[defaultColor]("$1") + chalk.yellow("$2"), - ); +function highlight(string, key, defaultColor = 'gray') { + return string + .replace(new RegExp(`(.*)(${key})(.*)`, 'gi'), `$1$2${chalk[defaultColor]('$3')}`) + .replace(new RegExp(`(.*?)(${key})`, 'gi'), chalk[defaultColor]('$1') + chalk.yellow('$2')); } function initChalkWithNoColor() { - try { - return new chalk.constructor({ enabled: false }); - } catch (e) { - return new chalk.Instance({ level: 0 }); - } + try { + return new chalk.constructor({ enabled: false }); + } catch (e) { + return new chalk.Instance({ level: 0 }); + } } diff --git a/package.json b/package.json index f6d1cac..b1f4dd0 100644 --- a/package.json +++ b/package.json @@ -1,77 +1,66 @@ { - "name": "fanyi", - "version": "8.0.3", - "description": "A translate tool in your command line", - "main": "index.js", - "repository": { - "type": "git", - "url": "git@github.com:afc163/fanyi.git" - }, - "author": "afc163 ", - "license": "MIT", - "bin": { - "fy": "bin/fanyi.js", - "fanyi": "bin/fanyi.js" - }, - "keywords": [ - "translate", - "iciba", - "terminal", - "chinese", - "command line", - "cli", - "translation", - "translator", - "fanyi" - ], - "engines": { - "node": ">=6.0.0" - }, - "readmeFilename": "README.md", - "files": ["index.js", "bin", "lib"], - "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.0.0", - "dayjs": "^1.11.5", - "fs-extra": "^10.1.0", - "gradient-string": "^2.0.2", - "https-proxy-agent": "^5.0.1", - "isomorphic-unfetch": "^4.0.2", - "needle": "^3.1.0", - "ora": "^4.0.2", - "update-notifier": "^4.1.0", - "xml2js": "^0.4.8" - }, - "lint-staged": { - "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}": [ - "biome check --write --files-ignore-unknown=true", - "biome format --write --files-ignore-unknown=true", - "biome lint --write --files-ignore-unknown=true" - ] - }, - "devDependencies": { - "@biomejs/biome": "^1.8.3", - "coffee": "^5.1.0", - "husky": "^9.1.5", - "lint-staged": "^15.2.10", - "mocha": "^7.1.1", - "nock": "^12.0.3", - "np": "^6.2.0", - "prettier": "^2.0.2", - "pretty-quick": "^2.0.0", - "sinon": "^9.0.1" - }, - "scripts": { - "format": "prettier --write '**/*.{json,js,md,yml}'", - "pretty-quick": "pretty-quick", - "test": "mocha tests/index.js --timeout 0", - "prepublishOnly": "np --no-cleanup --no-publish", - "lint-staged": "lint-staged", - "prepare": "husky" - }, - "husky": { - "hooks": { - "pre-commit": "pretty-quick --staged" - } - } + "name": "fanyi", + "version": "8.0.3", + "description": "A translate tool in your command line", + "main": "index.js", + "repository": { + "type": "git", + "url": "git@github.com:afc163/fanyi.git" + }, + "author": "afc163 ", + "license": "MIT", + "bin": { + "fy": "bin/fanyi.js", + "fanyi": "bin/fanyi.js" + }, + "keywords": [ + "translate", + "iciba", + "terminal", + "chinese", + "command line", + "cli", + "translation", + "translator", + "fanyi" + ], + "engines": { + "node": ">=16.0.0" + }, + "readmeFilename": "README.md", + "files": ["index.js", "bin", "lib"], + "dependencies": { + "chalk": "^4.0.0", + "commander": "^12.1.0", + "dayjs": "^1.11.5", + "fs-extra": "^10.1.0", + "needle": "^3.1.0", + "update-notifier": "^4.1.0", + "xml2js": "^0.4.8" + }, + "lint-staged": { + "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}": [ + "biome check --write --files-ignore-unknown=true", + "biome format --write --files-ignore-unknown=true", + "biome lint --write --files-ignore-unknown=true" + ] + }, + "devDependencies": { + "@biomejs/biome": "^1.8.3", + "c8": "^10.1.2", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", + "np": "^6.2.0", + "ora": "^4.0.2", + "vitest": "^2.0.5" + }, + "scripts": { + "test": "vitest run", + "coverage": "c8 --reporter=lcov --reporter=text npm test", + "lint": "biome check .", + "format": "biome check . --write", + "prepublishOnly": "np --no-cleanup --no-publish", + "lint-staged": "lint-staged", + "prepare": "husky" + } } diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 4f39080..0000000 --- a/renovate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["config:base"] -} diff --git a/tests/__snapshots__/index.test.ts.snap b/tests/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000..a7d0130 --- /dev/null +++ b/tests/__snapshots__/index.test.ts.snap @@ -0,0 +1,45 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`fanyi CLI > should print translation of the word 1`] = ` +" + hello 英[ hə'ləʊ ] 美[ həˈloʊ ] ~ iciba.com + - int. 哈喽,喂;你好,您好;表示问候;打招呼; + - n. “喂”的招呼声或问候声; + - vi. 喊“喂”; + + 1. This document contains Hello application components of each document summary of the contents. + 此文件包含组成Hello应用程序的每个文件的内容摘要. + 2. Hello! Hello! Hello! Hello! Hel - lo! + 你好! 你好! 你好! 你好! 你好! + 3. Hello! Hello! Hello! Hello ! I'm glad to meet you. + 你好! 你好! 你好! 你好! 见到你很高兴. + 4. Hello Marie. Hello Berlioz. Hello Toulouse. + 你好玛丽, 你好柏里欧, 你好图鲁兹. + 5. Hello. Yes, hello, hello. I can not hear a word clearly. + 喂, 咦, 喂, 喂. 我一点也听不清. + + ----- + +" +`; + +exports[`fanyi CLI > should print usage if no arguments are given 1`] = ` +"Usage: fanyi [options] [command] + +A translate tool in your command line + +Options: + -V, --version output the version number + -h, --help display help for command + +Commands: + config [options] Set the global options + list [options] + +Examples: + $ fanyi word + $ fanyi world peace + $ fanyi chinglish + +" +`; diff --git a/tests/data.js b/tests/data.js deleted file mode 100644 index 7c9ce2f..0000000 --- a/tests/data.js +++ /dev/null @@ -1,83 +0,0 @@ -module.exports = { - word: { - youdao: { - translation: ['词'], - basic: { - 'us-phonetic': 'wɝd', - phonetic: 'wɜːd', - 'uk-phonetic': 'wɜːd', - explains: [ - 'n. [语] 单词;话语;消息;诺言;命令', - 'vt. 用言辞表达', - 'n. (Word)人名;(英)沃德', - ], - }, - query: 'word', - errorCode: 0, - web: [ - { value: ['单词', '字', '字 (计算机)'], key: 'word' }, - { value: ['构词法', '造词法', '词性转换'], key: 'Word Formation' }, - { value: ['关键字', '中心词', '关键词'], key: 'key word' }, - ], - }, - iciba: ` - - word - wɜ:d - http://res.iciba.com/resource/amp3/0/0/c4/7d/c47d187067c6cf953245f128b5fde62a.mp3 - wɜrd - http://res.iciba.com/resource/amp3/1/0/c4/7d/c47d187067c6cf953245f128b5fde62a.mp3 - n. - 单词;话语;诺言;消息; - - vt. - 措辞,用词;用言语表达; - - vi. - 讲话; - - - Using Servers controller to call Word to create templates , which can create Word documents. - - - 用Servers控件调用Word能够较好地实现Delphi对Word的控制. - - - This file is on the PDF file format into WORD document format. - - - 此文件是关于把PDF文件格式转换成WORD文件格式的. - - - We WORD file on a comprehensive test. - - - 对WORD档我们进行了全方位的测试. - - - Runs on Microsoft Word: You do not have to handle several windows on the screen. - - - 运行在微软Word中: 你不必在桌面上操作多个窗口. - - - Also, make your resume available in several formats -- text only , Microsoft Word a PDF. - - - 另外, 要确保你的简历要有几个版本 — 纯文字 、 Word档、PDF档. - - `, - dictionaryapi: ` - wordMU-1b(2)#GR-2a,b#CP-2c#RC-4wordword0001.wav!wurdˈwərdnounMiddle English, from Old English; akin to Old High German wort word, Latin verbum, Greek eirein to say, speak, Hittite weriya- to call, namebefore 12th century 1 a
:something that is said
b plural (1)
:talk discourse putting one's feelings into words
(2)
:the text of a vocal musical composition
c
:a brief remark or conversation would like to have a word with you
2 a (1)
:a speech sound or series of speech sounds that symbolizes and communicates a meaning usually without being divisible into smaller units capable of independent use
(2)
:the entire set of linguistic forms produced by combining a single base with various inflectional elements without change in the part of speech elements
b (1)
:a written or printed character or combination of characters representing a spoken word the number of words to a line sometimes used with the first letter of a real or pretended taboo word prefixed as an often humorous euphemism the first man to utter the f word on British TV Time we were not afraid to use the d word and talk about death Erma Bombeck
(2)
:any segment of written or printed discourse ordinarily appearing between spaces or between a space and a punctuation mark
c
:a number of bytes processed as a unit and conveying a quantum of information in communication and computer work
3
:order command don't move till I give the word
4 often capitalized a
:logos
b
:gospel 1a
c
:the expressed or manifested mind and will of God
5 a
:news information sent word that he would be late
b
:rumor
6
:the act of speaking or of making verbal communication
7
:saying proverb
8
:promise declaration kept her word
9
:a quarrelsome utterance or conversation usually used in plural they had words and parted
10
:a verbal signal :password
11 slang
used interjectionally to express agreement
good word 1
:a favorable statement put in a good word for me
2
:good news what's the good word
in a word
:in short
in so many words 1
:in exactly those terms implied that such actions were criminal but did not say so in so many words
2
:in plain forthright language in so many words, she wasn't fit to be seen Jean Stafford
of few words
:not inclined to say more than is necessary :laconic a man of few words
of one's word
:that can be relied on to keep a promise used only after man or woman a man of his word
upon my word
:with my assurance :indeed assuredly upon my word, I've never heard of such a thing
- wordwordverbintransitive verb13th centuryarchaic
:speak
transitive verb
:to express in words :phrase a carefully worded reply
- word-association testPSword–association testnoun1946
:a test of personality and mental function in which the subject is required to respond to each of a series of words with the first word that comes to mind or with a word of a specified class of words (as antonyms)
- word classGRword classnoun1914
:a linguistic form class whose members are words
especially
:part of speech
- word for wordword forword wordfor wordword for wordadverb14th century
:in the exact words :verbatim
- word-for-wordword–for–wordadjectivecirca 1611
:being in or following the exact words :verbatim a word–for–word translation
- word-hoardword–hoardwordh01w.wav!wurd-+hOrdˈwərd-ˌhȯrdnountranslation of Old English wordhord1850
:a supply of words :vocabulary
- word-mongeringword–mon*ger*ingwordm01w.wav!wurd-+muN-g(u-)riN-g(ə-)riŋnoun1851
:the use of empty or bombastic words
- word of mouthword ofword mouthof mouthBZword of mouth1553
:oral communication
especially
:oral often inadvertent publicity
- word-of-mouthBZword–of–mouthwordo01w.wav+wurd-u(v)-!ma2thˌwərd-ə(v)-ˈmau̇thadjectivecirca 1812
:orally communicated
also
:generated from or reliant on oral publicity word–of–mouth customers a word–of–mouth business
-
`, - }, -}; diff --git a/tests/index.js b/tests/index.js deleted file mode 100644 index 35e5c10..0000000 --- a/tests/index.js +++ /dev/null @@ -1,34 +0,0 @@ -const coffee = require('coffee'); -const path = require('node:path'); -const sinon = require('sinon'); -const fanyi = require('../'); -const nock = require('nock'); -const data = require('./data'); -const { version } = require('../package'); - -describe('fanyi', () => { - it('should show help info in terminal', (done) => { - coffee - .fork(path.join(__dirname, '../bin/fanyi')) - .expect( - 'stdout', - `fanyi ~ ${version} -Translate tools in command line - $ fanyi word - $ fanyi world peace - $ fanyi chinglish -`, - ) - .expect('code', 0) - .end(done); - }); - - it('should translate word', (done) => { - sinon.spy(console, 'log'); - nock('http://dict-co.iciba.com').get(/api/).reply(200, data.word.iciba); - fanyi('word', () => { - sinon.assert.calledWithMatch(console.log, '', 'n. 单词;话语;诺言;消息;'); // iciba - done(); - }); - }); -}); diff --git a/tests/index.test.ts b/tests/index.test.ts new file mode 100644 index 0000000..ae16f87 --- /dev/null +++ b/tests/index.test.ts @@ -0,0 +1,42 @@ +import { fork } from 'node:child_process'; +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; + +const scriptPath = path.resolve(__dirname, '../bin/fanyi.js'); + +const runScript = (args: string[] = []): Promise<{ stdout: string; stderr: string }> => { + return new Promise((resolve, reject) => { + const child = fork(scriptPath, args, { silent: true }); + + let stdout = ''; + let stderr = ''; + + child.stdout?.on('data', (data) => { + stdout += data.toString(); + }); + + child.stderr?.on('data', (data) => { + stderr += data.toString(); + }); + + child.on('close', (code) => { + if (code !== 0) { + reject({ code, stdout, stderr }); + } else { + resolve({ stdout, stderr }); + } + }); + }); +}; + +describe('fanyi CLI', () => { + it('should print translation of the word', async () => { + const { stdout } = await runScript(['hello']); + expect(stdout).toMatchSnapshot(); + }); + + it('should print usage if no arguments are given', async () => { + const { stdout } = await runScript(); + expect(stdout).toMatchSnapshot(); + }); +});