document360-capture 0.1.4 → 0.2.1

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.
Files changed (52) hide show
  1. package/LICENSE +10 -16
  2. package/README.md +1 -1
  3. package/dist/cli.js +21 -64
  4. package/dist/commands/auth.d.ts +1 -1
  5. package/dist/commands/capture.d.ts +1 -1
  6. package/dist/commands/doctor.d.ts +1 -1
  7. package/dist/commands/init.d.ts +5 -1
  8. package/dist/commands/profile.d.ts +3 -0
  9. package/dist/config/authState.d.ts +2 -2
  10. package/dist/config/projectConfig.d.ts +90 -9
  11. package/dist/config/writerConfigDefaults.d.ts +18 -0
  12. package/dist/helpers/index.js +1 -3
  13. package/dist/runner/playwrightConfig.d.ts +6 -3
  14. package/dist/scripts/postinstall.js +1 -18
  15. package/package.json +5 -4
  16. package/dist/annotate/compose.js +0 -65
  17. package/dist/annotate/compose.js.map +0 -1
  18. package/dist/annotate/svg.js +0 -42
  19. package/dist/annotate/svg.js.map +0 -1
  20. package/dist/cli.js.map +0 -1
  21. package/dist/commands/auth.js +0 -71
  22. package/dist/commands/auth.js.map +0 -1
  23. package/dist/commands/capture.js +0 -83
  24. package/dist/commands/capture.js.map +0 -1
  25. package/dist/commands/doctor.js +0 -96
  26. package/dist/commands/doctor.js.map +0 -1
  27. package/dist/commands/init.js +0 -97
  28. package/dist/commands/init.js.map +0 -1
  29. package/dist/commands/list.js +0 -33
  30. package/dist/commands/list.js.map +0 -1
  31. package/dist/commands/status.js +0 -24
  32. package/dist/commands/status.js.map +0 -1
  33. package/dist/config/authState.js +0 -27
  34. package/dist/config/authState.js.map +0 -1
  35. package/dist/config/projectConfig.js +0 -43
  36. package/dist/config/projectConfig.js.map +0 -1
  37. package/dist/config/userConfig.js +0 -24
  38. package/dist/config/userConfig.js.map +0 -1
  39. package/dist/helpers/dumpAnnotations.js +0 -39
  40. package/dist/helpers/dumpAnnotations.js.map +0 -1
  41. package/dist/helpers/index.js.map +0 -1
  42. package/dist/helpers/types.js +0 -2
  43. package/dist/helpers/types.js.map +0 -1
  44. package/dist/helpers/waitPastLogin.js +0 -7
  45. package/dist/helpers/waitPastLogin.js.map +0 -1
  46. package/dist/runner/expiryDetect.js +0 -19
  47. package/dist/runner/expiryDetect.js.map +0 -1
  48. package/dist/runner/playwrightConfig.js +0 -71
  49. package/dist/runner/playwrightConfig.js.map +0 -1
  50. package/dist/runner/runSpecs.js +0 -88
  51. package/dist/runner/runSpecs.js.map +0 -1
  52. package/dist/scripts/postinstall.js.map +0 -1
@@ -1,71 +0,0 @@
1
- import { chromium } from 'playwright';
2
- import { findProjectConfigPath, readProjectConfig, resolveEnv, } from '../config/projectConfig.js';
3
- import { authStatePath, ensureAuthStateDir } from '../config/authState.js';
4
- export async function authCommand(opts) {
5
- const cfg = readProjectConfig(findProjectConfigPath());
6
- const { name: envName, env } = resolveEnv(cfg, opts.env);
7
- ensureAuthStateDir(cfg.projectId);
8
- const savePath = authStatePath(cfg.projectId, envName);
9
- console.log('');
10
- console.log(`Opening Chromium against ${env.startUrl}`);
11
- console.log(`Auth-state will save to: ${savePath}`);
12
- console.log('');
13
- const browser = await chromium.launch({
14
- headless: false,
15
- args: ['--start-maximized'],
16
- });
17
- const context = await browser.newContext({ viewport: null });
18
- const page = await context.newPage();
19
- await page.goto(env.startUrl, { waitUntil: 'domcontentloaded' });
20
- console.log('────────────────────────────────────────────────────────────');
21
- console.log(' Log in fully (MFA included) at your own pace.');
22
- console.log(' When you reach the post-login app, come back to this');
23
- console.log(' terminal and press ENTER to save the session.');
24
- console.log('────────────────────────────────────────────────────────────');
25
- console.log('');
26
- const boundary = new RegExp(env.authBoundaryUrlPattern);
27
- // Crash-protection autosave — but only once the browser is past the login
28
- // boundary. Saving mid-login persists a half-baked state (context cookies,
29
- // no session cookie) that later fails captures while `doctor` reports it
30
- // as present.
31
- const safetyInterval = setInterval(() => {
32
- if (boundary.test(page.url())) {
33
- void context.storageState({ path: savePath }).catch(() => { });
34
- }
35
- }, 30_000);
36
- try {
37
- // Refuse to save until the page is back inside the app — pressing ENTER
38
- // on the identity provider's login page must not persist a broken state.
39
- for (;;) {
40
- await waitForEnter();
41
- const url = page.url();
42
- if (boundary.test(url))
43
- break;
44
- console.log('');
45
- console.log(`✗ Login doesn't look complete yet — the browser is still at:`);
46
- console.log(` ${url}`);
47
- console.log(' Finish logging in until you can see the app, then press ENTER again.');
48
- console.log(' (Ctrl+C aborts without saving.)');
49
- }
50
- await context.storageState({ path: savePath });
51
- console.log('');
52
- console.log(`✓ Session saved to ${savePath}`);
53
- console.log(' This file contains session cookies — never commit it to git.');
54
- }
55
- finally {
56
- clearInterval(safetyInterval);
57
- await browser.close().catch(() => { });
58
- }
59
- }
60
- function waitForEnter() {
61
- return new Promise(resolve => {
62
- const onData = () => {
63
- process.stdin.off('data', onData);
64
- process.stdin.pause();
65
- resolve();
66
- };
67
- process.stdin.resume();
68
- process.stdin.once('data', onData);
69
- });
70
- }
71
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { isAbsolute, resolve } from 'node:path';
3
- import { findProjectConfigPath, readProjectConfig, resolveEnv, } from '../config/projectConfig.js';
4
- import { authStatePath, getAuthStateInfo } from '../config/authState.js';
5
- import { writeRuntimePlaywrightConfig } from '../runner/playwrightConfig.js';
6
- import { runSpecs } from '../runner/runSpecs.js';
7
- import { looksLikeSessionExpiry } from '../runner/expiryDetect.js';
8
- import { composeAnnotations } from '../annotate/compose.js';
9
- export async function captureCommand(specId, opts) {
10
- const cwd = process.cwd();
11
- const cfg = readProjectConfig(findProjectConfigPath(cwd));
12
- const { name: envName, env } = resolveEnv(cfg, opts.env);
13
- const info = getAuthStateInfo(cfg.projectId, envName);
14
- if (!info.exists) {
15
- console.error('');
16
- console.error(`✗ No saved session for env "${envName}".`);
17
- console.error(` Expected at: ${info.path}`);
18
- console.error(` Run: d360-capture auth --env ${envName}`);
19
- return 2;
20
- }
21
- const captureDirAbs = isAbsolute(cfg.captureDir) ? cfg.captureDir : resolve(cwd, cfg.captureDir);
22
- if (!existsSync(captureDirAbs)) {
23
- console.error(`✗ Capture directory missing: ${captureDirAbs}`);
24
- console.error(' Generate at least one spec there before running capture.');
25
- return 2;
26
- }
27
- const { configPath, tsconfigPath } = writeRuntimePlaywrightConfig({
28
- cwd,
29
- cfg,
30
- envName,
31
- storageStatePath: authStatePath(cfg.projectId, envName),
32
- });
33
- console.log('');
34
- console.log(`▶ Running specs against ${envName} (${env.startUrl})`);
35
- if (specId)
36
- console.log(` Single spec: ${specId}`);
37
- else
38
- console.log(` All specs in ${cfg.captureDir}`);
39
- console.log('');
40
- const result = await runSpecs({
41
- cwd,
42
- configPath,
43
- tsconfigPath,
44
- startUrl: env.startUrl,
45
- authBoundaryUrlPattern: env.authBoundaryUrlPattern,
46
- specId,
47
- captureDirAbs,
48
- });
49
- if (result.exitCode !== 0) {
50
- const combined = result.stdout + '\n' + result.stderr;
51
- console.error('');
52
- console.error(`✗ Playwright exited with code ${result.exitCode}`);
53
- // Login-page signatures in the output are a HINT, not proof — call logs
54
- // legitimately mention .auth/login redirects even when the saved session
55
- // worked. Surface expiry as a hypothesis alongside the real failure
56
- // instead of swallowing it.
57
- if (looksLikeSessionExpiry(combined)) {
58
- console.error('');
59
- console.error(' The output mentions a login page — if specs that previously passed now');
60
- console.error(` fail this way, your saved session may have expired. Re-auth with:`);
61
- console.error(` d360-capture auth --env ${envName}`);
62
- console.error(' Otherwise, inspect the failure above (selector timeouts are spec bugs,');
63
- console.error(' not auth bugs) and the error-context file Playwright printed.');
64
- }
65
- return result.exitCode;
66
- }
67
- const annotateEnabled = !opts.noAnnotate && cfg.annotation.enabled;
68
- const outputDirAbs = isAbsolute(cfg.outputDir) ? cfg.outputDir : resolve(cwd, cfg.outputDir);
69
- console.log('');
70
- console.log(annotateEnabled ? '▶ Annotating screenshots...' : '▶ Skipping annotation (--no-annotate or config off)');
71
- const annotated = await composeAnnotations(outputDirAbs, annotateEnabled);
72
- const ok = annotated.filter(r => r.ok).length;
73
- const failed = annotated.filter(r => !r.ok);
74
- console.log('');
75
- console.log(`✓ ${ok} screenshot${ok === 1 ? '' : 's'} ready in ${cfg.outputDir}`);
76
- if (failed.length > 0) {
77
- console.log(`✗ ${failed.length} annotation failure${failed.length === 1 ? '' : 's'}:`);
78
- for (const f of failed)
79
- console.log(` - ${f.id}: ${f.reason}`);
80
- }
81
- return failed.length === 0 ? 0 : 1;
82
- }
83
- //# sourceMappingURL=capture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
@@ -1,96 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { isAbsolute, resolve } from 'node:path';
3
- import { createRequire } from 'node:module';
4
- import { findProjectConfigPath, readProjectConfig, resolveEnv, } from '../config/projectConfig.js';
5
- import { getAuthStateInfo } from '../config/authState.js';
6
- const require = createRequire(import.meta.url);
7
- export async function doctorCommand(opts) {
8
- const cwd = process.cwd();
9
- let failures = 0;
10
- const ok = (msg) => console.log(` ✓ ${msg}`);
11
- const fail = (msg) => {
12
- console.log(` ✗ ${msg}`);
13
- failures++;
14
- };
15
- console.log('');
16
- console.log('Checking document360-capture setup...');
17
- console.log('');
18
- const cfgPath = findProjectConfigPath(cwd);
19
- if (!existsSync(cfgPath)) {
20
- fail(`Project config missing at ${cfgPath} — run \`d360-capture init\``);
21
- return 2;
22
- }
23
- ok(`Project config: ${cfgPath}`);
24
- let cfg;
25
- try {
26
- cfg = readProjectConfig(cfgPath);
27
- ok(`Config parses; projectId="${cfg.projectId}"`);
28
- }
29
- catch (err) {
30
- fail(`Config invalid: ${err.message}`);
31
- return 2;
32
- }
33
- const captureDirAbs = isAbsolute(cfg.captureDir) ? cfg.captureDir : resolve(cwd, cfg.captureDir);
34
- if (existsSync(captureDirAbs))
35
- ok(`Capture dir exists: ${cfg.captureDir}`);
36
- else
37
- fail(`Capture dir missing: ${cfg.captureDir}`);
38
- let env;
39
- try {
40
- env = resolveEnv(cfg, opts.env);
41
- ok(`Environment "${env.name}" resolved (startUrl=${env.env.startUrl})`);
42
- }
43
- catch (err) {
44
- fail(`Environment resolve failed: ${err.message}`);
45
- return 1;
46
- }
47
- const info = getAuthStateInfo(cfg.projectId, env.name);
48
- if (info.exists) {
49
- const ageDays = info.ageMs != null ? Math.floor(info.ageMs / 86_400_000) : null;
50
- ok(`Auth-state present (${ageDays}d old): ${info.path}`);
51
- try {
52
- const parsed = JSON.parse(readFileSync(info.path, 'utf8'));
53
- if (parsed && typeof parsed === 'object')
54
- ok('Auth-state parses as JSON');
55
- else
56
- fail('Auth-state is not a valid object');
57
- }
58
- catch (err) {
59
- fail(`Auth-state unreadable: ${err.message}`);
60
- }
61
- }
62
- else {
63
- fail(`Auth-state missing for "${env.name}" — run \`d360-capture auth --env ${env.name}\``);
64
- }
65
- try {
66
- const playwrightPkg = require.resolve('playwright/package.json');
67
- const pkg = JSON.parse(readFileSync(playwrightPkg, 'utf8'));
68
- ok(`playwright@${pkg.version} installed`);
69
- }
70
- catch {
71
- fail('playwright not resolvable — reinstall document360-capture');
72
- }
73
- // Newer @playwright/test versions export './cli'; older ones only the
74
- // literal './cli.js'. Accept either (mirrors runSpecs.resolvePlaywrightCli).
75
- const cliShapes = ['@playwright/test/cli', '@playwright/test/cli.js'];
76
- if (cliShapes.some(shape => { try {
77
- require.resolve(shape);
78
- return true;
79
- }
80
- catch {
81
- return false;
82
- } })) {
83
- ok('@playwright/test CLI resolvable');
84
- }
85
- else {
86
- fail('@playwright/test CLI not resolvable — reinstall document360-capture');
87
- }
88
- console.log('');
89
- if (failures === 0)
90
- console.log('All checks passed.');
91
- else
92
- console.log(`${failures} check${failures === 1 ? '' : 's'} failed.`);
93
- console.log('');
94
- return failures === 0 ? 0 : 1;
95
- }
96
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,97 +0,0 @@
1
- import { input, confirm } from '@inquirer/prompts';
2
- import { existsSync, readFileSync } from 'node:fs';
3
- import { basename, join } from 'node:path';
4
- import { findProjectConfigPath, writeProjectConfig, } from '../config/projectConfig.js';
5
- export async function initCommand() {
6
- const cwd = process.cwd();
7
- const path = findProjectConfigPath(cwd);
8
- if (existsSync(path)) {
9
- const overwrite = await confirm({
10
- message: `${path} already exists. Overwrite?`,
11
- default: false,
12
- });
13
- if (!overwrite) {
14
- console.log('Init cancelled.');
15
- return;
16
- }
17
- }
18
- const defaultProjectId = readPackageName(cwd) ?? basename(cwd);
19
- const projectId = await input({
20
- message: 'Project ID (used to scope auth-state on disk):',
21
- default: defaultProjectId,
22
- validate: v => (v.trim().length > 0 ? true : 'Project ID is required'),
23
- });
24
- const captureDir = await input({
25
- message: 'Capture directory (where .spec.ts files live):',
26
- default: 'user-docs/_capture',
27
- });
28
- const outputDir = await input({
29
- message: 'Output directory (where final .png files land):',
30
- default: 'user-docs/_screenshots',
31
- });
32
- const viewportInput = await input({
33
- message: 'Viewport (WIDTHxHEIGHT):',
34
- default: '1440x900',
35
- validate: v => /^\d+x\d+$/.test(v) || 'Use WIDTHxHEIGHT, e.g. 1440x900',
36
- });
37
- const [w, h] = viewportInput.split('x').map(Number);
38
- const stagingUrl = await input({
39
- message: 'Staging URL (where captures start):',
40
- default: 'https://example.com/',
41
- validate: v => (v.startsWith('http') ? true : 'Must be a full URL'),
42
- });
43
- const authBoundary = await input({
44
- message: 'Auth boundary URL pattern (regex matching post-login routes):',
45
- default: '/\\/(home|app|projects|dashboard)(/|$)/',
46
- });
47
- const addProd = await confirm({
48
- message: 'Add a "prod" environment too?',
49
- default: true,
50
- });
51
- const environments = {
52
- staging: { startUrl: stagingUrl, authBoundaryUrlPattern: authBoundary },
53
- };
54
- if (addProd) {
55
- const prodUrl = await input({
56
- message: 'Prod URL:',
57
- default: stagingUrl.replace(/staging\./, ''),
58
- validate: v => (v.startsWith('http') ? true : 'Must be a full URL'),
59
- });
60
- environments.prod = { startUrl: prodUrl, authBoundaryUrlPattern: authBoundary };
61
- }
62
- const annotate = await confirm({
63
- message: 'Enable annotation overlays (highlights, callouts, redactions) by default?',
64
- default: true,
65
- });
66
- const cfg = {
67
- projectId,
68
- captureDir,
69
- outputDir,
70
- viewport: { width: w, height: h },
71
- loginTimeoutMs: 0,
72
- annotation: { enabled: annotate },
73
- environments,
74
- defaultEnvironment: 'staging',
75
- };
76
- writeProjectConfig(path, cfg);
77
- console.log('');
78
- console.log(`✓ Wrote ${path}`);
79
- console.log('');
80
- console.log('Next steps:');
81
- console.log(' 1. d360-capture auth --env staging # log in once, no timeout');
82
- console.log(' 2. d360-capture capture # run all specs in captureDir');
83
- console.log('');
84
- }
85
- function readPackageName(cwd) {
86
- const path = join(cwd, 'package.json');
87
- if (!existsSync(path))
88
- return null;
89
- try {
90
- const pkg = JSON.parse(readFileSync(path, 'utf8'));
91
- return pkg.name ?? null;
92
- }
93
- catch {
94
- return null;
95
- }
96
- }
97
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { existsSync, readdirSync, statSync } from 'node:fs';
2
- import { isAbsolute, join, resolve } from 'node:path';
3
- import { findProjectConfigPath, readProjectConfig } from '../config/projectConfig.js';
4
- export async function listCommand() {
5
- const cwd = process.cwd();
6
- const cfg = readProjectConfig(findProjectConfigPath(cwd));
7
- const captureDirAbs = isAbsolute(cfg.captureDir) ? cfg.captureDir : resolve(cwd, cfg.captureDir);
8
- const outputDirAbs = isAbsolute(cfg.outputDir) ? cfg.outputDir : resolve(cwd, cfg.outputDir);
9
- if (!existsSync(captureDirAbs)) {
10
- console.log(`Capture dir does not exist: ${captureDirAbs}`);
11
- return;
12
- }
13
- const specs = readdirSync(captureDirAbs)
14
- .filter(f => f.endsWith('.spec.ts'))
15
- .sort();
16
- if (specs.length === 0) {
17
- console.log(`No specs found in ${cfg.captureDir}.`);
18
- return;
19
- }
20
- console.log('');
21
- console.log(' Spec ID Last capture');
22
- console.log(' ─────────────────────────────────────────────── ───────────────────');
23
- for (const f of specs) {
24
- const id = f.replace(/\.spec\.ts$/, '');
25
- const finalPath = join(outputDirAbs, `${id}.png`);
26
- const lastCapture = existsSync(finalPath)
27
- ? new Date(statSync(finalPath).mtimeMs).toISOString().slice(0, 19).replace('T', ' ')
28
- : '(never)';
29
- console.log(` ${id.padEnd(47)} ${lastCapture}`);
30
- }
31
- console.log('');
32
- }
33
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACjG,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAE7F,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;SACnC,IAAI,EAAE,CAAC;IAEV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC;YACvC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;YACpF,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,24 +0,0 @@
1
- import { findProjectConfigPath, readProjectConfig } from '../config/projectConfig.js';
2
- import { getAuthStateInfo } from '../config/authState.js';
3
- export async function statusCommand() {
4
- const cfg = readProjectConfig(findProjectConfigPath());
5
- console.log('');
6
- console.log(`projectId: ${cfg.projectId}`);
7
- console.log(`captureDir: ${cfg.captureDir}`);
8
- console.log(`outputDir: ${cfg.outputDir}`);
9
- console.log(`viewport: ${cfg.viewport.width}x${cfg.viewport.height}`);
10
- console.log(`annotation enabled: ${cfg.annotation.enabled}`);
11
- console.log(`defaultEnvironment: ${cfg.defaultEnvironment}`);
12
- console.log('');
13
- console.log('Environments:');
14
- for (const [name, env] of Object.entries(cfg.environments)) {
15
- const info = getAuthStateInfo(cfg.projectId, name);
16
- const authStatus = info.exists
17
- ? `auth saved ${info.ageMs != null ? Math.floor(info.ageMs / 86_400_000) + 'd ago' : ''}`
18
- : 'no auth-state';
19
- console.log(` ${name.padEnd(10)} ${env.startUrl}`);
20
- console.log(` ${authStatus}`);
21
- }
22
- console.log('');
23
- }
24
- //# sourceMappingURL=status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM;YAC5B,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACzF,CAAC,CAAC,eAAe,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,27 +0,0 @@
1
- import { existsSync, mkdirSync, statSync } from 'node:fs';
2
- import { homedir } from 'node:os';
3
- import { join, dirname } from 'node:path';
4
- export function authStateDir() {
5
- return join(homedir(), '.document360-capture', 'auth-states');
6
- }
7
- export function authStatePath(projectId, envName) {
8
- return join(authStateDir(), projectId, `${envName}.json`);
9
- }
10
- export function ensureAuthStateDir(projectId) {
11
- const dir = join(authStateDir(), projectId);
12
- if (!existsSync(dir))
13
- mkdirSync(dir, { recursive: true });
14
- }
15
- export function getAuthStateInfo(projectId, envName) {
16
- const path = authStatePath(projectId, envName);
17
- if (!existsSync(path))
18
- return { path, exists: false };
19
- const stat = statSync(path);
20
- return { path, exists: true, ageMs: Date.now() - stat.mtimeMs };
21
- }
22
- export function ensureParentDir(path) {
23
- const parent = dirname(path);
24
- if (!existsSync(parent))
25
- mkdirSync(parent, { recursive: true });
26
- }
27
- //# sourceMappingURL=authState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authState.js","sourceRoot":"","sources":["../../src/config/authState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,OAAe;IAC9D,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,OAAe;IACjE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -1,43 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- export const PROJECT_CONFIG_FILENAME = '.d360-capture.json';
4
- export function findProjectConfigPath(cwd = process.cwd()) {
5
- return join(cwd, PROJECT_CONFIG_FILENAME);
6
- }
7
- export function readProjectConfig(path) {
8
- if (!existsSync(path)) {
9
- throw new Error(`No project config at ${path}. Run \`d360-capture init\` to create one.`);
10
- }
11
- const raw = JSON.parse(readFileSync(path, 'utf8'));
12
- validateProjectConfig(raw, path);
13
- return raw;
14
- }
15
- export function writeProjectConfig(path, cfg) {
16
- writeFileSync(path, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
17
- }
18
- export function resolveEnv(cfg, name) {
19
- const resolved = name ?? cfg.defaultEnvironment;
20
- const env = cfg.environments[resolved];
21
- if (!env) {
22
- const available = Object.keys(cfg.environments).join(', ');
23
- throw new Error(`Unknown environment "${resolved}". Available: ${available}`);
24
- }
25
- return { name: resolved, env };
26
- }
27
- function validateProjectConfig(cfg, path) {
28
- const missing = [];
29
- if (!cfg.projectId)
30
- missing.push('projectId');
31
- if (!cfg.captureDir)
32
- missing.push('captureDir');
33
- if (!cfg.outputDir)
34
- missing.push('outputDir');
35
- if (!cfg.environments || Object.keys(cfg.environments).length === 0)
36
- missing.push('environments');
37
- if (!cfg.defaultEnvironment)
38
- missing.push('defaultEnvironment');
39
- if (missing.length > 0) {
40
- throw new Error(`Invalid config at ${path}: missing ${missing.join(', ')}`);
41
- }
42
- }
43
- //# sourceMappingURL=projectConfig.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/config/projectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkBjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAE5D,MAAM,UAAU,qBAAqB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/D,OAAO,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,4CAA4C,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;IACpE,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,GAAkB;IACjE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAkB,EAAE,IAAa;IAC1D,MAAM,QAAQ,GAAG,IAAI,IAAI,GAAG,CAAC,kBAAkB,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,iBAAiB,SAAS,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAkB,EAAE,IAAY;IAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,IAAI,CAAC,GAAG,CAAC,kBAAkB;QAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -1,24 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
- import { homedir } from 'node:os';
3
- import { join, dirname } from 'node:path';
4
- const PATH = join(homedir(), '.document360-capture', 'config.json');
5
- export function userConfigPath() {
6
- return PATH;
7
- }
8
- export function readUserConfig() {
9
- if (!existsSync(PATH))
10
- return {};
11
- try {
12
- return JSON.parse(readFileSync(PATH, 'utf8'));
13
- }
14
- catch {
15
- return {};
16
- }
17
- }
18
- export function writeUserConfig(cfg) {
19
- const dir = dirname(PATH);
20
- if (!existsSync(dir))
21
- mkdirSync(dir, { recursive: true });
22
- writeFileSync(PATH, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
23
- }
24
- //# sourceMappingURL=userConfig.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"userConfig.js","sourceRoot":"","sources":["../../src/config/userConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAM1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAEpE,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC"}
@@ -1,39 +0,0 @@
1
- import { writeFileSync, mkdirSync } from 'node:fs';
2
- import { dirname } from 'node:path';
3
- async function bboxOrNull(page, selector) {
4
- try {
5
- const loc = page.locator(selector).first();
6
- await loc.waitFor({ state: 'visible', timeout: 2_000 });
7
- return await loc.boundingBox();
8
- }
9
- catch {
10
- return null;
11
- }
12
- }
13
- export async function dumpAnnotations(page, ph) {
14
- const rawPath = ph.saveTo;
15
- const finalPath = rawPath.replace(/\.raw\.png$/, '.png');
16
- const highlight = [];
17
- for (const selector of ph.highlight ?? []) {
18
- const bbox = await bboxOrNull(page, selector);
19
- if (bbox)
20
- highlight.push({ selector, bbox });
21
- }
22
- const annotations = [];
23
- for (const ann of ph.annotations ?? []) {
24
- const bbox = await bboxOrNull(page, ann.target);
25
- if (bbox)
26
- annotations.push({ label: ann.label, text: ann.text, selector: ann.target, bbox });
27
- }
28
- const redact = [];
29
- for (const selector of ph.redact ?? []) {
30
- const bbox = await bboxOrNull(page, selector);
31
- if (bbox)
32
- redact.push({ selector, bbox });
33
- }
34
- const resolved = { id: ph.id, rawPath, finalPath, highlight, annotations, redact };
35
- const jsonPath = rawPath.replace(/\.raw\.png$/, '.annotations.json');
36
- mkdirSync(dirname(jsonPath), { recursive: true });
37
- writeFileSync(jsonPath, JSON.stringify(resolved, null, 2), 'utf8');
38
- }
39
- //# sourceMappingURL=dumpAnnotations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dumpAnnotations.js","sourceRoot":"","sources":["../../src/helpers/dumpAnnotations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,KAAK,UAAU,UAAU,CAAC,IAAU,EAAE,QAAgB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,EAAe;IAC/D,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAqC,EAAE,CAAC;IACvD,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,WAAW,GAAuC,EAAE,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACxG,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACrE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/helpers/types.ts"],"names":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- export async function waitPastLogin(page, pattern, timeoutMs = 0) {
2
- if (pattern.test(page.url()))
3
- return;
4
- const effective = timeoutMs > 0 ? timeoutMs : 600_000;
5
- await page.waitForURL(pattern, { timeout: effective });
6
- }
7
- //# sourceMappingURL=waitPastLogin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"waitPastLogin.js","sourceRoot":"","sources":["../../src/helpers/waitPastLogin.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,OAAe,EACf,YAAoB,CAAC;IAErB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAAE,OAAO;IACrC,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AACzD,CAAC"}