demofly 0.2.8 → 0.2.10
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/README.md +154 -0
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +163 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/demos/open.d.ts.map +1 -1
- package/dist/commands/demos/open.js +2 -1
- package/dist/commands/demos/open.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +467 -198
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -15
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +20 -1
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/render.d.ts.map +1 -1
- package/dist/commands/render.js +5 -2
- package/dist/commands/render.js.map +1 -1
- package/dist/commands/tts.d.ts.map +1 -1
- package/dist/commands/tts.js +127 -12
- package/dist/commands/tts.js.map +1 -1
- package/dist/commands/voices/select.d.ts.map +1 -1
- package/dist/commands/voices/select.js +66 -11
- package/dist/commands/voices/select.js.map +1 -1
- package/dist/lib/audio-probe.d.ts +23 -0
- package/dist/lib/audio-probe.d.ts.map +1 -0
- package/dist/lib/audio-probe.js +59 -0
- package/dist/lib/audio-probe.js.map +1 -0
- package/dist/lib/checks.d.ts.map +1 -1
- package/dist/lib/checks.js +51 -16
- package/dist/lib/checks.js.map +1 -1
- package/dist/lib/demo-config.d.ts +7 -0
- package/dist/lib/demo-config.d.ts.map +1 -1
- package/dist/lib/demo-config.js +9 -0
- package/dist/lib/demo-config.js.map +1 -1
- package/dist/lib/edit-proposals.d.ts +48 -1
- package/dist/lib/edit-proposals.d.ts.map +1 -1
- package/dist/lib/edit-proposals.js +49 -0
- package/dist/lib/edit-proposals.js.map +1 -1
- package/dist/lib/push-project.d.ts +37 -0
- package/dist/lib/push-project.d.ts.map +1 -0
- package/dist/lib/push-project.js +194 -0
- package/dist/lib/push-project.js.map +1 -0
- package/dist/lib/retiming.js +47 -0
- package/dist/lib/retiming.js.map +1 -1
- package/dist/lib/scene-assembler.d.ts +32 -0
- package/dist/lib/scene-assembler.d.ts.map +1 -0
- package/dist/lib/scene-assembler.js +185 -0
- package/dist/lib/scene-assembler.js.map +1 -0
- package/dist/lib/voice-resolver.d.ts +4 -0
- package/dist/lib/voice-resolver.d.ts.map +1 -1
- package/dist/lib/voice-resolver.js +5 -2
- package/dist/lib/voice-resolver.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# demofly
|
|
2
|
+
|
|
3
|
+
Automated demo video generation from the command line. Record browser interactions, generate narration with text-to-speech, and assemble polished demo videos — all in one workflow.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g demofly
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires **Node.js 22** or later.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Initialize prerequisites (Playwright, ffmpeg, TTS models)
|
|
17
|
+
demofly init
|
|
18
|
+
|
|
19
|
+
# Generate a demo (record + narrate + assemble)
|
|
20
|
+
demofly generate my-demo --record
|
|
21
|
+
|
|
22
|
+
# Push to the cloud
|
|
23
|
+
demofly push my-demo
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
### Core Workflow
|
|
29
|
+
|
|
30
|
+
| Command | Description |
|
|
31
|
+
|---------|-------------|
|
|
32
|
+
| `demofly init` | Install prerequisites (Playwright, ffmpeg, Kokoro TTS model) |
|
|
33
|
+
| `demofly generate <demo>` | Record, narrate, and assemble a demo video |
|
|
34
|
+
| `demofly push <demo>` | Push a completed demo to the demofly cloud |
|
|
35
|
+
| `demofly status` | Check prerequisite status without installing |
|
|
36
|
+
|
|
37
|
+
### Generate Options
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
--record Record browser interactions with Playwright
|
|
41
|
+
--audio Generate narration audio only
|
|
42
|
+
--video Record video only (skip audio)
|
|
43
|
+
--assemble Full intelligent assembly (align + retiming)
|
|
44
|
+
--scene <id> Generate audio for a specific scene
|
|
45
|
+
--voice <name> TTS voice (e.g., "heart", "aria")
|
|
46
|
+
--provider <provider> TTS provider (kokoro, elevenlabs, openai)
|
|
47
|
+
--speed <multiplier> TTS speed multiplier (default: 1.0)
|
|
48
|
+
--no-audio Skip TTS generation
|
|
49
|
+
--verbose Show detailed debug output
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Authentication
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
demofly auth login # Device code flow (default)
|
|
56
|
+
demofly auth login --browser # OAuth browser flow
|
|
57
|
+
demofly auth login --otp # Email OTP
|
|
58
|
+
demofly auth logout # Clear credentials
|
|
59
|
+
demofly auth status # Check login state
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Demo Management
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
demofly demos list # List local and cloud demos
|
|
66
|
+
demofly demos get <name> # Get demo details
|
|
67
|
+
demofly demos update <name> # Update demo metadata
|
|
68
|
+
demofly demos delete <name> # Delete a demo
|
|
69
|
+
demofly demos open <name> # Open demo in browser
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Voice Selection
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
demofly voices list # List available TTS voices
|
|
76
|
+
demofly voices select # Choose a default voice interactively
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Utilities
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
demofly version # Print CLI version
|
|
83
|
+
demofly update # Update to latest version
|
|
84
|
+
demofly update --check # Check for updates without installing
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Voices
|
|
88
|
+
|
|
89
|
+
### Local (free, always available)
|
|
90
|
+
|
|
91
|
+
Powered by [Kokoro](https://github.com/thewh1teagle/kokoro-onnx) — runs entirely on your machine, no API key needed.
|
|
92
|
+
|
|
93
|
+
| Voice | Gender |
|
|
94
|
+
|-------|--------|
|
|
95
|
+
| heart | Female |
|
|
96
|
+
| bella | Female |
|
|
97
|
+
| nicole | Female |
|
|
98
|
+
| nova | Female |
|
|
99
|
+
| sarah | Female |
|
|
100
|
+
| adam | Male |
|
|
101
|
+
| michael | Male |
|
|
102
|
+
|
|
103
|
+
### Cloud (Pro)
|
|
104
|
+
|
|
105
|
+
With a Pro subscription, access premium voices from **ElevenLabs** and **OpenAI**. Run `demofly voices list` to see all available options.
|
|
106
|
+
|
|
107
|
+
## Project Structure
|
|
108
|
+
|
|
109
|
+
After running `demofly init`, a `demofly/` directory is created in your project root. Each demo gets its own subdirectory:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
demofly/
|
|
113
|
+
└── my-demo/
|
|
114
|
+
├── demo.spec.ts # Playwright test script
|
|
115
|
+
├── playwright.config.ts # Playwright configuration
|
|
116
|
+
├── proposal.md # Demo proposal and metadata
|
|
117
|
+
├── script.md # Demo script outline
|
|
118
|
+
├── narration.md # Scene-by-scene narration for TTS
|
|
119
|
+
├── demofly.json # Demo config (cloud sync ID)
|
|
120
|
+
├── audio/ # Generated TTS audio per scene
|
|
121
|
+
└── recordings/ # Recorded video, timing data, final output
|
|
122
|
+
├── video.webm
|
|
123
|
+
├── timing.json
|
|
124
|
+
└── final.mp4
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Claude Code Integration
|
|
128
|
+
|
|
129
|
+
Demofly works with [Claude Code](https://docs.anthropic.com/en/docs/claude-code) to create demos conversationally. Running `demofly init` installs the Playwright MCP plugin so Claude Code can drive the browser and record demos for you.
|
|
130
|
+
|
|
131
|
+
## Configuration
|
|
132
|
+
|
|
133
|
+
### Default Voice
|
|
134
|
+
|
|
135
|
+
Set with `demofly voices select` or pass `--voice` and `--provider` flags per command. Stored in `~/.config/demofly/config.json`.
|
|
136
|
+
|
|
137
|
+
### Credentials
|
|
138
|
+
|
|
139
|
+
Authentication tokens are stored in `~/.demofly/credentials` with restricted file permissions.
|
|
140
|
+
|
|
141
|
+
### Environment Variables
|
|
142
|
+
|
|
143
|
+
| Variable | Description |
|
|
144
|
+
|----------|-------------|
|
|
145
|
+
| `DEMOFLY_URL` | Override the API base URL (default: `https://app.demofly.ai`) |
|
|
146
|
+
|
|
147
|
+
## Links
|
|
148
|
+
|
|
149
|
+
- **Website:** [demofly.ai](https://demofly.ai)
|
|
150
|
+
- **Issues:** [GitHub Issues](https://github.com/llama-farm/demofly/issues)
|
|
151
|
+
|
|
152
|
+
## License
|
|
153
|
+
|
|
154
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkLzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD7D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve, extname } from "node:path";
|
|
3
|
+
import { normalizeTimingData } from "../lib/timing.js";
|
|
4
|
+
import { hasFfprobe, probeAudioDuration, computeOverflow, } from "../lib/audio-probe.js";
|
|
5
|
+
function findAudioFile(audioDir, sceneId) {
|
|
6
|
+
const extensions = [".wav", ".mp3", ".aac", ".m4a", ".ogg"];
|
|
7
|
+
for (const ext of extensions) {
|
|
8
|
+
const filePath = resolve(audioDir, `${sceneId}${ext}`);
|
|
9
|
+
if (existsSync(filePath))
|
|
10
|
+
return filePath;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function analyzeScenes(timingData, audioDir) {
|
|
15
|
+
const results = [];
|
|
16
|
+
for (const scene of timingData.scenes) {
|
|
17
|
+
const windowMs = scene.endMs - scene.startMs;
|
|
18
|
+
const audioPath = findAudioFile(audioDir, scene.sceneId);
|
|
19
|
+
if (!audioPath) {
|
|
20
|
+
results.push({
|
|
21
|
+
sceneId: scene.sceneId,
|
|
22
|
+
windowMs,
|
|
23
|
+
audioDurationMs: 0,
|
|
24
|
+
overflowMs: 0,
|
|
25
|
+
status: "no-audio",
|
|
26
|
+
severity: "ok",
|
|
27
|
+
});
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const audioDurationMs = probeAudioDuration(audioPath);
|
|
31
|
+
const { overflowMs, severity } = computeOverflow(audioDurationMs, windowMs);
|
|
32
|
+
results.push({
|
|
33
|
+
sceneId: scene.sceneId,
|
|
34
|
+
windowMs,
|
|
35
|
+
audioDurationMs,
|
|
36
|
+
overflowMs,
|
|
37
|
+
status: overflowMs > 0 ? "overflow" : "fit",
|
|
38
|
+
severity,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return results;
|
|
42
|
+
}
|
|
43
|
+
function buildReport(demo, scenes) {
|
|
44
|
+
const scenesWithAudio = scenes.filter((s) => s.status !== "no-audio");
|
|
45
|
+
const overflowScenes = scenes.filter((s) => s.overflowMs > 0);
|
|
46
|
+
return {
|
|
47
|
+
demo,
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
scenes,
|
|
50
|
+
summary: {
|
|
51
|
+
totalScenes: scenes.length,
|
|
52
|
+
scenesWithAudio: scenesWithAudio.length,
|
|
53
|
+
scenesOverflow: overflowScenes.length,
|
|
54
|
+
scenesUnderflow: scenesWithAudio.filter((s) => s.overflowMs < 0).length,
|
|
55
|
+
maxOverflowMs: overflowScenes.length > 0
|
|
56
|
+
? Math.max(...overflowScenes.map((s) => s.overflowMs))
|
|
57
|
+
: 0,
|
|
58
|
+
totalOverflowMs: overflowScenes.reduce((sum, s) => sum + s.overflowMs, 0),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const COLORS = {
|
|
63
|
+
reset: "\x1b[0m",
|
|
64
|
+
green: "\x1b[32m",
|
|
65
|
+
yellow: "\x1b[33m",
|
|
66
|
+
red: "\x1b[31m",
|
|
67
|
+
dim: "\x1b[2m",
|
|
68
|
+
bold: "\x1b[1m",
|
|
69
|
+
};
|
|
70
|
+
function severityColor(severity) {
|
|
71
|
+
switch (severity) {
|
|
72
|
+
case "ok": return COLORS.green;
|
|
73
|
+
case "warning": return COLORS.yellow;
|
|
74
|
+
case "critical": return COLORS.red;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function formatMs(ms) {
|
|
78
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
79
|
+
}
|
|
80
|
+
function printTable(report) {
|
|
81
|
+
const header = `${COLORS.bold}Scene${COLORS.reset}`.padEnd(25) +
|
|
82
|
+
"Window".padEnd(10) +
|
|
83
|
+
"Audio".padEnd(10) +
|
|
84
|
+
"Overflow".padEnd(12) +
|
|
85
|
+
"Status";
|
|
86
|
+
console.log(`\n${COLORS.bold}--- demofly analyze: ${report.demo} ---${COLORS.reset}\n`);
|
|
87
|
+
console.log(header);
|
|
88
|
+
console.log("─".repeat(60));
|
|
89
|
+
for (const scene of report.scenes) {
|
|
90
|
+
const color = severityColor(scene.severity);
|
|
91
|
+
const sceneCol = scene.sceneId.padEnd(15);
|
|
92
|
+
const windowCol = formatMs(scene.windowMs).padEnd(10);
|
|
93
|
+
if (scene.status === "no-audio") {
|
|
94
|
+
console.log(`${sceneCol}${windowCol}${COLORS.dim}—${COLORS.reset}`.padEnd(35) +
|
|
95
|
+
`${"—".padEnd(12)}${COLORS.dim}no audio${COLORS.reset}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const audioCol = formatMs(scene.audioDurationMs).padEnd(10);
|
|
99
|
+
const overflowSign = scene.overflowMs > 0 ? "+" : "";
|
|
100
|
+
const overflowCol = `${overflowSign}${formatMs(scene.overflowMs)}`.padEnd(12);
|
|
101
|
+
const statusLabel = scene.status === "overflow"
|
|
102
|
+
? scene.severity
|
|
103
|
+
: "ok";
|
|
104
|
+
console.log(`${sceneCol}${windowCol}${audioCol}${color}${overflowCol}${statusLabel}${COLORS.reset}`);
|
|
105
|
+
}
|
|
106
|
+
console.log("─".repeat(60));
|
|
107
|
+
const { summary } = report;
|
|
108
|
+
const parts = [
|
|
109
|
+
`${summary.totalScenes} scene(s)`,
|
|
110
|
+
`${summary.scenesWithAudio} with audio`,
|
|
111
|
+
];
|
|
112
|
+
if (summary.scenesOverflow > 0) {
|
|
113
|
+
parts.push(`${COLORS.yellow}${summary.scenesOverflow} overflow${COLORS.reset} (max ${formatMs(summary.maxOverflowMs)}, total ${formatMs(summary.totalOverflowMs)})`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
parts.push(`${COLORS.green}0 overflow${COLORS.reset}`);
|
|
117
|
+
}
|
|
118
|
+
console.log(parts.join(" | "));
|
|
119
|
+
console.log();
|
|
120
|
+
}
|
|
121
|
+
export function registerAnalyzeCommand(program) {
|
|
122
|
+
program
|
|
123
|
+
.command("analyze <demo>")
|
|
124
|
+
.description("Analyze audio timing fit against scene durations")
|
|
125
|
+
.option("--json", "Output JSON to stdout (no table, no file written)")
|
|
126
|
+
.option("--no-file", "Print table but skip writing analysis.json")
|
|
127
|
+
.action((demo, opts) => {
|
|
128
|
+
const projectDir = resolve(process.cwd(), "demofly", demo);
|
|
129
|
+
const recordingsDir = resolve(projectDir, "recordings");
|
|
130
|
+
const timingPath = resolve(recordingsDir, "timing.json");
|
|
131
|
+
const audioDir = resolve(projectDir, "audio");
|
|
132
|
+
if (!existsSync(timingPath)) {
|
|
133
|
+
console.error(`No timing.json found at ${timingPath}. Run \`demofly generate ${demo} --record\` first.`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
if (!existsSync(audioDir) || readdirSync(audioDir).filter((f) => {
|
|
137
|
+
const ext = extname(f).toLowerCase();
|
|
138
|
+
return [".mp3", ".wav", ".aac", ".m4a", ".ogg"].includes(ext);
|
|
139
|
+
}).length === 0) {
|
|
140
|
+
console.error(`No audio files found in ${audioDir}. Generate audio first with \`demofly generate ${demo}\`.`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
if (!hasFfprobe()) {
|
|
144
|
+
console.error("ffprobe is required for audio analysis. Install ffmpeg to continue.");
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
const timingData = normalizeTimingData(JSON.parse(readFileSync(timingPath, "utf-8")));
|
|
148
|
+
const scenes = analyzeScenes(timingData, audioDir);
|
|
149
|
+
const report = buildReport(demo, scenes);
|
|
150
|
+
if (opts.json) {
|
|
151
|
+
console.log(JSON.stringify(report, null, 2));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
printTable(report);
|
|
155
|
+
// opts.file is false when --no-file is passed (commander negation)
|
|
156
|
+
if (opts.file !== false) {
|
|
157
|
+
const outputPath = resolve(recordingsDir, "analysis.json");
|
|
158
|
+
writeFileSync(outputPath, JSON.stringify(report, null, 2) + "\n", "utf-8");
|
|
159
|
+
console.log(` Analysis written to ${outputPath}\n`);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAuBxD"}
|
|
@@ -33,7 +33,8 @@ export function registerOpenCommand(demos) {
|
|
|
33
33
|
const token = await requireAuth();
|
|
34
34
|
const client = createApiClient(token);
|
|
35
35
|
try {
|
|
36
|
-
const
|
|
36
|
+
const { id } = await resolveDemoBySlug(client, name);
|
|
37
|
+
const demo = await client.get(`/demos/${encodeURIComponent(id)}`);
|
|
37
38
|
console.log(`Opening ${demo.url}`);
|
|
38
39
|
openUrl(demo.url);
|
|
39
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,IAAc,CAAC;IAEnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,UAAU,CAAC;QACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,IAAc,CAAC;IAEnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,UAAU,CAAC;QACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAofnD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CAmCV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CA0CV;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA6BV;AA0TD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0Y9D"}
|