viberadar 0.3.175 → 0.3.177

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.
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAsC,cAAc,EAAE,MAAM,SAAS,CAAC;AAmH1F,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBjF"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAsC,cAAc,EAAE,MAAM,SAAS,CAAC;AAoL1F,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBjF"}
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.runProbeChecks = runProbeChecks;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
+ const child_process = __importStar(require("child_process"));
39
40
  const module_1 = require("module");
40
41
  const SCREENSHOTS_DIR = path.join(process.cwd(), '.viberadar', 'probe-screenshots');
41
42
  function ensureScreenshotsDir() {
@@ -94,12 +95,76 @@ async function executeStep(page, step, target, timeout) {
94
95
  throw new Error(`Unknown step type: ${type}`);
95
96
  }
96
97
  }
98
+ function findPlaywrightConfig(filePath) {
99
+ let dir = path.dirname(filePath);
100
+ for (let i = 0; i < 8; i++) {
101
+ for (const name of ['playwright.config.ts', 'playwright.config.js']) {
102
+ const candidate = path.join(dir, name);
103
+ if (fs.existsSync(candidate))
104
+ return { configFile: candidate, projectRoot: dir };
105
+ }
106
+ const parent = path.dirname(dir);
107
+ if (parent === dir)
108
+ break;
109
+ dir = parent;
110
+ }
111
+ return null;
112
+ }
113
+ async function runPlaywrightFile(check, target, timeout, config) {
114
+ const start = Date.now();
115
+ const filePath = path.resolve(process.cwd(), check.file);
116
+ if (!fs.existsSync(filePath)) {
117
+ return { check: check.name, status: 'failed', durationMs: 0, error: `File not found: ${filePath}` };
118
+ }
119
+ const pwConfig = findPlaywrightConfig(filePath);
120
+ const configArgs = pwConfig ? ['--config', pwConfig.configFile] : [];
121
+ const runCwd = pwConfig ? pwConfig.projectRoot : process.cwd();
122
+ return new Promise(resolve => {
123
+ const env = {
124
+ ...process.env,
125
+ BASE_URL: target,
126
+ PLAYWRIGHT_BASE_URL: target,
127
+ PLAYWRIGHT_USE_WEBSERVER: '0',
128
+ PLAYWRIGHT_BROWSERS: 'chromium',
129
+ };
130
+ if (config.e2eEmail) {
131
+ env.E2E_USER_EMAIL = config.e2eEmail;
132
+ env.E2E_EMAIL = config.e2eEmail;
133
+ }
134
+ if (config.e2ePassword) {
135
+ env.E2E_USER_PASSWORD = config.e2ePassword;
136
+ env.E2E_PASSWORD = config.e2ePassword;
137
+ }
138
+ const proc = child_process.spawn('npx', ['playwright', 'test', filePath, '--reporter=line', ...configArgs], {
139
+ env, cwd: runCwd, shell: true, timeout,
140
+ });
141
+ let output = '';
142
+ proc.stdout.on('data', (d) => { output += d.toString(); });
143
+ proc.stderr.on('data', (d) => { output += d.toString(); });
144
+ proc.on('close', code => {
145
+ const passed = code === 0;
146
+ resolve({
147
+ check: check.name,
148
+ status: passed ? 'passed' : 'failed',
149
+ durationMs: Date.now() - start,
150
+ error: passed ? undefined : output.slice(-500),
151
+ });
152
+ });
153
+ proc.on('error', err => {
154
+ resolve({ check: check.name, status: 'failed', durationMs: Date.now() - start, error: err.message });
155
+ });
156
+ });
157
+ }
97
158
  async function runCheck(browser, check, config) {
159
+ // Run real Playwright test file if specified
160
+ if (check.file) {
161
+ return runPlaywrightFile(check, config.target, config.timeout, config);
162
+ }
98
163
  const start = Date.now();
99
164
  const context = await browser.newContext();
100
165
  const page = await context.newPage();
101
166
  try {
102
- for (const step of check.steps) {
167
+ for (const step of (check.steps || [])) {
103
168
  await executeStep(page, step, config.target, config.timeout);
104
169
  }
105
170
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ export interface ProbeConfig {
4
4
  timeout: number;
5
5
  notify?: ProbeNotifyConfig;
6
6
  checks: ProbeCheck[];
7
+ e2eEmail?: string;
8
+ e2ePassword?: string;
7
9
  }
8
10
  export interface ProbeNotifyConfig {
9
11
  telegram?: {
@@ -13,7 +15,8 @@ export interface ProbeNotifyConfig {
13
15
  }
14
16
  export interface ProbeCheck {
15
17
  name: string;
16
- steps: ProbeStep[];
18
+ steps?: ProbeStep[];
19
+ file?: string;
17
20
  }
18
21
  export type ProbeStep = {
19
22
  goto: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/probe/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7C;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/probe/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7C;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EAAE,UAAU,EAA4H,MAAM,YAAY,CAAC;AAOlK,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AAuhED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA+tF1G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EAAE,UAAU,EAA4H,MAAM,YAAY,CAAC;AAOlK,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AAuhED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqwF1G"}
@@ -1877,15 +1877,26 @@ function startServer({ data: initialData, port, projectRoot }) {
1877
1877
  let probeRunning = false;
1878
1878
  let probeTimer = null;
1879
1879
  let probeState = { status: 'idle' };
1880
- function loadProbeNotifyConfig() {
1881
- const p = path.join(projectRoot, '.viberadar', 'probe-notify.json');
1880
+ function loadProbeSettings() {
1881
+ const p = path.join(projectRoot, '.viberadar', 'probe-settings.json');
1882
1882
  try {
1883
1883
  return JSON.parse(fs.readFileSync(p, 'utf-8'));
1884
1884
  }
1885
1885
  catch {
1886
- return undefined;
1886
+ return {};
1887
1887
  }
1888
1888
  }
1889
+ function saveProbeSettings(settings) {
1890
+ const dir = path.join(projectRoot, '.viberadar');
1891
+ if (!fs.existsSync(dir))
1892
+ fs.mkdirSync(dir, { recursive: true });
1893
+ fs.writeFileSync(path.join(dir, 'probe-settings.json'), JSON.stringify(settings, null, 2), 'utf-8');
1894
+ }
1895
+ // legacy shim — читаем из нового файла
1896
+ function loadProbeNotifyConfig() {
1897
+ const s = loadProbeSettings();
1898
+ return s.telegram ? { telegram: s.telegram } : undefined;
1899
+ }
1889
1900
  async function runProbeOnce() {
1890
1901
  if (probeRunning)
1891
1902
  return;
@@ -1894,15 +1905,25 @@ function startServer({ data: initialData, port, projectRoot }) {
1894
1905
  probeState.status = 'running';
1895
1906
  broadcast('probe-run-started', { timestamp: new Date().toISOString() });
1896
1907
  try {
1908
+ const settings = loadProbeSettings();
1897
1909
  const config = (0, config_1.loadProbeConfig)(path.join(projectRoot, 'probe.config.yml'));
1898
- if (!config) {
1910
+ // settings.target overrides config target; or we can run without a config file
1911
+ if (!config && !settings.target) {
1912
+ process.stdout.write(' ⚠️ Probe: no target configured\n');
1899
1913
  probeState.status = prevStatus;
1900
1914
  return;
1901
1915
  }
1902
- const notifyCfg = loadProbeNotifyConfig();
1903
- if (notifyCfg)
1904
- config.notify = notifyCfg;
1905
- const report = await (0, runner_1.runProbeChecks)(config);
1916
+ const effectiveConfig = config || { target: '', interval: 300, timeout: 30000, checks: [] };
1917
+ if (settings.target)
1918
+ effectiveConfig.target = settings.target;
1919
+ if (settings.telegram)
1920
+ effectiveConfig.notify = { telegram: settings.telegram };
1921
+ if (settings.e2eEmail)
1922
+ effectiveConfig.e2eEmail = settings.e2eEmail;
1923
+ if (settings.e2ePassword)
1924
+ effectiveConfig.e2ePassword = settings.e2ePassword;
1925
+ const notifyCfg = effectiveConfig.notify;
1926
+ const report = await (0, runner_1.runProbeChecks)(effectiveConfig);
1906
1927
  probeState.lastRun = report;
1907
1928
  probeState.status = probeTimer ? 'scheduled' : 'idle';
1908
1929
  broadcast('probe-run-done', report);
@@ -4854,9 +4875,11 @@ a{color:var(--blue)}
4854
4875
  // --- Probe API ---
4855
4876
  if (url === '/api/probe/status' && req.method === 'GET') {
4856
4877
  const config = (0, config_1.loadProbeConfig)(path.join(projectRoot, 'probe.config.yml'));
4857
- const checks = config ? config.checks.map(c => ({ name: c.name, steps: c.steps.length })) : null;
4878
+ const settings = loadProbeSettings();
4879
+ const effectiveTarget = settings.target || (config ? config.target : null);
4880
+ const checks = config ? config.checks.map(c => ({ name: c.name, type: c.file ? 'file' : 'dsl', steps: c.steps?.length ?? 0 })) : null;
4858
4881
  res.writeHead(200, jsonH);
4859
- res.end(JSON.stringify({ ...probeState, checks, configFound: !!config }));
4882
+ res.end(JSON.stringify({ ...probeState, checks, configFound: !!config, effectiveTarget }));
4860
4883
  return;
4861
4884
  }
4862
4885
  if (url === '/api/probe/run' && req.method === 'POST') {
@@ -4912,31 +4935,42 @@ a{color:var(--blue)}
4912
4935
  res.end(JSON.stringify({ ok: true }));
4913
4936
  return;
4914
4937
  }
4915
- if (url === '/api/probe/notify-config' && req.method === 'GET') {
4916
- const saved = loadProbeNotifyConfig();
4917
- const masked = saved?.telegram ? {
4918
- botToken: saved.telegram.botToken ? saved.telegram.botToken.slice(0, 8) + '••••••••' : '',
4919
- chatId: saved.telegram.chatId || '',
4938
+ if (url === '/api/probe/settings' && req.method === 'GET') {
4939
+ const s = loadProbeSettings();
4940
+ const masked = s.telegram ? {
4941
+ botToken: s.telegram.botToken ? s.telegram.botToken.slice(0, 8) + '••••••••' : '',
4942
+ chatId: s.telegram.chatId || '',
4920
4943
  } : null;
4921
4944
  res.writeHead(200, jsonH);
4922
- res.end(JSON.stringify({ telegram: masked }));
4945
+ res.end(JSON.stringify({
4946
+ target: s.target || '',
4947
+ telegram: masked,
4948
+ e2eEmail: s.e2eEmail || '',
4949
+ e2ePasswordSet: !!s.e2ePassword,
4950
+ }));
4923
4951
  return;
4924
4952
  }
4925
- if (url === '/api/probe/notify-config' && req.method === 'POST') {
4953
+ if (url === '/api/probe/settings' && req.method === 'POST') {
4926
4954
  let body = '';
4927
4955
  req.on('data', (d) => { body += d; });
4928
4956
  req.on('end', () => {
4929
4957
  try {
4930
- const { botToken, chatId } = JSON.parse(body);
4931
- if (!botToken || !chatId) {
4932
- res.writeHead(400, jsonH);
4933
- res.end(JSON.stringify({ error: 'botToken and chatId are required' }));
4934
- return;
4935
- }
4936
- const dir = path.join(projectRoot, '.viberadar');
4937
- if (!fs.existsSync(dir))
4938
- fs.mkdirSync(dir, { recursive: true });
4939
- fs.writeFileSync(path.join(dir, 'probe-notify.json'), JSON.stringify({ telegram: { botToken, chatId } }, null, 2), 'utf-8');
4958
+ const { target, botToken, chatId, e2eEmail, e2ePassword } = JSON.parse(body);
4959
+ const current = loadProbeSettings();
4960
+ const updated = { ...current };
4961
+ if (target !== undefined)
4962
+ updated.target = target || undefined;
4963
+ if (botToken && chatId)
4964
+ updated.telegram = { botToken, chatId };
4965
+ else if (botToken === '' && chatId === '')
4966
+ delete updated.telegram;
4967
+ if (e2eEmail !== undefined)
4968
+ updated.e2eEmail = e2eEmail || undefined;
4969
+ if (e2ePassword)
4970
+ updated.e2ePassword = e2ePassword;
4971
+ else if (e2ePassword === '')
4972
+ delete updated.e2ePassword;
4973
+ saveProbeSettings(updated);
4940
4974
  res.writeHead(200, jsonH);
4941
4975
  res.end(JSON.stringify({ ok: true }));
4942
4976
  }