create-termui-app 0.1.1 → 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/LICENSE +21 -0
- package/README.md +26 -22
- package/dist/index.js +42 -22
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Karanjot Singh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
# create-termui-app
|
|
2
2
|
|
|
3
|
-
Scaffold a new TermUI project. Pick a template,
|
|
3
|
+
Scaffold a new TermUI project. Pick a template, pick a theme, run `npm run dev`.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
7
|
-
```bash
|
|
8
|
-
npx create-termui-app my-app
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Or with a project name directly:
|
|
12
|
-
|
|
13
7
|
```bash
|
|
14
8
|
npx create-termui-app my-app
|
|
15
9
|
cd my-app
|
|
@@ -17,40 +11,50 @@ npm install
|
|
|
17
11
|
npm run dev
|
|
18
12
|
```
|
|
19
13
|
|
|
20
|
-
|
|
14
|
+
The CLI walks you through a few choices, then generates a working project.
|
|
21
15
|
|
|
22
|
-
|
|
16
|
+
## Templates
|
|
23
17
|
|
|
24
18
|
| Template | What you get |
|
|
25
19
|
|----------|-------------|
|
|
26
|
-
| Empty |
|
|
27
|
-
| Dashboard | Real-time gauges and
|
|
28
|
-
| Interactive Tool | Forms, selects,
|
|
29
|
-
| CLI Wrapper | Wraps an existing shell command
|
|
20
|
+
| Empty | One file, no dependencies beyond core. Start from scratch |
|
|
21
|
+
| Dashboard | Real-time gauges, tables, and a status bar |
|
|
22
|
+
| Interactive Tool | Forms, selects, prompts. Good for CLI wizards |
|
|
23
|
+
| CLI Wrapper | Wraps an existing shell command in a TermUI interface |
|
|
30
24
|
|
|
31
25
|
## Themes
|
|
32
26
|
|
|
33
|
-
|
|
27
|
+
Choose one of five built-in themes during setup: Default, Cyberpunk, Nord, Dracula, or Catppuccin. You can change it later in `termui.config.ts`.
|
|
34
28
|
|
|
35
|
-
##
|
|
29
|
+
## Optional features
|
|
36
30
|
|
|
37
|
-
|
|
31
|
+
The CLI asks which extras to include:
|
|
38
32
|
|
|
39
|
-
- Screen Router
|
|
40
|
-
- Data Providers
|
|
41
|
-
- Hot Reload
|
|
33
|
+
- **Screen Router** — file-based navigation between screens
|
|
34
|
+
- **Data Providers** — CPU, memory, disk monitoring out of the box
|
|
35
|
+
- **Hot Reload** — auto-restart on save via `@termuijs/dev-server`
|
|
36
|
+
- **Testing** — Vitest config with `@termuijs/testing` ready to go
|
|
42
37
|
|
|
43
|
-
## Generated
|
|
38
|
+
## Generated project
|
|
44
39
|
|
|
45
40
|
```
|
|
46
41
|
my-app/
|
|
47
42
|
package.json
|
|
48
43
|
tsconfig.json
|
|
49
44
|
termui.config.ts
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
vitest.config.ts (if testing selected)
|
|
46
|
+
themes/default.tss
|
|
47
|
+
src/
|
|
48
|
+
index.tsx
|
|
52
49
|
```
|
|
53
50
|
|
|
51
|
+
Everything is TypeScript, and the dev server is preconfigured in the `dev` script.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## Documentation
|
|
55
|
+
|
|
56
|
+
Full docs at [www.termui.io/docs/getting-started/installation](https://www.termui.io/docs/getting-started/installation).
|
|
57
|
+
|
|
54
58
|
## License
|
|
55
59
|
|
|
56
60
|
MIT
|
package/dist/index.js
CHANGED
|
@@ -64,6 +64,8 @@ function generateProject(config) {
|
|
|
64
64
|
"@termuijs/ui": "latest",
|
|
65
65
|
"@termuijs/jsx": "latest",
|
|
66
66
|
"@termuijs/tss": "latest",
|
|
67
|
+
"@termuijs/quick": "latest",
|
|
68
|
+
"@termuijs/motion": "latest",
|
|
67
69
|
...config.features.dataProviders ? { "@termuijs/data": "latest" } : {},
|
|
68
70
|
...config.features.router ? { "@termuijs/router": "latest" } : {}
|
|
69
71
|
},
|
|
@@ -124,13 +126,13 @@ export default defineConfig({
|
|
|
124
126
|
function generateEmptyTemplate(config) {
|
|
125
127
|
return [{
|
|
126
128
|
path: "src/index.tsx",
|
|
127
|
-
content: `import { app } from '@termuijs/quick';
|
|
128
|
-
import { Text, Box } from '@termuijs/ui';
|
|
129
|
+
content: `import { app, text } from '@termuijs/quick';
|
|
129
130
|
|
|
130
131
|
app('${config.name}')
|
|
131
132
|
.rows(
|
|
132
|
-
|
|
133
|
+
text('Hello from TermUI! Edit src/index.tsx to get started.'),
|
|
133
134
|
)
|
|
135
|
+
.keys({ q: 'quit' })
|
|
134
136
|
.run();
|
|
135
137
|
`
|
|
136
138
|
}];
|
|
@@ -141,25 +143,33 @@ function generateDashboardTemplate(config) {
|
|
|
141
143
|
content: `import { app, gauge, table, sparkline } from '@termuijs/quick';
|
|
142
144
|
${config.features.dataProviders ? "import { cpu, memory, disk, processes } from '@termuijs/data';" : ""}
|
|
143
145
|
|
|
146
|
+
// Sample data for demo
|
|
147
|
+
let cpuVal = 0.45;
|
|
148
|
+
let memVal = 0.62;
|
|
149
|
+
let dskVal = 0.38;
|
|
150
|
+
|
|
144
151
|
app('\u26A1 ${config.name}')
|
|
145
152
|
.rows(
|
|
146
153
|
// Row 1: Gauges
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
gauge('DSK', () => ${config.features.dataProviders ? "disk.percent / 100" : "0.7"}),
|
|
151
|
-
),
|
|
154
|
+
gauge('CPU', () => ${config.features.dataProviders ? "cpu.percent / 100" : "cpuVal"}),
|
|
155
|
+
gauge('MEM', () => ${config.features.dataProviders ? "memory.percent / 100" : "memVal"}),
|
|
156
|
+
gauge('DSK', () => ${config.features.dataProviders ? "disk.percent / 100" : "dskVal"}),
|
|
152
157
|
// Row 2: Table
|
|
153
|
-
table('Processes',
|
|
154
|
-
|
|
155
|
-
data: () => ${config.features.dataProviders ? `processes.top(10).map(p => ({
|
|
158
|
+
table('Processes',
|
|
159
|
+
() => ${config.features.dataProviders ? `processes.top(10).map(p => ({
|
|
156
160
|
Name: p.name.slice(0, 18),
|
|
157
161
|
PID: p.pid,
|
|
158
162
|
'CPU%': p.cpu.toFixed(1),
|
|
159
163
|
'MEM%': p.mem.toFixed(1),
|
|
160
|
-
}))` : `[
|
|
161
|
-
|
|
164
|
+
}))` : `[
|
|
165
|
+
{ Name: 'node', PID: 1234, 'CPU%': '5.0', 'MEM%': '2.1' },
|
|
166
|
+
{ Name: 'chrome', PID: 5678, 'CPU%': '12.3', 'MEM%': '8.4' },
|
|
167
|
+
]`},
|
|
168
|
+
['Name', 'PID', 'CPU%', 'MEM%'],
|
|
169
|
+
),
|
|
162
170
|
)
|
|
171
|
+
.keys({ q: 'quit', r: 'refresh' })
|
|
172
|
+
.refresh('1s')
|
|
163
173
|
.run();
|
|
164
174
|
`
|
|
165
175
|
}];
|
|
@@ -167,14 +177,19 @@ app('\u26A1 ${config.name}')
|
|
|
167
177
|
function generateInteractiveTemplate(config) {
|
|
168
178
|
return [{
|
|
169
179
|
path: "src/index.tsx",
|
|
170
|
-
content: `import { app } from '@termuijs/quick';
|
|
171
|
-
|
|
180
|
+
content: `import { app, text, list, input } from '@termuijs/quick';
|
|
181
|
+
|
|
182
|
+
const items = ['Option 1', 'Option 2', 'Option 3'];
|
|
172
183
|
|
|
173
|
-
// Interactive tool with forms, selects, and toasts
|
|
174
184
|
app('\u{1F527} ${config.name}')
|
|
175
185
|
.rows(
|
|
176
|
-
|
|
186
|
+
text('Select an option or type a command:'),
|
|
187
|
+
list(() => items),
|
|
188
|
+
input('Type here...', {
|
|
189
|
+
onSubmit: (value) => items.push(value),
|
|
190
|
+
}),
|
|
177
191
|
)
|
|
192
|
+
.keys({ q: 'quit' })
|
|
178
193
|
.run();
|
|
179
194
|
`
|
|
180
195
|
}];
|
|
@@ -183,16 +198,21 @@ function generateCliWrapperTemplate(config) {
|
|
|
183
198
|
return [{
|
|
184
199
|
path: "src/index.tsx",
|
|
185
200
|
content: `import { app, text, logView } from '@termuijs/quick';
|
|
186
|
-
import { exec } from 'node:child_process';
|
|
187
201
|
|
|
188
|
-
// CLI wrapper \u2014
|
|
189
|
-
const logs: string[] = [
|
|
202
|
+
// CLI wrapper \u2014 displays log output
|
|
203
|
+
const logs: string[] = [
|
|
204
|
+
'INFO Application started',
|
|
205
|
+
'INFO Waiting for input...',
|
|
206
|
+
'DEBUG Press q to quit',
|
|
207
|
+
];
|
|
190
208
|
|
|
191
209
|
app('\u{1F4DF} ${config.name}')
|
|
192
210
|
.rows(
|
|
193
|
-
text('Command output
|
|
194
|
-
logView(
|
|
211
|
+
text('Command output:'),
|
|
212
|
+
logView(() => logs),
|
|
195
213
|
)
|
|
214
|
+
.keys({ q: 'quit' })
|
|
215
|
+
.refresh('1s')
|
|
196
216
|
.run();
|
|
197
217
|
`
|
|
198
218
|
}];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/templates.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// create-termui-app — Interactive CLI scaffolding tool\n// ─────────────────────────────────────────────────────\n\nimport { resolve, join } from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { getBuiltinThemeNames } from '@termuijs/tss';\nimport { textPrompt, selectPrompt, multiSelectPrompt } from './prompts.js';\nimport { generateProject, type ProjectConfig } from './templates.js';\n\nconst TEMPLATES = ['Empty (start from scratch)', 'Dashboard (real-time data)', 'Interactive Tool (forms, prompts)', 'CLI Wrapper (wrap existing CLI)'];\nconst TEMPLATE_KEYS = ['empty', 'dashboard', 'interactive-tool', 'cli-wrapper'] as const;\nconst FEATURES = ['Screen Router', 'Data Providers', 'Hot Reload'];\n\nasync function main() {\n console.log();\n console.log(' ┌──────────────────────────────────┐');\n console.log(' │ create-termui-app │');\n console.log(' │ The React/Next.js for CLI apps │');\n console.log(' └──────────────────────────────────┘');\n console.log();\n\n // ── Get project name from args or prompt ──\n let projectName = process.argv[2];\n if (!projectName) {\n projectName = await textPrompt('Project name', 'my-termui-app');\n }\n\n // ── Template selection ──\n const templateIdx = await selectPrompt('What kind of app?', TEMPLATES);\n const template = TEMPLATE_KEYS[templateIdx];\n\n // ── Theme selection ──\n const themes = getBuiltinThemeNames();\n const themeIdx = await selectPrompt('Choose a theme', themes.map(t => t.charAt(0).toUpperCase() + t.slice(1)));\n const theme = themes[themeIdx];\n\n // ── Feature selection ──\n const featureDefaults = [false, template === 'dashboard', true]; // Router off, Data on for dashboard, HotReload on\n const featureFlags = await multiSelectPrompt('Features to include', FEATURES, featureDefaults);\n\n const config: ProjectConfig = {\n name: projectName,\n template,\n theme,\n features: {\n router: featureFlags[0],\n dataProviders: featureFlags[1],\n hotReload: featureFlags[2],\n },\n };\n\n // ── Generate project ──\n const projectDir = resolve(process.cwd(), projectName);\n if (existsSync(projectDir)) {\n console.log(`\\n ⚠ Directory \"${projectName}\" already exists. Files may be overwritten.\\n`);\n }\n\n console.log(`\\n Creating ${projectName}...`);\n\n const files = generateProject(config);\n\n for (const file of files) {\n const fullPath = join(projectDir, file.path);\n const dir = fullPath.substring(0, fullPath.lastIndexOf('/'));\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, file.content, 'utf-8');\n console.log(` ✓ ${file.path}`);\n }\n\n console.log();\n console.log(' ┌──────────────────────────────────┐');\n console.log(' │ ✅ Project created successfully! │');\n console.log(' └──────────────────────────────────┘');\n console.log();\n console.log(` Next steps:`);\n console.log(` cd ${projectName}`);\n console.log(` npm install`);\n console.log(` npm run dev`);\n console.log();\n}\n\nmain().catch(err => {\n console.error('Error:', err.message);\n process.exit(1);\n});\n","// ─────────────────────────────────────────────────────\n// Minimal interactive prompts (no external deps)\n// ─────────────────────────────────────────────────────\n\nimport { createInterface } from 'node:readline';\n\nconst rl = () => createInterface({ input: process.stdin, output: process.stdout });\n\nexport async function textPrompt(question: string, defaultValue?: string): Promise<string> {\n return new Promise(resolve => {\n const r = rl();\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n r.question(` ${question}${suffix}: `, answer => {\n r.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\nexport async function selectPrompt(question: string, options: string[]): Promise<number> {\n console.log(`\\n ${question}`);\n for (let i = 0; i < options.length; i++) {\n console.log(` ${i + 1}) ${options[i]}`);\n }\n const answer = await textPrompt('Enter number', '1');\n const idx = parseInt(answer) - 1;\n return Math.max(0, Math.min(idx, options.length - 1));\n}\n\nexport async function confirmPrompt(question: string, defaultValue = true): Promise<boolean> {\n const suffix = defaultValue ? '(Y/n)' : '(y/N)';\n const answer = await textPrompt(`${question} ${suffix}`);\n if (!answer) return defaultValue;\n return answer.toLowerCase().startsWith('y');\n}\n\nexport async function multiSelectPrompt(question: string, options: string[], defaults: boolean[] = []): Promise<boolean[]> {\n console.log(`\\n ${question} (comma-separated numbers, or 'all')`);\n for (let i = 0; i < options.length; i++) {\n const def = defaults[i] ? '✓' : ' ';\n console.log(` ${i + 1}) [${def}] ${options[i]}`);\n }\n const answer = await textPrompt('Enter numbers', defaults.some(d => d) ? 'keep defaults' : 'all');\n if (answer === 'all') return options.map(() => true);\n if (answer === 'keep defaults' || answer === '') return defaults.length ? defaults : options.map(() => true);\n const selected = answer.split(',').map(s => parseInt(s.trim()) - 1);\n return options.map((_, i) => selected.includes(i));\n}\n","// ─────────────────────────────────────────────────────\n// Project Templates — generates files for new apps\n// ─────────────────────────────────────────────────────\n\nimport { getBuiltinTheme } from '@termuijs/tss';\n\nexport interface ProjectConfig {\n name: string;\n template: 'empty' | 'dashboard' | 'interactive-tool' | 'cli-wrapper';\n theme: string;\n features: {\n router: boolean;\n dataProviders: boolean;\n hotReload: boolean;\n };\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\nexport function generateProject(config: ProjectConfig): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // ── package.json ──\n files.push({\n path: 'package.json',\n content: JSON.stringify({\n name: config.name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx --watch src/index.tsx',\n build: 'tsup src/index.tsx --format esm',\n start: 'node dist/index.js',\n },\n dependencies: {\n '@termuijs/core': 'latest',\n '@termuijs/widgets': 'latest',\n '@termuijs/ui': 'latest',\n '@termuijs/jsx': 'latest',\n '@termuijs/tss': 'latest',\n ...(config.features.dataProviders ? { '@termuijs/data': 'latest' } : {}),\n ...(config.features.router ? { '@termuijs/router': 'latest' } : {}),\n },\n devDependencies: {\n tsx: '^4.0.0',\n tsup: '^8.0.0',\n typescript: '^5.3.0',\n },\n }, null, 2) + '\\n',\n });\n\n // ── tsconfig.json ──\n files.push({\n path: 'tsconfig.json',\n content: JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n jsx: 'react-jsx',\n jsxImportSource: '@termuijs/jsx',\n strict: true,\n esModuleInterop: true,\n outDir: 'dist',\n rootDir: 'src',\n },\n include: ['src'],\n }, null, 2) + '\\n',\n });\n\n // ── termui.config.ts ──\n files.push({\n path: 'termui.config.ts',\n content: `import { defineConfig } from '@termuijs/core';\n\nexport default defineConfig({\n theme: '${config.theme}',\n ${config.features.hotReload ? \"hotReload: true,\" : ''}\n ${config.features.router ? \"router: { dir: './screens' },\" : ''}\n});\n`,\n });\n\n // ── Theme file ──\n const themeSrc = getBuiltinTheme(config.theme);\n if (themeSrc) {\n files.push({ path: `themes/${config.theme}.tss`, content: themeSrc.trim() + '\\n' });\n }\n\n // ── Template-specific files ──\n switch (config.template) {\n case 'dashboard':\n files.push(...generateDashboardTemplate(config));\n break;\n case 'interactive-tool':\n files.push(...generateInteractiveTemplate(config));\n break;\n case 'cli-wrapper':\n files.push(...generateCliWrapperTemplate(config));\n break;\n default:\n files.push(...generateEmptyTemplate(config));\n }\n\n return files;\n}\n\nfunction generateEmptyTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app } from '@termuijs/quick';\nimport { Text, Box } from '@termuijs/ui';\n\napp('${config.name}')\n .rows(\n // Add your widgets here\n )\n .run();\n`,\n }];\n}\n\nfunction generateDashboardTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, gauge, table, sparkline } from '@termuijs/quick';\n${config.features.dataProviders ? \"import { cpu, memory, disk, processes } from '@termuijs/data';\" : ''}\n\napp('⚡ ${config.name}')\n .rows(\n // Row 1: Gauges\n app.cols(\n gauge('CPU', () => ${config.features.dataProviders ? 'cpu.percent / 100' : '0.5'}),\n gauge('MEM', () => ${config.features.dataProviders ? 'memory.percent / 100' : '0.3'}),\n gauge('DSK', () => ${config.features.dataProviders ? 'disk.percent / 100' : '0.7'}),\n ),\n // Row 2: Table\n table('Processes', {\n columns: ['Name', 'PID', 'CPU%', 'MEM%'],\n data: () => ${config.features.dataProviders\n ? `processes.top(10).map(p => ({\n Name: p.name.slice(0, 18),\n PID: p.pid,\n 'CPU%': p.cpu.toFixed(1),\n 'MEM%': p.mem.toFixed(1),\n }))`\n : `[{ Name: 'example', PID: 1234, 'CPU%': '5.0', 'MEM%': '2.1' }]`},\n }),\n )\n .run();\n`,\n }];\n}\n\nfunction generateInteractiveTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app } from '@termuijs/quick';\nimport { Form, Select, Toast, ConfirmDialog } from '@termuijs/ui';\n\n// Interactive tool with forms, selects, and toasts\napp('🔧 ${config.name}')\n .rows(\n // Add your interactive components here\n )\n .run();\n`,\n }];\n}\n\nfunction generateCliWrapperTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, text, logView } from '@termuijs/quick';\nimport { exec } from 'node:child_process';\n\n// CLI wrapper — runs a command and displays output\nconst logs: string[] = [];\n\napp('📟 ${config.name}')\n .rows(\n text('Command output will appear below'),\n logView('Output', () => logs),\n )\n .run();\n`,\n }];\n}\n"],"mappings":";;;AAIA,SAAS,SAAS,YAAY;AAC9B,SAAS,WAAW,eAAe,kBAAkB;AACrD,SAAS,4BAA4B;;;ACFrC,SAAS,uBAAuB;AAEhC,IAAM,KAAK,MAAM,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAEjF,eAAsB,WAAW,UAAkB,cAAwC;AACvF,SAAO,IAAI,QAAQ,CAAAA,aAAW;AAC1B,UAAM,IAAI,GAAG;AACb,UAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,MAAE,SAAS,KAAK,QAAQ,GAAG,MAAM,MAAM,YAAU;AAC7C,QAAE,MAAM;AACR,MAAAA,SAAQ,OAAO,KAAK,KAAK,gBAAgB,EAAE;AAAA,IAC/C,CAAC;AAAA,EACL,CAAC;AACL;AAEA,eAAsB,aAAa,UAAkB,SAAoC;AACrF,UAAQ,IAAI;AAAA,IAAO,QAAQ,EAAE;AAC7B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAQ,IAAI,OAAO,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,EAC7C;AACA,QAAM,SAAS,MAAM,WAAW,gBAAgB,GAAG;AACnD,QAAM,MAAM,SAAS,MAAM,IAAI;AAC/B,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,SAAS,CAAC,CAAC;AACxD;AASA,eAAsB,kBAAkB,UAAkB,SAAmB,WAAsB,CAAC,GAAuB;AACvH,UAAQ,IAAI;AAAA,IAAO,QAAQ,sCAAsC;AACjE,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,MAAM,SAAS,CAAC,IAAI,WAAM;AAChC,YAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,EACtD;AACA,QAAM,SAAS,MAAM,WAAW,iBAAiB,SAAS,KAAK,OAAK,CAAC,IAAI,kBAAkB,KAAK;AAChG,MAAI,WAAW,MAAO,QAAO,QAAQ,IAAI,MAAM,IAAI;AACnD,MAAI,WAAW,mBAAmB,WAAW,GAAI,QAAO,SAAS,SAAS,WAAW,QAAQ,IAAI,MAAM,IAAI;AAC3G,QAAM,WAAW,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;AAClE,SAAO,QAAQ,IAAI,CAAC,GAAG,MAAM,SAAS,SAAS,CAAC,CAAC;AACrD;;;AC3CA,SAAS,uBAAuB;AAkBzB,SAAS,gBAAgB,QAAwC;AACpE,QAAM,QAAyB,CAAC;AAGhC,QAAM,KAAK;AAAA,IACP,MAAM;AAAA,IACN,SAAS,KAAK,UAAU;AAAA,MACpB,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,MACX;AAAA,MACA,cAAc;AAAA,QACV,kBAAkB;AAAA,QAClB,qBAAqB;AAAA,QACrB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,GAAI,OAAO,SAAS,gBAAgB,EAAE,kBAAkB,SAAS,IAAI,CAAC;AAAA,QACtE,GAAI,OAAO,SAAS,SAAS,EAAE,oBAAoB,SAAS,IAAI,CAAC;AAAA,MACrE;AAAA,MACA,iBAAiB;AAAA,QACb,KAAK;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,MAChB;AAAA,IACJ,GAAG,MAAM,CAAC,IAAI;AAAA,EAClB,CAAC;AAGD,QAAM,KAAK;AAAA,IACP,MAAM;AAAA,IACN,SAAS,KAAK,UAAU;AAAA,MACpB,iBAAiB;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,KAAK;AAAA,QACL,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS;AAAA,MACb;AAAA,MACA,SAAS,CAAC,KAAK;AAAA,IACnB,GAAG,MAAM,CAAC,IAAI;AAAA,EAClB,CAAC;AAGD,QAAM,KAAK;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA;AAAA;AAAA,cAGH,OAAO,KAAK;AAAA,MACpB,OAAO,SAAS,YAAY,qBAAqB,EAAE;AAAA,MACnD,OAAO,SAAS,SAAS,kCAAkC,EAAE;AAAA;AAAA;AAAA,EAG/D,CAAC;AAGD,QAAM,WAAW,gBAAgB,OAAO,KAAK;AAC7C,MAAI,UAAU;AACV,UAAM,KAAK,EAAE,MAAM,UAAU,OAAO,KAAK,QAAQ,SAAS,SAAS,KAAK,IAAI,KAAK,CAAC;AAAA,EACtF;AAGA,UAAQ,OAAO,UAAU;AAAA,IACrB,KAAK;AACD,YAAM,KAAK,GAAG,0BAA0B,MAAM,CAAC;AAC/C;AAAA,IACJ,KAAK;AACD,YAAM,KAAK,GAAG,4BAA4B,MAAM,CAAC;AACjD;AAAA,IACJ,KAAK;AACD,YAAM,KAAK,GAAG,2BAA2B,MAAM,CAAC;AAChD;AAAA,IACJ;AACI,YAAM,KAAK,GAAG,sBAAsB,MAAM,CAAC;AAAA,EACnD;AAEA,SAAO;AACX;AAEA,SAAS,sBAAsB,QAAwC;AACnE,SAAO,CAAC;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA;AAAA;AAAA,OAGV,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMd,CAAC;AACL;AAEA,SAAS,0BAA0B,QAAwC;AACvE,SAAO,CAAC;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACf,OAAO,SAAS,gBAAgB,mEAAmE,EAAE;AAAA;AAAA,cAE9F,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,iCAIa,OAAO,SAAS,gBAAgB,sBAAsB,KAAK;AAAA,iCAC3D,OAAO,SAAS,gBAAgB,yBAAyB,KAAK;AAAA,iCAC9D,OAAO,SAAS,gBAAgB,uBAAuB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKnE,OAAO,SAAS,gBACxB;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMA,gEAAgE;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9E,CAAC;AACL;AAEA,SAAS,4BAA4B,QAAwC;AACzE,SAAO,CAAC;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA;AAAA;AAAA;AAAA,iBAIP,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,CAAC;AACL;AAEA,SAAS,2BAA2B,QAAwC;AACxE,SAAO,CAAC;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMP,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,CAAC;AACL;;;AFrLA,IAAM,YAAY,CAAC,8BAA8B,8BAA8B,qCAAqC,iCAAiC;AACrJ,IAAM,gBAAgB,CAAC,SAAS,aAAa,oBAAoB,aAAa;AAC9E,IAAM,WAAW,CAAC,iBAAiB,kBAAkB,YAAY;AAEjE,eAAe,OAAO;AAClB,UAAQ,IAAI;AACZ,UAAQ,IAAI,4NAAwC;AACpD,UAAQ,IAAI,mDAAyC;AACrD,UAAQ,IAAI,mDAAyC;AACrD,UAAQ,IAAI,4NAAwC;AACpD,UAAQ,IAAI;AAGZ,MAAI,cAAc,QAAQ,KAAK,CAAC;AAChC,MAAI,CAAC,aAAa;AACd,kBAAc,MAAM,WAAW,gBAAgB,eAAe;AAAA,EAClE;AAGA,QAAM,cAAc,MAAM,aAAa,qBAAqB,SAAS;AACrE,QAAM,WAAW,cAAc,WAAW;AAG1C,QAAM,SAAS,qBAAqB;AACpC,QAAM,WAAW,MAAM,aAAa,kBAAkB,OAAO,IAAI,OAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7G,QAAM,QAAQ,OAAO,QAAQ;AAG7B,QAAM,kBAAkB,CAAC,OAAO,aAAa,aAAa,IAAI;AAC9D,QAAM,eAAe,MAAM,kBAAkB,uBAAuB,UAAU,eAAe;AAE7F,QAAM,SAAwB;AAAA,IAC1B,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACN,QAAQ,aAAa,CAAC;AAAA,MACtB,eAAe,aAAa,CAAC;AAAA,MAC7B,WAAW,aAAa,CAAC;AAAA,IAC7B;AAAA,EACJ;AAGA,QAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,WAAW;AACrD,MAAI,WAAW,UAAU,GAAG;AACxB,YAAQ,IAAI;AAAA,uBAAqB,WAAW;AAAA,CAA+C;AAAA,EAC/F;AAEA,UAAQ,IAAI;AAAA,aAAgB,WAAW,KAAK;AAE5C,QAAM,QAAQ,gBAAgB,MAAM;AAEpC,aAAW,QAAQ,OAAO;AACtB,UAAM,WAAW,KAAK,YAAY,KAAK,IAAI;AAC3C,UAAM,MAAM,SAAS,UAAU,GAAG,SAAS,YAAY,GAAG,CAAC;AAC3D,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,kBAAc,UAAU,KAAK,SAAS,OAAO;AAC7C,YAAQ,IAAI,cAAS,KAAK,IAAI,EAAE;AAAA,EACpC;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,4NAAwC;AACpD,UAAQ,IAAI,wDAAyC;AACrD,UAAQ,IAAI,4NAAwC;AACpD,UAAQ,IAAI;AACZ,UAAQ,IAAI,eAAe;AAC3B,UAAQ,IAAI,UAAU,WAAW,EAAE;AACnC,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI;AAChB;AAEA,KAAK,EAAE,MAAM,SAAO;AAChB,UAAQ,MAAM,UAAU,IAAI,OAAO;AACnC,UAAQ,KAAK,CAAC;AAClB,CAAC;","names":["resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/templates.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// create-termui-app — Interactive CLI scaffolding tool\n// ─────────────────────────────────────────────────────\n\nimport { resolve, join } from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { getBuiltinThemeNames } from '@termuijs/tss';\nimport { textPrompt, selectPrompt, multiSelectPrompt } from './prompts.js';\nimport { generateProject, type ProjectConfig } from './templates.js';\n\nconst TEMPLATES = ['Empty (start from scratch)', 'Dashboard (real-time data)', 'Interactive Tool (forms, prompts)', 'CLI Wrapper (wrap existing CLI)'];\nconst TEMPLATE_KEYS = ['empty', 'dashboard', 'interactive-tool', 'cli-wrapper'] as const;\nconst FEATURES = ['Screen Router', 'Data Providers', 'Hot Reload'];\n\nasync function main() {\n console.log();\n console.log(' ┌──────────────────────────────────┐');\n console.log(' │ create-termui-app │');\n console.log(' │ The React/Next.js for CLI apps │');\n console.log(' └──────────────────────────────────┘');\n console.log();\n\n // ── Get project name from args or prompt ──\n let projectName = process.argv[2];\n if (!projectName) {\n projectName = await textPrompt('Project name', 'my-termui-app');\n }\n\n // ── Template selection ──\n const templateIdx = await selectPrompt('What kind of app?', TEMPLATES);\n const template = TEMPLATE_KEYS[templateIdx];\n\n // ── Theme selection ──\n const themes = getBuiltinThemeNames();\n const themeIdx = await selectPrompt('Choose a theme', themes.map(t => t.charAt(0).toUpperCase() + t.slice(1)));\n const theme = themes[themeIdx];\n\n // ── Feature selection ──\n const featureDefaults = [false, template === 'dashboard', true]; // Router off, Data on for dashboard, HotReload on\n const featureFlags = await multiSelectPrompt('Features to include', FEATURES, featureDefaults);\n\n const config: ProjectConfig = {\n name: projectName,\n template,\n theme,\n features: {\n router: featureFlags[0],\n dataProviders: featureFlags[1],\n hotReload: featureFlags[2],\n },\n };\n\n // ── Generate project ──\n const projectDir = resolve(process.cwd(), projectName);\n if (existsSync(projectDir)) {\n console.log(`\\n ⚠ Directory \"${projectName}\" already exists. Files may be overwritten.\\n`);\n }\n\n console.log(`\\n Creating ${projectName}...`);\n\n const files = generateProject(config);\n\n for (const file of files) {\n const fullPath = join(projectDir, file.path);\n const dir = fullPath.substring(0, fullPath.lastIndexOf('/'));\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, file.content, 'utf-8');\n console.log(` ✓ ${file.path}`);\n }\n\n console.log();\n console.log(' ┌──────────────────────────────────┐');\n console.log(' │ ✅ Project created successfully! │');\n console.log(' └──────────────────────────────────┘');\n console.log();\n console.log(` Next steps:`);\n console.log(` cd ${projectName}`);\n console.log(` npm install`);\n console.log(` npm run dev`);\n console.log();\n}\n\nmain().catch(err => {\n console.error('Error:', err.message);\n process.exit(1);\n});\n","// ─────────────────────────────────────────────────────\n// Minimal interactive prompts (no external deps)\n// ─────────────────────────────────────────────────────\n\nimport { createInterface } from 'node:readline';\n\nconst rl = () => createInterface({ input: process.stdin, output: process.stdout });\n\nexport async function textPrompt(question: string, defaultValue?: string): Promise<string> {\n return new Promise(resolve => {\n const r = rl();\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n r.question(` ${question}${suffix}: `, answer => {\n r.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\nexport async function selectPrompt(question: string, options: string[]): Promise<number> {\n console.log(`\\n ${question}`);\n for (let i = 0; i < options.length; i++) {\n console.log(` ${i + 1}) ${options[i]}`);\n }\n const answer = await textPrompt('Enter number', '1');\n const idx = parseInt(answer) - 1;\n return Math.max(0, Math.min(idx, options.length - 1));\n}\n\nexport async function confirmPrompt(question: string, defaultValue = true): Promise<boolean> {\n const suffix = defaultValue ? '(Y/n)' : '(y/N)';\n const answer = await textPrompt(`${question} ${suffix}`);\n if (!answer) return defaultValue;\n return answer.toLowerCase().startsWith('y');\n}\n\nexport async function multiSelectPrompt(question: string, options: string[], defaults: boolean[] = []): Promise<boolean[]> {\n console.log(`\\n ${question} (comma-separated numbers, or 'all')`);\n for (let i = 0; i < options.length; i++) {\n const def = defaults[i] ? '✓' : ' ';\n console.log(` ${i + 1}) [${def}] ${options[i]}`);\n }\n const answer = await textPrompt('Enter numbers', defaults.some(d => d) ? 'keep defaults' : 'all');\n if (answer === 'all') return options.map(() => true);\n if (answer === 'keep defaults' || answer === '') return defaults.length ? defaults : options.map(() => true);\n const selected = answer.split(',').map(s => parseInt(s.trim()) - 1);\n return options.map((_, i) => selected.includes(i));\n}\n","// ─────────────────────────────────────────────────────\n// Project Templates — generates files for new apps\n// ─────────────────────────────────────────────────────\n\nimport { getBuiltinTheme } from '@termuijs/tss';\n\nexport interface ProjectConfig {\n name: string;\n template: 'empty' | 'dashboard' | 'interactive-tool' | 'cli-wrapper';\n theme: string;\n features: {\n router: boolean;\n dataProviders: boolean;\n hotReload: boolean;\n };\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\nexport function generateProject(config: ProjectConfig): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // ── package.json ──\n files.push({\n path: 'package.json',\n content: JSON.stringify({\n name: config.name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx --watch src/index.tsx',\n build: 'tsup src/index.tsx --format esm',\n start: 'node dist/index.js',\n },\n dependencies: {\n '@termuijs/core': 'latest',\n '@termuijs/widgets': 'latest',\n '@termuijs/ui': 'latest',\n '@termuijs/jsx': 'latest',\n '@termuijs/tss': 'latest',\n '@termuijs/quick': 'latest',\n '@termuijs/motion': 'latest',\n ...(config.features.dataProviders ? { '@termuijs/data': 'latest' } : {}),\n ...(config.features.router ? { '@termuijs/router': 'latest' } : {}),\n },\n devDependencies: {\n tsx: '^4.0.0',\n tsup: '^8.0.0',\n typescript: '^5.3.0',\n },\n }, null, 2) + '\\n',\n });\n\n // ── tsconfig.json ──\n files.push({\n path: 'tsconfig.json',\n content: JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n jsx: 'react-jsx',\n jsxImportSource: '@termuijs/jsx',\n strict: true,\n esModuleInterop: true,\n outDir: 'dist',\n rootDir: 'src',\n },\n include: ['src'],\n }, null, 2) + '\\n',\n });\n\n // ── termui.config.ts ──\n files.push({\n path: 'termui.config.ts',\n content: `import { defineConfig } from '@termuijs/core';\n\nexport default defineConfig({\n theme: '${config.theme}',\n ${config.features.hotReload ? \"hotReload: true,\" : ''}\n ${config.features.router ? \"router: { dir: './screens' },\" : ''}\n});\n`,\n });\n\n // ── Theme file ──\n const themeSrc = getBuiltinTheme(config.theme);\n if (themeSrc) {\n files.push({ path: `themes/${config.theme}.tss`, content: themeSrc.trim() + '\\n' });\n }\n\n // ── Template-specific files ──\n switch (config.template) {\n case 'dashboard':\n files.push(...generateDashboardTemplate(config));\n break;\n case 'interactive-tool':\n files.push(...generateInteractiveTemplate(config));\n break;\n case 'cli-wrapper':\n files.push(...generateCliWrapperTemplate(config));\n break;\n default:\n files.push(...generateEmptyTemplate(config));\n }\n\n return files;\n}\n\nfunction generateEmptyTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, text } from '@termuijs/quick';\n\napp('${config.name}')\n .rows(\n text('Hello from TermUI! Edit src/index.tsx to get started.'),\n )\n .keys({ q: 'quit' })\n .run();\n`,\n }];\n}\n\nfunction generateDashboardTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, gauge, table, sparkline } from '@termuijs/quick';\n${config.features.dataProviders ? \"import { cpu, memory, disk, processes } from '@termuijs/data';\" : ''}\n\n// Sample data for demo\nlet cpuVal = 0.45;\nlet memVal = 0.62;\nlet dskVal = 0.38;\n\napp('⚡ ${config.name}')\n .rows(\n // Row 1: Gauges\n gauge('CPU', () => ${config.features.dataProviders ? 'cpu.percent / 100' : 'cpuVal'}),\n gauge('MEM', () => ${config.features.dataProviders ? 'memory.percent / 100' : 'memVal'}),\n gauge('DSK', () => ${config.features.dataProviders ? 'disk.percent / 100' : 'dskVal'}),\n // Row 2: Table\n table('Processes',\n () => ${config.features.dataProviders\n ? `processes.top(10).map(p => ({\n Name: p.name.slice(0, 18),\n PID: p.pid,\n 'CPU%': p.cpu.toFixed(1),\n 'MEM%': p.mem.toFixed(1),\n }))`\n : `[\n { Name: 'node', PID: 1234, 'CPU%': '5.0', 'MEM%': '2.1' },\n { Name: 'chrome', PID: 5678, 'CPU%': '12.3', 'MEM%': '8.4' },\n ]`},\n ['Name', 'PID', 'CPU%', 'MEM%'],\n ),\n )\n .keys({ q: 'quit', r: 'refresh' })\n .refresh('1s')\n .run();\n`,\n }];\n}\n\nfunction generateInteractiveTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, text, list, input } from '@termuijs/quick';\n\nconst items = ['Option 1', 'Option 2', 'Option 3'];\n\napp('🔧 ${config.name}')\n .rows(\n text('Select an option or type a command:'),\n list(() => items),\n input('Type here...', {\n onSubmit: (value) => items.push(value),\n }),\n )\n .keys({ q: 'quit' })\n .run();\n`,\n }];\n}\n\nfunction generateCliWrapperTemplate(config: ProjectConfig): GeneratedFile[] {\n return [{\n path: 'src/index.tsx',\n content: `import { app, text, logView } from '@termuijs/quick';\n\n// CLI wrapper — displays log output\nconst logs: string[] = [\n 'INFO Application started',\n 'INFO Waiting for input...',\n 'DEBUG Press q to quit',\n];\n\napp('📟 ${config.name}')\n .rows(\n text('Command output:'),\n logView(() => logs),\n )\n .keys({ q: 'quit' })\n .refresh('1s')\n .run();\n`,\n }];\n}\n\n"],"mappings":"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","names":["resolve"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-termui-app",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"homepage": "https://www.termui.io/docs/getting-started/installation",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/Karanjot786/TermUI"
|
|
7
|
+
},
|
|
8
|
+
"version": "0.1.3",
|
|
9
|
+
"description": "Scaffold a new TermUI project with templates, themes, and dev server",
|
|
5
10
|
"type": "module",
|
|
6
11
|
"bin": {
|
|
7
12
|
"create-termui-app": "./dist/index.js"
|
|
@@ -11,7 +16,7 @@
|
|
|
11
16
|
"dist"
|
|
12
17
|
],
|
|
13
18
|
"dependencies": {
|
|
14
|
-
"@termuijs/tss": "0.1.
|
|
19
|
+
"@termuijs/tss": "0.1.3"
|
|
15
20
|
},
|
|
16
21
|
"devDependencies": {
|
|
17
22
|
"tsup": "^8.0.0",
|