@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 +163 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +70 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/prompts.d.ts +5 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +185 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/template.d.ts +26 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +170 -0
- package/dist/utils/template.js.map +1 -0
- package/eslint.config.mjs +21 -0
- package/package.json +52 -0
- package/src/cli.ts +42 -0
- package/src/commands/init.ts +83 -0
- package/src/types.ts +72 -0
- package/src/utils/prompts.ts +204 -0
- package/src/utils/template.ts +215 -0
- package/tsconfig.json +18 -0
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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"}
|