gen-testid 1.0.0

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/.eslintrc.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "rules": {
3
+ "no-unused-vars": "off",
4
+ "@typescript-eslint/no-unused-vars": "off"
5
+ },
6
+ "overrides": [
7
+ {
8
+ "files": ["src/cli/index.ts"],
9
+ "rules": {
10
+ "no-unused-expressions": "off"
11
+ }
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
6
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
7
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
+ </content>
9
+ <orderEntry type="inheritedJdk" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ </component>
12
+ </module>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/gen-testid.iml" filepath="$PROJECT_DIR$/.idea/gen-testid.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,96 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="03d60fe0-9201-42f6-8ce4-afe0b206e415" name="Changes" comment="">
8
+ <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
9
+ </list>
10
+ <option name="SHOW_DIALOG" value="false" />
11
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
12
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
13
+ <option name="LAST_RESOLUTION" value="IGNORE" />
14
+ </component>
15
+ <component name="FileTemplateManagerImpl">
16
+ <option name="RECENT_TEMPLATES">
17
+ <list>
18
+ <option value="TypeScript JSX File" />
19
+ <option value="tsconfig.json" />
20
+ <option value="JavaScript File" />
21
+ <option value="TypeScript File" />
22
+ </list>
23
+ </option>
24
+ </component>
25
+ <component name="Git.Settings">
26
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
27
+ </component>
28
+ <component name="ProjectColorInfo">{
29
+ &quot;associatedIndex&quot;: 3
30
+ }</component>
31
+ <component name="ProjectId" id="3AqUfsz22pMc0YTkLEne2rQh8Qu" />
32
+ <component name="ProjectViewState">
33
+ <option name="hideEmptyMiddlePackages" value="true" />
34
+ <option name="showLibraryContents" value="true" />
35
+ </component>
36
+ <component name="PropertiesComponent"><![CDATA[{
37
+ "keyToString": {
38
+ "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
39
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
40
+ "RunOnceActivity.ShowReadmeOnStart": "true",
41
+ "RunOnceActivity.git.unshallow": "true",
42
+ "git-widget-placeholder": "main",
43
+ "last_opened_file_path": "/Users/anastasiabortnikova/Documents/for works/gen-testid",
44
+ "node.js.detected.package.eslint": "true",
45
+ "node.js.detected.package.tslint": "true",
46
+ "node.js.selected.package.eslint": "(autodetect)",
47
+ "node.js.selected.package.tslint": "(autodetect)",
48
+ "nodejs_package_manager_path": "npm",
49
+ "ts.external.directory.path": "/Users/anastasiabortnikova/Documents/for works/gen-testid/node_modules/typescript/lib",
50
+ "vue.rearranger.settings.migration": "true"
51
+ }
52
+ }]]></component>
53
+ <component name="RecentsManager">
54
+ <key name="CopyFile.RECENT_KEYS">
55
+ <recent name="$PROJECT_DIR$/src/vue" />
56
+ </key>
57
+ <key name="MoveFile.RECENT_KEYS">
58
+ <recent name="$PROJECT_DIR$" />
59
+ <recent name="$PROJECT_DIR$/src" />
60
+ </key>
61
+ </component>
62
+ <component name="SharedIndexes">
63
+ <attachedChunks>
64
+ <set>
65
+ <option value="bundled-js-predefined-d6986cc7102b-6a121458b545-JavaScript-WS-251.25410.117" />
66
+ </set>
67
+ </attachedChunks>
68
+ </component>
69
+ <component name="TaskManager">
70
+ <task active="true" id="Default" summary="Default task">
71
+ <changelist id="03d60fe0-9201-42f6-8ce4-afe0b206e415" name="Changes" comment="" />
72
+ <created>1773319700445</created>
73
+ <option name="number" value="Default" />
74
+ <option name="presentableId" value="Default" />
75
+ <updated>1773319700445</updated>
76
+ <workItem from="1773319701449" duration="3152000" />
77
+ <workItem from="1773817209925" duration="2293000" />
78
+ <workItem from="1774438332768" duration="10000" />
79
+ <workItem from="1774719620483" duration="6090000" />
80
+ <workItem from="1775128895157" duration="903000" />
81
+ <workItem from="1775459581462" duration="5163000" />
82
+ <workItem from="1775465010645" duration="8951000" />
83
+ <workItem from="1775543974769" duration="4021000" />
84
+ <workItem from="1775716271318" duration="14757000" />
85
+ <workItem from="1777383993002" duration="69000" />
86
+ <workItem from="1777384065424" duration="546000" />
87
+ <workItem from="1777534342009" duration="1719000" />
88
+ <workItem from="1781424620957" duration="1335000" />
89
+ <workItem from="1781426323016" duration="3667000" />
90
+ </task>
91
+ <servers />
92
+ </component>
93
+ <component name="TypeScriptGeneratedFilesManager">
94
+ <option name="version" value="3" />
95
+ </component>
96
+ </project>
package/README.md ADDED
@@ -0,0 +1,524 @@
1
+ # GenTestID
2
+
3
+ CLI-инструмент для автоматического добавления атрибутов `data-testid` в шаблоны Vue-компонентов.
4
+
5
+ `gen-testid` находит элементы в секции `<template>`, пропускает элементы, у которых уже есть `data-testid`, генерирует идентификаторы по выбранной стратегии и сохраняет изменения непосредственно в `.vue`-файлы.
6
+
7
+ ## Возможности
8
+
9
+ - обработка всех Vue-файлов проекта или конкретного списка файлов;
10
+ - четыре стратегии генерации идентификаторов;
11
+ - настройка префикса;
12
+ - исключение файлов по glob-шаблонам;
13
+ - использование локальной Ollama для семантических идентификаторов;
14
+ - автоматическое создание конфигурации `.gentestidrc`;
15
+ - добавление команды `testids` в `package.json`.
16
+
17
+ ## Требования
18
+
19
+ - Node.js 20 или новее;
20
+ - Vue-проект с `.vue`-компонентами;
21
+ - `pnpm`, `npm` или другой совместимый пакетный менеджер;
22
+ - Ollama только для стратегии `semantic`.
23
+
24
+ ## Установка
25
+
26
+ ### Локальная установка через pnpm
27
+
28
+ Если исходный код `gen-testid` находится рядом с вашим проектом:
29
+
30
+ ```bash
31
+ cd "/path/for/directory/"
32
+ pnpm add --save-dev "../gen-testid"
33
+ ```
34
+
35
+ Проверка установки:
36
+
37
+ ```bash
38
+ pnpm exec gen-testid --help
39
+ pnpm list gen-testid --depth=0
40
+ ```
41
+
42
+ ### Локальная установка через npm
43
+
44
+ Используйте этот вариант только в проектах, которые управляются npm:
45
+
46
+ ```bash
47
+ npm install --save-dev "/path/for/directory/gen-testid"
48
+ ```
49
+
50
+ Проверка:
51
+
52
+ ```bash
53
+ npx gen-testid --help
54
+ ```
55
+
56
+ Не смешивайте npm и pnpm в одном проекте. Если в `package.json` указано поле `"packageManager": "pnpm@..."`, устанавливайте CLI через `pnpm add`.
57
+
58
+ ### Установка опубликованного пакета
59
+
60
+ После публикации `gen-testid` в npm registry:
61
+
62
+ ```bash
63
+ pnpm add --save-dev gen-testid
64
+ ```
65
+
66
+ или:
67
+
68
+ ```bash
69
+ npm install --save-dev gen-testid
70
+ ```
71
+
72
+ ## Быстрый старт
73
+
74
+ Перейдите в корень Vue-проекта и выполните:
75
+
76
+ ```bash
77
+ pnpm exec gen-testid init
78
+ pnpm exec gen-testid inject
79
+ ```
80
+
81
+ Команда `init`:
82
+
83
+ 1. предложит выбрать стратегию;
84
+ 2. запросит префикс;
85
+ 3. создаст `.gentestidrc`;
86
+ 4. добавит в `package.json` скрипт `"testids": "gen-testid inject"`.
87
+
88
+ После этого запуск можно сократить до:
89
+
90
+ ```bash
91
+ pnpm run testids
92
+ ```
93
+
94
+ ## Команды
95
+
96
+ ### Общая справка
97
+
98
+ ```bash
99
+ pnpm exec gen-testid --help
100
+ ```
101
+
102
+ Для npm-проекта:
103
+
104
+ ```bash
105
+ npx gen-testid --help
106
+ ```
107
+
108
+ ### Версия
109
+
110
+ ```bash
111
+ pnpm exec gen-testid --version
112
+ ```
113
+
114
+ ### Инициализация
115
+
116
+ ```bash
117
+ pnpm exec gen-testid init
118
+ ```
119
+
120
+ Пример диалога:
121
+
122
+ ```text
123
+ Выберите стратегию (1-4) [1]: 1
124
+ Префикс для testid [default: test]: e2e
125
+ ```
126
+
127
+ Результат: в корне проекта появится `.gentestidrc`.
128
+
129
+ Справка по команде:
130
+
131
+ ```bash
132
+ pnpm exec gen-testid init --help
133
+ ```
134
+
135
+ ### Обработка всех Vue-файлов
136
+
137
+ ```bash
138
+ pnpm exec gen-testid inject
139
+ ```
140
+
141
+ Без списка файлов CLI использует шаблоны `includeFiles` и `excludeFiles` из `.gentestidrc`.
142
+
143
+ ### Обработка одного файла
144
+
145
+ ```bash
146
+ pnpm exec gen-testid inject src/App.vue
147
+ ```
148
+
149
+ ### Обработка нескольких файлов
150
+
151
+ ```bash
152
+ pnpm exec gen-testid inject \
153
+ src/App.vue \
154
+ src/components/LoginForm.vue \
155
+ src/components/CheckoutButton.vue
156
+ ```
157
+
158
+ ### Выбор стратегии
159
+
160
+ ```bash
161
+ pnpm exec gen-testid inject --strategy hierarchical
162
+ ```
163
+
164
+ Короткая форма:
165
+
166
+ ```bash
167
+ pnpm exec gen-testid inject -s hierarchical
168
+ ```
169
+
170
+ Доступные значения:
171
+
172
+ | Стратегия | Назначение | Пример результата |
173
+ | --- | --- | --- |
174
+ | `hierarchical` | ID на основе файла, элемента, строки и номера вхождения | `test__app__button__line-12__elem-1` |
175
+ | `stable-uuid` | Детерминированный ID на основе MD5-хеша контекста | `test-550e8400-e29b-41d4-a716-446655440000` |
176
+ | `minimal` | Последовательный номер в рамках запуска | `test-1` |
177
+ | `semantic` | Короткий смысловой ID через локальную Ollama | `login-button` |
178
+
179
+ Примеры:
180
+
181
+ ```bash
182
+ pnpm exec gen-testid inject -s hierarchical
183
+ pnpm exec gen-testid inject -s stable-uuid
184
+ pnpm exec gen-testid inject -s minimal
185
+ pnpm exec gen-testid inject -s semantic
186
+ ```
187
+
188
+ ### Настройка префикса
189
+
190
+ ```bash
191
+ pnpm exec gen-testid inject --prefix e2e
192
+ ```
193
+
194
+ Короткая форма:
195
+
196
+ ```bash
197
+ pnpm exec gen-testid inject -p e2e
198
+ ```
199
+
200
+ Пример результата:
201
+
202
+ ```html
203
+ <button data-testid="e2e__app__button__line-12__elem-1">
204
+ Сохранить
205
+ </button>
206
+ ```
207
+
208
+ ### Пользовательский файл конфигурации
209
+
210
+ ```bash
211
+ pnpm exec gen-testid inject --config ./config/gen-testid.json
212
+ ```
213
+
214
+ Короткая форма:
215
+
216
+ ```bash
217
+ pnpm exec gen-testid inject -c ./config/gen-testid.json
218
+ ```
219
+
220
+ ### Комбинация параметров
221
+
222
+ ```bash
223
+ pnpm exec gen-testid inject src/App.vue \
224
+ --strategy hierarchical \
225
+ --prefix e2e \
226
+ --config .gentestidrc
227
+ ```
228
+
229
+ Параметры командной строки `--strategy` и `--prefix` имеют приоритет над значениями из конфигурации.
230
+
231
+ ### Справка по inject
232
+
233
+ ```bash
234
+ pnpm exec gen-testid inject --help
235
+ ```
236
+
237
+ Доступные опции:
238
+
239
+ ```text
240
+ -c, --config <path> путь к конфигурации
241
+ -s, --strategy <name> стратегия именования
242
+ -p, --prefix <prefix> префикс для testid
243
+ -h, --help справка
244
+ ```
245
+
246
+
247
+ ## Конфигурация
248
+
249
+ По умолчанию CLI ищет `.gentestidrc` в текущей рабочей директории.
250
+
251
+ Пример:
252
+
253
+ ```json
254
+ {
255
+ "strategy": "hierarchical",
256
+ "prefix": "test",
257
+ "semanticModel": "",
258
+ "ollamaUrl": "http://localhost:11434",
259
+ "includeFiles": [
260
+ "src/**/*.vue"
261
+ ],
262
+ "excludeFiles": [
263
+ "**/*.test.*",
264
+ "**/*.spec.*",
265
+ "**/node_modules/**",
266
+ "**/dist/**"
267
+ ]
268
+ }
269
+ ```
270
+
271
+ ### Параметры конфигурации
272
+
273
+ | Поле | Тип | Значение по умолчанию | Описание |
274
+ | --- | --- | --- | --- |
275
+ | `strategy` | `string` | `hierarchical` | Стратегия генерации ID |
276
+ | `prefix` | `string` | `test` | Префикс идентификатора |
277
+ | `semanticModel` | `string` | пустая строка | Модель Ollama для `semantic` |
278
+ | `ollamaUrl` | `string` | `http://localhost:11434` | Адрес локального Ollama API |
279
+ | `includeFiles` | `string[]` | `src/**/*.vue` | Glob-шаблоны обрабатываемых файлов |
280
+ | `excludeFiles` | `string[]` | тесты, `node_modules`, `dist` | Glob-шаблоны исключений |
281
+
282
+ ## Пример преобразования
283
+
284
+ До запуска:
285
+
286
+ ```vue
287
+ <template>
288
+ <form>
289
+ <input type="email" />
290
+ <button>Войти</button>
291
+ </form>
292
+ </template>
293
+ ```
294
+
295
+ Команда:
296
+
297
+ ```bash
298
+ pnpm exec gen-testid inject src/components/LoginForm.vue --prefix e2e
299
+ ```
300
+
301
+ После запуска:
302
+
303
+ ```vue
304
+ <template>
305
+ <form data-testid="e2e__loginform__form__line-2__elem-1">
306
+ <input data-testid="e2e__loginform__input__line-3__elem-1" type="email" />
307
+ <button data-testid="e2e__loginform__button__line-4__elem-1">Войти</button>
308
+ </form>
309
+ </template>
310
+ ```
311
+
312
+ Повторный запуск не добавляет второй `data-testid` элементам, у которых этот атрибут уже существует.
313
+
314
+ ## Семантическая стратегия и Ollama
315
+
316
+ Установите Ollama и модель:
317
+
318
+ ```bash
319
+ brew install ollama
320
+ ollama pull llama3.2:3b
321
+ ```
322
+
323
+ Запустите сервер в отдельном терминале:
324
+
325
+ ```bash
326
+ ollama serve
327
+ ```
328
+
329
+ Создайте конфигурацию интерактивно:
330
+
331
+ ```bash
332
+ pnpm exec gen-testid init
333
+ ```
334
+
335
+ Введите:
336
+
337
+ ```text
338
+ Выберите стратегию (1-4) [1]: 4
339
+ Модель (llama3.2:3b/mistral/gemma:2b) [llama3.2:3b]: llama3.2:3b
340
+ URL Ollama [http://localhost:11434]:
341
+ Префикс для testid [default: test]: test
342
+ ```
343
+
344
+ Или запустите стратегию напрямую:
345
+
346
+ ```bash
347
+ pnpm exec gen-testid inject --strategy semantic
348
+ ```
349
+
350
+ Если Ollama недоступна или не вернула корректный ID, CLI использует `hierarchical` как резервную стратегию.
351
+
352
+ ## Скрипты package.json
353
+
354
+ Рекомендуемая настройка:
355
+
356
+ ```json
357
+ {
358
+ "scripts": {
359
+ "testids": "gen-testid inject"
360
+ }
361
+ }
362
+ ```
363
+
364
+ Запуск:
365
+
366
+ ```bash
367
+ pnpm run testids
368
+ ```
369
+
370
+ Для обработки конкретного файла лучше вызвать CLI напрямую:
371
+
372
+ ```bash
373
+ pnpm exec gen-testid inject src/App.vue
374
+ ```
375
+
376
+ ## Локальная разработка CLI
377
+
378
+ Перейдите в репозиторий:
379
+
380
+ ```bash
381
+ cd "/path/for/directory/gen-testid"
382
+ ```
383
+
384
+ Установите зависимости и соберите проект:
385
+
386
+ ```bash
387
+ pnpm install
388
+ pnpm run build
389
+ ```
390
+
391
+ Запустите CLI напрямую:
392
+
393
+ ```bash
394
+ node bin/cli.js --help
395
+ node bin/cli.js inject --help
396
+ ```
397
+
398
+ Режим наблюдения TypeScript:
399
+
400
+ ```bash
401
+ pnpm run dev
402
+ ```
403
+
404
+ После изменения исходного кода пересоберите CLI:
405
+
406
+ ```bash
407
+ pnpm run build
408
+ ```
409
+
410
+ Проект, подключенный через `link:../gen-testid`, продолжит использовать эту локальную директорию.
411
+
412
+ ## Удаление
413
+
414
+ В pnpm-проекте:
415
+
416
+ ```bash
417
+ pnpm remove gen-testid
418
+ ```
419
+
420
+ В npm-проекте:
421
+
422
+ ```bash
423
+ npm uninstall gen-testid
424
+ ```
425
+
426
+ При необходимости удалите конфигурацию и скрипт вручную:
427
+
428
+ ```bash
429
+ rm .gentestidrc
430
+ ```
431
+
432
+ Из `package.json` удалите:
433
+
434
+ ```json
435
+ "testids": "gen-testid inject"
436
+ ```
437
+
438
+ ## Решение проблем
439
+
440
+ ### npm: Cannot read properties of null (reading 'matches')
441
+
442
+ Обычно эта ошибка возникает, когда npm запускают внутри проекта, установленного через pnpm.
443
+
444
+ Проверьте `package.json`:
445
+
446
+ ```json
447
+ "packageManager": "pnpm@10.15.1"
448
+ ```
449
+
450
+ Если поле присутствует, используйте:
451
+
452
+ ```bash
453
+ pnpm add --save-dev "../gen-testid"
454
+ ```
455
+
456
+ ### Команда gen-testid не найдена
457
+
458
+ Проверьте установку:
459
+
460
+ ```bash
461
+ pnpm list gen-testid --depth=0
462
+ ```
463
+
464
+ Запускайте локальный бинарный файл через пакетный менеджер:
465
+
466
+ ```bash
467
+ pnpm exec gen-testid --help
468
+ ```
469
+
470
+ ### CLI не находит Vue-файлы
471
+
472
+ Проверьте текущую директорию:
473
+
474
+ ```bash
475
+ pwd
476
+ ```
477
+
478
+ Запускайте CLI из корня проекта и проверьте `includeFiles` в `.gentestidrc`:
479
+
480
+ ```json
481
+ {
482
+ "includeFiles": ["src/**/*.vue"]
483
+ }
484
+ ```
485
+
486
+
487
+ ## Полный список часто используемых команд
488
+
489
+ ```bash
490
+ # Установка в pnpm-проект
491
+ pnpm add --save-dev "../gen-testid"
492
+
493
+ # Инициализация
494
+ pnpm exec gen-testid init
495
+
496
+ # Обработка всех Vue-файлов
497
+ pnpm exec gen-testid inject
498
+
499
+ # Обработка одного файла
500
+ pnpm exec gen-testid inject src/App.vue
501
+
502
+ # Обработка нескольких файлов
503
+ pnpm exec gen-testid inject src/App.vue src/components/LoginForm.vue
504
+
505
+ # Выбор стратегии
506
+ pnpm exec gen-testid inject --strategy hierarchical
507
+
508
+ # Настройка префикса
509
+ pnpm exec gen-testid inject --prefix e2e
510
+
511
+ # Пользовательская конфигурация
512
+ pnpm exec gen-testid inject --config .gentestidrc
513
+
514
+ # Запуск через package.json
515
+ pnpm run testids
516
+
517
+ # Справка и версия
518
+ pnpm exec gen-testid --help
519
+ pnpm exec gen-testid inject --help
520
+ pnpm exec gen-testid --version
521
+
522
+ # Удаление
523
+ pnpm remove gen-testid
524
+ ```
package/bin/cli.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Этот файл будет точкой входа для CLI
4
+ // Он просто импортирует скомпилированный TypeScript код
5
+
6
+ import('../dist/cli/index.js').catch(err => {
7
+ console.error('Ошибка запуска gen-testid:', err.message);
8
+ process.exit(1);
9
+ });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};