@kabeep/forex-cli
Advanced tools
+106
-53
| #!/usr/bin/env node | ||
| import { readFileSync } from 'node:fs'; | ||
| import fs, { readFileSync as readFileSync$1 } from 'node:fs'; | ||
| import process from 'node:process'; | ||
@@ -9,2 +9,3 @@ import updateNotifier from 'update-notifier'; | ||
| import ora from 'ora'; | ||
| import envPaths from 'env-paths'; | ||
| import { osLocaleSync } from 'os-locale'; | ||
@@ -15,2 +16,3 @@ import confirm from '@inquirer/confirm'; | ||
| import translate from '@kabeep/node-translate'; | ||
| import path from 'node:path'; | ||
| import { isDate } from 'node:util/types'; | ||
@@ -21,2 +23,3 @@ import clipboard from 'clipboardy'; | ||
| var LOCALE_CODE = osLocaleSync(); | ||
| var cacheDirectory = envPaths("@kabeep/forex-cli").cache; | ||
@@ -59,3 +62,5 @@ // src/locale/en-US.ts | ||
| CMD_ERR_INVALID_DATE: "Invalid date, please check --date parameter", | ||
| CMD_ERR_INVALID_AMOUNT: '"{{amount}}" is not a valid amount. Please enter a valid amount, such as "1000", "1,000", "1e3" or "1k"', | ||
| CMD_ERR_INVALID_AMOUNT: '"{{amount}}" \u4E0D\u662F\u6709\u6548\u91D1\u989D, \u8BF7\u8F93\u5165\u6709\u6548\u91D1\u989D, \u4F8B\u5982 "1000" \u6216 "1e3", \u518D\u6BD4\u5982 "101,001,001.01" \u6216 "1b1m1k1.01"', | ||
| CMD_ERR_CREATE_CACHE_DIR: "The cache directory cannot be created, please check CLI permissions", | ||
| CMD_ERR_WRITE_CACHE_FILE: "Unable to write cached files, please check CLI permissions", | ||
| CMD_ERR_TIMEOUT_CURRENCIES: "Request for list of available currencies timed out", | ||
@@ -111,2 +116,4 @@ CMD_ERR_CLIPBOARD_WRITE: "Clipboard writing failed", | ||
| CMD_ERR_INVALID_AMOUNT: '"{{amount}}" \u4E0D\u662F\u6709\u6548\u91D1\u989D, \u8BF7\u8F93\u5165\u6709\u6548\u91D1\u989D, \u4F8B\u5982 "1000" \u6216 "1e3", \u518D\u6BD4\u5982 "101,001,001.01" \u6216 "1b1m1k1.01"', | ||
| CMD_ERR_CREATE_CACHE_DIR: "\u65E0\u6CD5\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55, \u8BF7\u68C0\u67E5 CLI \u6743\u9650", | ||
| CMD_ERR_WRITE_CACHE_FILE: "\u65E0\u6CD5\u5199\u5165\u7F13\u5B58\u6587\u4EF6, \u8BF7\u68C0\u67E5 CLI \u6743\u9650", | ||
| CMD_ERR_TIMEOUT_CURRENCIES: "\u8BF7\u6C42\u53EF\u7528\u8D27\u5E01\u5217\u8868\u8D85\u65F6", | ||
@@ -117,5 +124,5 @@ CMD_ERR_CLIPBOARD_WRITE: "\u5199\u5165\u526A\u8D34\u677F\u5931\u8D25", | ||
| CMD_ERR_INVALID_TO: "\u65E0\u6548\u7684\u76EE\u6807\u8D27\u5E01\u6216\u533A\u57DF\u4EE3\u7801", | ||
| CMD_ERR_TIMEOUT_RATE: "\u8BF7\u6C42\u8D27\u5E01\u6C47\u7387\u8D85\u65F6", | ||
| CMD_ERR_TIMEOUT_RATE: "\u83B7\u53D6\u8D27\u5E01\u6C47\u7387\u8D85\u65F6", | ||
| CMD_ERR_INVALID_RATE: "\u5728\u6307\u5B9A\u65E5\u671F\u4E0D\u53EF\u7528\u7684\u8D27\u5E01\u4EE3\u7801", | ||
| CMD_ERR_TIMEOUT_CONVERT: "\u8BF7\u6C42\u5151\u6362\u91D1\u989D\u8D85\u65F6", | ||
| CMD_ERR_TIMEOUT_CONVERT: "\u83B7\u53D6\u5151\u6362\u91D1\u989D\u8D85\u65F6", | ||
| CMD_ERR_INVALID_CONVERT: "\u5728\u6307\u5B9A\u65E5\u671F\u4E0D\u53D7\u53EF\u7528\u7684\u8D27\u5E01\u4EE3\u7801", | ||
@@ -167,10 +174,10 @@ CMD_ERR_INVALID_COUNTRY: "\u5C1A\u672A\u652F\u6301\u7528\u7684\u56FD\u5BB6\u6216\u5730\u533A\u540D\u79F0", | ||
| } | ||
| t(path, variables, defaultValue) { | ||
| const value = this.get(this.dictionary, path); | ||
| t(path2, variables, defaultValue) { | ||
| const value = this.get(this.dictionary, path2); | ||
| if (typeof value === "object") | ||
| return this.t(`${path}.DEFAULT`, variables, defaultValue); | ||
| return typeof value === "string" ? this.compiled(value, variables) : defaultValue || path; | ||
| return this.t(`${path2}.DEFAULT`, variables, defaultValue); | ||
| return typeof value === "string" ? this.compiled(value, variables) : defaultValue || path2; | ||
| } | ||
| get(obj, path) { | ||
| return path.split(".").reduce( | ||
| get(obj, path2) { | ||
| return path2.split(".").reduce( | ||
| (acc, key) => { | ||
@@ -180,3 +187,3 @@ if (acc && typeof acc === "object" && key in acc) { | ||
| } | ||
| return undefined; | ||
| return void 0; | ||
| }, | ||
@@ -295,5 +302,5 @@ obj | ||
| const parsedError = Object.assign({}, err, errorExt); | ||
| return [parsedError, undefined]; | ||
| return [parsedError, void 0]; | ||
| } | ||
| return [err, undefined]; | ||
| return [err, void 0]; | ||
| }); | ||
@@ -413,3 +420,66 @@ } | ||
| var get_code_name_default = getCodeName; | ||
| function pathExist(filepath) { | ||
| try { | ||
| fs.accessSync(filepath, fs.constants.R_OK); | ||
| return true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
| var path_exist_default = pathExist; | ||
| // src/helper/_internal/ensure-directory.ts | ||
| function ensureDirectory(directoryPath) { | ||
| if (path_exist_default(directoryPath)) return; | ||
| try { | ||
| fs.mkdirSync(directoryPath, { recursive: true }); | ||
| return; | ||
| } catch (err) { | ||
| return err; | ||
| } | ||
| } | ||
| var ensure_directory_default = ensureDirectory; | ||
| function readFileSync(filepath) { | ||
| const result = fs.readFileSync(filepath, { encoding: "utf8" }); | ||
| try { | ||
| return JSON.parse(result); | ||
| } catch { | ||
| return result; | ||
| } | ||
| } | ||
| var read_file_sync_default = readFileSync; | ||
| function writeFileSync(filepath, content) { | ||
| try { | ||
| fs.writeFileSync(filepath, JSON.stringify(content), "utf8"); | ||
| } catch (err) { | ||
| return err; | ||
| } | ||
| } | ||
| var write_file_sync_default = writeFileSync; | ||
| // src/helper/get-currencies.ts | ||
| async function getCurrencies(client) { | ||
| const unexpected = ensure_directory_default(cacheDirectory); | ||
| if (unexpected) throw new Error("CREATE_CACHE_DIR"); | ||
| const date = /* @__PURE__ */ new Date(); | ||
| const formatDateString = (/* @__PURE__ */ new Date()).toISOString().split("T")[0]; | ||
| const cachePath = path.join(cacheDirectory, "currencies.json"); | ||
| const isExisted = path_exist_default(cachePath); | ||
| if (isExisted) { | ||
| const { date: date2, currencies } = read_file_sync_default(cachePath); | ||
| const isExpired = date2 !== formatDateString; | ||
| if (!isExpired) return currencies; | ||
| } | ||
| const [err, result] = await to_default(client.getCurrencies(date)); | ||
| ensure_default(!err, "TIMEOUT_CURRENCIES"); | ||
| ensure_default(result.data?.length, "INVALID_CURRENCIES"); | ||
| const disabled = write_file_sync_default(cachePath, { | ||
| date: formatDateString, | ||
| currencies: result.data | ||
| }); | ||
| if (disabled) throw new Error("WRITE_CACHE_DIR"); | ||
| return result.data; | ||
| } | ||
| var get_currencies_default = getCurrencies; | ||
| // src/helper/is-valid-code.ts | ||
@@ -491,14 +561,14 @@ function isValidCode(code, currencies) { | ||
| // src/helper/_internal/craete-palette.ts | ||
| // src/helper/_internal/create-palette.ts | ||
| function createPalette(open, close) { | ||
| return (text) => `\x1B[${open}m${text}\x1B[${close}m`; | ||
| } | ||
| var craete_palette_default = createPalette; | ||
| var create_palette_default = createPalette; | ||
| // src/helper/palette.ts | ||
| var colorful = (code) => craete_palette_default(code, 39); | ||
| var colorful = (code) => create_palette_default(code, 39); | ||
| var palette = Object.assign( | ||
| (open, close) => craete_palette_default(open, close), | ||
| (open, close) => create_palette_default(open, close), | ||
| { | ||
| dim: craete_palette_default(2, 22), | ||
| dim: create_palette_default(2, 22), | ||
| black: colorful(30), | ||
@@ -598,10 +668,5 @@ red: colorful(31), | ||
| "CMD_MSG_FETCH_CURRENCIES", | ||
| async () => { | ||
| const [err, result] = await to_default(client.getCurrencies(date)); | ||
| ensure_default(!err, "TIMEOUT_CURRENCIES"); | ||
| ensure_default(result.data?.length, "INVALID_CURRENCIES"); | ||
| return result.data; | ||
| }, | ||
| () => get_currencies_default(client), | ||
| { date: formatDateString }, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
@@ -611,11 +676,9 @@ ensure_default(is_valid_code_default(code, currencies), "INVALID_FROM"); | ||
| "CMD_MSG_FETCH_TRANSLATION", | ||
| () => { | ||
| return get_code_name_default(code, currencies, translate2, timeout); | ||
| }, | ||
| () => get_code_name_default(code, currencies, translate2, timeout), | ||
| { date: formatDateString }, | ||
| verbose && translate2 ? spinner : undefined | ||
| verbose && translate2 ? spinner : void 0 | ||
| ); | ||
| clipboard2 && await use_clipboard_default( | ||
| `${name} (${code})`, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
@@ -645,10 +708,5 @@ return `${palette_default.yellow(name)} (${palette_default.blue(code)})`; | ||
| "CMD_MSG_FETCH_CURRENCIES", | ||
| async () => { | ||
| const [err, result] = await to_default(client.getCurrencies(date)); | ||
| ensure_default(!err, "TIMEOUT_CURRENCIES"); | ||
| ensure_default(result.data?.length, "INVALID_CURRENCIES"); | ||
| return result.data; | ||
| }, | ||
| () => get_currencies_default(client), | ||
| { date: formatDateString }, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
@@ -675,3 +733,3 @@ ensure_default(is_valid_code_default(baseCode, currencies), "INVALID_FROM"); | ||
| { date: formatDateString }, | ||
| verbose && translate2 ? spinner : undefined | ||
| verbose && translate2 ? spinner : void 0 | ||
| ); | ||
@@ -700,5 +758,5 @@ const print = create_message_default( | ||
| }, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
| clipboard2 && await use_clipboard_default(rate, verbose ? spinner : undefined); | ||
| clipboard2 && await use_clipboard_default(rate, verbose ? spinner : void 0); | ||
| return print(palette_default.yellow(use_statistic_default(rate))); | ||
@@ -723,5 +781,5 @@ } | ||
| }, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
| clipboard2 && await use_clipboard_default(resultData, verbose ? spinner : undefined); | ||
| clipboard2 && await use_clipboard_default(resultData, verbose ? spinner : void 0); | ||
| return print( | ||
@@ -748,10 +806,5 @@ palette_default.yellow(use_statistic_default(numericAmount, { precision: 2 })), | ||
| "CMD_MSG_FETCH_CURRENCIES", | ||
| async () => { | ||
| const [err, result] = await to_default(client.getCurrencies(date)); | ||
| ensure_default(!err, "TIMEOUT_CURRENCIES"); | ||
| ensure_default(result.data?.length, "INVALID_CURRENCIES"); | ||
| return result.data; | ||
| }, | ||
| () => get_currencies_default(client), | ||
| { date: formatDateString }, | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
@@ -766,7 +819,7 @@ const translation = await use_handler_default( | ||
| ) | ||
| ) : [undefined, undefined]; | ||
| ) : [void 0, void 0]; | ||
| return result; | ||
| }, | ||
| { date: formatDateString }, | ||
| verbose && translate2 ? spinner : undefined | ||
| verbose && translate2 ? spinner : void 0 | ||
| ); | ||
@@ -777,3 +830,3 @@ clipboard2 && await use_clipboard_default( | ||
| ).join("\n"), | ||
| verbose ? spinner : undefined | ||
| verbose ? spinner : void 0 | ||
| ); | ||
@@ -814,3 +867,3 @@ if (!pretty) { | ||
| var pkg = JSON.parse( | ||
| readFileSync(new URL("../package.json", import.meta.url)).toString("utf8") | ||
| readFileSync$1(new URL("../package.json", import.meta.url)).toString("utf8") | ||
| ); | ||
@@ -817,0 +870,0 @@ updateNotifier({ pkg }).notify({ isGlobal: true }); |
+3
-2
| { | ||
| "name": "@kabeep/forex-cli", | ||
| "description": "A Node.js Library to convert foreign exchange in terminal", | ||
| "version": "0.3.1", | ||
| "version": "0.4.0", | ||
| "type": "module", | ||
@@ -31,2 +31,3 @@ "main": "./dist/cli.js", | ||
| "clipboardy": "^4.0.0", | ||
| "env-paths": "^3.0.0", | ||
| "iso-3166-1": "^2.1.1", | ||
@@ -52,3 +53,3 @@ "ora": "^8.1.1", | ||
| "typescript": "^5.7.2", | ||
| "vitest": "^2.1.8" | ||
| "vitest": "^3.0.8" | ||
| }, | ||
@@ -55,0 +56,0 @@ "author": "Zhang Zixin (kabeep)", |
77716
2.58%928
5.82%12
9.09%+ Added
+ Added