@nan0web/ui-cli 1.0.0 → 1.0.2
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 +2 -11
- package/package.json +17 -7
- package/src/CLI.js +141 -0
- package/src/Command.js +210 -0
- package/src/CommandError.js +35 -0
- package/src/CommandHelp.js +204 -0
- package/src/CommandMessage.js +181 -0
- package/src/CommandParser.js +217 -0
- package/src/InputAdapter.js +78 -149
- package/src/README.md.js +7 -6
- package/src/index.js +36 -14
- package/src/ui/index.js +3 -3
- package/src/ui/input.js +68 -11
- package/src/ui/next.js +30 -26
- package/src/ui/select.js +41 -31
- package/src/utils/parse.js +41 -0
- package/types/CLI.d.ts +44 -0
- package/types/Command.d.ts +72 -0
- package/types/CommandError.d.ts +19 -0
- package/types/CommandHelp.d.ts +85 -0
- package/types/CommandMessage.d.ts +65 -0
- package/types/CommandParser.d.ts +28 -0
- package/types/InputAdapter.d.ts +28 -85
- package/types/index.d.ts +12 -9
- package/types/ui/index.d.ts +2 -3
- package/types/ui/input.d.ts +50 -6
- package/types/ui/next.d.ts +11 -8
- package/types/ui/select.d.ts +50 -20
- package/types/utils/parse.d.ts +13 -0
- package/.editorconfig +0 -20
- package/CONTRIBUTING.md +0 -42
- package/docs/uk/README.md +0 -294
- package/playground/forms/addressForm.js +0 -37
- package/playground/forms/ageForm.js +0 -26
- package/playground/forms/profileForm.js +0 -33
- package/playground/forms/userForm.js +0 -36
- package/playground/main.js +0 -81
- package/playground/vocabs/en.js +0 -25
- package/playground/vocabs/index.js +0 -12
- package/playground/vocabs/uk.js +0 -25
- package/src/InputAdapter.test.js +0 -117
- package/src/ui/input.test.js +0 -27
- package/src/ui/select.test.js +0 -34
- package/system.md +0 -99
- package/tsconfig.json +0 -23
- package/types/test/ReadLine.d.ts +0 -1
- package/types/ui/errors.d.ts +0 -3
package/src/ui/input.test.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { Input, ask, createInput } from './input.js'
|
|
4
|
-
|
|
5
|
-
describe('Input utilities', () => {
|
|
6
|
-
it('should create Input instance', () => {
|
|
7
|
-
const input = new Input()
|
|
8
|
-
assert.equal(input.value, '')
|
|
9
|
-
assert.equal(input.cancelled, false)
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
it('should handle cancellation stops', () => {
|
|
13
|
-
const input = new Input({ stops: ['quit'] })
|
|
14
|
-
input.value = 'quit'
|
|
15
|
-
assert.equal(input.cancelled, true)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('should create input handler', () => {
|
|
19
|
-
const handler = createInput()
|
|
20
|
-
assert.equal(typeof handler, 'function')
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('should create input handler with stops', () => {
|
|
24
|
-
const handler = createInput(['exit'])
|
|
25
|
-
assert.equal(typeof handler, 'function')
|
|
26
|
-
})
|
|
27
|
-
})
|
package/src/ui/select.test.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { select } from './select.js'
|
|
4
|
-
import { CancelError } from '@nan0web/ui/core'
|
|
5
|
-
|
|
6
|
-
describe('Select utility', () => {
|
|
7
|
-
it('should throw error for empty options', async () => {
|
|
8
|
-
await assert.rejects(
|
|
9
|
-
select({
|
|
10
|
-
title: 'Test',
|
|
11
|
-
prompt: 'Choose:',
|
|
12
|
-
options: [],
|
|
13
|
-
console: console
|
|
14
|
-
}),
|
|
15
|
-
Error
|
|
16
|
-
)
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it('should throw CancelError for cancellation', async () => {
|
|
20
|
-
// Мокаємо ask для скасування
|
|
21
|
-
const mockAsk = () => Promise.resolve({ cancelled: true })
|
|
22
|
-
|
|
23
|
-
await assert.rejects(
|
|
24
|
-
select({
|
|
25
|
-
title: 'Test',
|
|
26
|
-
prompt: 'Choose:',
|
|
27
|
-
options: ['option1', 'option2'],
|
|
28
|
-
console: console,
|
|
29
|
-
ask: mockAsk
|
|
30
|
-
}),
|
|
31
|
-
CancelError
|
|
32
|
-
)
|
|
33
|
-
})
|
|
34
|
-
})
|
package/system.md
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
PROJECT_NAME: "ui-cli"
|
|
3
|
-
VERSION: "1.0.0"
|
|
4
|
-
CORE_PRINCIPLE: "Універсальний CLI‑адаптер – простота + надійність."
|
|
5
|
-
VALIDATION_PHRASE: "UI‑CLI відповідає"
|
|
6
|
-
FAILURE_RESPONSE: "Це — не UI‑CLI. Я не можу працювати далі."
|
|
7
|
-
IDENTITY_MODEL: "Я / тИ / мИ / вИ"
|
|
8
|
-
LOGIC_BASE: "Запит → відповідь → валідація → результат"
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# ✨ UI‑CLI – системне керівництво
|
|
12
|
-
|
|
13
|
-
> **Мета** – надати мінімальний, беззалежний інтерфейс вводу/виводу для Node‑CLI‑додатків, що працює без сторонніх бібліотек, лише чистий JavaScript.
|
|
14
|
-
|
|
15
|
-
## 📦 Основні компоненти
|
|
16
|
-
|
|
17
|
-
| Компонент | Опис | Експорт |
|
|
18
|
-
|----------|------|---------|
|
|
19
|
-
| `CLIInputAdapter` | Клас‑адаптер, що обгортає процес запиту форм, окремих полів та списків. | `default`, `CLIInputAdapter` |
|
|
20
|
-
| `Input` | Об’єкт, який зберігає рядок вводу та статус скасування. | `Input` |
|
|
21
|
-
| `CancelError` | Помилка, кидається при скасуванні запиту. | `CancelError` |
|
|
22
|
-
| `ask` | Проста функція‑проміс, що виводить питання та повертає відповідь. | `ask` |
|
|
23
|
-
| `createInput` | Фабрика, що створює кастомізований обробник вводу з ключовими словами «stop». | `createInput` |
|
|
24
|
-
| `select` | Генерує список варіантів, приймає номер, повертає обраний `value`. | `select` |
|
|
25
|
-
| `next` | Очікує будь‑яку клавішу (можна вказати схеми). | `next` |
|
|
26
|
-
| `pause` | Пауза на вказану кількість мілісекунд. | `pause` |
|
|
27
|
-
|
|
28
|
-
## 🚀 Швидкий старт
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npm i @nan0web/ui-cli
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
```js
|
|
35
|
-
import {
|
|
36
|
-
CLIInputAdapter,
|
|
37
|
-
ask,
|
|
38
|
-
select,
|
|
39
|
-
next,
|
|
40
|
-
pause,
|
|
41
|
-
CancelError,
|
|
42
|
-
Input,
|
|
43
|
-
createInput,
|
|
44
|
-
} from '@nan0web/ui-cli'
|
|
45
|
-
|
|
46
|
-
const adapter = new CLIInputAdapter()
|
|
47
|
-
|
|
48
|
-
// Приклад: простий запит
|
|
49
|
-
const name = await adapter.ask('Ваше ім’я?')
|
|
50
|
-
console.log('Вітаємо,', name)
|
|
51
|
-
|
|
52
|
-
// Приклад: вибір зі списку
|
|
53
|
-
const lang = await adapter.select({
|
|
54
|
-
title: 'Виберіть мову',
|
|
55
|
-
prompt: 'Введіть номер: ',
|
|
56
|
-
options: new Map([['en', 'English'], ['uk', 'Українська']]),
|
|
57
|
-
console: console,
|
|
58
|
-
})
|
|
59
|
-
console.log('Обрана мова:', lang.value)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## 🛠️ Тестування (TDD)
|
|
63
|
-
|
|
64
|
-
- **Команда** `npm test` – запускає всі `*.test.js` у `src/`.
|
|
65
|
-
- **Coverage** `npm run test:coverage` – мінімум 90 %.
|
|
66
|
-
- **Документація** `npm run test:docs` – генерує `README.md` з тестових блоків.
|
|
67
|
-
- **Release** `npm run test:release` – перевірка `releases/**/*.test.js`.
|
|
68
|
-
|
|
69
|
-
Кожна публічна функція/клас має **принаймні один тест** у `.test.js` поряд з файлом коду.
|
|
70
|
-
|
|
71
|
-
## 🧭 Доступні CLI‑методи
|
|
72
|
-
|
|
73
|
-
| Метод | Параметри | Повертає | Опис |
|
|
74
|
-
|-------|-----------|----------|------|
|
|
75
|
-
| `ask(question)` | `string` – підказка | `Promise<string>` | Запит користувачу, повертає введений рядок. |
|
|
76
|
-
| `createInput(stops?)` | `string[]` – слова‑сигнали | `Promise<Input>` | Створює інстанс `Input` з автоскасуванням. |
|
|
77
|
-
| `select(config)` | `{title, prompt, options, console, ask?}` | `Promise<{index, value}>` | Виводить нумерований список, повертає вибір. |
|
|
78
|
-
| `next(conf?)` | `string|array` – послідовність клавіш | `Promise<string>` | Чекає на натискання клавіші (або набору). |
|
|
79
|
-
| `pause(ms)` | `number` – мілісекунди | `Promise<void>` | Затримка виконання. |
|
|
80
|
-
| `CLIInputAdapter.requestForm(form, {silent})` | `UIForm` + опції | `Promise<FormMessage>` | Показує форму, проходить по полях, валідує, повертає результат або `escaped:true`. |
|
|
81
|
-
| `CLIInputAdapter.requestSelect(config)` | `config` (аналог `select`) | `Promise<InputMessage>` | Викликає `select`, обгортає результат у `InputMessage`. |
|
|
82
|
-
| `CLIInputAdapter.requestInput(config)` | `{prompt, id, label, name}` | `Promise<InputMessage>` | Простий рядковий запит. |
|
|
83
|
-
|
|
84
|
-
## 📝 Рекомендації для розробників
|
|
85
|
-
|
|
86
|
-
1. **JSDoc** – кожна функція/клас має повний опис (`@param`, `@returns`, `@throws`). Це забезпечує автодоповнення у IDE без TypeScript.
|
|
87
|
-
2. **Імпорти** – використовуйте `import { … } from '@nan0web/ui-cli'` лише в точках входу.
|
|
88
|
-
3. **Структура** – залишайте `src/` чистим, `tests/` поруч, `types/` лише декларації (`*.d.ts`), `README.md` генерується з тестів.
|
|
89
|
-
4. **Локальність** – UI‑текст передається через `i18n` (передача функції `t`). В `playground` вже реалізовано приклад.
|
|
90
|
-
5. **Нульові залежності** – не підключайте сторонні пакети у `ui-cli`; лише Node‑вбудовані (`readline`, `process`).
|
|
91
|
-
|
|
92
|
-
## 🌐 Підтримка та внесок
|
|
93
|
-
|
|
94
|
-
- **Bug‑репорт** – відкривайте Issue у репозиторії.
|
|
95
|
-
- **Pull‑request** – додайте нові функції з тестами та оновленою документацією.
|
|
96
|
-
- **CI** – автоматично запускає `npm test` та `npm run test:coverage`.
|
|
97
|
-
|
|
98
|
-
> **UI‑CLI відповідає** – коли команда виконується без помилок, коли тестове покриття достатнє, коли документація генерується без «шуму».
|
|
99
|
-
|
package/tsconfig.json
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "esnext",
|
|
4
|
-
"module": "nodenext",
|
|
5
|
-
"lib": ["esnext"],
|
|
6
|
-
"declaration": true,
|
|
7
|
-
"declarationMap": false,
|
|
8
|
-
"emitDeclarationOnly": true,
|
|
9
|
-
"outDir": "./types",
|
|
10
|
-
"rootDir": "./src",
|
|
11
|
-
"strict": true,
|
|
12
|
-
"esModuleInterop": true,
|
|
13
|
-
"skipLibCheck": true,
|
|
14
|
-
"forceConsistentCasingInFileNames": true,
|
|
15
|
-
"moduleResolution": "nodenext",
|
|
16
|
-
"allowSyntheticDefaultImports": true,
|
|
17
|
-
"noImplicitAny": false,
|
|
18
|
-
"allowJs": true,
|
|
19
|
-
"checkJs": true
|
|
20
|
-
},
|
|
21
|
-
"include": ["src/**/*"],
|
|
22
|
-
"exclude": ["node_modules", "src/**/*.test.js"]
|
|
23
|
-
}
|
package/types/test/ReadLine.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/types/ui/errors.d.ts
DELETED