@demoscript/cli 1.0.2 → 1.0.3

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 (72) hide show
  1. package/dist/bundle.cjs +10952 -10633
  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 +197 -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.map +1 -0
  17. package/dist/lib/config.d.ts +12 -0
  18. package/dist/lib/config.d.ts.map +1 -0
  19. package/dist/lib/config.js +39 -0
  20. package/dist/lib/config.js.map +1 -0
  21. package/dist/lib/executor.d.ts +20 -0
  22. package/dist/lib/executor.d.ts.map +1 -0
  23. package/dist/lib/executor.js +185 -0
  24. package/dist/lib/executor.js.map +1 -0
  25. package/dist/lib/executor.test.d.ts +2 -0
  26. package/dist/lib/executor.test.d.ts.map +1 -0
  27. package/dist/lib/executor.test.js +62 -0
  28. package/dist/lib/executor.test.js.map +1 -0
  29. package/dist/lib/loader.d.ts +10 -0
  30. package/dist/lib/loader.d.ts.map +1 -0
  31. package/dist/lib/loader.js +156 -0
  32. package/dist/lib/loader.js.map +1 -0
  33. package/dist/lib/openapi.d.ts +108 -0
  34. package/dist/lib/openapi.d.ts.map +1 -0
  35. package/dist/lib/openapi.js +375 -0
  36. package/dist/lib/openapi.js.map +1 -0
  37. package/dist/lib/openapi.test.d.ts +2 -0
  38. package/dist/lib/openapi.test.d.ts.map +1 -0
  39. package/dist/lib/openapi.test.js +318 -0
  40. package/dist/lib/openapi.test.js.map +1 -0
  41. package/dist/lib/validator.d.ts +12 -0
  42. package/dist/lib/validator.d.ts.map +1 -0
  43. package/dist/lib/validator.js +58 -0
  44. package/dist/lib/validator.js.map +1 -0
  45. package/dist/server/rest-proxy.d.ts +3 -0
  46. package/dist/server/rest-proxy.d.ts.map +1 -0
  47. package/dist/server/rest-proxy.js +34 -0
  48. package/dist/server/rest-proxy.js.map +1 -0
  49. package/dist/server/shell-executor.d.ts +3 -0
  50. package/dist/server/shell-executor.d.ts.map +1 -0
  51. package/dist/server/shell-executor.js +56 -0
  52. package/dist/server/shell-executor.js.map +1 -0
  53. package/dist/types.d.ts +312 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +33 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/ui-dist/assets/index-CtREFkwP.js +175 -0
  58. package/dist/ui-dist/assets/index-DTJEjfHv.css +1 -0
  59. package/dist/ui-dist/dist/assets/index-DZpZVgB7.js +177 -0
  60. package/dist/ui-dist/dist/assets/index-DZpZVgB7.js.map +1 -0
  61. package/dist/ui-dist/dist/assets/index-OFqwkvWn.css +1 -0
  62. package/dist/ui-dist/{assets/index-cngvCrhl.js → dist/assets/index-Uvktqp4J.js} +31 -31
  63. package/dist/ui-dist/dist/assets/index-Uvktqp4J.js.map +1 -0
  64. package/dist/ui-dist/dist/assets/index-pTz7wI27.css +1 -0
  65. package/dist/ui-dist/{assets/index-DFwzKJ81.css → dist/assets/index.css} +1 -1
  66. package/dist/ui-dist/dist/assets/index.js +177 -0
  67. package/dist/ui-dist/dist/assets/index.js.map +1 -0
  68. package/dist/ui-dist/dist/demo.yaml +120 -0
  69. package/dist/ui-dist/dist/index.html +14 -0
  70. package/dist/ui-dist/index.html +2 -2
  71. package/package.json +1 -1
  72. /package/dist/ui-dist/{favicon.svg → dist/favicon.svg} +0 -0
@@ -0,0 +1,318 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateFormFields, generateResultFields, mergeFormFields, getEndpointInfo } from './openapi.js';
3
+ const mockSpec = {
4
+ openapi: '3.0.0',
5
+ info: {
6
+ title: 'Test API',
7
+ version: '1.0.0',
8
+ },
9
+ paths: {
10
+ '/tokens': {
11
+ post: {
12
+ summary: 'Create a token',
13
+ description: 'Deploy a new ERC-20 token',
14
+ operationId: 'createToken',
15
+ requestBody: {
16
+ required: true,
17
+ content: {
18
+ 'application/json': {
19
+ schema: {
20
+ type: 'object',
21
+ required: ['name', 'symbol'],
22
+ properties: {
23
+ name: { type: 'string', description: 'Token name' },
24
+ symbol: { type: 'string', description: 'Token symbol' },
25
+ decimals: { type: 'integer', default: 18 },
26
+ },
27
+ },
28
+ },
29
+ },
30
+ },
31
+ responses: {
32
+ '200': {
33
+ description: 'Token created',
34
+ content: {
35
+ 'application/json': {
36
+ schema: {
37
+ type: 'object',
38
+ properties: {
39
+ tokenId: { type: 'string', description: 'Token ID' },
40
+ name: { type: 'string' },
41
+ contractAddress: { type: 'string' },
42
+ createdAt: { type: 'string', format: 'date-time' },
43
+ totalSupply: { type: 'number' },
44
+ },
45
+ },
46
+ },
47
+ },
48
+ },
49
+ },
50
+ },
51
+ },
52
+ '/users': {
53
+ get: {
54
+ summary: 'List users',
55
+ responses: {
56
+ '200': {
57
+ description: 'Users list',
58
+ content: {
59
+ 'application/json': {
60
+ schema: {
61
+ type: 'array',
62
+ items: {
63
+ type: 'object',
64
+ properties: {
65
+ id: { type: 'string' },
66
+ name: { type: 'string' },
67
+ },
68
+ },
69
+ },
70
+ },
71
+ },
72
+ },
73
+ },
74
+ },
75
+ post: {
76
+ summary: 'Create user',
77
+ requestBody: {
78
+ content: {
79
+ 'application/json': {
80
+ schema: {
81
+ type: 'object',
82
+ properties: {
83
+ role: {
84
+ type: 'string',
85
+ enum: ['admin', 'user', 'guest'],
86
+ description: 'User role',
87
+ },
88
+ active: { type: 'boolean' },
89
+ age: { type: 'number' },
90
+ tags: { type: 'array', items: { type: 'string' } },
91
+ metadata: { type: 'object' },
92
+ },
93
+ },
94
+ },
95
+ },
96
+ },
97
+ responses: {
98
+ '200': { description: 'User created' },
99
+ },
100
+ },
101
+ },
102
+ },
103
+ components: {
104
+ schemas: {
105
+ TokenInput: {
106
+ type: 'object',
107
+ required: ['name'],
108
+ properties: {
109
+ name: { type: 'string' },
110
+ amount: { type: 'integer' },
111
+ },
112
+ },
113
+ },
114
+ },
115
+ };
116
+ describe('generateFormFields', () => {
117
+ it('generates fields from request body schema', () => {
118
+ const fields = generateFormFields(mockSpec, 'POST', '/tokens');
119
+ expect(fields).toHaveLength(3);
120
+ expect(fields[0].name).toBe('name');
121
+ expect(fields[0].type).toBe('text');
122
+ expect(fields[0].required).toBe(true);
123
+ expect(fields[0].label).toBe('Token name');
124
+ expect(fields[1].name).toBe('symbol');
125
+ expect(fields[1].required).toBe(true);
126
+ expect(fields[2].name).toBe('decimals');
127
+ expect(fields[2].type).toBe('number');
128
+ expect(fields[2].default).toBe(18);
129
+ });
130
+ it('returns empty array for GET requests (no body)', () => {
131
+ const fields = generateFormFields(mockSpec, 'GET', '/users');
132
+ expect(fields).toHaveLength(0);
133
+ });
134
+ it('returns empty array for non-existent path', () => {
135
+ const fields = generateFormFields(mockSpec, 'POST', '/nonexistent');
136
+ expect(fields).toHaveLength(0);
137
+ });
138
+ it('returns empty array for non-existent method', () => {
139
+ const fields = generateFormFields(mockSpec, 'DELETE', '/tokens');
140
+ expect(fields).toHaveLength(0);
141
+ });
142
+ it('handles enum types as select fields', () => {
143
+ const fields = generateFormFields(mockSpec, 'POST', '/users');
144
+ const roleField = fields.find(f => f.name === 'role');
145
+ expect(roleField?.type).toBe('select');
146
+ expect(roleField?.options).toEqual([
147
+ { value: 'admin', label: 'admin' },
148
+ { value: 'user', label: 'user' },
149
+ { value: 'guest', label: 'guest' },
150
+ ]);
151
+ });
152
+ it('handles boolean types as select fields', () => {
153
+ const fields = generateFormFields(mockSpec, 'POST', '/users');
154
+ const activeField = fields.find(f => f.name === 'active');
155
+ expect(activeField?.type).toBe('select');
156
+ expect(activeField?.options).toEqual([
157
+ { value: 'true', label: 'true' },
158
+ { value: 'false', label: 'false' },
159
+ ]);
160
+ });
161
+ it('handles number types', () => {
162
+ const fields = generateFormFields(mockSpec, 'POST', '/users');
163
+ const ageField = fields.find(f => f.name === 'age');
164
+ expect(ageField?.type).toBe('number');
165
+ });
166
+ it('handles array types as textarea', () => {
167
+ const fields = generateFormFields(mockSpec, 'POST', '/users');
168
+ const tagsField = fields.find(f => f.name === 'tags');
169
+ expect(tagsField?.type).toBe('textarea');
170
+ });
171
+ it('handles object types as textarea', () => {
172
+ const fields = generateFormFields(mockSpec, 'POST', '/users');
173
+ const metadataField = fields.find(f => f.name === 'metadata');
174
+ expect(metadataField?.type).toBe('textarea');
175
+ });
176
+ it('is case-insensitive for method', () => {
177
+ const fieldsLower = generateFormFields(mockSpec, 'post', '/tokens');
178
+ const fieldsUpper = generateFormFields(mockSpec, 'POST', '/tokens');
179
+ expect(fieldsLower).toEqual(fieldsUpper);
180
+ });
181
+ });
182
+ describe('mergeFormFields', () => {
183
+ const openapiFields = [
184
+ { name: 'name', type: 'text', required: true },
185
+ { name: 'symbol', type: 'text' },
186
+ { name: 'decimals', type: 'number', default: 18 },
187
+ ];
188
+ it('returns OpenAPI fields when no overrides', () => {
189
+ const merged = mergeFormFields(openapiFields);
190
+ expect(merged).toEqual(openapiFields);
191
+ });
192
+ it('applies defaults to existing fields', () => {
193
+ const merged = mergeFormFields(openapiFields, {
194
+ name: 'Demo Token',
195
+ symbol: 'DEMO',
196
+ });
197
+ const nameField = merged.find(f => f.name === 'name');
198
+ expect(nameField?.default).toBe('Demo Token');
199
+ expect(nameField?.required).toBe(true); // Preserves OpenAPI field
200
+ const symbolField = merged.find(f => f.name === 'symbol');
201
+ expect(symbolField?.default).toBe('DEMO');
202
+ });
203
+ it('creates new fields from defaults not in OpenAPI', () => {
204
+ const merged = mergeFormFields(openapiFields, {
205
+ customField: 'custom value',
206
+ customNumber: 42,
207
+ });
208
+ const customField = merged.find(f => f.name === 'customField');
209
+ expect(customField?.default).toBe('custom value');
210
+ expect(customField?.type).toBe('text');
211
+ const customNumber = merged.find(f => f.name === 'customNumber');
212
+ expect(customNumber?.default).toBe(42);
213
+ expect(customNumber?.type).toBe('number');
214
+ });
215
+ it('manual form fields fully override OpenAPI fields', () => {
216
+ const manualFields = [
217
+ { name: 'name', label: 'Token Name', type: 'text', required: false, readonly: true },
218
+ ];
219
+ const merged = mergeFormFields(openapiFields, undefined, manualFields);
220
+ const nameField = merged.find(f => f.name === 'name');
221
+ expect(nameField?.label).toBe('Token Name');
222
+ expect(nameField?.required).toBe(false); // Overridden
223
+ expect(nameField?.readonly).toBe(true);
224
+ });
225
+ it('applies merge priority: OpenAPI -> defaults -> form', () => {
226
+ const defaults = { name: 'Default Name' };
227
+ const manualFields = [{ name: 'name', default: 'Manual Name' }];
228
+ const merged = mergeFormFields(openapiFields, defaults, manualFields);
229
+ const nameField = merged.find(f => f.name === 'name');
230
+ expect(nameField?.default).toBe('Manual Name'); // Form wins
231
+ });
232
+ it('preserves order with OpenAPI fields first', () => {
233
+ const merged = mergeFormFields(openapiFields, { newField: 'value' });
234
+ const names = merged.map(f => f.name);
235
+ expect(names).toEqual(['name', 'symbol', 'decimals', 'newField']);
236
+ });
237
+ });
238
+ describe('getEndpointInfo', () => {
239
+ it('returns summary and description for existing endpoint', () => {
240
+ const info = getEndpointInfo(mockSpec, 'POST', '/tokens');
241
+ expect(info?.summary).toBe('Create a token');
242
+ expect(info?.description).toBe('Deploy a new ERC-20 token');
243
+ });
244
+ it('returns null for non-existent path', () => {
245
+ const info = getEndpointInfo(mockSpec, 'POST', '/nonexistent');
246
+ expect(info).toBeNull();
247
+ });
248
+ it('returns null for non-existent method', () => {
249
+ const info = getEndpointInfo(mockSpec, 'DELETE', '/tokens');
250
+ expect(info).toBeNull();
251
+ });
252
+ it('handles endpoints without description', () => {
253
+ const info = getEndpointInfo(mockSpec, 'GET', '/users');
254
+ expect(info?.summary).toBe('List users');
255
+ expect(info?.description).toBeUndefined();
256
+ });
257
+ });
258
+ describe('generateResultFields', () => {
259
+ it('generates single JSON field for object response', () => {
260
+ const fields = generateResultFields(mockSpec, 'POST', '/tokens');
261
+ // All responses now return a single JSON viewer
262
+ expect(fields).toHaveLength(1);
263
+ expect(fields[0].key).toBe('');
264
+ expect(fields[0].type).toBe('json');
265
+ expect(fields[0].label).toBe('Response');
266
+ expect(fields[0].expandedDepth).toBe(2);
267
+ });
268
+ it('generates single JSON field for array response', () => {
269
+ const fields = generateResultFields(mockSpec, 'GET', '/users');
270
+ expect(fields).toHaveLength(1);
271
+ expect(fields[0].key).toBe('');
272
+ expect(fields[0].type).toBe('json');
273
+ expect(fields[0].label).toBe('Response');
274
+ expect(fields[0].expandedDepth).toBe(2);
275
+ });
276
+ it('returns empty array for non-existent path', () => {
277
+ const fields = generateResultFields(mockSpec, 'GET', '/nonexistent');
278
+ expect(fields).toEqual([]);
279
+ });
280
+ it('returns empty array when no response schema', () => {
281
+ const fields = generateResultFields(mockSpec, 'POST', '/users');
282
+ expect(fields).toEqual([]);
283
+ });
284
+ it('handles path parameters', () => {
285
+ const specWithParams = {
286
+ openapi: '3.0.0',
287
+ info: { title: 'Test', version: '1.0' },
288
+ paths: {
289
+ '/users/{userId}/profile': {
290
+ get: {
291
+ responses: {
292
+ '200': {
293
+ description: 'User profile',
294
+ content: {
295
+ 'application/json': {
296
+ schema: {
297
+ type: 'object',
298
+ properties: {
299
+ userId: { type: 'string' },
300
+ email: { type: 'string' },
301
+ },
302
+ },
303
+ },
304
+ },
305
+ },
306
+ },
307
+ },
308
+ },
309
+ },
310
+ };
311
+ // Test with $userId variable syntax - should find the path and return JSON field
312
+ const fields = generateResultFields(specWithParams, 'GET', '/users/$userId/profile');
313
+ expect(fields).toHaveLength(1);
314
+ expect(fields[0].type).toBe('json');
315
+ expect(fields[0].label).toBe('Response');
316
+ });
317
+ });
318
+ //# sourceMappingURL=openapi.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.test.js","sourceRoot":"","sources":["../../src/lib/openapi.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ValidationError {
2
+ path: string;
3
+ message: string;
4
+ keyword: string;
5
+ }
6
+ export interface ValidationResult {
7
+ valid: boolean;
8
+ errors: ValidationError[];
9
+ }
10
+ export declare function validateDemoConfig(config: unknown): ValidationResult;
11
+ export declare function formatValidationErrors(errors: ValidationError[]): string;
12
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAqCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAepE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAaxE"}
@@ -0,0 +1,58 @@
1
+ import Ajv from 'ajv';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { dirname, join } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ let validate = null;
8
+ function getValidator() {
9
+ if (validate) {
10
+ return validate;
11
+ }
12
+ // Load schema - try multiple locations for dev vs installed mode
13
+ const schemaPaths = [
14
+ join(__dirname, '../../../demo.schema.json'), // Development (from dist/lib/ or bundled dist/)
15
+ join(__dirname, '../../../../demo.schema.json'), // Development (from dist/commands/lib/)
16
+ join(__dirname, 'demo.schema.json'), // Installed package (schema next to bundle.cjs)
17
+ ];
18
+ let schemaPath = schemaPaths.find(p => existsSync(p));
19
+ if (!schemaPath) {
20
+ throw new Error(`Schema file not found. Tried: ${schemaPaths.join(', ')}`);
21
+ }
22
+ const schema = JSON.parse(readFileSync(schemaPath, 'utf-8'));
23
+ const ajv = new Ajv.default({
24
+ allErrors: true,
25
+ strict: false,
26
+ allowUnionTypes: true,
27
+ });
28
+ // Register uri format to suppress "unknown format" warnings
29
+ // Using a permissive validator since we just want structural validation
30
+ ajv.addFormat('uri', true);
31
+ validate = ajv.compile(schema);
32
+ return validate;
33
+ }
34
+ export function validateDemoConfig(config) {
35
+ const validator = getValidator();
36
+ const valid = validator(config);
37
+ if (valid) {
38
+ return { valid: true, errors: [] };
39
+ }
40
+ const errors = (validator.errors || []).map((e) => ({
41
+ path: e.instancePath || '/',
42
+ message: e.message || 'Unknown validation error',
43
+ keyword: e.keyword,
44
+ }));
45
+ return { valid: false, errors };
46
+ }
47
+ export function formatValidationErrors(errors) {
48
+ if (errors.length === 0) {
49
+ return '';
50
+ }
51
+ const lines = ['Demo configuration validation failed:', ''];
52
+ for (const error of errors) {
53
+ const path = error.path || '(root)';
54
+ lines.push(` ${path}: ${error.message}`);
55
+ }
56
+ return lines.join('\n');
57
+ }
58
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RequestHandler } from 'express';
2
+ export declare function createRestProxy(): RequestHandler;
3
+ //# sourceMappingURL=rest-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-proxy.d.ts","sourceRoot":"","sources":["../../src/server/rest-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAS9C,wBAAgB,eAAe,IAAI,cAAc,CAqChD"}
@@ -0,0 +1,34 @@
1
+ export function createRestProxy() {
2
+ return async (req, res) => {
3
+ const { method, url, headers, body } = req.body;
4
+ if (!method || !url) {
5
+ res.status(400).json({ error: 'Missing method or url' });
6
+ return;
7
+ }
8
+ try {
9
+ const fetchHeaders = {
10
+ 'Content-Type': 'application/json',
11
+ ...headers,
12
+ };
13
+ const fetchOptions = {
14
+ method,
15
+ headers: fetchHeaders,
16
+ };
17
+ if (body && method !== 'GET') {
18
+ fetchOptions.body = JSON.stringify(body);
19
+ }
20
+ const response = await fetch(url, fetchOptions);
21
+ const responseBody = await response.json().catch(() => null);
22
+ res.json({
23
+ status: response.status,
24
+ data: responseBody,
25
+ });
26
+ }
27
+ catch (err) {
28
+ res.status(500).json({
29
+ error: err instanceof Error ? err.message : 'Proxy request failed',
30
+ });
31
+ }
32
+ };
33
+ }
34
+ //# sourceMappingURL=rest-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-proxy.js","sourceRoot":"","sources":["../../src/server/rest-proxy.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAoB,CAAC;QAEhE,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAA2B;gBAC3C,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO;aACX,CAAC;YAEF,MAAM,YAAY,GAAgB;gBAChC,MAAM;gBACN,OAAO,EAAE,YAAY;aACtB,CAAC;YAEF,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7B,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE7D,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RequestHandler } from 'express';
2
+ export declare function createShellExecutor(): RequestHandler;
3
+ //# sourceMappingURL=shell-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-executor.d.ts","sourceRoot":"","sources":["../../src/server/shell-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAS9C,wBAAgB,mBAAmB,IAAI,cAAc,CAwBpD"}
@@ -0,0 +1,56 @@
1
+ import { spawn } from 'child_process';
2
+ export function createShellExecutor() {
3
+ return async (req, res) => {
4
+ const { command, shell_type, workdir, env } = req.body;
5
+ if (!command) {
6
+ res.status(400).json({ error: 'Missing command' });
7
+ return;
8
+ }
9
+ const result = await executeCommand(command, {
10
+ shell: shell_type || true,
11
+ cwd: workdir,
12
+ env: { ...process.env, ...env },
13
+ });
14
+ // Return all outputs for flexible variable saving
15
+ res.json({
16
+ stdout: result.stdout,
17
+ stderr: result.stderr,
18
+ status: result.status,
19
+ // Legacy: keep "output" as alias for stdout for backward compatibility
20
+ output: result.stdout,
21
+ });
22
+ };
23
+ }
24
+ function executeCommand(command, options) {
25
+ return new Promise((resolve) => {
26
+ const shell = typeof options.shell === 'string' ? options.shell : '/bin/sh';
27
+ const child = spawn(shell, ['-c', command], {
28
+ cwd: options.cwd,
29
+ env: options.env,
30
+ });
31
+ let stdout = '';
32
+ let stderr = '';
33
+ child.stdout.on('data', (data) => {
34
+ stdout += data.toString();
35
+ });
36
+ child.stderr.on('data', (data) => {
37
+ stderr += data.toString();
38
+ });
39
+ child.on('close', (code) => {
40
+ // Always resolve with full result, let caller decide how to handle non-zero status
41
+ resolve({
42
+ stdout: stdout.trim(),
43
+ stderr: stderr.trim(),
44
+ status: code ?? 1,
45
+ });
46
+ });
47
+ child.on('error', (err) => {
48
+ resolve({
49
+ stdout: '',
50
+ stderr: err.message,
51
+ status: 1,
52
+ });
53
+ });
54
+ });
55
+ }
56
+ //# sourceMappingURL=shell-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-executor.js","sourceRoot":"","sources":["../../src/server/shell-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAUtC,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAoB,CAAC;QAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;YAC3C,KAAK,EAAE,UAAU,IAAI,IAAI;YACzB,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;SAChC,CAAC,CAAC;QAEH,kDAAkD;QAClD,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,uEAAuE;YACvE,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAcD,SAAS,cAAc,CAAC,OAAe,EAAE,OAAoB;IAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YAC1C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,mFAAmF;YACnF,OAAO,CAAC;gBACN,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,MAAM,EAAE,IAAI,IAAI,CAAC;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC;gBACN,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,GAAG,CAAC,OAAO;gBACnB,MAAM,EAAE,CAAC;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}