document360-capture 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +30 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts +1 -1
- package/dist/commands/auth.js +8 -6
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/capture.d.ts +1 -1
- package/dist/commands/capture.js +30 -21
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +12 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +11 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.js +43 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/status.js +10 -7
- package/dist/commands/status.js.map +1 -1
- package/dist/config/authState.d.ts +2 -2
- package/dist/config/authState.js +4 -4
- package/dist/config/authState.js.map +1 -1
- package/dist/config/projectConfig.d.ts +33 -7
- package/dist/config/projectConfig.js +28 -12
- package/dist/config/projectConfig.js.map +1 -1
- package/dist/runner/playwrightConfig.d.ts +6 -3
- package/dist/runner/playwrightConfig.js +5 -5
- package/dist/runner/playwrightConfig.js.map +1 -1
- package/package.json +3 -2
package/dist/cli.js
CHANGED
|
@@ -7,9 +7,17 @@ import { captureCommand } from './commands/capture.js';
|
|
|
7
7
|
import { listCommand } from './commands/list.js';
|
|
8
8
|
import { doctorCommand } from './commands/doctor.js';
|
|
9
9
|
import { statusCommand } from './commands/status.js';
|
|
10
|
+
import { profileList, profileShow, profileUse } from './commands/profile.js';
|
|
10
11
|
const require = createRequire(import.meta.url);
|
|
11
12
|
const pkg = require('../package.json');
|
|
12
13
|
const program = new Command();
|
|
14
|
+
// --env was the old per-environment flag; it's now --profile. Catch it with a clear nudge.
|
|
15
|
+
function rejectLegacyEnv(opts) {
|
|
16
|
+
if (opts.env) {
|
|
17
|
+
console.error('✗ --env was replaced by --profile (connection profiles). Use: --profile <name>');
|
|
18
|
+
process.exit(2);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
13
21
|
program
|
|
14
22
|
.name('d360-capture')
|
|
15
23
|
.description('Capture product screenshots from Playwright specs. Login once, capture many.')
|
|
@@ -23,16 +31,20 @@ program
|
|
|
23
31
|
program
|
|
24
32
|
.command('auth')
|
|
25
33
|
.description('Open Chromium for interactive login. Press ENTER when done to save the session.')
|
|
26
|
-
.option('-
|
|
34
|
+
.option('-p, --profile <name>', 'Profile name (default: defaultProfile from config)')
|
|
35
|
+
.option('-e, --env <name>', false)
|
|
27
36
|
.action(async (opts) => {
|
|
37
|
+
rejectLegacyEnv(opts);
|
|
28
38
|
await authCommand(opts);
|
|
29
39
|
});
|
|
30
40
|
program
|
|
31
41
|
.command('capture [spec-id]')
|
|
32
42
|
.description('Run one spec by id, or all specs if omitted.')
|
|
33
|
-
.option('-
|
|
43
|
+
.option('-p, --profile <name>', 'Profile name (default: defaultProfile from config)')
|
|
44
|
+
.option('-e, --env <name>', false)
|
|
34
45
|
.option('--no-annotate', 'Skip annotation overlay; emit raw screenshots only')
|
|
35
46
|
.action(async (specId, opts) => {
|
|
47
|
+
rejectLegacyEnv(opts);
|
|
36
48
|
const exit = await captureCommand(specId, opts);
|
|
37
49
|
if (exit !== 0)
|
|
38
50
|
process.exit(exit);
|
|
@@ -46,8 +58,10 @@ program
|
|
|
46
58
|
program
|
|
47
59
|
.command('doctor')
|
|
48
60
|
.description('Validate config, auth-state, and browser install.')
|
|
49
|
-
.option('-
|
|
61
|
+
.option('-p, --profile <name>', 'Profile to check')
|
|
62
|
+
.option('-e, --env <name>', false)
|
|
50
63
|
.action(async (opts) => {
|
|
64
|
+
rejectLegacyEnv(opts);
|
|
51
65
|
const exit = await doctorCommand(opts);
|
|
52
66
|
if (exit !== 0)
|
|
53
67
|
process.exit(exit);
|
|
@@ -58,6 +72,19 @@ program
|
|
|
58
72
|
.action(async () => {
|
|
59
73
|
await statusCommand();
|
|
60
74
|
});
|
|
75
|
+
const profileCmd = program.command('profile').description('Manage capture profiles for the current repo');
|
|
76
|
+
profileCmd
|
|
77
|
+
.command('list', { isDefault: true })
|
|
78
|
+
.description('List profiles (● = default)')
|
|
79
|
+
.action(() => profileList());
|
|
80
|
+
profileCmd
|
|
81
|
+
.command('use <name>')
|
|
82
|
+
.description('Set the default profile for this repo')
|
|
83
|
+
.action(name => process.exit(profileUse(name)));
|
|
84
|
+
profileCmd
|
|
85
|
+
.command('show [name]')
|
|
86
|
+
.description('Print the resolved profile')
|
|
87
|
+
.action(name => process.exit(profileShow(name)));
|
|
61
88
|
program.parseAsync(process.argv).catch(err => {
|
|
62
89
|
console.error('');
|
|
63
90
|
console.error(`✗ ${err.message}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/auth.d.ts
CHANGED
package/dist/commands/auth.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
-
import { findProjectConfigPath, readProjectConfig,
|
|
2
|
+
import { findProjectConfigPath, readProjectConfig, resolveProfile, } from '../config/projectConfig.js';
|
|
3
3
|
import { authStatePath, ensureAuthStateDir } from '../config/authState.js';
|
|
4
4
|
export async function authCommand(opts) {
|
|
5
5
|
const cfg = readProjectConfig(findProjectConfigPath());
|
|
6
|
-
const
|
|
6
|
+
const profile = resolveProfile(cfg, opts.profile);
|
|
7
7
|
ensureAuthStateDir(cfg.projectId);
|
|
8
|
-
const savePath = authStatePath(cfg.projectId,
|
|
8
|
+
const savePath = authStatePath(cfg.projectId, profile.name);
|
|
9
9
|
console.log('');
|
|
10
|
-
|
|
10
|
+
if (profile.production)
|
|
11
|
+
console.log(`⚠ Profile "${profile.name}" is PRODUCTION.`);
|
|
12
|
+
console.log(`Opening Chromium against ${profile.connection.startUrl}`);
|
|
11
13
|
console.log(`Auth-state will save to: ${savePath}`);
|
|
12
14
|
console.log('');
|
|
13
15
|
const browser = await chromium.launch({
|
|
@@ -16,14 +18,14 @@ export async function authCommand(opts) {
|
|
|
16
18
|
});
|
|
17
19
|
const context = await browser.newContext({ viewport: null });
|
|
18
20
|
const page = await context.newPage();
|
|
19
|
-
await page.goto(
|
|
21
|
+
await page.goto(profile.connection.startUrl, { waitUntil: 'domcontentloaded' });
|
|
20
22
|
console.log('────────────────────────────────────────────────────────────');
|
|
21
23
|
console.log(' Log in fully (MFA included) at your own pace.');
|
|
22
24
|
console.log(' When you reach the post-login app, come back to this');
|
|
23
25
|
console.log(' terminal and press ENTER to save the session.');
|
|
24
26
|
console.log('────────────────────────────────────────────────────────────');
|
|
25
27
|
console.log('');
|
|
26
|
-
const boundary = new RegExp(
|
|
28
|
+
const boundary = new RegExp(profile.connection.authBoundaryUrlPattern);
|
|
27
29
|
// Crash-protection autosave — but only once the browser is past the login
|
|
28
30
|
// boundary. Saving mid-login persists a half-baked state (context cookies,
|
|
29
31
|
// no session cookie) that later fails captures while `doctor` reports it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/capture.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
-
import { findProjectConfigPath, readProjectConfig,
|
|
3
|
+
import { findProjectConfigPath, readProjectConfig, resolveProfile, } from '../config/projectConfig.js';
|
|
4
4
|
import { authStatePath, getAuthStateInfo } from '../config/authState.js';
|
|
5
5
|
import { writeRuntimePlaywrightConfig } from '../runner/playwrightConfig.js';
|
|
6
6
|
import { runSpecs } from '../runner/runSpecs.js';
|
|
@@ -9,16 +9,17 @@ import { composeAnnotations } from '../annotate/compose.js';
|
|
|
9
9
|
export async function captureCommand(specId, opts) {
|
|
10
10
|
const cwd = process.cwd();
|
|
11
11
|
const cfg = readProjectConfig(findProjectConfigPath(cwd));
|
|
12
|
-
const
|
|
13
|
-
const
|
|
12
|
+
const profile = resolveProfile(cfg, opts.profile);
|
|
13
|
+
const profileName = profile.name;
|
|
14
|
+
const info = getAuthStateInfo(cfg.projectId, profileName);
|
|
14
15
|
if (!info.exists) {
|
|
15
16
|
console.error('');
|
|
16
|
-
console.error(`✗ No saved session for
|
|
17
|
+
console.error(`✗ No saved session for profile "${profileName}".`);
|
|
17
18
|
console.error(` Expected at: ${info.path}`);
|
|
18
|
-
console.error(` Run: d360-capture auth --
|
|
19
|
+
console.error(` Run: d360-capture auth --profile ${profileName}`);
|
|
19
20
|
return 2;
|
|
20
21
|
}
|
|
21
|
-
const captureDirAbs = isAbsolute(
|
|
22
|
+
const captureDirAbs = isAbsolute(profile.captureDir) ? profile.captureDir : resolve(cwd, profile.captureDir);
|
|
22
23
|
if (!existsSync(captureDirAbs)) {
|
|
23
24
|
console.error(`✗ Capture directory missing: ${captureDirAbs}`);
|
|
24
25
|
console.error(' Generate at least one spec there before running capture.');
|
|
@@ -26,48 +27,56 @@ export async function captureCommand(specId, opts) {
|
|
|
26
27
|
}
|
|
27
28
|
const { configPath, tsconfigPath } = writeRuntimePlaywrightConfig({
|
|
28
29
|
cwd,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
profileName,
|
|
31
|
+
captureDir: profile.captureDir,
|
|
32
|
+
viewport: profile.viewport,
|
|
33
|
+
storageStatePath: authStatePath(cfg.projectId, profileName),
|
|
32
34
|
});
|
|
33
35
|
console.log('');
|
|
34
|
-
|
|
36
|
+
if (profile.production)
|
|
37
|
+
console.log(`⚠ Profile "${profileName}" is PRODUCTION (read-only capture).`);
|
|
38
|
+
console.log(`▶ Running specs against ${profileName} (${profile.connection.startUrl})`);
|
|
35
39
|
if (specId)
|
|
36
40
|
console.log(` Single spec: ${specId}`);
|
|
37
41
|
else
|
|
38
|
-
console.log(` All specs in ${
|
|
42
|
+
console.log(` All specs in ${profile.captureDir}`);
|
|
39
43
|
console.log('');
|
|
40
44
|
const result = await runSpecs({
|
|
41
45
|
cwd,
|
|
42
46
|
configPath,
|
|
43
47
|
tsconfigPath,
|
|
44
|
-
startUrl:
|
|
45
|
-
authBoundaryUrlPattern:
|
|
48
|
+
startUrl: profile.connection.startUrl,
|
|
49
|
+
authBoundaryUrlPattern: profile.connection.authBoundaryUrlPattern,
|
|
46
50
|
specId,
|
|
47
51
|
captureDirAbs,
|
|
48
52
|
});
|
|
49
53
|
if (result.exitCode !== 0) {
|
|
50
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.
|
|
51
61
|
if (looksLikeSessionExpiry(combined)) {
|
|
52
62
|
console.error('');
|
|
53
|
-
console.error(
|
|
54
|
-
console.error(`
|
|
55
|
-
console.error(
|
|
56
|
-
|
|
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.');
|
|
57
68
|
}
|
|
58
|
-
console.error('');
|
|
59
|
-
console.error(`✗ Playwright exited with code ${result.exitCode}`);
|
|
60
69
|
return result.exitCode;
|
|
61
70
|
}
|
|
62
71
|
const annotateEnabled = !opts.noAnnotate && cfg.annotation.enabled;
|
|
63
|
-
const outputDirAbs = isAbsolute(
|
|
72
|
+
const outputDirAbs = isAbsolute(profile.outputDir) ? profile.outputDir : resolve(cwd, profile.outputDir);
|
|
64
73
|
console.log('');
|
|
65
74
|
console.log(annotateEnabled ? '▶ Annotating screenshots...' : '▶ Skipping annotation (--no-annotate or config off)');
|
|
66
75
|
const annotated = await composeAnnotations(outputDirAbs, annotateEnabled);
|
|
67
76
|
const ok = annotated.filter(r => r.ok).length;
|
|
68
77
|
const failed = annotated.filter(r => !r.ok);
|
|
69
78
|
console.log('');
|
|
70
|
-
console.log(`✓ ${ok} screenshot${ok === 1 ? '' : 's'} ready in ${
|
|
79
|
+
console.log(`✓ ${ok} screenshot${ok === 1 ? '' : 's'} ready in ${profile.outputDir}`);
|
|
71
80
|
if (failed.length > 0) {
|
|
72
81
|
console.log(`✗ ${failed.length} annotation failure${failed.length === 1 ? '' : 's'}:`);
|
|
73
82
|
for (const f of failed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA0B,EAAE,IAAoB;IACnF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7G,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,4BAA4B,CAAC;QAChE,GAAG;QACH,WAAW;QACX,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC;KAC5D,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,sCAAsC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvF,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;;QAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,GAAG;QACH,UAAU;QACV,YAAY;QACZ,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ;QACrC,sBAAsB,EAAE,OAAO,CAAC,UAAU,CAAC,sBAAsB;QACjE,MAAM;QACN,aAAa;KACd,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,wEAAwE;QACxE,yEAAyE;QACzE,oEAAoE;QACpE,4BAA4B;QAC5B,IAAI,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC1F,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC1F,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;IACnE,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,qDAAqD,CAAC,CAAC;IAErH,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1E,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,sBAAsB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACvF,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { isAbsolute, resolve } from 'node:path';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
|
-
import { findProjectConfigPath, readProjectConfig,
|
|
4
|
+
import { findProjectConfigPath, readProjectConfig, resolveProfile, } from '../config/projectConfig.js';
|
|
5
5
|
import { getAuthStateInfo } from '../config/authState.js';
|
|
6
6
|
const require = createRequire(import.meta.url);
|
|
7
7
|
export async function doctorCommand(opts) {
|
|
@@ -30,21 +30,21 @@ export async function doctorCommand(opts) {
|
|
|
30
30
|
fail(`Config invalid: ${err.message}`);
|
|
31
31
|
return 2;
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
if (existsSync(captureDirAbs))
|
|
35
|
-
ok(`Capture dir exists: ${cfg.captureDir}`);
|
|
36
|
-
else
|
|
37
|
-
fail(`Capture dir missing: ${cfg.captureDir}`);
|
|
38
|
-
let env;
|
|
33
|
+
let profile;
|
|
39
34
|
try {
|
|
40
|
-
|
|
41
|
-
ok(`
|
|
35
|
+
profile = resolveProfile(cfg, opts.profile);
|
|
36
|
+
ok(`Profile "${profile.name}" resolved (startUrl=${profile.connection.startUrl})${profile.production ? ' ⚠ PRODUCTION' : ''}`);
|
|
42
37
|
}
|
|
43
38
|
catch (err) {
|
|
44
|
-
fail(`
|
|
39
|
+
fail(`Profile resolve failed: ${err.message}`);
|
|
45
40
|
return 1;
|
|
46
41
|
}
|
|
47
|
-
const
|
|
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
48
|
if (info.exists) {
|
|
49
49
|
const ageDays = info.ageMs != null ? Math.floor(info.ageMs / 86_400_000) : null;
|
|
50
50
|
ok(`Auth-state present (${ageDays}d old): ${info.path}`);
|
|
@@ -60,7 +60,7 @@ export async function doctorCommand(opts) {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
63
|
-
fail(`Auth-state missing for "${
|
|
63
|
+
fail(`Auth-state missing for "${profile.name}" — run \`d360-capture auth --profile ${profile.name}\``);
|
|
64
64
|
}
|
|
65
65
|
try {
|
|
66
66
|
const playwrightPkg = require.resolve('playwright/package.json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -45,11 +45,11 @@ export async function initCommand() {
|
|
|
45
45
|
default: '/\\/(home|app|projects|dashboard)(/|$)/',
|
|
46
46
|
});
|
|
47
47
|
const addProd = await confirm({
|
|
48
|
-
message: 'Add a "prod"
|
|
48
|
+
message: 'Add a "prod" profile too?',
|
|
49
49
|
default: true,
|
|
50
50
|
});
|
|
51
|
-
const
|
|
52
|
-
staging: { startUrl: stagingUrl, authBoundaryUrlPattern: authBoundary },
|
|
51
|
+
const profiles = {
|
|
52
|
+
staging: { connection: { startUrl: stagingUrl, authBoundaryUrlPattern: authBoundary } },
|
|
53
53
|
};
|
|
54
54
|
if (addProd) {
|
|
55
55
|
const prodUrl = await input({
|
|
@@ -57,7 +57,10 @@ export async function initCommand() {
|
|
|
57
57
|
default: stagingUrl.replace(/staging\./, ''),
|
|
58
58
|
validate: v => (v.startsWith('http') ? true : 'Must be a full URL'),
|
|
59
59
|
});
|
|
60
|
-
|
|
60
|
+
profiles.prod = {
|
|
61
|
+
connection: { startUrl: prodUrl, authBoundaryUrlPattern: authBoundary },
|
|
62
|
+
production: true,
|
|
63
|
+
};
|
|
61
64
|
}
|
|
62
65
|
const annotate = await confirm({
|
|
63
66
|
message: 'Enable annotation overlays (highlights, callouts, redactions) by default?',
|
|
@@ -70,16 +73,16 @@ export async function initCommand() {
|
|
|
70
73
|
viewport: { width: w, height: h },
|
|
71
74
|
loginTimeoutMs: 0,
|
|
72
75
|
annotation: { enabled: annotate },
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
profiles,
|
|
77
|
+
defaultProfile: 'staging',
|
|
75
78
|
};
|
|
76
79
|
writeProjectConfig(path, cfg);
|
|
77
80
|
console.log('');
|
|
78
81
|
console.log(`✓ Wrote ${path}`);
|
|
79
82
|
console.log('');
|
|
80
83
|
console.log('Next steps:');
|
|
81
|
-
console.log(' 1. d360-capture auth --
|
|
82
|
-
console.log(' 2. d360-capture capture
|
|
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');
|
|
83
86
|
console.log('');
|
|
84
87
|
}
|
|
85
88
|
function readPackageName(cwd) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;YAC9B,OAAO,EAAE,GAAG,IAAI,6BAA6B;YAC7C,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;QAC5B,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC;KACvE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;QAC7B,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,oBAAoB;KAC9B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;QAC5B,OAAO,EAAE,iDAAiD;QAC1D,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;QAChC,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iCAAiC;KACxE,CAAC,CAAC;IACH,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;QAC7B,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC;QAC/B,OAAO,EAAE,+DAA+D;QACxE,OAAO,EAAE,yCAAyC;KACnD,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC5B,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -4,19 +4,22 @@ export async function statusCommand() {
|
|
|
4
4
|
const cfg = readProjectConfig(findProjectConfigPath());
|
|
5
5
|
console.log('');
|
|
6
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}`);
|
|
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
10
|
console.log(`annotation enabled: ${cfg.annotation.enabled}`);
|
|
11
|
-
console.log(`
|
|
11
|
+
console.log(`defaultProfile: ${cfg.defaultProfile}`);
|
|
12
12
|
console.log('');
|
|
13
|
-
console.log('
|
|
14
|
-
for (const [name,
|
|
13
|
+
console.log('Profiles:');
|
|
14
|
+
for (const [name, profile] of Object.entries(cfg.profiles)) {
|
|
15
15
|
const info = getAuthStateInfo(cfg.projectId, name);
|
|
16
16
|
const authStatus = info.exists
|
|
17
17
|
? `auth saved ${info.ageMs != null ? Math.floor(info.ageMs / 86_400_000) + 'd ago' : ''}`
|
|
18
18
|
: 'no auth-state';
|
|
19
|
-
|
|
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}`);
|
|
20
23
|
console.log(` ${authStatus}`);
|
|
21
24
|
}
|
|
22
25
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare function authStateDir(): string;
|
|
2
|
-
export declare function authStatePath(projectId: string,
|
|
2
|
+
export declare function authStatePath(projectId: string, profileName: string): string;
|
|
3
3
|
export declare function ensureAuthStateDir(projectId: string): void;
|
|
4
4
|
export type AuthStateInfo = {
|
|
5
5
|
path: string;
|
|
6
6
|
exists: boolean;
|
|
7
7
|
ageMs?: number;
|
|
8
8
|
};
|
|
9
|
-
export declare function getAuthStateInfo(projectId: string,
|
|
9
|
+
export declare function getAuthStateInfo(projectId: string, profileName: string): AuthStateInfo;
|
|
10
10
|
export declare function ensureParentDir(path: string): void;
|
package/dist/config/authState.js
CHANGED
|
@@ -4,16 +4,16 @@ import { join, dirname } from 'node:path';
|
|
|
4
4
|
export function authStateDir() {
|
|
5
5
|
return join(homedir(), '.document360-capture', 'auth-states');
|
|
6
6
|
}
|
|
7
|
-
export function authStatePath(projectId,
|
|
8
|
-
return join(authStateDir(), projectId, `${
|
|
7
|
+
export function authStatePath(projectId, profileName) {
|
|
8
|
+
return join(authStateDir(), projectId, `${profileName}.json`);
|
|
9
9
|
}
|
|
10
10
|
export function ensureAuthStateDir(projectId) {
|
|
11
11
|
const dir = join(authStateDir(), projectId);
|
|
12
12
|
if (!existsSync(dir))
|
|
13
13
|
mkdirSync(dir, { recursive: true });
|
|
14
14
|
}
|
|
15
|
-
export function getAuthStateInfo(projectId,
|
|
16
|
-
const path = authStatePath(projectId,
|
|
15
|
+
export function getAuthStateInfo(projectId, profileName) {
|
|
16
|
+
const path = authStatePath(projectId, profileName);
|
|
17
17
|
if (!existsSync(path))
|
|
18
18
|
return { path, exists: false };
|
|
19
19
|
const stat = statSync(path);
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,9 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/** How to reach a target deployment for capture. */
|
|
2
|
+
export type ProfileConnection = {
|
|
2
3
|
startUrl: string;
|
|
3
4
|
authBoundaryUrlPattern: string;
|
|
4
5
|
};
|
|
6
|
+
/** A named capture profile. `connection` is one aspect; a profile may also override
|
|
7
|
+
the directories/viewport so one repo can target multiple doc-sets/environments. */
|
|
8
|
+
export type Profile = {
|
|
9
|
+
connection: ProfileConnection;
|
|
10
|
+
captureDir?: string;
|
|
11
|
+
outputDir?: string;
|
|
12
|
+
viewport?: {
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
};
|
|
16
|
+
/** Visible warning only — capture is read-only (screenshots), so no hard guard. */
|
|
17
|
+
production?: boolean;
|
|
18
|
+
};
|
|
5
19
|
export type ProjectConfig = {
|
|
6
20
|
projectId: string;
|
|
21
|
+
/** Defaults inherited by any profile that doesn't override them. */
|
|
7
22
|
captureDir: string;
|
|
8
23
|
outputDir: string;
|
|
9
24
|
viewport: {
|
|
@@ -14,14 +29,25 @@ export type ProjectConfig = {
|
|
|
14
29
|
annotation: {
|
|
15
30
|
enabled: boolean;
|
|
16
31
|
};
|
|
17
|
-
|
|
18
|
-
|
|
32
|
+
profiles: Record<string, Profile>;
|
|
33
|
+
defaultProfile: string;
|
|
34
|
+
};
|
|
35
|
+
/** A profile with directory/viewport defaults already merged in. */
|
|
36
|
+
export type ResolvedProfile = {
|
|
37
|
+
name: string;
|
|
38
|
+
connection: ProfileConnection;
|
|
39
|
+
captureDir: string;
|
|
40
|
+
outputDir: string;
|
|
41
|
+
viewport: {
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
};
|
|
45
|
+
production: boolean;
|
|
19
46
|
};
|
|
20
47
|
export declare const PROJECT_CONFIG_FILENAME = ".d360-capture.json";
|
|
48
|
+
export declare class ProfileConfigError extends Error {
|
|
49
|
+
}
|
|
21
50
|
export declare function findProjectConfigPath(cwd?: string): string;
|
|
22
51
|
export declare function readProjectConfig(path: string): ProjectConfig;
|
|
23
52
|
export declare function writeProjectConfig(path: string, cfg: ProjectConfig): void;
|
|
24
|
-
export declare function
|
|
25
|
-
name: string;
|
|
26
|
-
env: EnvironmentConfig;
|
|
27
|
-
};
|
|
53
|
+
export declare function resolveProfile(cfg: ProjectConfig, name?: string): ResolvedProfile;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
export const PROJECT_CONFIG_FILENAME = '.d360-capture.json';
|
|
4
|
+
export class ProfileConfigError extends Error {
|
|
5
|
+
}
|
|
4
6
|
export function findProjectConfigPath(cwd = process.cwd()) {
|
|
5
7
|
return join(cwd, PROJECT_CONFIG_FILENAME);
|
|
6
8
|
}
|
|
@@ -15,16 +17,30 @@ export function readProjectConfig(path) {
|
|
|
15
17
|
export function writeProjectConfig(path, cfg) {
|
|
16
18
|
writeFileSync(path, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
17
19
|
}
|
|
18
|
-
export function
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
if (!
|
|
22
|
-
const available = Object.keys(cfg.
|
|
23
|
-
throw new
|
|
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}`);
|
|
24
26
|
}
|
|
25
|
-
return {
|
|
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
|
+
};
|
|
26
35
|
}
|
|
27
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
|
+
}
|
|
28
44
|
const missing = [];
|
|
29
45
|
if (!cfg.projectId)
|
|
30
46
|
missing.push('projectId');
|
|
@@ -32,12 +48,12 @@ function validateProjectConfig(cfg, path) {
|
|
|
32
48
|
missing.push('captureDir');
|
|
33
49
|
if (!cfg.outputDir)
|
|
34
50
|
missing.push('outputDir');
|
|
35
|
-
if (!cfg.
|
|
36
|
-
missing.push('
|
|
37
|
-
if (!cfg.
|
|
38
|
-
missing.push('
|
|
51
|
+
if (!cfg.profiles || Object.keys(cfg.profiles).length === 0)
|
|
52
|
+
missing.push('profiles');
|
|
53
|
+
if (!cfg.defaultProfile)
|
|
54
|
+
missing.push('defaultProfile');
|
|
39
55
|
if (missing.length > 0) {
|
|
40
|
-
throw new
|
|
56
|
+
throw new ProfileConfigError(`Invalid config at ${path}: missing ${missing.join(', ')}`);
|
|
41
57
|
}
|
|
42
58
|
}
|
|
43
59
|
//# sourceMappingURL=projectConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,8 +1,11 @@
|
|
|
1
|
-
import type { ProjectConfig } from '../config/projectConfig.js';
|
|
2
1
|
export type RuntimeConfigArgs = {
|
|
3
2
|
cwd: string;
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
profileName: string;
|
|
4
|
+
captureDir: string;
|
|
5
|
+
viewport: {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
};
|
|
6
9
|
storageStatePath: string;
|
|
7
10
|
};
|
|
8
11
|
export type RuntimeConfigPaths = {
|
|
@@ -3,12 +3,12 @@ import { createRequire } from 'node:module';
|
|
|
3
3
|
import { join, isAbsolute, resolve } from 'node:path';
|
|
4
4
|
const require = createRequire(import.meta.url);
|
|
5
5
|
export function writeRuntimePlaywrightConfig(args) {
|
|
6
|
-
const { cwd,
|
|
6
|
+
const { cwd, profileName, captureDir, viewport, storageStatePath } = args;
|
|
7
7
|
const cacheDir = join(cwd, '.d360-capture-cache');
|
|
8
8
|
if (!existsSync(cacheDir))
|
|
9
9
|
mkdirSync(cacheDir, { recursive: true });
|
|
10
|
-
const path = join(cacheDir, `playwright.${
|
|
11
|
-
const captureDirAbs = isAbsolute(
|
|
10
|
+
const path = join(cacheDir, `playwright.${profileName}.config.cjs`);
|
|
11
|
+
const captureDirAbs = isAbsolute(captureDir) ? captureDir : resolve(cwd, captureDir);
|
|
12
12
|
const storageAbs = isAbsolute(storageStatePath) ? storageStatePath : resolve(cwd, storageStatePath);
|
|
13
13
|
// The generated config lives in the CONSUMING repo, which typically does
|
|
14
14
|
// not have @playwright/test in its node_modules (the CLI is installed
|
|
@@ -26,7 +26,7 @@ module.exports = defineConfig({
|
|
|
26
26
|
reporter: [['list']],
|
|
27
27
|
use: {
|
|
28
28
|
headless: false,
|
|
29
|
-
viewport: ${JSON.stringify(
|
|
29
|
+
viewport: ${JSON.stringify(viewport)},
|
|
30
30
|
storageState: ${JSON.stringify(storageAbs)},
|
|
31
31
|
actionTimeout: 15000,
|
|
32
32
|
navigationTimeout: 30000,
|
|
@@ -42,7 +42,7 @@ module.exports = defineConfig({
|
|
|
42
42
|
// mappings into the CLI's own dependency tree; runSpecs passes it via
|
|
43
43
|
// `playwright test --tsconfig`, whose mappings Playwright applies when
|
|
44
44
|
// transpiling spec imports.
|
|
45
|
-
const tsconfigPath = join(cacheDir, `tsconfig.${
|
|
45
|
+
const tsconfigPath = join(cacheDir, `tsconfig.${profileName}.json`);
|
|
46
46
|
const toSlash = (p) => p.replace(/\\/g, '/');
|
|
47
47
|
// Self-reference resolution (Node >= 12.16): inside the package, its own
|
|
48
48
|
// name resolves through its exports map — works for global installs,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightConfig.js","sourceRoot":"","sources":["../../src/runner/playwrightConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"playwrightConfig.js","sourceRoot":"","sources":["../../src/runner/playwrightConfig.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "document360-capture",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI that captures product screenshots from Playwright specs. Login once, capture many. Companion to document360-writer.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"build": "tsc -b",
|
|
21
21
|
"clean": "rimraf dist",
|
|
22
22
|
"postinstall": "node -e \"import('./dist/scripts/postinstall.js').catch(() => {})\"",
|
|
23
|
-
"prepublishOnly": "npm run build"
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"test": "vitest run"
|
|
24
25
|
},
|
|
25
26
|
"engines": {
|
|
26
27
|
"node": ">=20"
|