@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.
Files changed (47) hide show
  1. package/README.md +2 -11
  2. package/package.json +17 -7
  3. package/src/CLI.js +141 -0
  4. package/src/Command.js +210 -0
  5. package/src/CommandError.js +35 -0
  6. package/src/CommandHelp.js +204 -0
  7. package/src/CommandMessage.js +181 -0
  8. package/src/CommandParser.js +217 -0
  9. package/src/InputAdapter.js +78 -149
  10. package/src/README.md.js +7 -6
  11. package/src/index.js +36 -14
  12. package/src/ui/index.js +3 -3
  13. package/src/ui/input.js +68 -11
  14. package/src/ui/next.js +30 -26
  15. package/src/ui/select.js +41 -31
  16. package/src/utils/parse.js +41 -0
  17. package/types/CLI.d.ts +44 -0
  18. package/types/Command.d.ts +72 -0
  19. package/types/CommandError.d.ts +19 -0
  20. package/types/CommandHelp.d.ts +85 -0
  21. package/types/CommandMessage.d.ts +65 -0
  22. package/types/CommandParser.d.ts +28 -0
  23. package/types/InputAdapter.d.ts +28 -85
  24. package/types/index.d.ts +12 -9
  25. package/types/ui/index.d.ts +2 -3
  26. package/types/ui/input.d.ts +50 -6
  27. package/types/ui/next.d.ts +11 -8
  28. package/types/ui/select.d.ts +50 -20
  29. package/types/utils/parse.d.ts +13 -0
  30. package/.editorconfig +0 -20
  31. package/CONTRIBUTING.md +0 -42
  32. package/docs/uk/README.md +0 -294
  33. package/playground/forms/addressForm.js +0 -37
  34. package/playground/forms/ageForm.js +0 -26
  35. package/playground/forms/profileForm.js +0 -33
  36. package/playground/forms/userForm.js +0 -36
  37. package/playground/main.js +0 -81
  38. package/playground/vocabs/en.js +0 -25
  39. package/playground/vocabs/index.js +0 -12
  40. package/playground/vocabs/uk.js +0 -25
  41. package/src/InputAdapter.test.js +0 -117
  42. package/src/ui/input.test.js +0 -27
  43. package/src/ui/select.test.js +0 -34
  44. package/system.md +0 -99
  45. package/tsconfig.json +0 -23
  46. package/types/test/ReadLine.d.ts +0 -1
  47. package/types/ui/errors.d.ts +0 -3
@@ -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
- })
@@ -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
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- export class CancelError extends Error {
2
- constructor(message?: string);
3
- }