@vue-skuilder/cli 0.1.6 → 0.1.7

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 (52) hide show
  1. package/dist/cli.js +8 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/studio.d.ts +3 -0
  4. package/dist/commands/studio.d.ts.map +1 -0
  5. package/dist/commands/studio.js +396 -0
  6. package/dist/commands/studio.js.map +1 -0
  7. package/dist/commands/unpack.d.ts +3 -0
  8. package/dist/commands/unpack.d.ts.map +1 -0
  9. package/dist/commands/unpack.js +228 -0
  10. package/dist/commands/unpack.js.map +1 -0
  11. package/dist/studio-ui-assets/assets/BrowseView-BJbixGOU.js +2 -0
  12. package/dist/studio-ui-assets/assets/BrowseView-BJbixGOU.js.map +1 -0
  13. package/dist/studio-ui-assets/assets/BrowseView-CM4HBO4j.css +1 -0
  14. package/dist/studio-ui-assets/assets/BulkImportView-DB6DYDJU.js +2 -0
  15. package/dist/studio-ui-assets/assets/BulkImportView-DB6DYDJU.js.map +1 -0
  16. package/dist/studio-ui-assets/assets/BulkImportView-g4wQUfPA.css +1 -0
  17. package/dist/studio-ui-assets/assets/CourseEditorView-BIlhlhw1.js +2 -0
  18. package/dist/studio-ui-assets/assets/CourseEditorView-BIlhlhw1.js.map +1 -0
  19. package/dist/studio-ui-assets/assets/CourseEditorView-WuPNLVKp.css +1 -0
  20. package/dist/studio-ui-assets/assets/CreateCardView-CyNOKCkm.css +1 -0
  21. package/dist/studio-ui-assets/assets/CreateCardView-DPjPvzzt.js +2 -0
  22. package/dist/studio-ui-assets/assets/CreateCardView-DPjPvzzt.js.map +1 -0
  23. package/dist/studio-ui-assets/assets/edit-ui.es-DiUxqbgF.js +330 -0
  24. package/dist/studio-ui-assets/assets/edit-ui.es-DiUxqbgF.js.map +1 -0
  25. package/dist/studio-ui-assets/assets/index--zY88pg6.css +14 -0
  26. package/dist/studio-ui-assets/assets/index-BnAv1C72.js +287 -0
  27. package/dist/studio-ui-assets/assets/index-BnAv1C72.js.map +1 -0
  28. package/dist/studio-ui-assets/assets/index-DHMXQY3-.js +192 -0
  29. package/dist/studio-ui-assets/assets/index-DHMXQY3-.js.map +1 -0
  30. package/dist/studio-ui-assets/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  31. package/dist/studio-ui-assets/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  32. package/dist/studio-ui-assets/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  33. package/dist/studio-ui-assets/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  34. package/dist/studio-ui-assets/assets/vue-DZcMATiC.js +28 -0
  35. package/dist/studio-ui-assets/assets/vue-DZcMATiC.js.map +1 -0
  36. package/dist/studio-ui-assets/assets/vuetify-qg7mRxy_.js +6 -0
  37. package/dist/studio-ui-assets/assets/vuetify-qg7mRxy_.js.map +1 -0
  38. package/dist/studio-ui-assets/index.html +16 -0
  39. package/dist/utils/NodeFileSystemAdapter.d.ts +14 -0
  40. package/dist/utils/NodeFileSystemAdapter.d.ts.map +1 -0
  41. package/dist/utils/NodeFileSystemAdapter.js +55 -0
  42. package/dist/utils/NodeFileSystemAdapter.js.map +1 -0
  43. package/dist/utils/template.d.ts +1 -1
  44. package/dist/utils/template.d.ts.map +1 -1
  45. package/dist/utils/template.js +19 -5
  46. package/dist/utils/template.js.map +1 -1
  47. package/package.json +7 -4
  48. package/src/cli.ts +8 -0
  49. package/src/commands/studio.ts +497 -0
  50. package/src/commands/unpack.ts +259 -0
  51. package/src/utils/NodeFileSystemAdapter.ts +72 -0
  52. package/src/utils/template.ts +26 -7
package/dist/cli.js CHANGED
@@ -5,6 +5,8 @@ import { fileURLToPath } from 'url';
5
5
  import { dirname, join } from 'path';
6
6
  import { createInitCommand } from './commands/init.js';
7
7
  import { createPackCommand } from './commands/pack.js';
8
+ import { createUnpackCommand } from './commands/unpack.js';
9
+ import { createStudioCommand } from './commands/studio.js';
8
10
  const __filename = fileURLToPath(import.meta.url);
9
11
  const __dirname = dirname(__filename);
10
12
  // Read package.json to get version
@@ -18,6 +20,8 @@ program
18
20
  // Add commands
19
21
  program.addCommand(createInitCommand());
20
22
  program.addCommand(createPackCommand());
23
+ program.addCommand(createUnpackCommand());
24
+ program.addCommand(createStudioCommand());
21
25
  program.on('--help', () => {
22
26
  console.log('');
23
27
  console.log('Examples:');
@@ -26,6 +30,10 @@ program.on('--help', () => {
26
30
  console.log(' $ skuilder init physics --no-interactive --data-layer=dynamic');
27
31
  console.log(' $ skuilder pack sample-course-id');
28
32
  console.log(' $ skuilder pack biology-101 --server http://localhost:5984 --username admin');
33
+ console.log(' $ skuilder unpack ./static-courses/biology-101');
34
+ console.log(' $ skuilder unpack ./my-course --database test-migration --validate');
35
+ console.log(' $ skuilder studio ./my-sui-course');
36
+ console.log(' $ skuilder studio . --port 5985 --no-browser');
29
37
  });
30
38
  program.parse();
31
39
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,mCAAmC;AACnC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAExC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;AAC/F,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,mCAAmC;AACnC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAE1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createStudioCommand(): Command;
3
+ //# sourceMappingURL=studio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,mBAAmB,IAAI,OAAO,CAO7C"}
@@ -0,0 +1,396 @@
1
+ import { Command } from 'commander';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import chalk from 'chalk';
5
+ import { spawn } from 'child_process';
6
+ import { fileURLToPath } from 'url';
7
+ import { dirname } from 'path';
8
+ import http from 'http';
9
+ import { CouchDBManager } from '@vue-skuilder/common/docker';
10
+ // TODO: Re-enable once module import issues are resolved
11
+ // import { StaticToCouchDBMigrator, validateStaticCourse } from '@vue-skuilder/db';
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+ export function createStudioCommand() {
15
+ return new Command('studio')
16
+ .description('Launch studio mode for editing a static course')
17
+ .argument('[coursePath]', 'Path to static course directory', '.')
18
+ .option('-p, --port <port>', 'CouchDB port for studio session', '5985')
19
+ .option('--no-browser', 'Skip automatic browser launch')
20
+ .action(launchStudio);
21
+ }
22
+ // Global references for cleanup
23
+ let couchDBManager = null;
24
+ let studioUIServer = null;
25
+ async function launchStudio(coursePath, options) {
26
+ try {
27
+ console.log(chalk.cyan(`🎨 Launching Skuilder Studio...`));
28
+ // Phase 2: Course Detection & Validation
29
+ const resolvedPath = path.resolve(coursePath);
30
+ console.log(chalk.gray(`📁 Course path: ${resolvedPath}`));
31
+ if (!(await validateSuiCourse(resolvedPath))) {
32
+ console.error(chalk.red(`❌ Not a valid standalone-ui course directory`));
33
+ console.log(chalk.yellow(`💡 Studio mode requires a vue-skuilder course with:`));
34
+ console.log(chalk.yellow(` - package.json with @vue-skuilder/* dependencies`));
35
+ console.log(chalk.yellow(` - static-data/ OR public/static-courses/ directory with course content`));
36
+ process.exit(1);
37
+ }
38
+ console.log(chalk.green(`✅ Valid standalone-ui course detected`));
39
+ // Phase 1: CouchDB Management
40
+ const studioDatabaseName = generateStudioDatabaseName(resolvedPath);
41
+ console.log(chalk.cyan(`🗄️ Starting studio CouchDB instance: ${studioDatabaseName}`));
42
+ couchDBManager = await startStudioCouchDB(studioDatabaseName, parseInt(options.port));
43
+ // Phase 4: Populate CouchDB with course data
44
+ console.log(chalk.cyan(`📦 Unpacking course data to studio database...`));
45
+ const unpackResult = await unpackCourseToStudio(resolvedPath, couchDBManager.getConnectionDetails());
46
+ // Phase 7: Launch studio-ui server
47
+ console.log(chalk.cyan(`🌐 Starting studio-ui server...`));
48
+ console.log(chalk.gray(` Debug: Unpack result - Database: "${unpackResult.databaseName}", Course ID: "${unpackResult.courseId}"`));
49
+ const studioUIPort = await startStudioUIServer(couchDBManager.getConnectionDetails(), unpackResult);
50
+ console.log(chalk.green(`✅ Studio session ready!`));
51
+ console.log(chalk.white(`🎨 Studio URL: http://localhost:${studioUIPort}`));
52
+ console.log(chalk.gray(` Database: ${studioDatabaseName} on port ${options.port}`));
53
+ if (options.browser) {
54
+ console.log(chalk.cyan(`🌐 Opening browser...`));
55
+ await openBrowser(`http://localhost:${studioUIPort}`);
56
+ }
57
+ console.log(chalk.gray(` Press Ctrl+C to stop studio session`));
58
+ // Keep process alive and handle cleanup
59
+ process.on('SIGINT', () => {
60
+ void (async () => {
61
+ console.log(chalk.cyan(`\n🔄 Stopping studio session...`));
62
+ await stopStudioSession();
63
+ console.log(chalk.green(`✅ Studio session stopped`));
64
+ process.exit(0);
65
+ })();
66
+ });
67
+ process.on('SIGTERM', () => {
68
+ void (async () => {
69
+ console.log(chalk.cyan(`\n🔄 Stopping studio session...`));
70
+ await stopStudioSession();
71
+ process.exit(0);
72
+ })();
73
+ });
74
+ // Keep process alive
75
+ await new Promise(() => { });
76
+ }
77
+ catch (error) {
78
+ console.error(chalk.red(`❌ Studio launch failed:`), error);
79
+ process.exit(1);
80
+ }
81
+ }
82
+ /**
83
+ * Phase 2: Validate that the given path contains a standalone-ui course
84
+ */
85
+ async function validateSuiCourse(coursePath) {
86
+ try {
87
+ // Check if directory exists
88
+ if (!fs.existsSync(coursePath)) {
89
+ return false;
90
+ }
91
+ // Check for package.json
92
+ const packageJsonPath = path.join(coursePath, 'package.json');
93
+ if (!fs.existsSync(packageJsonPath)) {
94
+ return false;
95
+ }
96
+ // Read and validate package.json
97
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
98
+ // Check for vue-skuilder course indicators (either standalone-ui or required packages)
99
+ const hasStandaloneUi = (packageJson.dependencies && packageJson.dependencies['@vue-skuilder/standalone-ui']) ||
100
+ (packageJson.devDependencies && packageJson.devDependencies['@vue-skuilder/standalone-ui']);
101
+ const hasRequiredPackages = packageJson.dependencies &&
102
+ packageJson.dependencies['@vue-skuilder/common-ui'] &&
103
+ packageJson.dependencies['@vue-skuilder/courses'] &&
104
+ packageJson.dependencies['@vue-skuilder/db'];
105
+ if (!hasStandaloneUi && !hasRequiredPackages) {
106
+ return false;
107
+ }
108
+ // Check for course content directory (static-data OR public/static-courses)
109
+ const staticDataPath = path.join(coursePath, 'static-data');
110
+ const publicStaticCoursesPath = path.join(coursePath, 'public', 'static-courses');
111
+ if (!fs.existsSync(staticDataPath) && !fs.existsSync(publicStaticCoursesPath)) {
112
+ return false;
113
+ }
114
+ return true;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ /**
121
+ * Generate a unique database name for this studio session
122
+ */
123
+ function generateStudioDatabaseName(coursePath) {
124
+ const courseName = path.basename(coursePath);
125
+ const timestamp = Date.now();
126
+ return `studio-${courseName.toLowerCase().replace(/[^a-z0-9]/g, '-')}-${timestamp}`;
127
+ }
128
+ /**
129
+ * Phase 1: Start CouchDB for studio session
130
+ */
131
+ async function startStudioCouchDB(_databaseName, port) {
132
+ const manager = new CouchDBManager({
133
+ mode: 'blank',
134
+ port: port,
135
+ containerName: `skuilder-studio-${port}`,
136
+ }, {
137
+ onLog: (message) => console.log(chalk.gray(` ${message}`)),
138
+ onError: (error) => console.error(chalk.red(` Error: ${error}`)),
139
+ });
140
+ try {
141
+ await manager.start();
142
+ const connectionDetails = manager.getConnectionDetails();
143
+ console.log(chalk.green(`✅ CouchDB studio instance ready`));
144
+ console.log(chalk.gray(` URL: ${connectionDetails.url}`));
145
+ console.log(chalk.gray(` Username: ${connectionDetails.username}`));
146
+ console.log(chalk.gray(` Password: ${connectionDetails.password}`));
147
+ return manager;
148
+ }
149
+ catch (error) {
150
+ const errorMessage = error instanceof Error ? error.message : String(error);
151
+ console.error(chalk.red(`Failed to start CouchDB: ${errorMessage}`));
152
+ throw error;
153
+ }
154
+ }
155
+ /**
156
+ * Stop entire studio session (CouchDB + UI server)
157
+ */
158
+ async function stopStudioSession() {
159
+ // Stop studio-ui server
160
+ if (studioUIServer) {
161
+ try {
162
+ studioUIServer.close();
163
+ console.log(chalk.green(`✅ Studio-UI server stopped`));
164
+ }
165
+ catch (error) {
166
+ const errorMessage = error instanceof Error ? error.message : String(error);
167
+ console.error(chalk.red(`Error stopping studio-ui server: ${errorMessage}`));
168
+ }
169
+ studioUIServer = null;
170
+ }
171
+ // Stop CouchDB
172
+ if (couchDBManager) {
173
+ try {
174
+ await couchDBManager.remove(); // This stops and removes the container
175
+ console.log(chalk.green(`✅ CouchDB studio instance cleaned up`));
176
+ }
177
+ catch (error) {
178
+ const errorMessage = error instanceof Error ? error.message : String(error);
179
+ console.error(chalk.red(`Error cleaning up CouchDB: ${errorMessage}`));
180
+ }
181
+ couchDBManager = null;
182
+ }
183
+ }
184
+ async function startStudioUIServer(connectionDetails, unpackResult) {
185
+ const studioAssetsPath = path.join(__dirname, '..', 'studio-ui-assets');
186
+ if (!fs.existsSync(studioAssetsPath)) {
187
+ throw new Error('Studio-UI assets not found. Please rebuild the CLI package.');
188
+ }
189
+ // Find available port starting from 7174
190
+ let port = 7174;
191
+ while (port < 7200) {
192
+ try {
193
+ await new Promise((resolve, reject) => {
194
+ const server = http.createServer((req, res) => {
195
+ let filePath = path.join(studioAssetsPath, req.url === '/' ? 'index.html' : req.url || '');
196
+ // Security: prevent directory traversal
197
+ if (!filePath.startsWith(studioAssetsPath)) {
198
+ res.writeHead(403);
199
+ res.end('Forbidden');
200
+ return;
201
+ }
202
+ // Check if file exists
203
+ if (!fs.existsSync(filePath)) {
204
+ // If it's not a file, serve index.html for SPA routing
205
+ filePath = path.join(studioAssetsPath, 'index.html');
206
+ }
207
+ // Determine content type
208
+ const ext = path.extname(filePath);
209
+ const contentType = {
210
+ '.html': 'text/html',
211
+ '.js': 'text/javascript',
212
+ '.css': 'text/css',
213
+ '.woff2': 'font/woff2',
214
+ '.woff': 'font/woff',
215
+ '.ttf': 'font/ttf',
216
+ '.eot': 'application/vnd.ms-fontobject',
217
+ }[ext] || 'application/octet-stream';
218
+ res.writeHead(200, { 'Content-Type': contentType });
219
+ // For HTML files, inject CouchDB connection details
220
+ if (ext === '.html') {
221
+ let html = fs.readFileSync(filePath, 'utf8');
222
+ // Inject connection details as script tag before </head>
223
+ const connectionScript = `
224
+ <script>
225
+ window.STUDIO_CONFIG = {
226
+ couchdb: {
227
+ url: '${connectionDetails.url}',
228
+ username: '${connectionDetails.username}',
229
+ password: '${connectionDetails.password}'
230
+ },
231
+ database: {
232
+ name: '${unpackResult.databaseName}',
233
+ courseId: '${unpackResult.courseId}'
234
+ }
235
+ };
236
+ </script>
237
+ `;
238
+ html = html.replace('</head>', connectionScript + '</head>');
239
+ res.end(html);
240
+ }
241
+ else {
242
+ // Serve static files
243
+ const stream = fs.createReadStream(filePath);
244
+ stream.pipe(res);
245
+ }
246
+ });
247
+ server.listen(port, '127.0.0.1', () => {
248
+ studioUIServer = server;
249
+ resolve();
250
+ });
251
+ server.on('error', (err) => {
252
+ if (err.code === 'EADDRINUSE') {
253
+ reject(err);
254
+ }
255
+ else {
256
+ reject(err);
257
+ }
258
+ });
259
+ });
260
+ // Port is available
261
+ console.log(chalk.green(`✅ Studio-UI server running on port ${port}`));
262
+ return port;
263
+ }
264
+ catch (error) {
265
+ if (error instanceof Error && 'code' in error && error.code === 'EADDRINUSE') {
266
+ port++;
267
+ continue;
268
+ }
269
+ else {
270
+ throw error;
271
+ }
272
+ }
273
+ }
274
+ throw new Error('Unable to find an available port for studio-ui server');
275
+ }
276
+ /**
277
+ * Open browser to studio URL
278
+ */
279
+ async function openBrowser(url) {
280
+ const { spawn } = await import('child_process');
281
+ let command;
282
+ let args;
283
+ switch (process.platform) {
284
+ case 'darwin':
285
+ command = 'open';
286
+ args = [url];
287
+ break;
288
+ case 'win32':
289
+ command = 'start';
290
+ args = ['', url];
291
+ break;
292
+ default:
293
+ command = 'xdg-open';
294
+ args = [url];
295
+ break;
296
+ }
297
+ try {
298
+ spawn(command, args, { detached: true, stdio: 'ignore' });
299
+ }
300
+ catch {
301
+ console.log(chalk.yellow(`⚠️ Could not automatically open browser. Please visit: ${url}`));
302
+ }
303
+ }
304
+ /**
305
+ * Phase 4: Unpack course data to studio CouchDB
306
+ */
307
+ async function unpackCourseToStudio(coursePath, connectionDetails) {
308
+ return new Promise((resolve, reject) => {
309
+ // Find the course data directory (static-data OR public/static-courses)
310
+ let courseDataPath = path.join(coursePath, 'static-data');
311
+ if (!fs.existsSync(courseDataPath)) {
312
+ // Try public/static-courses directory
313
+ const publicStaticPath = path.join(coursePath, 'public', 'static-courses');
314
+ if (fs.existsSync(publicStaticPath)) {
315
+ // Find the first course directory inside public/static-courses
316
+ const courses = fs
317
+ .readdirSync(publicStaticPath, { withFileTypes: true })
318
+ .filter((dirent) => dirent.isDirectory())
319
+ .map((dirent) => dirent.name);
320
+ if (courses.length > 0) {
321
+ courseDataPath = path.join(publicStaticPath, courses[0]);
322
+ }
323
+ else {
324
+ reject(new Error('No course directories found in public/static-courses/'));
325
+ return;
326
+ }
327
+ }
328
+ else {
329
+ reject(new Error('No course data found in static-data/ or public/static-courses/'));
330
+ return;
331
+ }
332
+ }
333
+ console.log(chalk.gray(` Course data path: ${courseDataPath}`));
334
+ // Build the unpack command arguments
335
+ const args = [
336
+ 'unpack',
337
+ courseDataPath,
338
+ '--server',
339
+ connectionDetails.url,
340
+ '--username',
341
+ connectionDetails.username,
342
+ '--password',
343
+ connectionDetails.password,
344
+ ];
345
+ console.log(chalk.gray(` Running: skuilder ${args.join(' ')}`));
346
+ // Spawn the unpack command as a child process
347
+ const unpackProcess = spawn('node', [path.join(__dirname, '..', 'cli.js'), ...args], {
348
+ stdio: ['pipe', 'pipe', 'pipe'],
349
+ cwd: process.cwd(),
350
+ });
351
+ let stdout = '';
352
+ let stderr = '';
353
+ unpackProcess.stdout?.on('data', (data) => {
354
+ const output = data.toString();
355
+ stdout += output;
356
+ // Forward output with indentation
357
+ process.stdout.write(chalk.gray(` ${output.replace(/\n/g, '\n ')}`));
358
+ });
359
+ unpackProcess.stderr?.on('data', (data) => {
360
+ const output = data.toString();
361
+ stderr += output;
362
+ // Forward error output with indentation
363
+ process.stderr.write(chalk.gray(` ${output.replace(/\n/g, '\n ')}`));
364
+ });
365
+ unpackProcess.on('close', (code) => {
366
+ if (code === 0) {
367
+ console.log(chalk.green(`✅ Course data unpacked successfully`));
368
+ // Parse the output to extract database name and course ID
369
+ console.log(chalk.gray(` Debug: Parsing unpack output...`));
370
+ const databaseMatch = stdout.match(/Database: ([\w-_]+)/);
371
+ const courseIdMatch = stdout.match(/Course: .* \(([a-f0-9]+)\)/);
372
+ const fullDatabaseName = databaseMatch ? databaseMatch[1] : '';
373
+ const courseId = courseIdMatch ? courseIdMatch[1] : '';
374
+ // Extract the course database ID by removing 'coursedb-' prefix
375
+ const databaseName = fullDatabaseName.startsWith('coursedb-')
376
+ ? fullDatabaseName.substring('coursedb-'.length)
377
+ : fullDatabaseName;
378
+ console.log(chalk.gray(` Debug: Parsed - Full DB: "${fullDatabaseName}", Course DB ID: "${databaseName}", Course ID: "${courseId}"`));
379
+ if (!databaseName || !courseId) {
380
+ console.warn(chalk.yellow(`⚠️ Could not parse database name or course ID from unpack output`));
381
+ console.log(chalk.gray(` Raw stdout length: ${stdout.length} chars`));
382
+ }
383
+ resolve({ databaseName, courseId });
384
+ }
385
+ else {
386
+ console.error(chalk.red(`❌ Failed to unpack course data (exit code: ${code})`));
387
+ reject(new Error(`Unpack failed with code ${code}\nstdout: ${stdout}\nstderr: ${stderr}`));
388
+ }
389
+ });
390
+ unpackProcess.on('error', (error) => {
391
+ console.error(chalk.red(`❌ Failed to start unpack process: ${error.message}`));
392
+ reject(error);
393
+ });
394
+ });
395
+ }
396
+ //# sourceMappingURL=studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,yDAAyD;AACzD,oFAAoF;AAEpF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,QAAQ,CAAC,cAAc,EAAE,iCAAiC,EAAE,GAAG,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,EAAE,MAAM,CAAC;SACtE,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC;SACvD,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC;AAOD,gCAAgC;AAChC,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,IAAI,cAAc,GAAuB,IAAI,CAAC;AAE9C,KAAK,UAAU,YAAY,CAAC,UAAkB,EAAE,OAAsB;IACpE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAE3D,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,2EAA2E,CAAC,CAC1F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAElE,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAExF,cAAc,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEtF,6CAA6C;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAC7C,YAAY,EACZ,cAAc,CAAC,oBAAoB,EAAE,CACtC,CAAC;QAEF,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,wCAAwC,YAAY,CAAC,YAAY,kBAAkB,YAAY,CAAC,QAAQ,GAAG,CAC5G,CACF,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,cAAc,CAAC,oBAAoB,EAAE,EACrC,YAAY,CACb,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,MAAM,WAAW,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAElE,wCAAwC;QACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC3D,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC3D,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,4BAA4B;QAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yBAAyB;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QAE1E,uFAAuF;QACvF,MAAM,eAAe,GACnB,CAAC,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;YACrF,CAAC,WAAW,CAAC,eAAe,IAAI,WAAW,CAAC,eAAe,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAE9F,MAAM,mBAAmB,GACvB,WAAW,CAAC,YAAY;YACxB,WAAW,CAAC,YAAY,CAAC,yBAAyB,CAAC;YACnD,WAAW,CAAC,YAAY,CAAC,uBAAuB,CAAC;YACjD,WAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE/C,IAAI,CAAC,eAAe,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,4EAA4E;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAElF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CAAC,UAAkB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,UAAU,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,aAAqB,EAAE,IAAY;IACnE,MAAM,OAAO,GAAG,IAAI,cAAc,CAChC;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,mBAAmB,IAAI,EAAE;KACzC,EACD;QACE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;KACnE,CACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEtE,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,wBAAwB;IACxB,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,cAAc,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,eAAe;IACf,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,uCAAuC;YACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC;AAgBD,KAAK,UAAU,mBAAmB,CAAC,iBAAoC,EAAE,YAA0B;IACjG,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAExE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,yCAAyC;IACzC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBAC5C,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CACtB,gBAAgB,EAChB,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAC/C,CAAC;oBAEF,wCAAwC;oBACxC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC3C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wBACrB,OAAO;oBACT,CAAC;oBAED,uBAAuB;oBACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7B,uDAAuD;wBACvD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;oBACvD,CAAC;oBAED,yBAAyB;oBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACnC,MAAM,WAAW,GACf;wBACE,OAAO,EAAE,WAAW;wBACpB,KAAK,EAAE,iBAAiB;wBACxB,MAAM,EAAE,UAAU;wBAClB,QAAQ,EAAE,YAAY;wBACtB,OAAO,EAAE,WAAW;wBACpB,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE,+BAA+B;qBACxC,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;oBAEvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBAEpD,oDAAoD;oBACpD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;wBACpB,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAE7C,yDAAyD;wBACzD,MAAM,gBAAgB,GAAG;;;;4BAIT,iBAAiB,CAAC,GAAG;iCAChB,iBAAiB,CAAC,QAAQ;iCAC1B,iBAAiB,CAAC,QAAQ;;;6BAG9B,YAAY,CAAC,YAAY;iCACrB,YAAY,CAAC,QAAQ;;;;aAIzC,CAAC;wBACF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC;wBAC7D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;yBAAM,CAAC;wBACN,qBAAqB;wBACrB,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;wBAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;oBACpC,cAAc,GAAG,MAAM,CAAC;oBACxB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;oBAChD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,oBAAoB;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC7E,IAAI,EAAE,CAAC;gBACP,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAEhD,IAAI,OAAe,CAAC;IACpB,IAAI,IAAc,CAAC;IAEnB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,GAAG,MAAM,CAAC;YACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACb,MAAM;QACR,KAAK,OAAO;YACV,OAAO,GAAG,OAAO,CAAC;YAClB,IAAI,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACjB,MAAM;QACR;YACE,OAAO,GAAG,UAAU,CAAC;YACrB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACb,MAAM;IACV,CAAC;IAED,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2DAA2D,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,UAAkB,EAClB,iBAAoC;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,wEAAwE;QACxE,IAAI,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,sCAAsC;YACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,+DAA+D;gBAC/D,MAAM,OAAO,GAAG,EAAE;qBACf,WAAW,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBACtD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;qBACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAEhC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;oBAC3E,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC,CAAC;QAElE,qCAAqC;QACrC,MAAM,IAAI,GAAG;YACX,QAAQ;YACR,cAAc;YACd,UAAU;YACV,iBAAiB,CAAC,GAAG;YACrB,YAAY;YACZ,iBAAiB,CAAC,QAAQ;YAC1B,YAAY;YACZ,iBAAiB,CAAC,QAAQ;SAC3B,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,8CAA8C;QAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;YACnF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,MAAM,CAAC;YACjB,kCAAkC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,MAAM,CAAC;YACjB,wCAAwC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAEhE,0DAA0D;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAE9D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAEjE,MAAM,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEvD,gEAAgE;gBAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC;oBAC3D,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;oBAChD,CAAC,CAAC,gBAAgB,CAAC;gBAErB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,gCAAgC,gBAAgB,qBAAqB,YAAY,kBAAkB,QAAQ,GAAG,CAC/G,CACF,CAAC;gBAEF,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAClF,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBAED,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,IAAI,GAAG,CAAC,CAAC,CAAC;gBAChF,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,aAAa,MAAM,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createUnpackCommand(): Command;
3
+ //# sourceMappingURL=unpack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpack.d.ts","sourceRoot":"","sources":["../../src/commands/unpack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,IAAI,OAAO,CAa7C"}