@vue-skuilder/cli 0.1.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.
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ # Skuilder CLI
2
+
3
+ A command-line tool for scaffolding Skuilder course applications.
4
+
5
+ ## Installation
6
+
7
+ Install globally via npm:
8
+
9
+ ```bash
10
+ npm install -g skuilder
11
+ ```
12
+
13
+ Or use npx to run without installing:
14
+
15
+ ```bash
16
+ npx skuilder init my-course
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ### Create a new project
22
+
23
+ ```bash
24
+ skuilder init my-anatomy-course
25
+ ```
26
+
27
+ This will start an interactive prompt to configure your project:
28
+ - Course title
29
+ - Data layer type (static or dynamic)
30
+ - CouchDB connection details (for dynamic)
31
+ - Theme selection
32
+ - Course ID to import (optional)
33
+
34
+ ### Non-interactive mode
35
+
36
+ ```bash
37
+ skuilder init physics-101 \
38
+ --data-layer=static \
39
+ --theme=educational \
40
+ --no-interactive
41
+ ```
42
+
43
+ ### Dynamic data layer with CouchDB
44
+
45
+ ```bash
46
+ skuilder init biology-course \
47
+ --data-layer=dynamic \
48
+ --couchdb-url=https://my-couch.server.com:5984 \
49
+ --course-id=bio-101-2024 \
50
+ --theme=medical
51
+ ```
52
+
53
+ ## Command Options
54
+
55
+ - `--data-layer <type>` - Choose data layer: `static` or `dynamic` (default: dynamic)
56
+ - `--theme <name>` - Select theme: `default`, `medical`, `educational`, or `corporate` (default: default)
57
+ - `--no-interactive` - Skip interactive prompts and use provided options
58
+ - `--couchdb-url <url>` - CouchDB server URL (required for dynamic data layer)
59
+ - `--course-id <id>` - Course ID to import from CouchDB (optional)
60
+
61
+ ## Generated Project Structure
62
+
63
+ ```
64
+ my-course/
65
+ ├── src/
66
+ │ ├── components/ # Vue components
67
+ │ ├── views/ # Route views
68
+ │ ├── stores/ # Pinia stores
69
+ │ └── main.ts # App entry point
70
+ ├── public/ # Static assets
71
+ ├── skuilder.config.json # Course configuration
72
+ ├── package.json # Project dependencies
73
+ ├── vite.config.ts # Build configuration
74
+ └── README.md # Project documentation
75
+ ```
76
+
77
+ ## Data Layer Types
78
+
79
+ ### Static Data Layer
80
+ - Self-contained JSON files for course data
81
+ - Static deployment friendly
82
+ - User progress tracking via browser localstorage
83
+ - Includes sample course data
84
+
85
+ ### Dynamic Data Layer
86
+ - Connects to CouchDB server for course data
87
+ - Real-time data synchronization
88
+ - courses 'adaptive' to global usage, eg,
89
+ - dynamic
90
+ - User progress tracking both locally (as in static deployments) and in serverside CouchDB (allowing multi-device use)
91
+ - Course content management UIs
92
+
93
+ ## Themes
94
+
95
+ ### Predefined Themes
96
+
97
+ - **Default**: Material Blue (`#1976D2`, `#424242`, `#82B1FF`)
98
+ - **Medical**: Healthcare Green (`#2E7D32`, `#558B2F`, `#66BB6A`)
99
+ - **Educational**: Academic Orange (`#F57C00`, `#FF9800`, `#FFB74D`)
100
+ - **Corporate**: Professional Gray (`#37474F`, `#546E7A`, `#78909C`)
101
+
102
+ Themes are applied via Vuetify's theming system and can be customized after project generation.
103
+
104
+ ## Development
105
+
106
+ ### Working on the CLI
107
+
108
+ Clone the repository and install dependencies:
109
+
110
+ ```bash
111
+ git clone https://github.com/patched-network/vue-skuilder.git
112
+ cd vue-skuilder
113
+ yarn install
114
+ ```
115
+
116
+ Build the CLI package:
117
+
118
+ ```bash
119
+ yarn workspace @vue-skuilder/cli build
120
+ ```
121
+
122
+ Link for local testing:
123
+
124
+ ```bash
125
+ cd packages/cli
126
+ npm link
127
+ skuilder init test-project
128
+ ```
129
+
130
+ ### Testing
131
+
132
+ Run the CLI locally:
133
+
134
+ ```bash
135
+ yarn workspace @vue-skuilder/cli build
136
+ node packages/cli/dist/cli.js init test-project
137
+ ```
138
+
139
+ ## Requirements
140
+
141
+ - Node.js 18.0.0 or higher
142
+ - npm or yarn package manager
143
+
144
+ ## Dependencies
145
+
146
+ The CLI generates projects using published `@vue-skuilder/*` packages:
147
+
148
+ - `@vue-skuilder/common-ui` - Vue component library
149
+ - `@vue-skuilder/db` - Database abstraction layer
150
+ - `@vue-skuilder/standalone-ui` - Template source
151
+
152
+ Generated projects include:
153
+ - Vue 3 with Composition API
154
+ - Vuetify 3 for UI components
155
+ - Pinia for state management
156
+ - Vue Router for navigation
157
+ - TypeScript support
158
+ - Vite for building and development
159
+
160
+ ## Support
161
+
162
+ - Documentation: [Vue Skuilder Repository](https://github.com/patched-network/vue-skuilder)
163
+ - Issues: [GitHub Issues](https://github.com/patched-network/vue-skuilder/issues)
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { readFileSync } from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+ import { initCommand } from './commands/init.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ // Read package.json to get version
10
+ const packagePath = join(__dirname, '..', 'package.json');
11
+ const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
12
+ const program = new Command();
13
+ program
14
+ .name('skuilder')
15
+ .description('CLI tool for scaffolding Skuilder course applications')
16
+ .version(packageJson.version);
17
+ program
18
+ .command('init')
19
+ .argument('<project-name>', 'name of the project to create')
20
+ .description('create a new Skuilder course application')
21
+ .option('--data-layer <type>', 'data layer type (static|dynamic)', 'dynamic')
22
+ .option('--theme <name>', 'theme name (default|medical|educational|corporate)', 'default')
23
+ .option('--no-interactive', 'skip interactive prompts')
24
+ .option('--couchdb-url <url>', 'CouchDB server URL (for dynamic data layer)')
25
+ .option('--course-id <id>', 'course ID to import (for dynamic data layer)')
26
+ .action(initCommand);
27
+ program.on('--help', () => {
28
+ console.log('');
29
+ console.log('Examples:');
30
+ console.log(' $ skuilder init my-anatomy-course');
31
+ console.log(' $ skuilder init biology-101 --data-layer=static --theme=medical');
32
+ console.log(' $ skuilder init physics --no-interactive --data-layer=dynamic');
33
+ });
34
+ program.parse();
35
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +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,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,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,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;KAC3D,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,qBAAqB,EAAE,kCAAkC,EAAE,SAAS,CAAC;KAC5E,MAAM,CAAC,gBAAgB,EAAE,oDAAoD,EAAE,SAAS,CAAC;KACzF,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;KAC5E,MAAM,CAAC,kBAAkB,EAAE,8CAA8C,CAAC;KAC1E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,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;AACjF,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CliOptions } from '../types.js';
2
+ export declare function initCommand(projectName: string, options: CliOptions): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CA2Df"}
@@ -0,0 +1,70 @@
1
+ import { existsSync } from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { gatherProjectConfig, confirmProjectCreation } from '../utils/prompts.js';
5
+ import { processTemplate } from '../utils/template.js';
6
+ import { readFileSync } from 'fs';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname, join } from 'path';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ export async function initCommand(projectName, options) {
12
+ try {
13
+ // Validate project name
14
+ if (!isValidProjectName(projectName)) {
15
+ console.error(chalk.red('❌ Invalid project name. Use only letters, numbers, hyphens, and underscores.'));
16
+ process.exit(1);
17
+ }
18
+ // Check if directory already exists
19
+ const projectPath = path.resolve(process.cwd(), projectName);
20
+ if (existsSync(projectPath)) {
21
+ console.error(chalk.red(`❌ Directory "${projectName}" already exists.`));
22
+ process.exit(1);
23
+ }
24
+ // Get CLI version for dependency transformation
25
+ const packagePath = join(__dirname, '..', '..', 'package.json');
26
+ const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
27
+ const cliVersion = packageJson.version;
28
+ // Gather project configuration
29
+ const config = await gatherProjectConfig(projectName, options);
30
+ // Confirm project creation (only in interactive mode)
31
+ if (options.interactive) {
32
+ const confirmed = await confirmProjectCreation(config, projectPath);
33
+ if (!confirmed) {
34
+ console.log(chalk.yellow('Project creation cancelled.'));
35
+ return;
36
+ }
37
+ }
38
+ console.log(chalk.cyan(`\n🛠️ Creating project "${projectName}"...\n`));
39
+ // Process template and create project
40
+ await processTemplate(projectPath, config, cliVersion);
41
+ // Success message
42
+ console.log(chalk.green('\n🎉 Project created successfully!\n'));
43
+ console.log(chalk.cyan('Next steps:'));
44
+ console.log(` ${chalk.white('cd')} ${projectName}`);
45
+ console.log(` ${chalk.white('npm install')}`);
46
+ console.log(` ${chalk.white('npm run dev')}`);
47
+ console.log('');
48
+ if (config.dataLayerType === 'couch') {
49
+ console.log(chalk.yellow('📝 Note: Make sure your CouchDB server is running and accessible.'));
50
+ if (config.course) {
51
+ console.log(chalk.yellow(`📚 Course ID "${config.course}" will be loaded from the database.`));
52
+ }
53
+ }
54
+ else {
55
+ console.log(chalk.yellow('📝 Note: This project uses static data. Sample course data has been included.'));
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error(chalk.red('\n❌ Failed to create project:'));
60
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
61
+ process.exit(1);
62
+ }
63
+ }
64
+ function isValidProjectName(name) {
65
+ // Allow letters, numbers, hyphens, and underscores
66
+ // Must start with a letter or number
67
+ const validNameRegex = /^[a-zA-Z0-9][a-zA-Z0-9-_]*$/;
68
+ return validNameRegex.test(name) && name.length > 0 && name.length <= 214;
69
+ }
70
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface CliOptions {
2
+ dataLayer: 'static' | 'dynamic';
3
+ theme: 'default' | 'medical' | 'educational' | 'corporate';
4
+ interactive: boolean;
5
+ couchdbUrl?: string;
6
+ courseId?: string;
7
+ }
8
+ export interface ProjectConfig {
9
+ projectName: string;
10
+ title: string;
11
+ dataLayerType: 'static' | 'couch';
12
+ course?: string;
13
+ couchdbUrl?: string;
14
+ theme: ThemeConfig;
15
+ }
16
+ export interface ThemeConfig {
17
+ name: string;
18
+ colors: {
19
+ primary: string;
20
+ secondary: string;
21
+ accent: string;
22
+ };
23
+ }
24
+ export interface SkuilderConfig {
25
+ title: string;
26
+ course?: string;
27
+ dataLayerType: 'static' | 'couch';
28
+ couchdbUrl?: string;
29
+ theme?: ThemeConfig;
30
+ }
31
+ export interface InitCommandOptions extends CliOptions {
32
+ projectName: string;
33
+ }
34
+ export declare const PREDEFINED_THEMES: Record<string, ThemeConfig>;
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAC3D,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiCzD,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,35 @@
1
+ export const PREDEFINED_THEMES = {
2
+ default: {
3
+ name: 'default',
4
+ colors: {
5
+ primary: '#1976D2',
6
+ secondary: '#424242',
7
+ accent: '#82B1FF'
8
+ }
9
+ },
10
+ medical: {
11
+ name: 'medical',
12
+ colors: {
13
+ primary: '#2E7D32',
14
+ secondary: '#558B2F',
15
+ accent: '#66BB6A'
16
+ }
17
+ },
18
+ educational: {
19
+ name: 'educational',
20
+ colors: {
21
+ primary: '#F57C00',
22
+ secondary: '#FF9800',
23
+ accent: '#FFB74D'
24
+ }
25
+ },
26
+ corporate: {
27
+ name: 'corporate',
28
+ colors: {
29
+ primary: '#37474F',
30
+ secondary: '#546E7A',
31
+ accent: '#78909C'
32
+ }
33
+ }
34
+ };
35
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;SAClB;KACF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;SAClB;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;SAClB;KACF;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;SAClB;KACF;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { CliOptions, ProjectConfig, ThemeConfig } from '../types.js';
2
+ export declare function gatherProjectConfig(projectName: string, options: CliOptions): Promise<ProjectConfig>;
3
+ export declare function confirmProjectCreation(config: ProjectConfig, projectPath: string): Promise<boolean>;
4
+ export declare function promptForCustomTheme(): Promise<ThemeConfig>;
5
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAExF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CA0GxB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAyCjE"}
@@ -0,0 +1,185 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { PREDEFINED_THEMES } from '../types.js';
4
+ export async function gatherProjectConfig(projectName, options) {
5
+ console.log(chalk.cyan('\n🚀 Creating a new Skuilder course application\n'));
6
+ let config = {
7
+ projectName
8
+ };
9
+ if (options.interactive) {
10
+ const answers = await inquirer.prompt([
11
+ {
12
+ type: 'input',
13
+ name: 'title',
14
+ message: 'Course title:',
15
+ default: formatProjectName(projectName),
16
+ validate: (input) => input.trim().length > 0 || 'Course title is required'
17
+ },
18
+ {
19
+ type: 'list',
20
+ name: 'dataLayerType',
21
+ message: 'Data layer type:',
22
+ choices: [
23
+ {
24
+ name: 'Dynamic (Connect to CouchDB server)',
25
+ value: 'couch'
26
+ },
27
+ {
28
+ name: 'Static (Self-contained JSON files)',
29
+ value: 'static'
30
+ }
31
+ ],
32
+ default: options.dataLayer === 'dynamic' ? 'couch' : 'static'
33
+ },
34
+ {
35
+ type: 'input',
36
+ name: 'couchdbUrl',
37
+ message: 'CouchDB server URL:',
38
+ default: 'http://localhost:5984',
39
+ when: (answers) => answers.dataLayerType === 'couch',
40
+ validate: (input) => {
41
+ if (!input.trim())
42
+ return 'CouchDB URL is required for dynamic data layer';
43
+ try {
44
+ new URL(input);
45
+ return true;
46
+ }
47
+ catch {
48
+ return 'Please enter a valid URL';
49
+ }
50
+ }
51
+ },
52
+ {
53
+ type: 'input',
54
+ name: 'courseId',
55
+ message: 'Course ID to import (optional):',
56
+ when: (answers) => answers.dataLayerType === 'couch'
57
+ },
58
+ {
59
+ type: 'list',
60
+ name: 'themeName',
61
+ message: 'Select theme:',
62
+ choices: [
63
+ {
64
+ name: 'Default (Material Blue)',
65
+ value: 'default'
66
+ },
67
+ {
68
+ name: 'Medical (Healthcare Green)',
69
+ value: 'medical'
70
+ },
71
+ {
72
+ name: 'Educational (Academic Orange)',
73
+ value: 'educational'
74
+ },
75
+ {
76
+ name: 'Corporate (Professional Gray)',
77
+ value: 'corporate'
78
+ }
79
+ ],
80
+ default: options.theme
81
+ }
82
+ ]);
83
+ config = {
84
+ ...config,
85
+ title: answers.title,
86
+ dataLayerType: answers.dataLayerType,
87
+ couchdbUrl: answers.couchdbUrl,
88
+ course: answers.courseId,
89
+ theme: PREDEFINED_THEMES[answers.themeName]
90
+ };
91
+ }
92
+ else {
93
+ // Non-interactive mode: use provided options
94
+ config = {
95
+ projectName,
96
+ title: formatProjectName(projectName),
97
+ dataLayerType: options.dataLayer === 'dynamic' ? 'couch' : 'static',
98
+ couchdbUrl: options.couchdbUrl,
99
+ course: options.courseId,
100
+ theme: PREDEFINED_THEMES[options.theme]
101
+ };
102
+ // Validate required fields for non-interactive mode
103
+ if (config.dataLayerType === 'couch' && !config.couchdbUrl) {
104
+ throw new Error('CouchDB URL is required when using dynamic data layer. Use --couchdb-url option.');
105
+ }
106
+ }
107
+ return config;
108
+ }
109
+ export async function confirmProjectCreation(config, projectPath) {
110
+ console.log(chalk.yellow('\n📋 Project Configuration Summary:'));
111
+ console.log(` Project Name: ${chalk.white(config.projectName)}`);
112
+ console.log(` Course Title: ${chalk.white(config.title)}`);
113
+ console.log(` Data Layer: ${chalk.white(config.dataLayerType)}`);
114
+ if (config.couchdbUrl) {
115
+ console.log(` CouchDB URL: ${chalk.white(config.couchdbUrl)}`);
116
+ }
117
+ if (config.course) {
118
+ console.log(` Course ID: ${chalk.white(config.course)}`);
119
+ }
120
+ console.log(` Theme: ${chalk.white(config.theme.name)}`);
121
+ console.log(` Directory: ${chalk.white(projectPath)}`);
122
+ const { confirmed } = await inquirer.prompt([
123
+ {
124
+ type: 'confirm',
125
+ name: 'confirmed',
126
+ message: 'Create project with these settings?',
127
+ default: true
128
+ }
129
+ ]);
130
+ return confirmed;
131
+ }
132
+ export async function promptForCustomTheme() {
133
+ console.log(chalk.cyan('\n🎨 Custom Theme Configuration\n'));
134
+ const answers = await inquirer.prompt([
135
+ {
136
+ type: 'input',
137
+ name: 'name',
138
+ message: 'Theme name:',
139
+ validate: (input) => input.trim().length > 0 || 'Theme name is required'
140
+ },
141
+ {
142
+ type: 'input',
143
+ name: 'primary',
144
+ message: 'Primary color (hex):',
145
+ default: '#1976D2',
146
+ validate: validateHexColor
147
+ },
148
+ {
149
+ type: 'input',
150
+ name: 'secondary',
151
+ message: 'Secondary color (hex):',
152
+ default: '#424242',
153
+ validate: validateHexColor
154
+ },
155
+ {
156
+ type: 'input',
157
+ name: 'accent',
158
+ message: 'Accent color (hex):',
159
+ default: '#82B1FF',
160
+ validate: validateHexColor
161
+ }
162
+ ]);
163
+ return {
164
+ name: answers.name,
165
+ colors: {
166
+ primary: answers.primary,
167
+ secondary: answers.secondary,
168
+ accent: answers.accent
169
+ }
170
+ };
171
+ }
172
+ function formatProjectName(projectName) {
173
+ return projectName
174
+ .split(/[-_\s]+/)
175
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
176
+ .join(' ');
177
+ }
178
+ function validateHexColor(input) {
179
+ const hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
180
+ if (!hexColorRegex.test(input)) {
181
+ return 'Please enter a valid hex color (e.g., #1976D2)';
182
+ }
183
+ return true;
184
+ }
185
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ /**
3
+ * Find the standalone-ui package in node_modules
4
+ */
5
+ export declare function findStandaloneUiPath(): Promise<string>;
6
+ /**
7
+ * Copy directory recursively, excluding certain files/directories
8
+ */
9
+ export declare function copyDirectory(source: string, destination: string, excludePatterns?: string[]): Promise<void>;
10
+ /**
11
+ * Transform package.json to use published dependencies instead of workspace references
12
+ */
13
+ export declare function transformPackageJson(packageJsonPath: string, projectName: string, cliVersion: string): Promise<void>;
14
+ /**
15
+ * Generate skuilder.config.json based on project configuration
16
+ */
17
+ export declare function generateSkuilderConfig(configPath: string, config: ProjectConfig): Promise<void>;
18
+ /**
19
+ * Generate project README.md
20
+ */
21
+ export declare function generateReadme(readmePath: string, config: ProjectConfig): Promise<void>;
22
+ /**
23
+ * Copy and transform the standalone-ui template to create a new project
24
+ */
25
+ export declare function processTemplate(projectPath: string, config: ProjectConfig, cliVersion: string): Promise<void>;
26
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAK5D;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa5D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,MAAM,EAAgD,GACtE,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA+Df;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAoBf"}