@kabeep/lunar-birthday-cli
Version:
A Node.js Library to list the lunar birthday in terminal
674 lines (648 loc) • 28 kB
JavaScript
#!/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()
);