@easyoref/cli 1.21.8 → 1.21.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/areas.d.ts +10 -0
- package/dist/data/areas.js +89 -0
- package/dist/data/areas.js.map +1 -0
- package/package.json +4 -1
- package/src/commands/init.ts +0 -147
- package/src/commands/list-areas.ts +0 -24
- package/src/index.ts +0 -94
- package/tsconfig.json +0 -21
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oref area names for CLI checkbox selection.
|
|
3
|
+
* Hebrew value is what goes into AREAS env var.
|
|
4
|
+
*/
|
|
5
|
+
export interface AreaChoice {
|
|
6
|
+
name: string;
|
|
7
|
+
value: string;
|
|
8
|
+
}
|
|
9
|
+
/** Grouped area choices for the interactive wizard */
|
|
10
|
+
export declare const AREA_CHOICES: AreaChoice[];
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oref area names for CLI checkbox selection.
|
|
3
|
+
* Hebrew value is what goes into AREAS env var.
|
|
4
|
+
*/
|
|
5
|
+
/** Grouped area choices for the interactive wizard */
|
|
6
|
+
export const AREA_CHOICES = [
|
|
7
|
+
// ── Tel Aviv / Gush Dan ─────────────────────────
|
|
8
|
+
{
|
|
9
|
+
name: "Tel Aviv - South & Jaffa (תל אביב - דרום העיר ויפו)",
|
|
10
|
+
value: "תל אביב - דרום העיר ויפו",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "Tel Aviv - City Center (תל אביב - מרכז העיר)",
|
|
14
|
+
value: "תל אביב - מרכז העיר",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "Tel Aviv - North (תל אביב - עבר הירקון)",
|
|
18
|
+
value: "תל אביב - עבר הירקון",
|
|
19
|
+
},
|
|
20
|
+
{ name: "Gush Dan region (גוש דן)", value: "גוש דן" },
|
|
21
|
+
{
|
|
22
|
+
name: "Ramat Gan - Givatayim (רמת גן - גבעתיים)",
|
|
23
|
+
value: "רמת גן - גבעתיים",
|
|
24
|
+
},
|
|
25
|
+
{ name: "Bnei Brak (בני ברק)", value: "בני ברק" },
|
|
26
|
+
{ name: "Petah Tikva (פתח תקווה)", value: "פתח תקווה" },
|
|
27
|
+
{ name: "Holon (חולון)", value: "חולון" },
|
|
28
|
+
{ name: "Bat Yam (בת ים)", value: "בת ים" },
|
|
29
|
+
// ── Sharon ──────────────────────────────────────
|
|
30
|
+
{ name: "Herzliya (הרצליה)", value: "הרצליה" },
|
|
31
|
+
{ name: "Netanya (נתניה)", value: "נתניה" },
|
|
32
|
+
{ name: "Kfar Saba (כפר סבא)", value: "כפר סבא" },
|
|
33
|
+
{ name: "Ra'anana (רעננה)", value: "רעננה" },
|
|
34
|
+
{ name: "Hod HaSharon (הוד השרון)", value: "הוד השרון" },
|
|
35
|
+
// ── Center ──────────────────────────────────────
|
|
36
|
+
{
|
|
37
|
+
name: "Rishon LeZion - East (ראשון לציון - מזרח)",
|
|
38
|
+
value: "ראשון לציון - מזרח",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "Rishon LeZion - West (ראשון לציון - מערב)",
|
|
42
|
+
value: "ראשון לציון - מערב",
|
|
43
|
+
},
|
|
44
|
+
{ name: "Rehovot (רחובות)", value: "רחובות" },
|
|
45
|
+
{ name: "Ness Ziona (נס ציונה)", value: "נס ציונה" },
|
|
46
|
+
{ name: "Lod (לוד)", value: "לוד" },
|
|
47
|
+
{ name: "Ramla (רמלה)", value: "רמלה" },
|
|
48
|
+
{ name: "Modi'in (מודיעין - מכבים - רעות)", value: "מודיעין - מכבים - רעות" },
|
|
49
|
+
// ── Jerusalem ───────────────────────────────────
|
|
50
|
+
{ name: "Jerusalem - Center (ירושלים - מרכז)", value: "ירושלים - מרכז" },
|
|
51
|
+
{ name: "Jerusalem - East (ירושלים - מזרח)", value: "ירושלים - מזרח" },
|
|
52
|
+
{ name: "Jerusalem - South (ירושלים - דרום)", value: "ירושלים - דרום" },
|
|
53
|
+
{ name: "Jerusalem - West (ירושלים - מערב)", value: "ירושלים - מערב" },
|
|
54
|
+
// ── Haifa ───────────────────────────────────────
|
|
55
|
+
{
|
|
56
|
+
name: "Haifa - Carmel & Downtown (חיפה - כרמל ועיר תחתית)",
|
|
57
|
+
value: "חיפה - כרמל ועיר תחתית",
|
|
58
|
+
},
|
|
59
|
+
{ name: "Haifa - West (חיפה - מערב)", value: "חיפה - מערב" },
|
|
60
|
+
{
|
|
61
|
+
name: "Haifa - Neve Sha'anan (חיפה - נווה שאנן)",
|
|
62
|
+
value: "חיפה - נווה שאנן",
|
|
63
|
+
},
|
|
64
|
+
// ── South ───────────────────────────────────────
|
|
65
|
+
{ name: "Ashdod A,B,D,E (אשדוד - א,ב,ד,ה)", value: "אשדוד - א,ב,ד,ה" },
|
|
66
|
+
{ name: "Ashkelon - North (אשקלון - צפון)", value: "אשקלון - צפון" },
|
|
67
|
+
{ name: "Ashkelon - South (אשקלון - דרום)", value: "אשקלון - דרום" },
|
|
68
|
+
{ name: "Beer Sheva - East (באר שבע - מזרח)", value: "באר שבע - מזרח" },
|
|
69
|
+
{ name: "Beer Sheva - West (באר שבע - מערב)", value: "באר שבע - מערב" },
|
|
70
|
+
{ name: "Sderot (שדרות)", value: "שדרות" },
|
|
71
|
+
{ name: "Gaza Envelope (עוטף עזה)", value: "עוטף עזה" },
|
|
72
|
+
{ name: "Eilat (אילת)", value: "אילת" },
|
|
73
|
+
// ── North ───────────────────────────────────────
|
|
74
|
+
{ name: "Nazareth (נצרת)", value: "נצרת" },
|
|
75
|
+
{ name: "Akko / Acre (עכו)", value: "עכו" },
|
|
76
|
+
{ name: "Tiberias (טבריה)", value: "טבריה" },
|
|
77
|
+
{ name: "Safed / Tzfat (צפת)", value: "צפת" },
|
|
78
|
+
{ name: "Kiryat Shmona (קריית שמונה)", value: "קריית שמונה" },
|
|
79
|
+
// ── Regions ─────────────────────────────────────
|
|
80
|
+
{ name: "Sharon region (שרון)", value: "שרון" },
|
|
81
|
+
{ name: "Shfela / Lowlands (שפלה)", value: "שפלה" },
|
|
82
|
+
{ name: "Negev (נגב)", value: "נגב" },
|
|
83
|
+
{ name: "Upper Galilee (גליל עליון)", value: "גליל עליון" },
|
|
84
|
+
{ name: "Lower Galilee (גליל תחתון)", value: "גליל תחתון" },
|
|
85
|
+
{ name: "Golan Heights (גולן)", value: "גולן" },
|
|
86
|
+
{ name: "Jezreel Valley (עמק יזרעאל)", value: "עמק יזרעאל" },
|
|
87
|
+
{ name: "Jordan Valley (בקעת הירדן)", value: "בקעת הירדן" },
|
|
88
|
+
];
|
|
89
|
+
//# sourceMappingURL=areas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"areas.js","sourceRoot":"","sources":["../../src/data/areas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,mDAAmD;IACnD;QACE,IAAI,EAAE,qDAAqD;QAC3D,KAAK,EAAE,0BAA0B;KAClC;IACD;QACE,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,qBAAqB;KAC7B;IACD;QACE,IAAI,EAAE,yCAAyC;QAC/C,KAAK,EAAE,sBAAsB;KAC9B;IACD,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrD;QACE,IAAI,EAAE,0CAA0C;QAChD,KAAK,EAAE,kBAAkB;KAC1B;IACD,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE;IACjD,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,EAAE;IACvD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACzC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;IAE3C,mDAAmD;IACnD,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9C,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC3C,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE;IACjD,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC5C,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,WAAW,EAAE;IAExD,mDAAmD;IACnD;QACE,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,oBAAoB;KAC5B;IACD;QACE,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,oBAAoB;KAC5B;IACD,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC7C,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,UAAU,EAAE;IACpD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;IACvC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,wBAAwB,EAAE;IAE7E,mDAAmD;IACnD,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACxE,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACtE,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACvE,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IAEtE,mDAAmD;IACnD;QACE,IAAI,EAAE,oDAAoD;QAC1D,KAAK,EAAE,wBAAwB;KAChC;IACD,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,aAAa,EAAE;IAC5D;QACE,IAAI,EAAE,0CAA0C;QAChD,KAAK,EAAE,kBAAkB;KAC1B;IAED,mDAAmD;IACnD,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,iBAAiB,EAAE;IACtE,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,eAAe,EAAE;IACpE,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,eAAe,EAAE;IACpE,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACvE,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACvE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1C,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,UAAU,EAAE;IACvD,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;IAEvC,mDAAmD;IACnD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1C,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC5C,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE;IAC7C,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,aAAa,EAAE;IAE7D,mDAAmD;IACnD,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/C,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE;IACnD,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE;IACrC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,YAAY,EAAE;IAC3D,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,YAAY,EAAE;IAC3D,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/C,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,YAAY,EAAE;IAC5D,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,YAAY,EAAE;CAC5D,CAAC"}
|
package/package.json
CHANGED
package/src/commands/init.ts
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `easyoref init` — Interactive setup wizard
|
|
3
|
-
*
|
|
4
|
-
* Walks user through:
|
|
5
|
-
* 1. Language selection (ru/en/he)
|
|
6
|
-
* 2. Bot token input + validation
|
|
7
|
-
* 3. Chat ID input
|
|
8
|
-
* 4. Area selection (checkbox)
|
|
9
|
-
* 5. Generates .env file
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { checkbox, input, password, select } from "@inquirer/prompts";
|
|
13
|
-
import chalk from "chalk";
|
|
14
|
-
import { Bot } from "grammy";
|
|
15
|
-
import { writeFileSync } from "node:fs";
|
|
16
|
-
import { AREA_CHOICES } from "../data/areas.js";
|
|
17
|
-
|
|
18
|
-
export async function init(): Promise<void> {
|
|
19
|
-
// ── Step 0: Language ───────────────────────────────────
|
|
20
|
-
|
|
21
|
-
const language = await select({
|
|
22
|
-
message: "🌍 Message language / Язык сообщений / שפת ההודעות:",
|
|
23
|
-
choices: [
|
|
24
|
-
{ name: "Русский", value: "ru" },
|
|
25
|
-
{ name: "English", value: "en" },
|
|
26
|
-
{ name: "עברית", value: "he" },
|
|
27
|
-
],
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const t = translations[language as keyof typeof translations];
|
|
31
|
-
|
|
32
|
-
// ── Step 1: Bot Token ──────────────────────────────────
|
|
33
|
-
|
|
34
|
-
const botToken = await password({
|
|
35
|
-
message: t.botTokenPrompt,
|
|
36
|
-
validate: (val) => {
|
|
37
|
-
if (!val || val.length < 10) return t.botTokenRequired;
|
|
38
|
-
if (!val.includes(":")) return t.botTokenFormat;
|
|
39
|
-
return true;
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Validate token by calling Telegram API
|
|
44
|
-
console.log(chalk.dim(t.validating));
|
|
45
|
-
try {
|
|
46
|
-
const bot = new Bot(botToken);
|
|
47
|
-
const me = await bot.api.getMe();
|
|
48
|
-
console.log(chalk.green(` ✅ ${t.botVerified}: @${me.username}`));
|
|
49
|
-
} catch {
|
|
50
|
-
console.log(chalk.yellow(` ⚠️ ${t.botVerifyFailed}`));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// ── Step 2: Chat ID ────────────────────────────────────
|
|
54
|
-
|
|
55
|
-
const chatId = await input({
|
|
56
|
-
message: t.chatIdPrompt,
|
|
57
|
-
validate: (val) => {
|
|
58
|
-
if (!val) return t.chatIdRequired;
|
|
59
|
-
// Allow negative numbers (groups) and positive (DMs)
|
|
60
|
-
if (!/^-?\d+$/.test(val)) return t.chatIdFormat;
|
|
61
|
-
return true;
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// ── Step 3: Areas ──────────────────────────────────────
|
|
66
|
-
|
|
67
|
-
const areas = await checkbox({
|
|
68
|
-
message: t.areasPrompt,
|
|
69
|
-
choices: AREA_CHOICES,
|
|
70
|
-
required: true,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// ── Step 4: Write .env ─────────────────────────────────
|
|
74
|
-
|
|
75
|
-
const envContent = [
|
|
76
|
-
"# EasyOref Configuration",
|
|
77
|
-
`# Generated by @easyoref/cli on ${new Date().toISOString().split("T")[0]}`,
|
|
78
|
-
"",
|
|
79
|
-
`BOT_TOKEN=${botToken}`,
|
|
80
|
-
`CHAT_ID=${chatId}`,
|
|
81
|
-
`AREAS=${areas.join(",")}`,
|
|
82
|
-
`LANGUAGE=${language}`,
|
|
83
|
-
"HEALTH_PORT=3100",
|
|
84
|
-
"",
|
|
85
|
-
].join("\n");
|
|
86
|
-
|
|
87
|
-
writeFileSync(".env", envContent, "utf-8");
|
|
88
|
-
|
|
89
|
-
console.log("");
|
|
90
|
-
console.log(chalk.green.bold(`✅ ${t.configSaved}`));
|
|
91
|
-
console.log("");
|
|
92
|
-
console.log(chalk.dim(t.nextSteps));
|
|
93
|
-
console.log(
|
|
94
|
-
` ${chalk.cyan("docker compose up -d")} ${chalk.dim("(Docker)")}`,
|
|
95
|
-
);
|
|
96
|
-
console.log(
|
|
97
|
-
` ${chalk.cyan("npm start")} ${chalk.dim("(Node.js)")}`,
|
|
98
|
-
);
|
|
99
|
-
console.log("");
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ── i18n for the wizard itself ───────────────────────────
|
|
103
|
-
|
|
104
|
-
const translations = {
|
|
105
|
-
ru: {
|
|
106
|
-
botTokenPrompt: "🤖 Токен бота (от @BotFather):",
|
|
107
|
-
botTokenRequired: "Токен обязателен",
|
|
108
|
-
botTokenFormat: "Формат: 123456:ABC-DEF...",
|
|
109
|
-
validating: " Проверяем токен...",
|
|
110
|
-
botVerified: "Бот найден",
|
|
111
|
-
botVerifyFailed: "Не удалось проверить токен (продолжаем)",
|
|
112
|
-
chatIdPrompt: "💬 Chat ID группы (отрицательное число):",
|
|
113
|
-
chatIdRequired: "Chat ID обязателен",
|
|
114
|
-
chatIdFormat: "Chat ID — число (отрицательное для групп)",
|
|
115
|
-
areasPrompt: "📍 Выберите районы для мониторинга (пробел = выбрать):",
|
|
116
|
-
configSaved: "Конфигурация сохранена в .env",
|
|
117
|
-
nextSteps: "Следующий шаг — запустите бота:",
|
|
118
|
-
},
|
|
119
|
-
en: {
|
|
120
|
-
botTokenPrompt: "🤖 Bot Token (from @BotFather):",
|
|
121
|
-
botTokenRequired: "Token is required",
|
|
122
|
-
botTokenFormat: "Format: 123456:ABC-DEF...",
|
|
123
|
-
validating: " Validating token...",
|
|
124
|
-
botVerified: "Bot found",
|
|
125
|
-
botVerifyFailed: "Could not verify token (continuing anyway)",
|
|
126
|
-
chatIdPrompt: "💬 Chat ID (negative number for groups):",
|
|
127
|
-
chatIdRequired: "Chat ID is required",
|
|
128
|
-
chatIdFormat: "Chat ID must be a number (negative for groups)",
|
|
129
|
-
areasPrompt: "📍 Select areas to monitor (space = toggle):",
|
|
130
|
-
configSaved: "Config saved to .env",
|
|
131
|
-
nextSteps: "Next step — start the bot:",
|
|
132
|
-
},
|
|
133
|
-
he: {
|
|
134
|
-
botTokenPrompt: "🤖 טוקן בוט (מ-@BotFather):",
|
|
135
|
-
botTokenRequired: "טוקן נדרש",
|
|
136
|
-
botTokenFormat: "פורמט: 123456:ABC-DEF...",
|
|
137
|
-
validating: " מאמת טוקן...",
|
|
138
|
-
botVerified: "בוט נמצא",
|
|
139
|
-
botVerifyFailed: "לא ניתן לאמת את הטוקן (ממשיכים)",
|
|
140
|
-
chatIdPrompt: "💬 Chat ID (מספר שלילי לקבוצות):",
|
|
141
|
-
chatIdRequired: "Chat ID נדרש",
|
|
142
|
-
chatIdFormat: "Chat ID חייב להיות מספר (שלילי לקבוצות)",
|
|
143
|
-
areasPrompt: "📍 בחר אזורים לניטור (רווח = בחירה):",
|
|
144
|
-
configSaved: "הגדרות נשמרו ל-.env",
|
|
145
|
-
nextSteps: "שלב הבא — הפעל את הבוט:",
|
|
146
|
-
},
|
|
147
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `easyoref list-areas` — Print all available Oref area names
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import chalk from "chalk";
|
|
6
|
-
import { AREA_CHOICES } from "../data/areas.js";
|
|
7
|
-
|
|
8
|
-
export function listAreas(): void {
|
|
9
|
-
console.log(chalk.bold("Available Oref areas for AREAS env var:\n"));
|
|
10
|
-
console.log(
|
|
11
|
-
chalk.dim(
|
|
12
|
-
"Copy the Hebrew name (right column) into your .env AREAS field.\n",
|
|
13
|
-
),
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
const maxName = Math.max(...AREA_CHOICES.map((c) => c.name.length));
|
|
17
|
-
|
|
18
|
-
for (const choice of AREA_CHOICES) {
|
|
19
|
-
const padded = choice.name.padEnd(maxName + 2);
|
|
20
|
-
console.log(` ${padded} ${chalk.cyan(choice.value)}`);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
console.log(chalk.dim("\nExample: AREAS=תל אביב - דרום העיר ויפו,גוש דן"));
|
|
24
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#! /usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* @easyoref/cli — Interactive setup wizard
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* npx @easyoref/cli init — interactive setup
|
|
7
|
-
* npx @easyoref/cli list-areas — show all Oref area names
|
|
8
|
-
* npx @easyoref/cli update — update RPi deployment
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import chalk from "chalk";
|
|
12
|
-
import { execSync } from "node:child_process";
|
|
13
|
-
import { existsSync } from "node:fs";
|
|
14
|
-
import { resolve } from "node:path";
|
|
15
|
-
import { init } from "./commands/init.js";
|
|
16
|
-
import { listAreas } from "./commands/list-areas.js";
|
|
17
|
-
|
|
18
|
-
const command = process.argv[2];
|
|
19
|
-
const args = process.argv.slice(3);
|
|
20
|
-
|
|
21
|
-
async function main(): Promise<void> {
|
|
22
|
-
console.log(chalk.bold("\n🚨 EasyOref — Setup Wizard\n"));
|
|
23
|
-
|
|
24
|
-
switch (command) {
|
|
25
|
-
case "init":
|
|
26
|
-
case undefined:
|
|
27
|
-
await init();
|
|
28
|
-
break;
|
|
29
|
-
case "list-areas":
|
|
30
|
-
listAreas();
|
|
31
|
-
break;
|
|
32
|
-
case "update":
|
|
33
|
-
update(args[0]);
|
|
34
|
-
break;
|
|
35
|
-
case "--help":
|
|
36
|
-
case "-h":
|
|
37
|
-
printHelp();
|
|
38
|
-
break;
|
|
39
|
-
default:
|
|
40
|
-
console.log(chalk.red(`Unknown command: ${command}`));
|
|
41
|
-
printHelp();
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function printHelp(): void {
|
|
47
|
-
console.log(`${chalk.bold("Commands:")}
|
|
48
|
-
${chalk.cyan("init")} Interactive setup wizard (default)
|
|
49
|
-
${chalk.cyan("list-areas")} Show all Oref area names with translations
|
|
50
|
-
${chalk.cyan("update")} Update RPi deployment
|
|
51
|
-
${chalk.cyan("update /path/to/deploy")} Update in specific directory
|
|
52
|
-
${chalk.cyan("--help")} Show this help message
|
|
53
|
-
`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function update(path?: string): void {
|
|
57
|
-
const targetPath = path
|
|
58
|
-
? resolve(path)
|
|
59
|
-
: process.cwd();
|
|
60
|
-
|
|
61
|
-
const composePath = resolve(targetPath, "docker-compose.yml");
|
|
62
|
-
|
|
63
|
-
if (!existsSync(composePath)) {
|
|
64
|
-
console.log(chalk.yellow(`No docker-compose.yml found in: ${targetPath}`));
|
|
65
|
-
console.log(chalk.gray("Usage: easyoref update /path/to/deployment"));
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
console.log(chalk.cyan(`Updating EasyOref in: ${targetPath}...\n`));
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
console.log(chalk.gray(" → npm update"));
|
|
73
|
-
execSync("npm update", { cwd: targetPath, stdio: "inherit" });
|
|
74
|
-
|
|
75
|
-
console.log(chalk.gray("\n → npm uninstall -g easyoref @easyoref/cli 2>/dev/null; npm install -g @easyoref/cli"));
|
|
76
|
-
execSync("npm uninstall -g easyoref @easyoref/cli 2>/dev/null; npm install -g @easyoref/cli", { stdio: "inherit" });
|
|
77
|
-
|
|
78
|
-
console.log(chalk.gray("\n → docker compose down"));
|
|
79
|
-
execSync("docker compose down", { cwd: targetPath, stdio: "inherit" });
|
|
80
|
-
|
|
81
|
-
console.log(chalk.gray("\n → docker compose up --build -d"));
|
|
82
|
-
execSync("docker compose up --build -d", { cwd: targetPath, stdio: "inherit" });
|
|
83
|
-
|
|
84
|
-
console.log(chalk.green("\n✅ EasyOref updated successfully!"));
|
|
85
|
-
} catch (err) {
|
|
86
|
-
console.error(chalk.red("\n❌ Update failed:"), err);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
main().catch((err) => {
|
|
92
|
-
console.error(chalk.red("Fatal error:"), err);
|
|
93
|
-
process.exit(1);
|
|
94
|
-
});
|
package/tsconfig.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "NodeNext",
|
|
5
|
-
"moduleResolution": "NodeNext",
|
|
6
|
-
"lib": ["ES2022"],
|
|
7
|
-
"outDir": "dist",
|
|
8
|
-
"rootDir": "src",
|
|
9
|
-
"strict": true,
|
|
10
|
-
"esModuleInterop": true,
|
|
11
|
-
"skipLibCheck": true,
|
|
12
|
-
"forceConsistentCasingInFileNames": true,
|
|
13
|
-
"resolveJsonModule": true,
|
|
14
|
-
"declaration": true,
|
|
15
|
-
"sourceMap": true,
|
|
16
|
-
"composite": true
|
|
17
|
-
},
|
|
18
|
-
"references": [{ "path": "../shared" }, { "path": "../monitoring" }],
|
|
19
|
-
"include": ["src/**/*"],
|
|
20
|
-
"exclude": ["node_modules", "dist"]
|
|
21
|
-
}
|