/** * Локальная разработка без Telegram: печатает ссылки на Mini App с подписанным initData. * * pnpm dev:initdata — ссылки для всех тестовых пользователей из seed * pnpm dev:initdata -- client 100000001 — конкретный пользователь * * Подпись делается тем же токеном, которым API проверяет initData (настоящий или DEV_*). */ import { env } from '../src/env.ts'; import { signInitData } from '../src/auth/telegram.ts'; if (env.isProd) throw new Error('Только для разработки'); const users: { app: 'client' | 'pro'; id: number; name: string; lang: string }[] = [ { app: 'client', id: 100000001, name: 'Анна', lang: 'ru' }, { app: 'client', id: 100000002, name: 'John', lang: 'en' }, { app: 'client', id: 100000003, name: '李明', lang: 'zh' }, { app: 'client', id: 100000004, name: 'Ольга', lang: 'ru' }, { app: 'client', id: 100000099, name: 'Новый клиент', lang: 'ru' }, { app: 'pro', id: 200000001, name: 'Мария (клинер)', lang: 'ru' }, { app: 'pro', id: 200000003, name: 'Elena (клинер)', lang: 'es' }, { app: 'pro', id: 200000011, name: 'Лусине (сотрудник компании)', lang: 'hy' }, { app: 'pro', id: 300000001, name: 'Карен (диспетчер компании)', lang: 'ru' }, { app: 'pro', id: 300000010, name: 'Арам (собственник Lumen Coffee)', lang: 'ru' }, { app: 'pro', id: 300000011, name: 'Гаяне (сотрудник Lumen Coffee)', lang: 'ru' }, ]; const [appArg, idArg] = process.argv.slice(2).filter((a) => a !== '--'); const selected = appArg && idArg ? [{ app: appArg as 'client' | 'pro', id: Number(idArg), name: `user ${idArg}`, lang: 'ru' }] : users; for (const u of selected) { const token = u.app === 'client' ? env.clientBotToken : env.proBotToken; // initData живёт TG_INIT_DATA_MAX_AGE секунд — для разработки этого достаточно const initData = signInitData(token, { id: u.id, first_name: u.name.split(' ')[0], language_code: u.lang }); const base = u.app === 'client' ? env.CLIENT_MINIAPP_URL : env.PRO_MINIAPP_URL; console.log(`${u.app.padEnd(6)} ${u.name}\n ${base}/#tgWebAppData=${encodeURIComponent(initData)}\n`); }