@vscode/component-explorer-cli 0.1.1-0 → 0.1.1-2
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/browserPage.js +4 -2
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +1 -0
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +8 -2
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +1 -0
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +8 -2
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/mcpCommand.d.ts +8 -0
- package/dist/commands/mcpCommand.d.ts.map +1 -0
- package/dist/commands/mcpCommand.js +24 -0
- package/dist/commands/mcpCommand.js.map +1 -0
- package/dist/commands/screenshotCommand.d.ts +1 -0
- package/dist/commands/screenshotCommand.d.ts.map +1 -1
- package/dist/commands/screenshotCommand.js +10 -4
- package/dist/commands/screenshotCommand.js.map +1 -1
- package/dist/commands/serveCommand.d.ts +16 -0
- package/dist/commands/serveCommand.d.ts.map +1 -0
- package/dist/commands/serveCommand.js +137 -0
- package/dist/commands/serveCommand.js.map +1 -0
- package/dist/commands/watchCommand.d.ts +1 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +22 -10
- package/dist/commands/watchCommand.js.map +1 -1
- package/dist/componentExplorer.js +5 -2
- package/dist/componentExplorer.js.map +1 -1
- package/dist/daemon/DaemonService.d.ts +131 -0
- package/dist/daemon/DaemonService.d.ts.map +1 -0
- package/dist/daemon/DaemonService.js +450 -0
- package/dist/daemon/DaemonService.js.map +1 -0
- package/dist/daemon/approvalStore.d.ts +51 -0
- package/dist/daemon/approvalStore.d.ts.map +1 -0
- package/dist/daemon/approvalStore.js +58 -0
- package/dist/daemon/approvalStore.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +8 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +51 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/pipeClient.d.ts +4 -0
- package/dist/daemon/pipeClient.d.ts.map +1 -0
- package/dist/daemon/pipeClient.js +97 -0
- package/dist/daemon/pipeClient.js.map +1 -0
- package/dist/daemon/pipeName.d.ts +2 -0
- package/dist/daemon/pipeName.d.ts.map +1 -0
- package/dist/daemon/pipeName.js +14 -0
- package/dist/daemon/pipeName.js.map +1 -0
- package/dist/daemon/pipeServer.d.ts +4 -0
- package/dist/daemon/pipeServer.d.ts.map +1 -0
- package/dist/daemon/pipeServer.js +23 -0
- package/dist/daemon/pipeServer.js.map +1 -0
- package/dist/dependencyInstaller.js +7 -4
- package/dist/dependencyInstaller.js.map +1 -1
- package/dist/explorerSession.d.ts +5 -3
- package/dist/explorerSession.d.ts.map +1 -1
- package/dist/explorerSession.js +11 -5
- package/dist/explorerSession.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/disposables.js +43 -0
- package/dist/external/vscode-observables/observables/dist/disposables.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/base.js +22 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js +40 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js +77 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js +114 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js +25 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js +332 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +79 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/debuggerRpc.js +72 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/debuggerRpc.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/devToolsLogger.js +447 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/devToolsLogger.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/rpc.js +64 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/rpc.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/utils.js +52 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/utils.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js +100 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js +143 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js +17 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js +362 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js +123 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js +81 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js +23 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js +226 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js +87 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js +68 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
- package/dist/git/gitCommitId.js +4 -2
- package/dist/git/gitCommitId.js.map +1 -1
- package/dist/git/gitCommitResolver.js +11 -3
- package/dist/git/gitCommitResolver.js.map +1 -1
- package/dist/git/gitService.js +5 -2
- package/dist/git/gitService.js.map +1 -1
- package/dist/git/gitUtils.js +9 -6
- package/dist/git/gitUtils.js.map +1 -1
- package/dist/git/gitWorktreeManager.js +5 -2
- package/dist/git/gitWorktreeManager.js.map +1 -1
- package/dist/httpServer.d.ts +9 -7
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +67 -10
- package/dist/httpServer.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +17 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +43 -6
- package/dist/logger.js.map +1 -1
- package/dist/mcp/McpServer.d.ts +28 -0
- package/dist/mcp/McpServer.d.ts.map +1 -0
- package/dist/mcp/McpServer.js +386 -0
- package/dist/mcp/McpServer.js.map +1 -0
- package/dist/screenshotCache.js +7 -4
- package/dist/screenshotCache.js.map +1 -1
- package/dist/sourceTreeId.js +4 -2
- package/dist/sourceTreeId.js.map +1 -1
- package/dist/storage.js +5 -2
- package/dist/storage.js.map +1 -1
- package/dist/viteProjectRef.js +5 -2
- package/dist/viteProjectRef.js.map +1 -1
- package/dist/watchConfig.d.ts +5 -0
- package/dist/watchConfig.d.ts.map +1 -1
- package/dist/watchConfig.js +22 -7
- package/dist/watchConfig.js.map +1 -1
- package/package.json +11 -4
package/dist/browserPage.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
class PlaywrightBrowserPageFactory {
|
|
2
2
|
_browser;
|
|
3
3
|
async openPage(url) {
|
|
4
4
|
if (!this._browser) {
|
|
@@ -36,4 +36,6 @@ class PlaywrightBrowserPage {
|
|
|
36
36
|
await this._page.close();
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
export { PlaywrightBrowserPageFactory };
|
|
41
|
+
//# sourceMappingURL=browserPage.js.map
|
package/dist/browserPage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserPage.js","
|
|
1
|
+
{"version":3,"file":"browserPage.js","sources":["../src/browserPage.ts"],"sourcesContent":[null],"names":[],"mappings":"MAWa,4BAA4B,CAAA;AAChC,IAAA,QAAQ;IAEhB,MAAM,QAAQ,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACnB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,YAAY,CAAC;YAC/C,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE;QACxC;QACA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC1C,QAAA,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAClD,QAAA,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC;IACvC;AAEA,IAAA,MAAM,OAAO,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;IAC1B;AACA;AAED,MAAM,qBAAqB,CAAA;AACG,IAAA,KAAA;AAA7B,IAAA,WAAA,CAA6B,KAAgC,EAAA;QAAhC,IAAA,CAAA,KAAK,GAAL,KAAK;IAA8B;IAEhE,MAAM,UAAU,CAAI,UAAkB,EAAA;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAe;IACrD;IAEA,MAAM,UAAU,CAAC,iBAAyB,EAAA;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC;AACjE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,iBAAiB,CAAA,CAAE,CAAC;QACjF;;AAEA,QAAA,MAAM,MAAM,GAAG,MAAO,OAA8E,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAChI,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;IAC9B;AAEA,IAAA,MAAM,OAAO,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACzB;AACA;;;;"}
|
|
@@ -2,6 +2,7 @@ import { Command } from 'clipanion';
|
|
|
2
2
|
export declare class AcceptCommand extends Command {
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
|
+
readonly verbose: number;
|
|
5
6
|
readonly filter: string | undefined;
|
|
6
7
|
readonly root: string;
|
|
7
8
|
execute(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAAgB;IAErC,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,qBAAkG;IACjH,QAAQ,CAAC,IAAI,SAAqF;IAE5F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA2B9B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
+
import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
|
|
2
3
|
import { FileSystemStorage } from '../storage.js';
|
|
3
|
-
|
|
4
|
+
|
|
5
|
+
class AcceptCommand extends Command {
|
|
4
6
|
static paths = [['accept']];
|
|
5
7
|
static usage = Command.Usage({
|
|
6
8
|
description: 'Promote current screenshots as baseline',
|
|
@@ -9,9 +11,11 @@ export class AcceptCommand extends Command {
|
|
|
9
11
|
['Accept specific fixtures', '$0 accept --filter "Button/*"'],
|
|
10
12
|
],
|
|
11
13
|
});
|
|
14
|
+
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
12
15
|
filter = Option.String('--filter', { required: false, description: 'Filter fixtures by glob pattern' });
|
|
13
16
|
root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
|
|
14
17
|
async execute() {
|
|
18
|
+
new ConsoleLogger('accept', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
15
19
|
const storage = new FileSystemStorage(`${this.root}/.screenshots`);
|
|
16
20
|
let currentFiles = await storage.list('current');
|
|
17
21
|
if (this.filter) {
|
|
@@ -31,4 +35,6 @@ export class AcceptCommand extends Command {
|
|
|
31
35
|
this.context.stdout.write(`\nAccepted ${currentFiles.length} screenshot(s) as baseline.\n`);
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
|
-
|
|
38
|
+
|
|
39
|
+
export { AcceptCommand };
|
|
40
|
+
//# sourceMappingURL=acceptCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptCommand.js","
|
|
1
|
+
{"version":3,"file":"acceptCommand.js","sources":["../../src/commands/acceptCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIM,MAAO,aAAc,SAAQ,OAAO,CAAA;IACzC,OAAgB,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEpC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,yCAAyC;AACtD,QAAA,QAAQ,EAAE;YACT,CAAC,YAAY,EAAE,WAAW,CAAC;YAC3B,CAAC,0BAA0B,EAAE,+BAA+B,CAAC;AAC7D,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AAC5G,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;AACvG,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;AAEjG,IAAA,MAAM,OAAO,GAAA;QACI,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAClG,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,aAAA,CAAe,CAAC;QAElE,IAAI,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,MAAM,CACvB,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CACxE;AACD,YAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD;AAEA,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC;YAChE;QACD;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,EAAE,IAAI,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,YAAY,CAAA,EAAA,CAAI,CAAC;QACnD;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,WAAA,EAAc,YAAY,CAAC,MAAM,CAAA,6BAAA,CAA+B,CAAC;IAC5F;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,cAAe,SAAQ,OAAO;IAC1C,OAAgB,KAAK,aAAiB;IAEtC,OAAgB,KAAK,4BAKlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,IAAI,SAAqF;IAE5F,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAiEhC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
+
import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
|
|
2
3
|
import { FileSystemStorage } from '../storage.js';
|
|
3
|
-
|
|
4
|
+
|
|
5
|
+
class CompareCommand extends Command {
|
|
4
6
|
static paths = [['compare']];
|
|
5
7
|
static usage = Command.Usage({
|
|
6
8
|
description: 'Compare current screenshots against baseline',
|
|
@@ -8,8 +10,10 @@ export class CompareCommand extends Command {
|
|
|
8
10
|
['Compare default directories', '$0 compare'],
|
|
9
11
|
],
|
|
10
12
|
});
|
|
13
|
+
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
11
14
|
root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
|
|
12
15
|
async execute() {
|
|
16
|
+
new ConsoleLogger('compare', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
13
17
|
const storage = new FileSystemStorage(`${this.root}/.screenshots`);
|
|
14
18
|
const baselineFiles = await storage.list('baseline');
|
|
15
19
|
const currentFiles = await storage.list('current');
|
|
@@ -81,4 +85,6 @@ function buffersEqual(a, b) {
|
|
|
81
85
|
}
|
|
82
86
|
return true;
|
|
83
87
|
}
|
|
84
|
-
|
|
88
|
+
|
|
89
|
+
export { CompareCommand };
|
|
90
|
+
//# sourceMappingURL=compareCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compareCommand.js","
|
|
1
|
+
{"version":3,"file":"compareCommand.js","sources":["../../src/commands/compareCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpCommand.d.ts","sourceRoot":"","sources":["../../src/commands/mcpCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,UAAW,SAAQ,OAAO;IACtC,OAAgB,KAAK,aAAa;IAElC,OAAgB,KAAK,4BAKlB;IAEH,QAAQ,CAAC,MAAM,SAA8F;IAEvG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ9B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command, Option } from 'clipanion';
|
|
2
|
+
import { ensureDaemon } from '../daemon/lifecycle.js';
|
|
3
|
+
import { ComponentExplorerMcpServer } from '../mcp/McpServer.js';
|
|
4
|
+
|
|
5
|
+
class McpCommand extends Command {
|
|
6
|
+
static paths = [['mcp']];
|
|
7
|
+
static usage = Command.Usage({
|
|
8
|
+
description: 'Start an MCP server over stdio. Auto-starts a daemon if not already running.',
|
|
9
|
+
examples: [
|
|
10
|
+
['Start MCP server', '$0 mcp -c config.json'],
|
|
11
|
+
],
|
|
12
|
+
});
|
|
13
|
+
config = Option.String('-c,--config', { required: true, description: 'Path to watch config JSON' });
|
|
14
|
+
async execute() {
|
|
15
|
+
// Ensure daemon is running (auto-starts in background if needed)
|
|
16
|
+
const daemon = await ensureDaemon(this.config);
|
|
17
|
+
// Create and connect the MCP server over stdio
|
|
18
|
+
const mcpServer = new ComponentExplorerMcpServer(daemon);
|
|
19
|
+
await mcpServer.connect();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { McpCommand };
|
|
24
|
+
//# sourceMappingURL=mcpCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpCommand.js","sources":["../../src/commands/mcpCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIM,MAAO,UAAW,SAAQ,OAAO,CAAA;IACtC,OAAgB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,8EAA8E;AAC3F,QAAA,QAAQ,EAAE;YACT,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;AAC7C,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;AAE5G,IAAA,MAAM,OAAO,GAAA;;QAEZ,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG9C,QAAA,MAAM,SAAS,GAAG,IAAI,0BAA0B,CAAC,MAAM,CAAC;AACxD,QAAA,MAAM,SAAS,CAAC,OAAO,EAAE;IAC1B;;;;;"}
|
|
@@ -2,6 +2,7 @@ import { Command } from 'clipanion';
|
|
|
2
2
|
export declare class ScreenshotCommand extends Command {
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
|
+
readonly verbose: number;
|
|
5
6
|
readonly filter: string | undefined;
|
|
6
7
|
readonly accept: boolean;
|
|
7
8
|
readonly root: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotCommand.d.ts","sourceRoot":"","sources":["../../src/commands/screenshotCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshotCommand.d.ts","sourceRoot":"","sources":["../../src/commands/screenshotCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAQ5C,qBAAa,iBAAkB,SAAQ,OAAO;IAC7C,OAAgB,KAAK,aAAoB;IAEzC,OAAgB,KAAK,4BAOlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,qBAAkG;IACjH,QAAQ,CAAC,MAAM,UAAuG;IACtH,QAAQ,CAAC,IAAI,SAAqF;IAE5F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAsC9B"}
|
|
@@ -2,9 +2,11 @@ import { Command, Option } from 'clipanion';
|
|
|
2
2
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
3
3
|
import { BrowserComponentExplorer } from '../componentExplorer.js';
|
|
4
4
|
import { DefaultComponentExplorerHttpServerFactory } from '../httpServer.js';
|
|
5
|
+
import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
|
|
5
6
|
import { FileSystemStorage } from '../storage.js';
|
|
6
7
|
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
class ScreenshotCommand extends Command {
|
|
8
10
|
static paths = [['screenshot']];
|
|
9
11
|
static usage = Command.Usage({
|
|
10
12
|
description: 'Capture screenshots of all fixtures',
|
|
@@ -14,10 +16,12 @@ export class ScreenshotCommand extends Command {
|
|
|
14
16
|
['Filter by glob', '$0 screenshot --filter "Button/*"'],
|
|
15
17
|
],
|
|
16
18
|
});
|
|
19
|
+
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
17
20
|
filter = Option.String('--filter', { required: false, description: 'Filter fixtures by glob pattern' });
|
|
18
21
|
accept = Option.Boolean('--accept', false, { description: 'Write directly to baseline instead of current' });
|
|
19
22
|
root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
|
|
20
23
|
async execute() {
|
|
24
|
+
const logger = new ConsoleLogger('screenshot', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
21
25
|
const outputDir = this.accept ? 'baseline' : 'current';
|
|
22
26
|
const storage = new FileSystemStorage(`${this.root}/.screenshots`);
|
|
23
27
|
const serverFactory = new DefaultComponentExplorerHttpServerFactory();
|
|
@@ -26,9 +30,9 @@ export class ScreenshotCommand extends Command {
|
|
|
26
30
|
let explorer;
|
|
27
31
|
try {
|
|
28
32
|
this.context.stdout.write('Starting Vite dev server...\n');
|
|
29
|
-
server = await serverFactory.createViteServer(ViteProjectRef.fromSourceRootDir(this.root));
|
|
33
|
+
server = await serverFactory.createViteServer(ViteProjectRef.fromSourceRootDir(this.root), { logger });
|
|
30
34
|
this.context.stdout.write(`Server running at ${server.url}\n`);
|
|
31
|
-
explorer = new BrowserComponentExplorer(browserFactory, server);
|
|
35
|
+
explorer = new BrowserComponentExplorer(browserFactory, server, logger);
|
|
32
36
|
const fixtures = await explorer.listFixtures();
|
|
33
37
|
const filtered = this.filter
|
|
34
38
|
? fixtures.filter(f => matchGlob(f.fixtureId, this.filter))
|
|
@@ -53,4 +57,6 @@ function matchGlob(fixtureId, pattern) {
|
|
|
53
57
|
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
54
58
|
return regex.test(fixtureId);
|
|
55
59
|
}
|
|
56
|
-
|
|
60
|
+
|
|
61
|
+
export { ScreenshotCommand };
|
|
62
|
+
//# sourceMappingURL=screenshotCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotCommand.js","
|
|
1
|
+
{"version":3,"file":"screenshotCommand.js","sources":["../../src/commands/screenshotCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from 'clipanion';
|
|
2
|
+
export declare class ServeCommand extends Command {
|
|
3
|
+
static paths: string[][];
|
|
4
|
+
static usage: import("clipanion").Usage;
|
|
5
|
+
readonly verbose: number;
|
|
6
|
+
readonly config: string;
|
|
7
|
+
readonly background: boolean;
|
|
8
|
+
readonly attach: boolean;
|
|
9
|
+
readonly kill: boolean;
|
|
10
|
+
execute(): Promise<void>;
|
|
11
|
+
private _ensureBackground;
|
|
12
|
+
private _attach;
|
|
13
|
+
private _printEvent;
|
|
14
|
+
private _startDaemon;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=serveCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serveCommand.d.ts","sourceRoot":"","sources":["../../src/commands/serveCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAW5C,qBAAa,YAAa,SAAQ,OAAO;IACxC,OAAgB,KAAK,aAAe;IAEpC,OAAgB,KAAK,4BAgBlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,SAA8F;IAC7G,QAAQ,CAAC,UAAU,UAAoG;IACvH,QAAQ,CAAC,MAAM,UAAsG;IACrH,QAAQ,CAAC,IAAI,UAAkF;IAEzF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA+ChB,iBAAiB;YAsBjB,OAAO;IAgBrB,OAAO,CAAC,WAAW;YAeL,YAAY;CA+B1B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Command, Option } from 'clipanion';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
|
|
6
|
+
import { ResolvedWatchConfig } from '../watchConfig.js';
|
|
7
|
+
import { DaemonService } from '../daemon/DaemonService.js';
|
|
8
|
+
import { startPipeServer } from '../daemon/pipeServer.js';
|
|
9
|
+
import { daemonPipeName } from '../daemon/pipeName.js';
|
|
10
|
+
import { tryConnect, waitForDaemon } from '../daemon/lifecycle.js';
|
|
11
|
+
|
|
12
|
+
class ServeCommand extends Command {
|
|
13
|
+
static paths = [['serve']];
|
|
14
|
+
static usage = Command.Usage({
|
|
15
|
+
description: 'Start or attach to a Component Explorer daemon.',
|
|
16
|
+
details: `
|
|
17
|
+
Without flags: starts a foreground daemon. Errors if one is already running.
|
|
18
|
+
--background: spawns a detached daemon, prints pipe name, exits. No-op if already running.
|
|
19
|
+
--attach: connects to a running daemon and streams events. Errors if none is running.
|
|
20
|
+
--background --attach: ensures a daemon is running, then attaches.
|
|
21
|
+
--kill: shuts down a running daemon.
|
|
22
|
+
`,
|
|
23
|
+
examples: [
|
|
24
|
+
['Start in foreground', '$0 serve -c config.json'],
|
|
25
|
+
['Start in background', '$0 serve -c config.json --background'],
|
|
26
|
+
['Attach to running daemon', '$0 serve -c config.json --attach'],
|
|
27
|
+
['Ensure daemon + attach', '$0 serve -c config.json --background --attach'],
|
|
28
|
+
['Kill running daemon', '$0 serve -c config.json --kill'],
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
32
|
+
config = Option.String('-c,--config', { required: true, description: 'Path to watch config JSON' });
|
|
33
|
+
background = Option.Boolean('--background', false, { description: 'Spawn as a detached background process' });
|
|
34
|
+
attach = Option.Boolean('--attach', false, { description: 'Attach to a running daemon and stream events' });
|
|
35
|
+
kill = Option.Boolean('--kill', false, { description: 'Shut down a running daemon' });
|
|
36
|
+
async execute() {
|
|
37
|
+
const pipeName = daemonPipeName(this.config);
|
|
38
|
+
if (this.kill) {
|
|
39
|
+
const client = await tryConnect(pipeName);
|
|
40
|
+
if (!client) {
|
|
41
|
+
this.context.stderr.write('No daemon running.\n');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
await client.methods.shutdown();
|
|
45
|
+
this.context.stdout.write('Daemon shut down.\n');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (this.background && this.attach) {
|
|
49
|
+
// Ensure daemon is running, then attach
|
|
50
|
+
await this._ensureBackground(pipeName);
|
|
51
|
+
const client = await tryConnect(pipeName);
|
|
52
|
+
if (!client) {
|
|
53
|
+
this.context.stderr.write('Failed to connect after starting daemon.\n');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
return this._attach(client, pipeName);
|
|
57
|
+
}
|
|
58
|
+
if (this.background) {
|
|
59
|
+
return this._ensureBackground(pipeName);
|
|
60
|
+
}
|
|
61
|
+
if (this.attach) {
|
|
62
|
+
const client = await tryConnect(pipeName);
|
|
63
|
+
if (!client) {
|
|
64
|
+
this.context.stderr.write(`No daemon running. Start one first:\n $0 serve -c ${this.config}\n`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
return this._attach(client, pipeName);
|
|
68
|
+
}
|
|
69
|
+
// Default: start foreground daemon
|
|
70
|
+
const existing = await tryConnect(pipeName);
|
|
71
|
+
if (existing) {
|
|
72
|
+
this.context.stderr.write(`Daemon already running (pipe: ${pipeName}).\nUse --attach to connect to it.\n`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
return this._startDaemon(pipeName);
|
|
76
|
+
}
|
|
77
|
+
async _ensureBackground(pipeName) {
|
|
78
|
+
if (await tryConnect(pipeName)) {
|
|
79
|
+
this.context.stdout.write('Daemon already running.\n');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const cliEntryPoint = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../index.js');
|
|
83
|
+
const child = spawn(process.execPath, [cliEntryPoint, 'serve', '-c', this.config], { detached: true, stdio: 'ignore' });
|
|
84
|
+
child.unref();
|
|
85
|
+
await waitForDaemon(pipeName, { timeoutMs: 30_000 });
|
|
86
|
+
this.context.stdout.write(`Daemon started (pipe: ${pipeName})\n`);
|
|
87
|
+
}
|
|
88
|
+
async _attach(client, pipeName) {
|
|
89
|
+
this.context.stdout.write(`Attached to daemon (pipe: ${pipeName})\n`);
|
|
90
|
+
this.context.stdout.write('Listening for events... (Ctrl+C to detach)\n\n');
|
|
91
|
+
const events = await client.methods.events();
|
|
92
|
+
for await (const event of events) {
|
|
93
|
+
this._printEvent(event);
|
|
94
|
+
}
|
|
95
|
+
this.context.stdout.write('\nEvent stream ended.\n');
|
|
96
|
+
}
|
|
97
|
+
_printEvent(event) {
|
|
98
|
+
const ts = new Date().toLocaleTimeString();
|
|
99
|
+
switch (event.type) {
|
|
100
|
+
case 'source-change':
|
|
101
|
+
this.context.stdout.write(`[${ts}] source-change ${event.sessionName} sourceTreeId=${event.sourceTreeId}\n`);
|
|
102
|
+
break;
|
|
103
|
+
case 'ref-change':
|
|
104
|
+
this.context.stdout.write(`[${ts}] ref-change ${event.sessionName} newCommit=${event.newCommit}\n`);
|
|
105
|
+
break;
|
|
106
|
+
case 'log':
|
|
107
|
+
this.context.stdout.write(`[${ts}] [${event.level}] ${event.message}\n`);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async _startDaemon(pipeName) {
|
|
112
|
+
const logger = new ConsoleLogger('serve', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
113
|
+
logger.log(`Reading config from ${this.config}`);
|
|
114
|
+
const resolvedConfig = await ResolvedWatchConfig.fromFile(this.config);
|
|
115
|
+
logger.log('Setting up sessions...');
|
|
116
|
+
const service = await DaemonService.create(resolvedConfig, logger);
|
|
117
|
+
logger.log(`Starting pipe server on ${pipeName}`);
|
|
118
|
+
const server = await startPipeServer(pipeName, service);
|
|
119
|
+
this.context.stdout.write(`Daemon listening on ${pipeName}\n`);
|
|
120
|
+
this.context.stdout.write('Press Ctrl+C to stop.\n\n');
|
|
121
|
+
const sessionInfos = service.getSessionInfos();
|
|
122
|
+
for (const s of sessionInfos) {
|
|
123
|
+
this.context.stdout.write(` ${s.name}: ${s.serverUrl} (${s.sourceKind})\n`);
|
|
124
|
+
}
|
|
125
|
+
this.context.stdout.write('\n');
|
|
126
|
+
process.on('SIGINT', () => {
|
|
127
|
+
service.requestShutdown();
|
|
128
|
+
});
|
|
129
|
+
await service.runEventLoop();
|
|
130
|
+
this.context.stdout.write('\nShutting down...\n');
|
|
131
|
+
server.close();
|
|
132
|
+
await service.dispose();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { ServeCommand };
|
|
137
|
+
//# sourceMappingURL=serveCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serveCommand.js","sources":["../../src/commands/serveCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Command } from 'clipanion';
|
|
|
2
2
|
export declare class WatchCommand extends Command {
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
|
+
readonly verbose: number;
|
|
5
6
|
readonly root: string;
|
|
6
7
|
readonly config: string | undefined;
|
|
7
8
|
execute(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchCommand.d.ts","sourceRoot":"","sources":["../../src/commands/watchCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAiB5C,qBAAa,YAAa,SAAQ,OAAO;IACxC,OAAgB,KAAK,aAAe;IAEpC,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,IAAI,SAAqF;IAClG,QAAQ,CAAC,MAAM,qBAA+F;IAExG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,cAAc;YAoCd,kBAAkB;YAkHlB,aAAa;
|
|
1
|
+
{"version":3,"file":"watchCommand.d.ts","sourceRoot":"","sources":["../../src/commands/watchCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAiB5C,qBAAa,YAAa,SAAQ,OAAO;IACxC,OAAgB,KAAK,aAAe;IAEpC,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,IAAI,SAAqF;IAClG,QAAQ,CAAC,MAAM,qBAA+F;IAExG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,cAAc;YAoCd,kBAAkB;YAkHlB,aAAa;CAgD3B"}
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
-
import
|
|
2
|
+
import '../external/vscode-observables/observables/dist/observableInternal/index.js';
|
|
3
|
+
import '../external/vscode-observables/observables/dist/observableInternal/debugLocation.js';
|
|
4
|
+
import { autorun } from '../external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js';
|
|
5
|
+
import '../external/vscode-observables/observables/dist/observableInternal/observables/derived.js';
|
|
6
|
+
import '../external/vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
7
|
+
import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
3
8
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
4
9
|
import { BrowserComponentExplorer } from '../componentExplorer.js';
|
|
5
10
|
import { DefaultComponentExplorerHttpServerFactory } from '../httpServer.js';
|
|
6
|
-
import { ConsoleLogger } from '../logger.js';
|
|
11
|
+
import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
|
|
7
12
|
import { FileSystemStorage } from '../storage.js';
|
|
8
13
|
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
9
14
|
import { ResolvedWatchConfig } from '../watchConfig.js';
|
|
10
15
|
import { ExplorerSession } from '../explorerSession.js';
|
|
11
16
|
import { installDependencies } from '../dependencyInstaller.js';
|
|
12
|
-
import {
|
|
13
|
-
|
|
17
|
+
import { compareScreenshots, ScreenshotCache, contentHash } from '../screenshotCache.js';
|
|
18
|
+
|
|
19
|
+
class WatchCommand extends Command {
|
|
14
20
|
static paths = [['watch']];
|
|
15
21
|
static usage = Command.Usage({
|
|
16
22
|
description: 'Watch for changes and compare screenshots against baseline',
|
|
@@ -19,6 +25,7 @@ export class WatchCommand extends Command {
|
|
|
19
25
|
['Watch with config', '$0 watch -c component-explorer-watch-config.json'],
|
|
20
26
|
],
|
|
21
27
|
});
|
|
28
|
+
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
22
29
|
root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
|
|
23
30
|
config = Option.String('-c,--config', { required: false, description: 'Path to watch config JSON' });
|
|
24
31
|
async execute() {
|
|
@@ -28,12 +35,12 @@ export class WatchCommand extends Command {
|
|
|
28
35
|
return this._executeLegacy();
|
|
29
36
|
}
|
|
30
37
|
async _executeLegacy() {
|
|
31
|
-
const logger = new ConsoleLogger('watch', this.context.stdout);
|
|
38
|
+
const logger = new ConsoleLogger('watch', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
32
39
|
const storage = new FileSystemStorage(`${this.root}/.screenshots`);
|
|
33
40
|
const serverFactory = new DefaultComponentExplorerHttpServerFactory();
|
|
34
41
|
const browserFactory = new PlaywrightBrowserPageFactory();
|
|
35
42
|
logger.log('Starting Vite dev server...');
|
|
36
|
-
const server = await serverFactory.createViteServer(ViteProjectRef.fromSourceRootDir(this.root));
|
|
43
|
+
const server = await serverFactory.createViteServer(ViteProjectRef.fromSourceRootDir(this.root), { logger });
|
|
37
44
|
logger.log(`Server running at ${server.url}`);
|
|
38
45
|
const explorer = new BrowserComponentExplorer(browserFactory, server, logger);
|
|
39
46
|
logger.log('Taking initial screenshots...');
|
|
@@ -58,7 +65,7 @@ export class WatchCommand extends Command {
|
|
|
58
65
|
await server.dispose();
|
|
59
66
|
}
|
|
60
67
|
async _executeWithConfig() {
|
|
61
|
-
const logger = new ConsoleLogger('watch', this.context.stdout);
|
|
68
|
+
const logger = new ConsoleLogger('watch', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
62
69
|
const serverFactory = new DefaultComponentExplorerHttpServerFactory();
|
|
63
70
|
const browserFactory = new PlaywrightBrowserPageFactory();
|
|
64
71
|
logger.log(`Reading config from ${this.config}`);
|
|
@@ -126,7 +133,7 @@ export class WatchCommand extends Command {
|
|
|
126
133
|
}
|
|
127
134
|
await installDependencies(wt.worktreePath, wt.install, logger);
|
|
128
135
|
// Recreate session
|
|
129
|
-
const newSession = await ExplorerSession.create(sessionConfig.name, sessionConfig.viteProject, serverFactory, browserFactory, logger, resolveViteFrom);
|
|
136
|
+
const newSession = await ExplorerSession.create(sessionConfig.name, sessionConfig.viteProject, serverFactory, browserFactory, { logger, resolveViteFrom });
|
|
130
137
|
sessions.set(sessionConfig.name, newSession);
|
|
131
138
|
const cache = caches.get(sessionConfig.name);
|
|
132
139
|
const screenshots = await captureAll(newSession.explorer);
|
|
@@ -188,7 +195,10 @@ export class WatchCommand extends Command {
|
|
|
188
195
|
}
|
|
189
196
|
}
|
|
190
197
|
logger.log(`Starting server: ${sessionConfig.name}`);
|
|
191
|
-
const session = await ExplorerSession.create(sessionConfig.name, sessionConfig.viteProject, serverFactory, browserFactory,
|
|
198
|
+
const session = await ExplorerSession.create(sessionConfig.name, sessionConfig.viteProject, serverFactory, browserFactory, {
|
|
199
|
+
logger,
|
|
200
|
+
resolveViteFrom: sessionConfig.source.kind === 'worktree' ? resolveViteFrom : undefined,
|
|
201
|
+
});
|
|
192
202
|
sessions.set(sessionConfig.name, session);
|
|
193
203
|
caches.set(sessionConfig.name, new ScreenshotCache());
|
|
194
204
|
logger.log(`Server ready: ${sessionConfig.name} (${session.serverUrl})`);
|
|
@@ -304,4 +314,6 @@ function buffersEqual(a, b) {
|
|
|
304
314
|
}
|
|
305
315
|
return true;
|
|
306
316
|
}
|
|
307
|
-
|
|
317
|
+
|
|
318
|
+
export { WatchCommand };
|
|
319
|
+
//# sourceMappingURL=watchCommand.js.map
|