UNPKG

@kabeep/lunar-birthday-cli

Version:

A Node.js Library to list the lunar birthday in terminal

674 lines (648 loc) 28 kB
#!/usr/bin/env node import process2 from 'node:process'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import { isValidDate, getLeapMonth, isValidLunar, isValidSolar, toLunar, toSolar } from '@kabeep/lunar-date-fns'; import { zodiac } from '@kabeep/zodiac-animals'; import get from 'lodash.get'; import template from 'lodash.template'; import merge from 'lodash.merge'; import { osLocaleSync } from 'os-locale'; // src/constants.ts var SYMBOLS = { RAT: "\u{1F42D}", OX: "\u{1F402}", TIGER: "\u{1F42F}", RABBIT: "\u{1F407}", CAT: "\u{1F431}", DRAGON: "\u{1F409}", SNAKE: "\u{1F40D}", HORSE: "\u{1F40E}", SHEEP: "\u{1F40F}", MONKEY: "\u{1F435}", ROOSTER: "\u{1F414}", DOG: "\u{1F436}", PIG: "\u{1F43D}" }; function toOffsetSolar(lunar) { const solar = toSolar(lunar); if (solar === -1) return toSolar({ ...lunar, day: lunar.day - 1 }); return solar; } var to_offset_solar_default = toOffsetSolar; // src/helper/_internal/birthday-iterator.ts function birthdayIterator(value, startYear, length) { const result = []; let year = startYear; let index = length; while (index-- && year++) { const isLeapMonth = value.isLeapMonth && getLeapMonth(year) === value.month; const current = { ...value, year, isLeapMonth }; const date = to_offset_solar_default(current); if (date === -1) break; result.push(date); } return result; } var birthday_iterator_default = birthdayIterator; // src/helper/_internal/ensure.ts function ensure(condition, message) { if (condition) { return; } const providedMessage = typeof message === "function" ? message() : message; throw new Error(providedMessage ?? "UNKNOWN"); } var ensure_default = ensure; // src/helper/_internal/compose-dates.ts function composeDates(value) { if (typeof value === "string") value = [value]; const { length } = value; const separator = Array.from({ length: 83 }).join("-"); let text = ""; let decade = ""; let cursor = 0; for (let index = 0; index < length; index++) { const item = value[index]; const year = /^\d{4}/.exec(item)?.[0]; ensure_default(year); const next = year.replace(/\d$/, "0"); const isDiff = next !== decade; if (isDiff) { text += cursor > 0 ? ` ${separator} ` : `${separator} `; text += `\x1B[34m${next}\x1B[39m `; decade = next; cursor = 0; } if (++cursor % 5) { text += (!isDiff && cursor === 1 ? " " : "") + item + " "; } else { text += index === length - 1 ? item : `${item} `; cursor = 0; } } return `${text} ${separator}`; } var compose_dates_default = composeDates; // src/helper/_internal/padded-date.ts function paddedDate(value, length = 2, padding = "0") { return `${value}`.padStart(length, padding); } var padded_date_default = paddedDate; // src/helper/serialized-date.ts function serializedDate(value, pattern = "YYYY-MM-DD") { ensure_default(isValidDate(value)); const tokens = { /* eslint-disable @typescript-eslint/naming-convention */ YYYY: value.getFullYear().toString(), MM: padded_date_default(value.getMonth() + 1), DD: padded_date_default(value.getDate()) /* eslint-enable @typescript-eslint/naming-convention */ }; return pattern.replaceAll(/YYYY|MM|DD/g, (match) => tokens[match]); } var serialized_date_default = serializedDate; // src/helper/get-century-dates.ts function getCenturyDates(value, year) { const result = birthday_iterator_default(value, year, 100).map((item) => serialized_date_default(item)); return compose_dates_default(result); } var get_century_dates_default = getCenturyDates; // src/helper/get-decade-dates.ts function getDecadeDates(value) { const year = (/* @__PURE__ */ new Date()).getFullYear(); const result = birthday_iterator_default(value, year, 10).map((item) => serialized_date_default(item)); return compose_dates_default(result); } var get_decade_dates_default = getDecadeDates; // src/helper/get-earthly-branch.ts function getEarthlyBranch(lunarYear) { const branches = ["zi", "chou", "yin", "mao", "chen", "si", "wu", "wei", "shen", "you", "xu", "hai"]; const offset = (lunarYear - 3) % 12; return branches[(offset || 12) - 1]; } var get_earthly_branch_default = getEarthlyBranch; // src/helper/get-heavenly-stem.ts function getHeavenlyStem(lunarYear) { const stems = ["jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "kui"]; const offset = (lunarYear - 3) % 10; return stems[(offset || 10) - 1]; } var get_heavenly_stem_default = getHeavenlyStem; function getNowDate(value) { const year = (/* @__PURE__ */ new Date()).getFullYear(); const isLeapMonth = value.isLeapMonth && getLeapMonth(year) === value.month; const solar = to_offset_solar_default({ ...value, year, isLeapMonth }); ensure_default(solar !== -1); return solar; } var get_now_date_default = getNowDate; function isUnicodeSupported(strict) { const { env } = process2; const { TERM, TERM_PROGRAM } = env; if (process2.platform !== "win32") return TERM !== "linux"; if (strict && (TERM_PROGRAM === "vscode" || TERM_PROGRAM === "Hyper") && TERM === "xterm-256color") return false; return Boolean(env.WT_SESSION) || // Windows Terminal Boolean(env.TERMINUS_SUBLIME) || // Terminus (<0.2.27) env.ConEmuTask === "{cmd::Cmder}" || // ConEmu and cmder TERM_PROGRAM === "Terminus-Sublime" || TERM === "xterm-256color" || TERM === "alacritty" || TERM === "rxvt-unicode" || TERM === "rxvt-unicode-256color" || env.TERMINAL_EMULATOR === "JetBrains-JediTerm"; } var is_unicode_supported_default = isUnicodeSupported; // src/helper/get-state-symbol.ts var green = (text) => `\x1B[32m${text}\x1B[39m`; var red = (text) => `\x1B[31m${text}\x1B[39m`; var _isUnicodeSupported = is_unicode_supported_default(); var success = green(_isUnicodeSupported ? "\u2714" : "\u221A"); var error = red(_isUnicodeSupported ? "\u2716\uFE0F" : "\xD7"); function getStateSymbol(state) { return state ? success : error; } var get_state_symbol_default = getStateSymbol; function getZodiacAnimal(date) { const result = zodiac(date); ensure_default(result !== -1); return result.name; } var get_zodiac_animal_default = getZodiacAnimal; // src/helper/get-zodiac-year-state.ts function getZodiacYearState(baseLunarYear, compareLunarYear) { return !((compareLunarYear - baseLunarYear) % 12); } var get_zodiac_year_state_default = getZodiacYearState; // src/helper/go.ts function go(function_, ...arguments_) { try { return [undefined, function_(...arguments_)]; } catch (error2) { return [error2, undefined]; } } var go_default = go; // src/helper/normalize-input.ts function normalizeInput(value) { ensure_default(value.length, "MISSING"); if (value.every((text) => /^\d{1,4}$/.test(text.toString()))) { return value.join("-"); } return value.join(""); } var normalize_input_default = normalizeInput; function serializedLunarDate(value, pattern = "YYYY-MM-DD") { ensure_default(value !== -1 && isValidLunar(value)); const tokens = { /* eslint-disable @typescript-eslint/naming-convention */ YYYY: value.year.toString(), MM: padded_date_default(value.month), DD: padded_date_default(value.day) /* eslint-enable @typescript-eslint/naming-convention */ }; return pattern.replaceAll(/YYYY|MM|DD/g, (match) => tokens[match]); } var serialized_lunar_date_default = serializedLunarDate; function toDate(value) { const date = new Date(value); ensure_default(isValidDate(date), "INVALID"); return date; } var to_date_default = toDate; function toLunarDate(value) { ensure_default(isValidSolar(value), "UNMEANING"); const lunarDate = toLunar(value); ensure_default(lunarDate !== -1); return lunarDate; } var to_lunar_date_default = toLunarDate; // src/locale/en-US.ts var en_US_default = { CMD_USAGE: "$0 [options] <date>", CMD_USAGE_EG_ARGS: "Parameter date format", CMD_USAGE_EG_ISO: "ISO-8601 standard date format", CMD_USAGE_EG_US: "US date format", CMD_USAGE_EG_VARIANT: "US variant date format", CMD_USAGE_EG_WRITTEN: "written date format", CMD_USAGE_EG_EGG: "Birth year birthday (Lunar Calendar)", CMD_USAGE_EG_BIRTH: "Birth year birthday (Solar Calendar)", CMD_USAGE_EG_NOW: "Birthday this year (Solar Calendar)", CMD_USAGE_EG_DECADE: "Birthdays in the next ten years (Solar Calendar)", CMD_USAGE_EG_CENTURY: "Birthday in century year (Solar Calendar)", CMD_USAGE_EPILOG: "Valid input dates are between 1900-01-31 and 2100-12-31", CMD_LABEL_BIRTHDAY: "Birthday", CMD_LABEL_YEAR: "Year", CMD_LABEL_AGE: "Age", CMD_LABEL_LEAP_MONTH: "Leap Month", CMD_LABEL_ZODIAC_YEAR: "Year of Fate", CMD_LABEL_ZODIAC: "Zodiac Animal", CMD_LABEL_ANIMAL_RAT: "Rat", CMD_LABEL_ANIMAL_OX: "Ox", CMD_LABEL_ANIMAL_TIGER: "Tiger", CMD_LABEL_ANIMAL_RABBIT: "Rabbit", CMD_LABEL_ANIMAL_DRAGON: "Dragon", CMD_LABEL_ANIMAL_SNAKE: "Snake", CMD_LABEL_ANIMAL_HORSE: "Horse", CMD_LABEL_ANIMAL_SHEEP: "Sheep", CMD_LABEL_ANIMAL_MONKEY: "Monkey", CMD_LABEL_ANIMAL_ROOSTER: "Rooster", CMD_LABEL_ANIMAL_DOG: "Dog", CMD_LABEL_ANIMAL_PIG: "Pig", CMD_LABEL_HEAVENLY_STEM_JIA: "Jia ", CMD_LABEL_HEAVENLY_STEM_YI: "Yi ", CMD_LABEL_HEAVENLY_STEM_BING: "Bing ", CMD_LABEL_HEAVENLY_STEM_DING: "Ding ", CMD_LABEL_HEAVENLY_STEM_WU: "Wu ", CMD_LABEL_HEAVENLY_STEM_JI: "Ji ", CMD_LABEL_HEAVENLY_STEM_GENG: "Geng ", CMD_LABEL_HEAVENLY_STEM_XIN: "Xin ", CMD_LABEL_HEAVENLY_STEM_REN: "Ren ", CMD_LABEL_HEAVENLY_STEM_KUI: "Kui ", CMD_LABEL_EARTHLY_BRANCH_ZI: "Zi ", CMD_LABEL_EARTHLY_BRANCH_CHOU: "Chou ", CMD_LABEL_EARTHLY_BRANCH_YIN: "Yin ", CMD_LABEL_EARTHLY_BRANCH_MAO: "Mao ", CMD_LABEL_EARTHLY_BRANCH_CHEN: "Chen ", CMD_LABEL_EARTHLY_BRANCH_SI: "Si ", CMD_LABEL_EARTHLY_BRANCH_WU: "Wu ", CMD_LABEL_EARTHLY_BRANCH_WEI: "Wei ", CMD_LABEL_EARTHLY_BRANCH_SHEN: "Shen ", CMD_LABEL_EARTHLY_BRANCH_YOU: "You ", CMD_LABEL_EARTHLY_BRANCH_XU: "Xu ", CMD_LABEL_EARTHLY_BRANCH_HAI: "Hai ", CMD_ERR_UNKNOWN: "Unknown Error: If it occurs repeatedly, please submit an issue in https://github.com/kabeep/lunar-birthday-cli/issues", CMD_ERR_MISSING: "Please enter the date, such as: 2024-12-31", CMD_ERR_INVALID: "Please enter a valid date, such as: 2024-12-31", CMD_ERR_UNMEANING: "Meaningless date, only supports 1900-1-31 to 2100-12-31", CMD_ERR_OUTPUT: "Invalid Output: If it occurs repeatedly, please submit an issue in https://github.com/kabeep/lunar-birthday-cli/issues" }; // src/locale/ja-JP.ts var ja_JP_default = { CMD_USAGE: "$0 [\u30AA\u30D7\u30B7\u30E7\u30F3] <\u65E5\u4ED8>", CMD_USAGE_EG_ARGS: "\u30D1\u30E9\u30E1\u30FC\u30BF\u306E\u65E5\u4ED8\u5F62\u5F0F", CMD_USAGE_EG_ISO: "ISO-8601 \u6A19\u6E96\u65E5\u4ED8\u5F62\u5F0F", CMD_USAGE_EG_US: "US \u65E5\u4ED8\u5F62\u5F0F", CMD_USAGE_EG_VARIANT: "US \u30D0\u30EA\u30A2\u30F3\u30C8\u65E5\u4ED8\u5F62\u5F0F", CMD_USAGE_EG_WRITTEN: "\u66F8\u304B\u308C\u305F\u65E5\u4ED8\u306E\u5F62\u5F0F", CMD_USAGE_EG_EGG: "\u751F\u307E\u308C\u5E74\u8A95\u751F\u65E5\uFF08\u3044\u3093\u308C\u304D\uFF09", CMD_USAGE_EG_NOW: "\u4ECA\u5E74\u306E\u8A95\u751F\u65E5\uFF08\u305F\u3044\u3088\u3046\u308C\u304D\uFF09", CMD_USAGE_EG_DECADE: "\u4ECA\u5F8C 10 \u5E74\u9593\u306E\u8A95\u751F\u65E5 (\u305F\u3044\u3088\u3046\u308C\u304D)", CMD_USAGE_EG_CENTURY: "\u4E16\u7D00\u5E74\u3067\u306E\u8A95\u751F\u65E5 (\u305F\u3044\u3088\u3046\u308C\u304D)", CMD_USAGE_EPILOG: "\u6709\u52B9\u306A\u5165\u529B\u65E5\u4ED8\u306F 1900-01-31 \u304B\u3089 2100-12-31 \u307E\u3067\u3067\u3059\u3002", CMD_LABEL_BIRTHDAY: "\u305F\u3093\u3058\u3087\u3046\u3073", CMD_LABEL_YEAR: "\u306D\u3093", CMD_LABEL_AGE: "\u306D\u3093\u308C\u3044", CMD_LABEL_LEAP_MONTH: "\u3046\u308B\u3046\u3065\u304D", CMD_LABEL_ZODIAC_YEAR: "\u307B\u3093\u3081\u3044\u306D\u3093", CMD_LABEL_ZODIAC: "\u305B\u3044\u3057\u3087\u3046", CMD_LABEL_ANIMAL_RAT: "\u306B\u9F20", CMD_LABEL_ANIMAL_OX: "\u725B", CMD_LABEL_ANIMAL_TIGER: "\u864E", CMD_LABEL_ANIMAL_RABBIT: "\u514E", CMD_LABEL_ANIMAL_DRAGON: "\u9F8D", CMD_LABEL_ANIMAL_SNAKE: "\u86C7", CMD_LABEL_ANIMAL_HORSE: "\u99AC", CMD_LABEL_ANIMAL_SHEEP: "\u7F8A", CMD_LABEL_ANIMAL_MONKEY: "\u733F", CMD_LABEL_ANIMAL_ROOSTER: "\u9D8F", CMD_LABEL_ANIMAL_DOG: "\u72AC", CMD_LABEL_ANIMAL_PIG: "\u8C5A", CMD_LABEL_HEAVENLY_STEM_JIA: "\u3053\u3046", CMD_LABEL_HEAVENLY_STEM_YI: "\u304A\u3064", CMD_LABEL_HEAVENLY_STEM_BING: "\u3078\u3044", CMD_LABEL_HEAVENLY_STEM_DING: "\u3066\u3044", CMD_LABEL_HEAVENLY_STEM_WU: "\u307C", CMD_LABEL_HEAVENLY_STEM_JI: "\u304D", CMD_LABEL_HEAVENLY_STEM_GENG: "\u3053\u3046", CMD_LABEL_HEAVENLY_STEM_XIN: "\u3057\u3093", CMD_LABEL_HEAVENLY_STEM_REN: "\u3058\u3093", CMD_LABEL_HEAVENLY_STEM_KUI: "\u304D", CMD_LABEL_EARTHLY_BRANCH_ZI: "\u3057", CMD_LABEL_EARTHLY_BRANCH_CHOU: "\u3061\u3085\u3046", CMD_LABEL_EARTHLY_BRANCH_YIN: "\u3044\u3093", CMD_LABEL_EARTHLY_BRANCH_MAO: "\u307C\u3046", CMD_LABEL_EARTHLY_BRANCH_CHEN: "\u3057\u3093", CMD_LABEL_EARTHLY_BRANCH_SI: "\u3057", CMD_LABEL_EARTHLY_BRANCH_WU: "\u3054", CMD_LABEL_EARTHLY_BRANCH_WEI: "\u307F", CMD_LABEL_EARTHLY_BRANCH_SHEN: "\u3057\u3093", CMD_LABEL_EARTHLY_BRANCH_YOU: "\u3086\u3046", CMD_LABEL_EARTHLY_BRANCH_XU: "\u3058\u3085\u3064", CMD_LABEL_EARTHLY_BRANCH_HAI: "(\u304C\u3044" }; // src/locale/ko-KR.ts var ko_KR_default = { CMD_USAGE: "$0 [\uC635\uC158] <\uB0A0\uC9DC>", CMD_USAGE_EG_ARGS: "\uB9E4\uAC1C\uBCC0\uC218 \uB0A0\uC9DC \uD615\uC2DD", CMD_USAGE_EG_ISO: "ISO-8601 \uD45C\uC900 \uB0A0\uC9DC \uD615\uC2DD", CMD_USAGE_EG_US: "\uBBF8\uAD6D \uB0A0\uC9DC \uD615\uC2DD", CMD_USAGE_EG_VARIANT: "\uBBF8\uAD6D \uBCC0\uD615 \uB0A0\uC9DC \uD615\uC2DD", CMD_USAGE_EG_WRITTEN: "\uC791\uC131\uB41C \uB0A0\uC9DC \uD615\uC2DD", CMD_USAGE_EG_EGG: "\uCD9C\uC0DD\uC5F0\uB3C4 \uC0DD\uC77C(\uC74C\uB825)", CMD_USAGE_EG_NOW: "\uC62C\uD574 \uC0DD\uC77C(\uC591\uB825)", CMD_USAGE_EG_DECADE: "\uD5A5\uD6C4 10\uB144 \uB0B4 \uC0DD\uC77C(\uC591\uB825)", CMD_USAGE_EG_CENTURY: "\uC138\uAE30 \uC5F0\uB3C4\uC758 \uC0DD\uC77C(\uC591\uB825)", CMD_USAGE_EPILOG: "\uC720\uD6A8\uD55C \uC785\uB825 \uB0A0\uC9DC\uB294 1900-01-31\uACFC 2100-12-31 \uC0AC\uC774\uC785\uB2C8\uB2E4.", CMD_LABEL_BIRTHDAY: "\uC0DD\uC77C", CMD_LABEL_YEAR: "\uB144", CMD_LABEL_AGE: "\uC5F0\uB839", CMD_LABEL_LEAP_MONTH: "\uC724\uB2EC", CMD_LABEL_ZODIAC_YEAR: "\uB760\uC758 \uD574", CMD_LABEL_ZODIAC: "\uC5F4\uB450 \uB760", CMD_LABEL_ANIMAL_RAT: "\uC950", CMD_LABEL_ANIMAL_OX: "\uC18C", CMD_LABEL_ANIMAL_TIGER: "\uD638\uB791\uC774", CMD_LABEL_ANIMAL_RABBIT: "\uD1A0\uB07C", CMD_LABEL_ANIMAL_DRAGON: "\uC6A9", CMD_LABEL_ANIMAL_SNAKE: "\uBC40", CMD_LABEL_ANIMAL_HORSE: "\uB9D0", CMD_LABEL_ANIMAL_SHEEP: "\uC591", CMD_LABEL_ANIMAL_MONKEY: "\uC6D0\uC22D\uC774", CMD_LABEL_ANIMAL_ROOSTER: "\uB2ED", CMD_LABEL_ANIMAL_DOG: "\uAC1C", CMD_LABEL_ANIMAL_PIG: "\uB3FC\uC9C0", CMD_LABEL_HEAVENLY_STEM_JIA: "\uAC11", CMD_LABEL_HEAVENLY_STEM_YI: "\uC744", CMD_LABEL_HEAVENLY_STEM_BING: "\uBCD1", CMD_LABEL_HEAVENLY_STEM_DING: "\uC815", CMD_LABEL_HEAVENLY_STEM_WU: "\uBB34", CMD_LABEL_HEAVENLY_STEM_JI: "\uAE30", CMD_LABEL_HEAVENLY_STEM_GENG: "\uACBD", CMD_LABEL_HEAVENLY_STEM_XIN: "\uC2E0", CMD_LABEL_HEAVENLY_STEM_REN: "\uC784", CMD_LABEL_HEAVENLY_STEM_KUI: "\uACC4", CMD_LABEL_EARTHLY_BRANCH_ZI: "\uC790", CMD_LABEL_EARTHLY_BRANCH_CHOU: "\uCD95", CMD_LABEL_EARTHLY_BRANCH_YIN: "\uC778", CMD_LABEL_EARTHLY_BRANCH_MAO: "\uBB18", CMD_LABEL_EARTHLY_BRANCH_CHEN: "\uC9C4", CMD_LABEL_EARTHLY_BRANCH_SI: "\uC0AC", CMD_LABEL_EARTHLY_BRANCH_WU: "\uC624", CMD_LABEL_EARTHLY_BRANCH_WEI: "\uBBF8", CMD_LABEL_EARTHLY_BRANCH_SHEN: "\uC2E0", CMD_LABEL_EARTHLY_BRANCH_YOU: "\uC720", CMD_LABEL_EARTHLY_BRANCH_XU: "\uC220", CMD_LABEL_EARTHLY_BRANCH_HAI: "\uD574" }; // src/locale/vi-VN.ts var vi_VN_default = { CMD_USAGE: "$0 [t\xF9y ch\u1ECDn] <ng\xE0y>", CMD_USAGE_EG_ARGS: "\u0110\u1ECBnh d\u1EA1ng ng\xE0y tham s\u1ED1", CMD_USAGE_EG_ISO: "\u0110\u1ECBnh d\u1EA1ng ng\xE0y ti\xEAu chu\u1EA9n ISO-8601", CMD_USAGE_EG_US: "\u0111\u1ECBnh d\u1EA1ng ng\xE0y c\u1EE7a Hoa K\u1EF3", CMD_USAGE_EG_VARIANT: "\u0110\u1ECBnh d\u1EA1ng ng\xE0y bi\u1EBFn th\u1EC3 c\u1EE7a Hoa K\u1EF3", CMD_USAGE_EG_WRITTEN: "\u0111\u1ECBnh d\u1EA1ng ng\xE0y vi\u1EBFt", CMD_USAGE_EG_EGG: "Ng\xE0y sinh n\u0103m sinh (\xC2m l\u1ECBch)", CMD_USAGE_EG_NOW: "Sinh nh\u1EADt n\u0103m nay (D\u01B0\u01A1ng l\u1ECBch)", CMD_USAGE_EG_DECADE: "Sinh nh\u1EADt trong m\u01B0\u1EDDi n\u0103m t\u1EDBi (D\u01B0\u01A1ng l\u1ECBch)", CMD_USAGE_EG_CENTURY: "Sinh nh\u1EADt v\xE0o n\u0103m th\u1EBF k\u1EF7 (D\u01B0\u01A1ng l\u1ECBch)", CMD_USAGE_EPILOG: "Ng\xE0y nh\u1EADp h\u1EE3p l\u1EC7 l\xE0 t\u1EEB 1900-01-31 \u0111\u1EBFn 2100-12-31", CMD_LABEL_BIRTHDAY: "Sinh nh\u1EADt", CMD_LABEL_YEAR: "N\u0103m", CMD_LABEL_AGE: "Tu\u1ED5i", CMD_LABEL_LEAP_MONTH: "Th\xE1ng Nhu\u1EADn", CMD_LABEL_ZODIAC_YEAR: "N\u0103m tu\u1ED5i", CMD_LABEL_ZODIAC: "Con Gi\xE1p", CMD_LABEL_ANIMAL_RAT: "chu\u1ED9t", CMD_LABEL_ANIMAL_OX: "tr\xE2u", CMD_LABEL_ANIMAL_TIGER: "h\u1ED5", CMD_LABEL_ANIMAL_RABBIT: "m\xE8o", CMD_LABEL_ANIMAL_DRAGON: "r\u1ED3ng", CMD_LABEL_ANIMAL_SNAKE: "r\u1EAFn", CMD_LABEL_ANIMAL_HORSE: "ng\u1EF1a", CMD_LABEL_ANIMAL_SHEEP: "d\xEA", CMD_LABEL_ANIMAL_MONKEY: "kh\u1EC9", CMD_LABEL_ANIMAL_ROOSTER: "g\xE0", CMD_LABEL_ANIMAL_DOG: "ch\xF3", CMD_LABEL_ANIMAL_PIG: "l\u1EE3n", CMD_LABEL_HEAVENLY_STEM_JIA: "gi\xE1p ", CMD_LABEL_HEAVENLY_STEM_YI: "\u1EA5t ", CMD_LABEL_HEAVENLY_STEM_BING: "b\xEDnh ", CMD_LABEL_HEAVENLY_STEM_DING: "\u0111inh ", CMD_LABEL_HEAVENLY_STEM_WU: "m\u1EADu ", CMD_LABEL_HEAVENLY_STEM_JI: "k\u1EF7 ", CMD_LABEL_HEAVENLY_STEM_GENG: "canh ", CMD_LABEL_HEAVENLY_STEM_XIN: "t\xE2n ", CMD_LABEL_HEAVENLY_STEM_REN: "nh\xE2m ", CMD_LABEL_HEAVENLY_STEM_KUI: "qu\xFD ", CMD_LABEL_EARTHLY_BRANCH_ZI: "t\xFD ", CMD_LABEL_EARTHLY_BRANCH_CHOU: "s\u1EEDu ", CMD_LABEL_EARTHLY_BRANCH_YIN: "d\u1EA7n ", CMD_LABEL_EARTHLY_BRANCH_MAO: "m\xE3o ", CMD_LABEL_EARTHLY_BRANCH_CHEN: "th\xECn ", CMD_LABEL_EARTHLY_BRANCH_SI: "t\u1EF5 ", CMD_LABEL_EARTHLY_BRANCH_WU: "ng\u1ECD ", CMD_LABEL_EARTHLY_BRANCH_WEI: "m\xF9i ", CMD_LABEL_EARTHLY_BRANCH_SHEN: "th\xE2n ", CMD_LABEL_EARTHLY_BRANCH_YOU: "d\u1EADu ", CMD_LABEL_EARTHLY_BRANCH_XU: "tu\u1EA5t ", CMD_LABEL_EARTHLY_BRANCH_HAI: "h\u1EE3i " }; // src/locale/zh-CN.ts var zh_CN_default = { CMD_USAGE: "$0 [\u9009\u9879] <\u65E5\u671F>", CMD_USAGE_EG_ARGS: "\u53C2\u6570\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_ISO: "ISO-8601 \u6807\u51C6\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_US: "US \u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_VARIANT: "US \u53D8\u4F53\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_WRITTEN: "\u4E66\u9762\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_EGG: "\u8BDE\u751F\u5E74\u751F\u65E5\uFF08\u9634\u5386\uFF09", CMD_USAGE_EG_BIRTH: "\u8BDE\u751F\u5E74\u751F\u65E5\uFF08\u9633\u5386\uFF09", CMD_USAGE_EG_NOW: "\u4ECA\u5E74\u751F\u65E5\uFF08\u9633\u5386\uFF09", CMD_USAGE_EG_DECADE: "\u672A\u6765\u5341\u5E74\u751F\u65E5\uFF08\u9633\u5386\uFF09", CMD_USAGE_EG_CENTURY: "\u4E16\u7EAA\u5E74\u751F\u65E5\uFF08\u9633\u5386\uFF09", CMD_USAGE_EPILOG: "\u6709\u6548\u8F93\u5165\u65E5\u671F\u5728\u516C\u5386 1900-01-31 \u5230 2100-12-31 \u4E4B\u95F4", CMD_LABEL_BIRTHDAY: "\u751F\u65E5", CMD_LABEL_YEAR: "\u5E74", CMD_LABEL_AGE: "\u5E74\u9F84", CMD_LABEL_LEAP_MONTH: "\u95F0\u6708", CMD_LABEL_ZODIAC_YEAR: "\u672C\u547D\u5E74", CMD_LABEL_ZODIAC: "\u751F\u8096", CMD_LABEL_ANIMAL_RAT: "\u9F20", CMD_LABEL_ANIMAL_OX: "\u725B", CMD_LABEL_ANIMAL_TIGER: "\u864E", CMD_LABEL_ANIMAL_RABBIT: "\u5154", CMD_LABEL_ANIMAL_DRAGON: "\u9F99", CMD_LABEL_ANIMAL_SNAKE: "\u86C7", CMD_LABEL_ANIMAL_HORSE: "\u9A6C", CMD_LABEL_ANIMAL_SHEEP: "\u7F8A", CMD_LABEL_ANIMAL_MONKEY: "\u7334", CMD_LABEL_ANIMAL_ROOSTER: "\u9E21", CMD_LABEL_ANIMAL_DOG: "\u72D7", CMD_LABEL_ANIMAL_PIG: "\u732A", CMD_LABEL_HEAVENLY_STEM_JIA: "\u7532", CMD_LABEL_HEAVENLY_STEM_YI: "\u4E59", CMD_LABEL_HEAVENLY_STEM_BING: "\u4E19", CMD_LABEL_HEAVENLY_STEM_DING: "\u4E01", CMD_LABEL_HEAVENLY_STEM_WU: "\u620A", CMD_LABEL_HEAVENLY_STEM_JI: "\u5DF1", CMD_LABEL_HEAVENLY_STEM_GENG: "\u5E9A", CMD_LABEL_HEAVENLY_STEM_XIN: "\u8F9B", CMD_LABEL_HEAVENLY_STEM_REN: "\u58EC", CMD_LABEL_HEAVENLY_STEM_KUI: "\u7678", CMD_LABEL_EARTHLY_BRANCH_ZI: "\u5B50", CMD_LABEL_EARTHLY_BRANCH_CHOU: "\u4E11", CMD_LABEL_EARTHLY_BRANCH_YIN: "\u5BC5", CMD_LABEL_EARTHLY_BRANCH_MAO: "\u536F", CMD_LABEL_EARTHLY_BRANCH_CHEN: "\u8FB0", CMD_LABEL_EARTHLY_BRANCH_SI: "\u5DF3", CMD_LABEL_EARTHLY_BRANCH_WU: "\u5348", CMD_LABEL_EARTHLY_BRANCH_WEI: "\u672A", CMD_LABEL_EARTHLY_BRANCH_SHEN: "\u7533", CMD_LABEL_EARTHLY_BRANCH_YOU: "\u9149", CMD_LABEL_EARTHLY_BRANCH_XU: "\u620C", CMD_LABEL_EARTHLY_BRANCH_HAI: "\u4EA5", CMD_ERR_UNKNOWN: "\u672A\u77E5\u5F02\u5E38\uFF0C\u82E5\u91CD\u590D\u51FA\u73B0\u8BF7\u901A\u8FC7 https://github.com/kabeep/lunar-birthday-cli/issues \u63D0\u4EA4 issue", CMD_ERR_MISSING: "\u8BF7\u8F93\u5165\u65E5\u671F\uFF0C\u5982\uFF1A2024-12-31", CMD_ERR_INVALID: "\u8BF7\u8F93\u5165\u6709\u6548\u65E5\u671F\uFF0C\u5982\uFF1A2024-12-31", CMD_ERR_UNMEANING: "\u65E0\u610F\u4E49\u7684\u65E5\u671F\uFF0C\u4EC5\u652F\u6301 1900-1-31 \u5230 2100-12-31", CMD_ERR_OUTPUT: "\u65E0\u6548\u8F93\u51FA\uFF0C\u82E5\u91CD\u590D\u51FA\u73B0\u8BF7\u901A\u8FC7 https://github.com/kabeep/lunar-birthday-cli/issues \u63D0\u4EA4 issue" }; // src/locale/zh-TW.ts var zh_TW_default = { CMD_USAGE: "$0 [\u9078\u9805] <\u65E5\u671F>", CMD_USAGE_EG_ARGS: "\u53C3\u6578\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_ISO: "ISO-8601 \u6A19\u6E96\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_US: "US \u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_VARIANT: "US \u8B8A\u9AD4\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_WRITTEN: "\u66F8\u9762\u65E5\u671F\u683C\u5F0F", CMD_USAGE_EG_EGG: "\u8A95\u751F\u5E74\u751F\u65E5\uFF08\u9670\u66C6\uFF09", CMD_USAGE_EG_NOW: "\u4ECA\u5E74\u751F\u65E5\uFF08\u967D\u66C6\uFF09", CMD_USAGE_EG_DECADE: "\u672A\u4F86\u5341\u5E74\u751F\u65E5\uFF08\u967D\u66C6\uFF09", CMD_USAGE_EG_CENTURY: "\u4E16\u7D00\u5E74\u751F\u65E5\uFF08\u967D\u66C6\uFF09", CMD_USAGE_EPILOG: "\u6709\u6548\u8F38\u5165\u65E5\u671F\u5728\u516C\u66C6 1900-01-31 \u5230 2100-12-31 \u4E4B\u9593", CMD_LABEL_BIRTHDAY: "\u8A95\u751F\u65E5", CMD_LABEL_AGE: "\u5E74\u9F61", CMD_LABEL_LEAP_MONTH: "\u958F\u6708", CMD_LABEL_ANIMAL_DRAGON: "\u9F8D", CMD_LABEL_ANIMAL_HORSE: "\u99AC", CMD_LABEL_ANIMAL_ROOSTER: "\u96DE", CMD_LABEL_ANIMAL_PIG: "\u8C6C" }; // src/locale/index.ts var getZhLocale = (code) => { switch (code) { case "zh-CN": { return zh_CN_default; } case "zh-TW": case "zh-HK": { return merge(zh_CN_default, zh_TW_default); } default: { return zh_CN_default; } } }; function getLocale() { const localeCode = osLocaleSync(); const localeAbbr = localeCode.split("-")[0]; switch (localeAbbr) { case "ja": { return ja_JP_default; } case "ko": { return ko_KR_default; } case "vi": { return vi_VN_default; } case "zh": { return getZhLocale(localeCode); } default: { return en_US_default; } } } var locale = merge(en_US_default, getLocale()); var locale_default = locale; // src/i18n.ts var I18n = class { dictionary; constructor(locale2) { this.dictionary = locale2; this.i18n = this.i18n.bind(this); } i18n(path, variables) { const value = get(this.dictionary, path); if (typeof value === "string") { return this.compiled(value, variables); } return path; } compiled(value, variables) { if (variables) return this.compiler(value)(variables); return value; } compiler(value) { return template(value, { interpolate: /{{([\s\S]+?)}}/g }); } }; var instance = new I18n(locale_default); var i18n_default = instance.i18n; // src/birthday.ts function birthday(value, mode) { const input = normalize_input_default(value); const date = to_date_default(input); const lunarDate = to_lunar_date_default(date); const { isLeapMonth } = lunarDate; const isDecade = mode === "d" || mode === "decade"; const symbol = isLeapMonth ? ` \x1B[34m(${i18n_default("CMD_LABEL_LEAP_MONTH")})\x1B[39m` : ""; const heading = (text) => `\x1B[33m${text}\x1B[39m `; const yearLabel = i18n_default("CMD_LABEL_YEAR"); const original = serialized_date_default(date); const birthdayContent = `${heading(i18n_default("CMD_LABEL_BIRTHDAY"))}${original}`; const egg = `${serialized_lunar_date_default(lunarDate)}${symbol}`; const eggStem = i18n_default(`CMD_LABEL_HEAVENLY_STEM_${get_heavenly_stem_default(lunarDate.year).toUpperCase()}`); const eggBranch = i18n_default(`CMD_LABEL_EARTHLY_BRANCH_${get_earthly_branch_default(lunarDate.year).toUpperCase()}`); const lunarContent = `${heading(i18n_default("CMD_USAGE_EG_EGG"))}${eggStem + eggBranch + yearLabel} ${egg}`; const nowDate = get_now_date_default(lunarDate); const now = serialized_date_default(nowDate); const nowLunarDate = to_lunar_date_default(nowDate); const nowStem = i18n_default(`CMD_LABEL_HEAVENLY_STEM_${get_heavenly_stem_default(nowLunarDate.year).toUpperCase()}`); const nowBranch = i18n_default(`CMD_LABEL_EARTHLY_BRANCH_${get_earthly_branch_default(nowLunarDate.year).toUpperCase()}`); const nowBirthdayContent = `${heading(i18n_default("CMD_USAGE_EG_NOW"))}${nowStem + nowBranch + yearLabel} ${now}`; const isZodiacYear = get_zodiac_year_state_default(lunarDate.year, nowLunarDate.year); const zodiacYearContent = `${heading(i18n_default("CMD_LABEL_ZODIAC_YEAR"))}${get_state_symbol_default(isZodiacYear)}`; const animal = get_zodiac_animal_default(date).toUpperCase(); const emoji = is_unicode_supported_default(true) ? ` ${SYMBOLS[animal]}` : ""; const zodiac2 = i18n_default(`CMD_LABEL_ANIMAL_${animal.toUpperCase()}`) + emoji; const zodiacContent = `${heading(i18n_default("CMD_LABEL_ZODIAC"))}${zodiac2}`; const age = nowLunarDate.year - lunarDate.year; const ageContent = `${heading(i18n_default("CMD_LABEL_AGE"))}${age}`; const extra = isDecade ? get_decade_dates_default(lunarDate) : get_century_dates_default(lunarDate, date.getFullYear()); const extraContent = `${heading(i18n_default(isDecade ? "CMD_USAGE_EG_DECADE" : "CMD_USAGE_EG_CENTURY"))} ${extra}`; console.log(ageContent, " ", zodiacContent, " ", birthdayContent, " ", zodiacYearContent); console.log(lunarContent); console.log(nowBirthdayContent); console.log(extraContent); } var birthday_default = birthday; // src/index.ts function main({ _, mode }) { const [error2] = go_default(birthday_default, _, mode); error2 && console.log(i18n_default(`CMD_ERR_${error2?.message ?? "UNKNOWN"}`)); } var src_default = main; // bin/cli.ts process2.on("SIGINT", function() { process2.exit(0); }); var palette = (code) => (text) => `\x1B[${code}m${text}\x1B[39m`; var grey = palette(90); var yellow = palette(33); src_default( yargs(hideBin(process2.argv)).scriptName("birthday").usage(i18n_default("CMD_USAGE")).options("mode", { alias: "m", type: "string", choices: ["d", "decade", "c", "century"], desc: "d(ecade)\uFF0Cc(entury)", default: "decade" }).example(yellow("birthday 1997 05 08"), i18n_default("CMD_USAGE_EG_ARGS")).example(yellow("birthday 1997-05-08"), i18n_default("CMD_USAGE_EG_ISO")).example(yellow("birthday 05/08/1997"), i18n_default("CMD_USAGE_EG_US")).example(yellow("birthday 1997/05/08"), i18n_default("CMD_USAGE_EG_VARIANT")).example(yellow("birthday May 8, 1997"), i18n_default("CMD_USAGE_EG_WRITTEN")).example(grey("-------"), "").example(yellow("birthday -m d 1997-5-8"), i18n_default("CMD_USAGE_EG_DECADE")).example(yellow("birthday -m c 1997-5-8"), i18n_default("CMD_USAGE_EG_CENTURY")).epilog(grey("* " + i18n_default("CMD_USAGE_EPILOG"))).alias({ v: "version", h: "help" }).parse() );