document360-capture 0.2.0 → 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.
- package/LICENSE +10 -16
- package/README.md +1 -1
- package/dist/cli.js +21 -91
- package/dist/commands/init.d.ts +5 -1
- package/dist/config/projectConfig.d.ts +60 -5
- package/dist/config/writerConfigDefaults.d.ts +18 -0
- package/dist/helpers/index.js +1 -3
- package/dist/scripts/postinstall.js +1 -18
- package/package.json +3 -3
- package/dist/annotate/compose.js +0 -65
- package/dist/annotate/compose.js.map +0 -1
- package/dist/annotate/svg.js +0 -42
- package/dist/annotate/svg.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/auth.js +0 -73
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/capture.js +0 -87
- package/dist/commands/capture.js.map +0 -1
- package/dist/commands/doctor.js +0 -96
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/init.js +0 -100
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -33
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/profile.js +0 -43
- package/dist/commands/profile.js.map +0 -1
- package/dist/commands/status.js +0 -27
- package/dist/commands/status.js.map +0 -1
- package/dist/config/authState.js +0 -27
- package/dist/config/authState.js.map +0 -1
- package/dist/config/projectConfig.js +0 -59
- package/dist/config/projectConfig.js.map +0 -1
- package/dist/config/userConfig.js +0 -24
- package/dist/config/userConfig.js.map +0 -1
- package/dist/helpers/dumpAnnotations.js +0 -39
- package/dist/helpers/dumpAnnotations.js.map +0 -1
- package/dist/helpers/index.js.map +0 -1
- package/dist/helpers/types.js +0 -2
- package/dist/helpers/types.js.map +0 -1
- package/dist/helpers/waitPastLogin.js +0 -7
- package/dist/helpers/waitPastLogin.js.map +0 -1
- package/dist/runner/expiryDetect.js +0 -19
- package/dist/runner/expiryDetect.js.map +0 -1
- package/dist/runner/playwrightConfig.js +0 -71
- package/dist/runner/playwrightConfig.js.map +0 -1
- package/dist/runner/runSpecs.js +0 -88
- package/dist/runner/runSpecs.js.map +0 -1
- package/dist/scripts/postinstall.js.map +0 -1
package/dist/commands/capture.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
-
import { findProjectConfigPath, readProjectConfig, resolveProfile, } 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 profile = resolveProfile(cfg, opts.profile);
|
|
13
|
-
const profileName = profile.name;
|
|
14
|
-
const info = getAuthStateInfo(cfg.projectId, profileName);
|
|
15
|
-
if (!info.exists) {
|
|
16
|
-
console.error('');
|
|
17
|
-
console.error(`✗ No saved session for profile "${profileName}".`);
|
|
18
|
-
console.error(` Expected at: ${info.path}`);
|
|
19
|
-
console.error(` Run: d360-capture auth --profile ${profileName}`);
|
|
20
|
-
return 2;
|
|
21
|
-
}
|
|
22
|
-
const captureDirAbs = isAbsolute(profile.captureDir) ? profile.captureDir : resolve(cwd, profile.captureDir);
|
|
23
|
-
if (!existsSync(captureDirAbs)) {
|
|
24
|
-
console.error(`✗ Capture directory missing: ${captureDirAbs}`);
|
|
25
|
-
console.error(' Generate at least one spec there before running capture.');
|
|
26
|
-
return 2;
|
|
27
|
-
}
|
|
28
|
-
const { configPath, tsconfigPath } = writeRuntimePlaywrightConfig({
|
|
29
|
-
cwd,
|
|
30
|
-
profileName,
|
|
31
|
-
captureDir: profile.captureDir,
|
|
32
|
-
viewport: profile.viewport,
|
|
33
|
-
storageStatePath: authStatePath(cfg.projectId, profileName),
|
|
34
|
-
});
|
|
35
|
-
console.log('');
|
|
36
|
-
if (profile.production)
|
|
37
|
-
console.log(`⚠ Profile "${profileName}" is PRODUCTION (read-only capture).`);
|
|
38
|
-
console.log(`▶ Running specs against ${profileName} (${profile.connection.startUrl})`);
|
|
39
|
-
if (specId)
|
|
40
|
-
console.log(` Single spec: ${specId}`);
|
|
41
|
-
else
|
|
42
|
-
console.log(` All specs in ${profile.captureDir}`);
|
|
43
|
-
console.log('');
|
|
44
|
-
const result = await runSpecs({
|
|
45
|
-
cwd,
|
|
46
|
-
configPath,
|
|
47
|
-
tsconfigPath,
|
|
48
|
-
startUrl: profile.connection.startUrl,
|
|
49
|
-
authBoundaryUrlPattern: profile.connection.authBoundaryUrlPattern,
|
|
50
|
-
specId,
|
|
51
|
-
captureDirAbs,
|
|
52
|
-
});
|
|
53
|
-
if (result.exitCode !== 0) {
|
|
54
|
-
const combined = result.stdout + '\n' + result.stderr;
|
|
55
|
-
console.error('');
|
|
56
|
-
console.error(`✗ Playwright exited with code ${result.exitCode}`);
|
|
57
|
-
// Login-page signatures in the output are a HINT, not proof — call logs
|
|
58
|
-
// legitimately mention .auth/login redirects even when the saved session
|
|
59
|
-
// worked. Surface expiry as a hypothesis alongside the real failure
|
|
60
|
-
// instead of swallowing it.
|
|
61
|
-
if (looksLikeSessionExpiry(combined)) {
|
|
62
|
-
console.error('');
|
|
63
|
-
console.error(' The output mentions a login page — if specs that previously passed now');
|
|
64
|
-
console.error(` fail this way, your saved session may have expired. Re-auth with:`);
|
|
65
|
-
console.error(` d360-capture auth --profile ${profileName}`);
|
|
66
|
-
console.error(' Otherwise, inspect the failure above (selector timeouts are spec bugs,');
|
|
67
|
-
console.error(' not auth bugs) and the error-context file Playwright printed.');
|
|
68
|
-
}
|
|
69
|
-
return result.exitCode;
|
|
70
|
-
}
|
|
71
|
-
const annotateEnabled = !opts.noAnnotate && cfg.annotation.enabled;
|
|
72
|
-
const outputDirAbs = isAbsolute(profile.outputDir) ? profile.outputDir : resolve(cwd, profile.outputDir);
|
|
73
|
-
console.log('');
|
|
74
|
-
console.log(annotateEnabled ? '▶ Annotating screenshots...' : '▶ Skipping annotation (--no-annotate or config off)');
|
|
75
|
-
const annotated = await composeAnnotations(outputDirAbs, annotateEnabled);
|
|
76
|
-
const ok = annotated.filter(r => r.ok).length;
|
|
77
|
-
const failed = annotated.filter(r => !r.ok);
|
|
78
|
-
console.log('');
|
|
79
|
-
console.log(`✓ ${ok} screenshot${ok === 1 ? '' : 's'} ready in ${profile.outputDir}`);
|
|
80
|
-
if (failed.length > 0) {
|
|
81
|
-
console.log(`✗ ${failed.length} annotation failure${failed.length === 1 ? '' : 's'}:`);
|
|
82
|
-
for (const f of failed)
|
|
83
|
-
console.log(` - ${f.id}: ${f.reason}`);
|
|
84
|
-
}
|
|
85
|
-
return failed.length === 0 ? 0 : 1;
|
|
86
|
-
}
|
|
87
|
-
//# 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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"}
|
package/dist/commands/doctor.js
DELETED
|
@@ -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, resolveProfile, } 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
|
-
let profile;
|
|
34
|
-
try {
|
|
35
|
-
profile = resolveProfile(cfg, opts.profile);
|
|
36
|
-
ok(`Profile "${profile.name}" resolved (startUrl=${profile.connection.startUrl})${profile.production ? ' ⚠ PRODUCTION' : ''}`);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
fail(`Profile resolve failed: ${err.message}`);
|
|
40
|
-
return 1;
|
|
41
|
-
}
|
|
42
|
-
const captureDirAbs = isAbsolute(profile.captureDir) ? profile.captureDir : resolve(cwd, profile.captureDir);
|
|
43
|
-
if (existsSync(captureDirAbs))
|
|
44
|
-
ok(`Capture dir exists: ${profile.captureDir}`);
|
|
45
|
-
else
|
|
46
|
-
fail(`Capture dir missing: ${profile.captureDir}`);
|
|
47
|
-
const info = getAuthStateInfo(cfg.projectId, profile.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 "${profile.name}" — run \`d360-capture auth --profile ${profile.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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"}
|
package/dist/commands/init.js
DELETED
|
@@ -1,100 +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" profile too?',
|
|
49
|
-
default: true,
|
|
50
|
-
});
|
|
51
|
-
const profiles = {
|
|
52
|
-
staging: { connection: { 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
|
-
profiles.prod = {
|
|
61
|
-
connection: { startUrl: prodUrl, authBoundaryUrlPattern: authBoundary },
|
|
62
|
-
production: true,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
const annotate = await confirm({
|
|
66
|
-
message: 'Enable annotation overlays (highlights, callouts, redactions) by default?',
|
|
67
|
-
default: true,
|
|
68
|
-
});
|
|
69
|
-
const cfg = {
|
|
70
|
-
projectId,
|
|
71
|
-
captureDir,
|
|
72
|
-
outputDir,
|
|
73
|
-
viewport: { width: w, height: h },
|
|
74
|
-
loginTimeoutMs: 0,
|
|
75
|
-
annotation: { enabled: annotate },
|
|
76
|
-
profiles,
|
|
77
|
-
defaultProfile: 'staging',
|
|
78
|
-
};
|
|
79
|
-
writeProjectConfig(path, cfg);
|
|
80
|
-
console.log('');
|
|
81
|
-
console.log(`✓ Wrote ${path}`);
|
|
82
|
-
console.log('');
|
|
83
|
-
console.log('Next steps:');
|
|
84
|
-
console.log(' 1. d360-capture auth --profile staging # log in once, no timeout');
|
|
85
|
-
console.log(' 2. d360-capture capture # run all specs in captureDir');
|
|
86
|
-
console.log('');
|
|
87
|
-
}
|
|
88
|
-
function readPackageName(cwd) {
|
|
89
|
-
const path = join(cwd, 'package.json');
|
|
90
|
-
if (!existsSync(path))
|
|
91
|
-
return null;
|
|
92
|
-
try {
|
|
93
|
-
const pkg = JSON.parse(readFileSync(path, 'utf8'));
|
|
94
|
-
return pkg.name ?? null;
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
//# 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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"}
|
package/dist/commands/list.js
DELETED
|
@@ -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"}
|
package/dist/commands/profile.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { findProjectConfigPath, readProjectConfig, resolveProfile, writeProjectConfig, } from '../config/projectConfig.js';
|
|
2
|
-
import { getAuthStateInfo } from '../config/authState.js';
|
|
3
|
-
export function profileList() {
|
|
4
|
-
const cfg = readProjectConfig(findProjectConfigPath());
|
|
5
|
-
console.log('');
|
|
6
|
-
for (const [name, profile] of Object.entries(cfg.profiles)) {
|
|
7
|
-
const active = name === cfg.defaultProfile ? '● ' : ' ';
|
|
8
|
-
const prod = profile.production ? ' ⚠ PRODUCTION' : '';
|
|
9
|
-
const info = getAuthStateInfo(cfg.projectId, name);
|
|
10
|
-
const auth = info.exists ? 'auth saved' : 'no auth-state';
|
|
11
|
-
console.log(`${active}${name} → ${profile.connection.startUrl}${prod} [${auth}]`);
|
|
12
|
-
}
|
|
13
|
-
console.log('');
|
|
14
|
-
console.log('● = default. Switch with: d360-capture profile use <name>');
|
|
15
|
-
console.log('');
|
|
16
|
-
}
|
|
17
|
-
export function profileUse(name) {
|
|
18
|
-
const path = findProjectConfigPath();
|
|
19
|
-
const cfg = readProjectConfig(path);
|
|
20
|
-
if (!cfg.profiles[name]) {
|
|
21
|
-
console.error(`✗ Unknown profile "${name}". Available: ${Object.keys(cfg.profiles).join(', ')}`);
|
|
22
|
-
return 1;
|
|
23
|
-
}
|
|
24
|
-
cfg.defaultProfile = name;
|
|
25
|
-
writeProjectConfig(path, cfg);
|
|
26
|
-
const prod = cfg.profiles[name].production ? ' ⚠ PRODUCTION' : '';
|
|
27
|
-
console.log(`✓ Default profile is now "${name}"${prod}`);
|
|
28
|
-
return 0;
|
|
29
|
-
}
|
|
30
|
-
export function profileShow(name) {
|
|
31
|
-
const cfg = readProjectConfig(findProjectConfigPath());
|
|
32
|
-
const profile = resolveProfile(cfg, name);
|
|
33
|
-
console.log('');
|
|
34
|
-
console.log(`Profile ${profile.name}${profile.production ? ' ⚠ PRODUCTION' : ''}`);
|
|
35
|
-
console.log(` startUrl: ${profile.connection.startUrl}`);
|
|
36
|
-
console.log(` authBoundary:${profile.connection.authBoundaryUrlPattern}`);
|
|
37
|
-
console.log(` captureDir: ${profile.captureDir}`);
|
|
38
|
-
console.log(` outputDir: ${profile.outputDir}`);
|
|
39
|
-
console.log(` viewport: ${profile.viewport.width}x${profile.viewport.height}`);
|
|
40
|
-
console.log('');
|
|
41
|
-
return 0;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=profile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
DELETED
|
@@ -1,27 +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} (default)`);
|
|
8
|
-
console.log(`outputDir: ${cfg.outputDir} (default)`);
|
|
9
|
-
console.log(`viewport: ${cfg.viewport.width}x${cfg.viewport.height} (default)`);
|
|
10
|
-
console.log(`annotation enabled: ${cfg.annotation.enabled}`);
|
|
11
|
-
console.log(`defaultProfile: ${cfg.defaultProfile}`);
|
|
12
|
-
console.log('');
|
|
13
|
-
console.log('Profiles:');
|
|
14
|
-
for (const [name, profile] of Object.entries(cfg.profiles)) {
|
|
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
|
-
const marks = `${name === cfg.defaultProfile ? ' ●' : ''}${profile.production ? ' ⚠ PRODUCTION' : ''}`;
|
|
20
|
-
console.log(` ${name.padEnd(10)} ${profile.connection.startUrl}${marks}`);
|
|
21
|
-
if (profile.captureDir)
|
|
22
|
-
console.log(` captureDir: ${profile.captureDir}`);
|
|
23
|
-
console.log(` ${authStatus}`);
|
|
24
|
-
}
|
|
25
|
-
console.log('');
|
|
26
|
-
}
|
|
27
|
-
//# 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,cAAc,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,SAAS,cAAc,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,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,MAAM,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/config/authState.js
DELETED
|
@@ -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, profileName) {
|
|
8
|
-
return join(authStateDir(), projectId, `${profileName}.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, profileName) {
|
|
16
|
-
const path = authStatePath(projectId, profileName);
|
|
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,WAAmB;IAClE,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;AAChE,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,WAAmB;IACrE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnD,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,59 +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 class ProfileConfigError extends Error {
|
|
5
|
-
}
|
|
6
|
-
export function findProjectConfigPath(cwd = process.cwd()) {
|
|
7
|
-
return join(cwd, PROJECT_CONFIG_FILENAME);
|
|
8
|
-
}
|
|
9
|
-
export function readProjectConfig(path) {
|
|
10
|
-
if (!existsSync(path)) {
|
|
11
|
-
throw new Error(`No project config at ${path}. Run \`d360-capture init\` to create one.`);
|
|
12
|
-
}
|
|
13
|
-
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
14
|
-
validateProjectConfig(raw, path);
|
|
15
|
-
return raw;
|
|
16
|
-
}
|
|
17
|
-
export function writeProjectConfig(path, cfg) {
|
|
18
|
-
writeFileSync(path, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
19
|
-
}
|
|
20
|
-
export function resolveProfile(cfg, name) {
|
|
21
|
-
const chosen = name ?? cfg.defaultProfile;
|
|
22
|
-
const profile = cfg.profiles[chosen];
|
|
23
|
-
if (!profile) {
|
|
24
|
-
const available = Object.keys(cfg.profiles).join(', ');
|
|
25
|
-
throw new ProfileConfigError(`Unknown profile "${chosen}". Available: ${available}`);
|
|
26
|
-
}
|
|
27
|
-
return {
|
|
28
|
-
name: chosen,
|
|
29
|
-
connection: profile.connection,
|
|
30
|
-
captureDir: profile.captureDir ?? cfg.captureDir,
|
|
31
|
-
outputDir: profile.outputDir ?? cfg.outputDir,
|
|
32
|
-
viewport: profile.viewport ?? cfg.viewport,
|
|
33
|
-
production: profile.production === true,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
function validateProjectConfig(cfg, path) {
|
|
37
|
-
// No back-compat (decided 2026-06-08): the old environments/defaultEnvironment shape
|
|
38
|
-
// is rejected with a clear migration message rather than silently adapted.
|
|
39
|
-
if (cfg.environments && !cfg.profiles) {
|
|
40
|
-
throw new ProfileConfigError(`Config at ${path} uses the old "environments" shape, which is no longer supported. ` +
|
|
41
|
-
'It is now "profiles" (each with a "connection" { startUrl, authBoundaryUrlPattern }) + ' +
|
|
42
|
-
'"defaultProfile". Re-run `d360-capture init`, then `d360-capture auth --profile <name>`.');
|
|
43
|
-
}
|
|
44
|
-
const missing = [];
|
|
45
|
-
if (!cfg.projectId)
|
|
46
|
-
missing.push('projectId');
|
|
47
|
-
if (!cfg.captureDir)
|
|
48
|
-
missing.push('captureDir');
|
|
49
|
-
if (!cfg.outputDir)
|
|
50
|
-
missing.push('outputDir');
|
|
51
|
-
if (!cfg.profiles || Object.keys(cfg.profiles).length === 0)
|
|
52
|
-
missing.push('profiles');
|
|
53
|
-
if (!cfg.defaultProfile)
|
|
54
|
-
missing.push('defaultProfile');
|
|
55
|
-
if (missing.length > 0) {
|
|
56
|
-
throw new ProfileConfigError(`Invalid config at ${path}: missing ${missing.join(', ')}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# 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;AAyCjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAE5D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,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,CAA+C,CAAC;IACjG,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,cAAc,CAAC,GAAkB,EAAE,IAAa;IAC9D,MAAM,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,cAAc,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,MAAM,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU;QAChD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAC1C,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,GAA+C,EAAE,IAAY;IAC1F,qFAAqF;IACrF,2EAA2E;IAC3E,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAC1B,aAAa,IAAI,oEAAoE;YACnF,yFAAyF;YACzF,0FAA0F,CAC7F,CAAC;IACJ,CAAC;IACD,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,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,IAAI,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,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"}
|
package/dist/helpers/types.js
DELETED
|
@@ -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"}
|