@demoscript/cli 1.1.7 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/bundle.cjs +38256 -7931
  2. package/dist/commands/login.d.ts +4 -0
  3. package/dist/commands/login.d.ts.map +1 -0
  4. package/dist/commands/login.js +109 -0
  5. package/dist/commands/login.js.map +1 -0
  6. package/dist/commands/push.d.ts +9 -0
  7. package/dist/commands/push.d.ts.map +1 -0
  8. package/dist/commands/push.js +146 -0
  9. package/dist/commands/push.js.map +1 -0
  10. package/dist/commands/serve.d.ts +9 -0
  11. package/dist/commands/serve.d.ts.map +1 -0
  12. package/dist/commands/serve.js +221 -0
  13. package/dist/commands/serve.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +0 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/config.d.ts +12 -0
  19. package/dist/lib/config.d.ts.map +1 -0
  20. package/dist/lib/config.js +39 -0
  21. package/dist/lib/config.js.map +1 -0
  22. package/dist/lib/executor.d.ts +19 -0
  23. package/dist/lib/executor.d.ts.map +1 -0
  24. package/dist/lib/executor.js +150 -0
  25. package/dist/lib/executor.js.map +1 -0
  26. package/dist/lib/executor.test.d.ts +2 -0
  27. package/dist/lib/executor.test.d.ts.map +1 -0
  28. package/dist/lib/executor.test.js +62 -0
  29. package/dist/lib/executor.test.js.map +1 -0
  30. package/dist/lib/loader.d.ts +10 -0
  31. package/dist/lib/loader.d.ts.map +1 -0
  32. package/dist/lib/loader.js +156 -0
  33. package/dist/lib/loader.js.map +1 -0
  34. package/dist/lib/openapi.d.ts +10 -0
  35. package/dist/lib/openapi.d.ts.map +1 -0
  36. package/dist/lib/openapi.js +9 -0
  37. package/dist/lib/openapi.js.map +1 -0
  38. package/dist/lib/openapi.test.d.ts +2 -0
  39. package/dist/lib/openapi.test.d.ts.map +1 -0
  40. package/dist/lib/openapi.test.js +318 -0
  41. package/dist/lib/openapi.test.js.map +1 -0
  42. package/dist/lib/validator.d.ts +12 -0
  43. package/dist/lib/validator.d.ts.map +1 -0
  44. package/dist/lib/validator.js +58 -0
  45. package/dist/lib/validator.js.map +1 -0
  46. package/dist/server/graphql-proxy.d.ts +3 -0
  47. package/dist/server/graphql-proxy.d.ts.map +1 -0
  48. package/dist/server/graphql-proxy.js +56 -0
  49. package/dist/server/graphql-proxy.js.map +1 -0
  50. package/dist/server/rest-proxy.d.ts +3 -0
  51. package/dist/server/rest-proxy.d.ts.map +1 -0
  52. package/dist/server/rest-proxy.js +41 -0
  53. package/dist/server/rest-proxy.js.map +1 -0
  54. package/dist/server/shell-executor.d.ts +3 -0
  55. package/dist/server/shell-executor.d.ts.map +1 -0
  56. package/dist/server/shell-executor.js +56 -0
  57. package/dist/server/shell-executor.js.map +1 -0
  58. package/dist/types.d.ts +351 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +55 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/ui-dist/assets/index.css +1 -1
  63. package/dist/ui-dist/assets/index.js +123 -123
  64. package/package.json +12 -4
@@ -0,0 +1,4 @@
1
+ export declare function login(): Promise<void>;
2
+ export declare function logout(): Promise<void>;
3
+ export declare function whoami(): Promise<void>;
4
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AA0DA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD3C;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAG5C;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAc5C"}
@@ -0,0 +1,109 @@
1
+ import chalk from 'chalk';
2
+ import readline from 'readline';
3
+ import { loadConfig, saveConfig, getApiUrl, clearConfig } from '../lib/config.js';
4
+ function prompt(question, hidden = false) {
5
+ const rl = readline.createInterface({
6
+ input: process.stdin,
7
+ output: process.stdout,
8
+ });
9
+ return new Promise((resolve) => {
10
+ if (hidden) {
11
+ // For password input, we need to handle it differently
12
+ process.stdout.write(question);
13
+ let password = '';
14
+ process.stdin.setRawMode(true);
15
+ process.stdin.resume();
16
+ process.stdin.setEncoding('utf-8');
17
+ const handler = (char) => {
18
+ if (char === '\n' || char === '\r' || char === '\u0004') {
19
+ process.stdin.setRawMode(false);
20
+ process.stdin.removeListener('data', handler);
21
+ console.log();
22
+ rl.close();
23
+ resolve(password);
24
+ }
25
+ else if (char === '\u0003') {
26
+ // Ctrl+C
27
+ process.exit();
28
+ }
29
+ else if (char === '\u007f' || char === '\b') {
30
+ // Backspace
31
+ if (password.length > 0) {
32
+ password = password.slice(0, -1);
33
+ }
34
+ }
35
+ else {
36
+ password += char;
37
+ }
38
+ };
39
+ process.stdin.on('data', handler);
40
+ }
41
+ else {
42
+ rl.question(question, (answer) => {
43
+ rl.close();
44
+ resolve(answer);
45
+ });
46
+ }
47
+ });
48
+ }
49
+ export async function login() {
50
+ const apiUrl = getApiUrl();
51
+ console.log(chalk.blue('Login to DemoScript Cloud'));
52
+ console.log(chalk.gray(`API: ${apiUrl}`));
53
+ console.log();
54
+ const email = await prompt('Email: ');
55
+ const password = await prompt('Password: ', true);
56
+ console.log();
57
+ console.log(chalk.gray('Authenticating...'));
58
+ try {
59
+ const response = await fetch(`${apiUrl}/api/auth/login`, {
60
+ method: 'POST',
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ body: JSON.stringify({ email, password }),
65
+ });
66
+ if (!response.ok) {
67
+ const error = await response.json();
68
+ throw new Error(error.error || `Login failed with status ${response.status}`);
69
+ }
70
+ const data = await response.json();
71
+ // Save token and user info to config
72
+ const config = loadConfig();
73
+ config.token = data.token;
74
+ config.username = data.user.username;
75
+ config.email = data.user.email;
76
+ saveConfig(config);
77
+ console.log();
78
+ console.log(chalk.green.bold('Login successful!'));
79
+ console.log(chalk.gray(`Logged in as ${data.user.username} (${data.user.email})`));
80
+ console.log();
81
+ console.log('You can now use:');
82
+ console.log(chalk.cyan(' demoscript push <demo>') + ' - Push a demo to the cloud');
83
+ console.log(chalk.cyan(' demoscript whoami') + ' - Show current user');
84
+ console.log(chalk.cyan(' demoscript logout') + ' - Log out');
85
+ }
86
+ catch (err) {
87
+ console.log();
88
+ console.log(chalk.red('Login failed:'), err instanceof Error ? err.message : 'Unknown error');
89
+ process.exit(1);
90
+ }
91
+ }
92
+ export async function logout() {
93
+ clearConfig();
94
+ console.log(chalk.green('Logged out successfully.'));
95
+ }
96
+ export async function whoami() {
97
+ const config = loadConfig();
98
+ if (!config.token || !config.username) {
99
+ console.log(chalk.yellow('Not logged in.'));
100
+ console.log(chalk.gray('Run: demoscript login'));
101
+ process.exit(1);
102
+ }
103
+ console.log(chalk.green(`Logged in as ${config.username}`));
104
+ if (config.email) {
105
+ console.log(chalk.gray(`Email: ${config.email}`));
106
+ }
107
+ console.log(chalk.gray(`API: ${getApiUrl()}`));
108
+ }
109
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface PushOptions {
2
+ slug?: string;
3
+ title?: string;
4
+ public?: boolean;
5
+ private?: boolean;
6
+ }
7
+ export declare function push(demoPath: string, options: PushOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoBD,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JhF"}
@@ -0,0 +1,146 @@
1
+ import { resolve, dirname, basename } from 'path';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import chalk from 'chalk';
4
+ import { loadConfig, getApiUrl } from '../lib/config.js';
5
+ export async function push(demoPath, options) {
6
+ const config = loadConfig();
7
+ const apiUrl = getApiUrl();
8
+ // Check authentication
9
+ if (!config.token) {
10
+ console.log(chalk.red('Not logged in.'));
11
+ console.log(chalk.gray('Run: demoscript login'));
12
+ process.exit(1);
13
+ }
14
+ // Resolve paths
15
+ const resolvedPath = resolve(process.cwd(), demoPath);
16
+ const demoDir = resolvedPath.endsWith('.yaml') ? dirname(resolvedPath) : resolvedPath;
17
+ const demoFile = resolvedPath.endsWith('.yaml') ? resolvedPath : resolve(resolvedPath, 'demo.yaml');
18
+ // Check if demo file exists
19
+ if (!existsSync(demoFile)) {
20
+ console.log(chalk.red(`Demo not found: ${demoFile}`));
21
+ process.exit(1);
22
+ }
23
+ // Read demo YAML
24
+ const yamlContent = readFileSync(demoFile, 'utf-8');
25
+ // Try to parse YAML to get title
26
+ let demoTitle = options.title;
27
+ try {
28
+ const yaml = await import('js-yaml');
29
+ const parsed = yaml.load(yamlContent);
30
+ if (!demoTitle && parsed.title) {
31
+ demoTitle = parsed.title;
32
+ }
33
+ }
34
+ catch {
35
+ // Ignore YAML parsing errors - the server will validate
36
+ }
37
+ // Read recordings if they exist
38
+ const recordingsPath = resolve(demoDir, 'recordings.json');
39
+ let recordingsJson;
40
+ if (existsSync(recordingsPath)) {
41
+ recordingsJson = readFileSync(recordingsPath, 'utf-8');
42
+ console.log(chalk.gray('Found recordings.json'));
43
+ }
44
+ else {
45
+ console.log(chalk.yellow('No recordings.json found. Demo will use recorded mode without data.'));
46
+ console.log(chalk.gray('Run: demoscript record <demo>'));
47
+ console.log();
48
+ }
49
+ // Determine slug
50
+ const slug = options.slug || basename(demoDir).toLowerCase().replace(/[^a-z0-9-]/g, '-');
51
+ // Determine visibility
52
+ const isPublic = options.private ? false : (options.public !== undefined ? options.public : true);
53
+ console.log(chalk.blue('Pushing demo to DemoScript Cloud...'));
54
+ console.log();
55
+ console.log(chalk.gray(` Slug: ${slug}`));
56
+ console.log(chalk.gray(` Title: ${demoTitle || '(untitled)'}`));
57
+ console.log(chalk.gray(` Visibility: ${isPublic ? 'public' : 'private'}`));
58
+ console.log(chalk.gray(` Recordings: ${recordingsJson ? 'yes' : 'no'}`));
59
+ console.log();
60
+ try {
61
+ // Check if demo already exists
62
+ const listResponse = await fetch(`${apiUrl}/api/demos`, {
63
+ headers: {
64
+ 'Authorization': `Bearer ${config.token}`,
65
+ },
66
+ });
67
+ if (!listResponse.ok) {
68
+ if (listResponse.status === 401) {
69
+ console.log(chalk.red('Authentication expired. Please login again.'));
70
+ console.log(chalk.gray('Run: demoscript login'));
71
+ process.exit(1);
72
+ }
73
+ throw new Error(`Failed to fetch demos: ${listResponse.status}`);
74
+ }
75
+ const demosData = await listResponse.json();
76
+ const existingDemo = demosData.demos.find(d => d.slug === slug);
77
+ let response;
78
+ let method;
79
+ if (existingDemo) {
80
+ // Update existing demo
81
+ console.log(chalk.gray(`Updating existing demo (${existingDemo.id})...`));
82
+ method = 'PUT';
83
+ response = await fetch(`${apiUrl}/api/demos/${existingDemo.id}`, {
84
+ method: 'PUT',
85
+ headers: {
86
+ 'Authorization': `Bearer ${config.token}`,
87
+ 'Content-Type': 'application/json',
88
+ },
89
+ body: JSON.stringify({
90
+ slug,
91
+ title: demoTitle,
92
+ yaml_content: yamlContent,
93
+ recordings_json: recordingsJson,
94
+ is_public: isPublic,
95
+ }),
96
+ });
97
+ }
98
+ else {
99
+ // Create new demo
100
+ console.log(chalk.gray('Creating new demo...'));
101
+ method = 'POST';
102
+ response = await fetch(`${apiUrl}/api/demos`, {
103
+ method: 'POST',
104
+ headers: {
105
+ 'Authorization': `Bearer ${config.token}`,
106
+ 'Content-Type': 'application/json',
107
+ },
108
+ body: JSON.stringify({
109
+ slug,
110
+ title: demoTitle,
111
+ yaml_content: yamlContent,
112
+ recordings_json: recordingsJson,
113
+ is_public: isPublic,
114
+ }),
115
+ });
116
+ }
117
+ if (!response.ok) {
118
+ const error = await response.json();
119
+ throw new Error(error.error || `Push failed with status ${response.status}`);
120
+ }
121
+ const data = await response.json();
122
+ console.log();
123
+ console.log(chalk.green.bold('Push successful!'));
124
+ console.log();
125
+ if (data.url) {
126
+ console.log('Your demo is live at:');
127
+ console.log(chalk.cyan(` ${data.url}`));
128
+ }
129
+ else {
130
+ console.log('Your demo is live at:');
131
+ console.log(chalk.cyan(` ${apiUrl}/u/${config.username}/${slug}`));
132
+ }
133
+ console.log();
134
+ if (!recordingsJson) {
135
+ console.log(chalk.yellow('Note: Demo has no recordings. Viewers will see empty responses.'));
136
+ console.log(chalk.gray('To add recordings:'));
137
+ console.log(chalk.gray(' 1. Run: demoscript record <demo>'));
138
+ console.log(chalk.gray(' 2. Run: demoscript push <demo>'));
139
+ }
140
+ }
141
+ catch (err) {
142
+ console.log(chalk.red('Push failed:'), err instanceof Error ? err.message : 'Unknown error');
143
+ process.exit(1);
144
+ }
145
+ }
146
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface ServeOptions {
2
+ port: number;
3
+ host?: string;
4
+ open: boolean;
5
+ watch?: boolean;
6
+ }
7
+ export declare function serve(demoPath: string, options: ServeOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AA4BA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiOlF"}
@@ -0,0 +1,221 @@
1
+ import { resolve, dirname, join } from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ import { networkInterfaces } from 'os';
4
+ import { existsSync, readFileSync } from 'fs';
5
+ import express from 'express';
6
+ import { WebSocketServer, WebSocket } from 'ws';
7
+ import chokidar from 'chokidar';
8
+ import { loadDemo } from '../lib/loader.js';
9
+ import { createRestProxy } from '../server/rest-proxy.js';
10
+ import { createShellExecutor } from '../server/shell-executor.js';
11
+ import { handleSandboxRequest, sandboxOpenApiSpec } from '@demoscript/shared/sandbox';
12
+ import chalk from 'chalk';
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ function getNetworkUrl(port) {
15
+ const nets = networkInterfaces();
16
+ for (const name of Object.keys(nets)) {
17
+ for (const net of nets[name] || []) {
18
+ if (net.family === 'IPv4' && !net.internal) {
19
+ return `http://${net.address}:${port}`;
20
+ }
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ export async function serve(demoPath, options) {
26
+ const { port, host, open, watch } = options;
27
+ // Resolve demo path
28
+ const resolvedPath = resolve(process.cwd(), demoPath);
29
+ const demoDir = resolvedPath.endsWith('.yaml') ? dirname(resolvedPath) : resolvedPath;
30
+ const demoFile = resolvedPath.endsWith('.yaml') ? resolvedPath : resolve(resolvedPath, 'demo.yaml');
31
+ console.log(chalk.blue('Starting DemoScript server...'));
32
+ console.log(chalk.gray(` Demo: ${demoFile}`));
33
+ // Load and validate demo config
34
+ let { config, recordings, openapiSpec } = await loadDemo(demoFile);
35
+ console.log(chalk.green(` Loaded: ${config.title}`));
36
+ console.log(chalk.gray(` Steps: ${config.steps.length}`));
37
+ // Create Express app
38
+ const app = express();
39
+ app.use(express.json());
40
+ // API endpoints for demo data
41
+ app.get('/api/demo', (_req, res) => {
42
+ res.json({ config, recordings, openapiSpec });
43
+ });
44
+ // Track WebSocket clients for live reload
45
+ const wsClients = new Set();
46
+ // REST proxy for live execution
47
+ app.post('/api/execute', createRestProxy());
48
+ // Shell executor for live execution
49
+ app.post('/api/execute-shell', createShellExecutor());
50
+ // Sandbox API - OpenAPI spec
51
+ app.get('/sandbox/openapi.json', (_req, res) => {
52
+ res.json(sandboxOpenApiSpec);
53
+ });
54
+ // Sandbox API handler - handles both /sandbox and /sandbox/* routes
55
+ async function sandboxHandler(req, res) {
56
+ try {
57
+ const sandboxPath = req.path.replace('/sandbox', '') || '/';
58
+ const response = await handleSandboxRequest({
59
+ method: req.method,
60
+ path: sandboxPath,
61
+ body: req.body,
62
+ headers: req.headers,
63
+ });
64
+ res.status(response.status).json(response.body);
65
+ }
66
+ catch (err) {
67
+ console.error('Sandbox error:', err);
68
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Sandbox error' });
69
+ }
70
+ }
71
+ app.all('/sandbox', sandboxHandler);
72
+ app.all('/sandbox/*', sandboxHandler);
73
+ // Browser opener for browser steps
74
+ app.post('/api/open-browser', async (req, res) => {
75
+ try {
76
+ const { url } = req.body;
77
+ if (!url) {
78
+ return res.status(400).json({ error: 'URL is required' });
79
+ }
80
+ const openModule = await import('open');
81
+ await openModule.default(url);
82
+ res.json({ success: true });
83
+ }
84
+ catch (err) {
85
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Failed to open browser' });
86
+ }
87
+ });
88
+ // Determine UI serving mode:
89
+ // 1. Development (monorepo): Use Vite dev server with HMR
90
+ // 2. Published package: Serve pre-built UI dist statically
91
+ // Try multiple paths for different environments
92
+ const uiSourcePaths = [
93
+ resolve(__dirname, '../../..', 'ui'), // Development (from dist/commands/)
94
+ resolve(__dirname, '../../../..', 'ui'), // Development (from bundled dist/)
95
+ ];
96
+ const uiDistPaths = [
97
+ resolve(__dirname, '..', 'ui-dist'), // Development (from dist/commands/)
98
+ resolve(__dirname, 'ui-dist'), // Bundled/installed (from bundle.cjs location)
99
+ ];
100
+ const uiSourcePath = uiSourcePaths.find(p => existsSync(resolve(p, 'vite.config.ts'))) || uiSourcePaths[0];
101
+ const uiDistPath = uiDistPaths.find(p => existsSync(resolve(p, 'index.html'))) || uiDistPaths[0];
102
+ const useViteDevServer = existsSync(resolve(uiSourcePath, 'vite.config.ts'));
103
+ let vite = null;
104
+ if (useViteDevServer) {
105
+ // Development mode: use Vite with HMR (dynamically import vite)
106
+ const { createServer: createViteServer } = await import('vite');
107
+ const serverOptions = {
108
+ middlewareMode: true,
109
+ hmr: {
110
+ port: port + 1,
111
+ host: host || 'localhost',
112
+ },
113
+ };
114
+ vite = await createViteServer({
115
+ root: uiSourcePath,
116
+ configFile: resolve(uiSourcePath, 'vite.config.ts'),
117
+ server: serverOptions,
118
+ appType: 'spa',
119
+ });
120
+ app.use(vite.middlewares);
121
+ }
122
+ else if (existsSync(uiDistPath)) {
123
+ // Published package mode: serve pre-built UI
124
+ // Inject demo config into index.html
125
+ const indexHtml = readFileSync(join(uiDistPath, 'index.html'), 'utf-8');
126
+ const injectedHtml = indexHtml.replace('</head>', `<script>window.__DEMOSCRIPT_API__ = true;</script></head>`);
127
+ app.get('/', (_req, res) => {
128
+ res.type('html').send(injectedHtml);
129
+ });
130
+ app.use(express.static(uiDistPath));
131
+ }
132
+ else {
133
+ console.error(chalk.red('Error: UI files not found. Please rebuild the package.'));
134
+ process.exit(1);
135
+ }
136
+ // Start server
137
+ const listenHost = host || 'localhost';
138
+ const server = app.listen(port, listenHost, async () => {
139
+ console.log();
140
+ console.log(chalk.green.bold(' DemoScript is running!'));
141
+ console.log();
142
+ console.log(` ${chalk.cyan('Local:')} http://localhost:${port}`);
143
+ if (host === '0.0.0.0') {
144
+ const networkUrl = getNetworkUrl(port);
145
+ if (networkUrl) {
146
+ console.log(` ${chalk.cyan('Network:')} ${networkUrl}`);
147
+ }
148
+ }
149
+ console.log(` ${chalk.cyan('Mode:')} ${chalk.yellow('Live execution enabled')}`);
150
+ if (watch) {
151
+ console.log(` ${chalk.cyan('Watch:')} ${chalk.green('Enabled')}`);
152
+ }
153
+ console.log();
154
+ console.log(chalk.gray(" Press 'q' to quit"));
155
+ console.log();
156
+ if (open) {
157
+ import('open').then((mod) => mod.default(`http://localhost:${port}`)).catch(() => {
158
+ // Ignore if open fails
159
+ });
160
+ }
161
+ });
162
+ // Set up WebSocket server for live reload
163
+ const wss = new WebSocketServer({ server, path: '/ws' });
164
+ wss.on('connection', (ws) => {
165
+ wsClients.add(ws);
166
+ ws.on('close', () => {
167
+ wsClients.delete(ws);
168
+ });
169
+ });
170
+ // Set up file watcher if --watch flag is enabled
171
+ let watcher = null;
172
+ if (watch) {
173
+ const recordingsFile = join(demoDir, 'recordings.json');
174
+ const filesToWatch = [demoFile];
175
+ if (existsSync(recordingsFile)) {
176
+ filesToWatch.push(recordingsFile);
177
+ }
178
+ watcher = chokidar.watch(filesToWatch, {
179
+ ignoreInitial: true,
180
+ awaitWriteFinish: {
181
+ stabilityThreshold: 300,
182
+ pollInterval: 100,
183
+ },
184
+ });
185
+ watcher.on('change', async (changedPath) => {
186
+ console.log(chalk.yellow(` File changed: ${changedPath}`));
187
+ try {
188
+ const reloaded = await loadDemo(demoFile);
189
+ config = reloaded.config;
190
+ recordings = reloaded.recordings;
191
+ openapiSpec = reloaded.openapiSpec;
192
+ console.log(chalk.green(` Reloaded: ${config.title}`));
193
+ // Notify all connected clients
194
+ const message = JSON.stringify({ type: 'reload', config, recordings, openapiSpec });
195
+ for (const client of wsClients) {
196
+ if (client.readyState === WebSocket.OPEN) {
197
+ client.send(message);
198
+ }
199
+ }
200
+ }
201
+ catch (err) {
202
+ console.log(chalk.red(` Reload failed: ${err instanceof Error ? err.message : 'Unknown error'}`));
203
+ }
204
+ });
205
+ }
206
+ // Handle graceful shutdown
207
+ process.stdin.setRawMode?.(true);
208
+ process.stdin.resume();
209
+ process.stdin.on('data', (data) => {
210
+ const key = data.toString();
211
+ if (key === 'q' || key === '\u0003') {
212
+ console.log(chalk.gray('\nShutting down...'));
213
+ watcher?.close();
214
+ wss.close();
215
+ server.close();
216
+ vite?.close();
217
+ process.exit(0);
218
+ }
219
+ });
220
+ }
221
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js CHANGED
File without changes
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface CliConfig {
2
+ token?: string;
3
+ username?: string;
4
+ email?: string;
5
+ apiUrl?: string;
6
+ }
7
+ export declare function loadConfig(): CliConfig;
8
+ export declare function saveConfig(config: CliConfig): void;
9
+ export declare function getToken(): string | undefined;
10
+ export declare function getApiUrl(): string;
11
+ export declare function clearConfig(): void;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,UAAU,IAAI,SAAS,CAUtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGlD;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
@@ -0,0 +1,39 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const CONFIG_DIR = join(homedir(), '.demoscript');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ const DEFAULT_API_URL = 'https://demoscript.app';
7
+ function ensureConfigDir() {
8
+ if (!existsSync(CONFIG_DIR)) {
9
+ mkdirSync(CONFIG_DIR, { recursive: true });
10
+ }
11
+ }
12
+ export function loadConfig() {
13
+ try {
14
+ if (existsSync(CONFIG_FILE)) {
15
+ const content = readFileSync(CONFIG_FILE, 'utf-8');
16
+ return JSON.parse(content);
17
+ }
18
+ }
19
+ catch {
20
+ // Ignore errors, return empty config
21
+ }
22
+ return {};
23
+ }
24
+ export function saveConfig(config) {
25
+ ensureConfigDir();
26
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
27
+ }
28
+ export function getToken() {
29
+ return loadConfig().token;
30
+ }
31
+ export function getApiUrl() {
32
+ return loadConfig().apiUrl || DEFAULT_API_URL;
33
+ }
34
+ export function clearConfig() {
35
+ if (existsSync(CONFIG_FILE)) {
36
+ writeFileSync(CONFIG_FILE, JSON.stringify({}, null, 2));
37
+ }
38
+ }
39
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AASpD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAEjD,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,EAAE,CAAC,KAAK,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,EAAE,CAAC,MAAM,IAAI,eAAe,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}