@vernikr/size-report 1.3.0 → 2.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/CHANGELOG.md +81 -0
- package/README.md +53 -40
- package/bin/postinstall.js +51 -0
- package/package.json +4 -3
- package/src/args.js +4 -4
- package/src/artifact.js +25 -16
- package/src/cli.js +16 -4
- package/src/config.js +5 -4
- package/src/css.js +7 -16
- package/src/hook.js +42 -4
- package/src/locales.js +5 -4
- package/src/modes.js +25 -34
- package/src/page/app.css +30 -0
- package/src/page/build.js +23 -4
- package/src/project.js +4 -1
- package/src/refusal.js +8 -8
- package/src/size-table.js +11 -9
- package/templates/README.md +6 -1
- package/templates/ci.yml +6 -5
- package/templates/size-report.config.json +1 -1
- package/src/artifact.css +0 -8
- package/src/render.js +0 -139
package/CHANGELOG.md
CHANGED
|
@@ -18,6 +18,87 @@
|
|
|
18
18
|
где за основу взяты `fixtures/synthetic/config.json`, метрики — `raw`, `min`, `tok`, а
|
|
19
19
|
способ минификации — `strip` или `esbuild`.
|
|
20
20
|
|
|
21
|
+
## 2.0.0 — 2026-09-15
|
|
22
|
+
|
|
23
|
+
Один отчёт вместо двух, и он же появляется сам: форма отчёта сведена к одному
|
|
24
|
+
файлу, а обновление — к одному решению (хук ставится сам).
|
|
25
|
+
|
|
26
|
+
- **Отчёт — один файл: самодостаточная страница `size-report.html`.** Данные,
|
|
27
|
+
оформление и программа лежат в нём же; внешних ссылок нет. Прежние две формы
|
|
28
|
+
(статическая таблица и рядом страница) убраны вместе с их кодом (`src/render.js`,
|
|
29
|
+
`src/artifact.css`): два вывода одной истории расходились бы молча, а выбрать,
|
|
30
|
+
какой верный, было бы нечем. Колонка движка — это файл, значит и отчёт — файл.
|
|
31
|
+
- **Запись одна: `--write [файл]`** (прежняя `--page` убрана — это ломающее
|
|
32
|
+
изменение). Значение ключа пишет отчёт по названному пути (каталог создаётся сам)
|
|
33
|
+
и становится его же `output`: отчёт называет себя тем путём, по которому лежит.
|
|
34
|
+
- **По умолчанию — `docs/size-report.html`**, если каталог `docs/` в проекте есть,
|
|
35
|
+
иначе в корне. Имя больше не выводится из настроек: файл это и есть отчёт.
|
|
36
|
+
- **Хук ставится сам** — после постановки пакета (`bin/postinstall.js`) и при первом
|
|
37
|
+
запуске в проекте. Поэтому `docs/` с отчётом появляется первым же коммитом, без
|
|
38
|
+
ручного шага; ставится там, где это безопасно (обычный `.git/hooks`, нет чужого
|
|
39
|
+
хука, есть чем звать инструмент, не CI), и там же молчит, где нельзя.
|
|
40
|
+
- Коммит отчёта виден в хуке как раньше: отдельным коммитом, только этим путём.
|
|
41
|
+
Отчёт остаётся **неподвижной точкой** — список пропущенных коммитов в файл не
|
|
42
|
+
идёт (он меняется от коммита самого отчёта), и хук не коммитит его бесконечно;
|
|
43
|
+
читателю этот список по-прежнему доступен: `--data`, `--json`, `size explain`.
|
|
44
|
+
|
|
45
|
+
### Что изменится в числах
|
|
46
|
+
|
|
47
|
+
**Ничего.** Измерение не тронуто: те же датчики, те же способы, те же колонки. Что
|
|
48
|
+
меняется у потребителя — **форма файла и его путь**: `size` (проверка) на прежнем
|
|
49
|
+
файле будет красным, пока отчёт не пересобран, а скрипты, звавшие `--page`,
|
|
50
|
+
получат отказ с названным ключом. Таблица ниже та же, что у 1.3.1, до последней
|
|
51
|
+
клетки.
|
|
52
|
+
|
|
53
|
+
| Файл | raw | min со strip | min с esbuild | tok |
|
|
54
|
+
|---|---|---|---|---|
|
|
55
|
+
| code.js | 735 | 276 | 185 | 168 |
|
|
56
|
+
| modern.js | 246 | 51 | 45 | 44 |
|
|
57
|
+
| config.mjs | 172 | 45 | 40 | 40 |
|
|
58
|
+
| заметки.md | 306 | 303 | 303 | 53 |
|
|
59
|
+
| crlf.txt | 63 | 60 | 60 | 10 |
|
|
60
|
+
| package.json | 87 | 69 | 69 | 34 |
|
|
61
|
+
| style.css | 156 | 55 | 43 | 38 |
|
|
62
|
+
| table.toml | 300 | 299 | 299 | 52 |
|
|
63
|
+
| empty.js | 0 | 0 | 0 | 0 |
|
|
64
|
+
| WORKLOG.md | 446 | 439 | 439 | 101 |
|
|
65
|
+
| **ИТОГО** | **2511** | **1597** | **1483** | **540** |
|
|
66
|
+
|
|
67
|
+
## 1.3.1 — 2026-09-15
|
|
68
|
+
|
|
69
|
+
Правка раскладки страницы: на широком экране панель выбора встаёт слева от таблицы.
|
|
70
|
+
|
|
71
|
+
- **От 900 px панель — колонка слева от таблицы.** Метрики, дерево файлов и легенда
|
|
72
|
+
видны одновременно с числами: прокрутка нижних строк больше не уводит управление за
|
|
73
|
+
верх экрана, а таблица получает всё оставшееся по горизонтали (1060 px при окне
|
|
74
|
+
1440 против 1372 у прежней раскладки в одну колонку). Узкое окно раскладку снимает:
|
|
75
|
+
там столбцы снова идут друг под другом, как было.
|
|
76
|
+
- Раскладка — сетка на `body` (`src/page/app.css`), а не обёртка в разметке: страница
|
|
77
|
+
собирается вклейкой глав, и форма страницы осталась в одном месте. Порог тот же,
|
|
78
|
+
что у адаптаций: между «широко» и «узко» нет промежутка без правил.
|
|
79
|
+
- Ни поведение, ни артефакт, ни данные не тронуты — правка только в оформлении
|
|
80
|
+
страницы (`--page`); статический артефакт (`--write`) этот выпуск не касается.
|
|
81
|
+
|
|
82
|
+
### Что изменится в числах
|
|
83
|
+
|
|
84
|
+
**Ничего.** Этот выпуск не трогает ни измерение, ни форму отчёта: изменилась
|
|
85
|
+
раскладка страницы, а числа считает тот же движок теми же датчиками. Таблица ниже та
|
|
86
|
+
же, что у 1.3.0, до последней клетки.
|
|
87
|
+
|
|
88
|
+
| Файл | raw | min со strip | min с esbuild | tok |
|
|
89
|
+
|---|---|---|---|---|
|
|
90
|
+
| code.js | 735 | 276 | 185 | 168 |
|
|
91
|
+
| modern.js | 246 | 51 | 45 | 44 |
|
|
92
|
+
| config.mjs | 172 | 45 | 40 | 40 |
|
|
93
|
+
| заметки.md | 306 | 303 | 303 | 53 |
|
|
94
|
+
| crlf.txt | 63 | 60 | 60 | 10 |
|
|
95
|
+
| package.json | 87 | 69 | 69 | 34 |
|
|
96
|
+
| style.css | 156 | 55 | 43 | 38 |
|
|
97
|
+
| table.toml | 300 | 299 | 299 | 52 |
|
|
98
|
+
| empty.js | 0 | 0 | 0 | 0 |
|
|
99
|
+
| WORKLOG.md | 446 | 439 | 439 | 101 |
|
|
100
|
+
| **ИТОГО** | **2511** | **1597** | **1483** | **540** |
|
|
101
|
+
|
|
21
102
|
## 1.3.0 — 2026-09-15
|
|
22
103
|
|
|
23
104
|
Выпуск выведенных настроек: чтобы получить отчёт, проект больше не обязан себя
|
package/README.md
CHANGED
|
@@ -10,11 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
## Статус
|
|
12
12
|
|
|
13
|
-
**Выпуск
|
|
13
|
+
**Выпуск 2.0.0 (2026-09-15).** Инструмент живёт отдельным пакетом: имя в
|
|
14
14
|
реестре — `@vernikr/size-report` (публикуется тегом из CI, без секрета). Настроек
|
|
15
15
|
проект может не заводить вовсе: без файла инструмент выводит их из самого проекта и
|
|
16
16
|
говорит об этом строкой, а `--init` закрепляет выведенное файлом (чем этот шаг
|
|
17
|
-
отличается от прежнего — `CHANGELOG.md` 1.3.0).
|
|
17
|
+
отличается от прежнего — `CHANGELOG.md` 1.3.0). Отчёт — **один файл**,
|
|
18
|
+
самодостаточная страница `docs/size-report.html`, и он появляется сам: хук обновления
|
|
19
|
+
ставится после установки пакета и при первом запуске (чем это отличается от двух
|
|
20
|
+
файлов прежних выпусков — `CHANGELOG.md` 2.0.0).
|
|
18
21
|
Версия — в манифесте, а у выпуска есть `CHANGELOG.md` с разделом «Что изменится
|
|
19
22
|
в числах»:
|
|
20
23
|
таблица чисел в нём не пересказ, а замер на фикстуре, который сверяется с живым
|
|
@@ -67,7 +70,7 @@
|
|
|
67
70
|
|
|
68
71
|
**Шаг 2 начат первым срезом — контрактом данных.** Движок отдаёт абсолютные
|
|
69
72
|
значения и устройство таблицы (`--data`), а дельты, суммы, «сейчас» и фильтры
|
|
70
|
-
считает страница (
|
|
73
|
+
считает страница (она же и есть отчёт — `size-report.html`): без этого
|
|
71
74
|
фильтры и «итого по выбору» невозможны в принципе. В контракте едет и точность
|
|
72
75
|
числа — рядом пометок `approx` по клеткам, — потому что это факт замера, а не
|
|
73
76
|
вывод: страница показывает то, что сказал движок, и своего правила точности не
|
|
@@ -216,10 +219,10 @@
|
|
|
216
219
|
|
|
217
220
|
| Прогон | Команда | Проверок |
|
|
218
221
|
|---|---|---|
|
|
219
|
-
| Быстрый — каждая правка | `pnpm test` | **65 из
|
|
220
|
-
| Полный — выкладка и CI | `pnpm test:all` | **
|
|
222
|
+
| Быстрый — каждая правка | `pnpm test` | **65 из 168** |
|
|
223
|
+
| Полный — выкладка и CI | `pnpm test:all` | **168** |
|
|
221
224
|
|
|
222
|
-
Ни одна проверка не потеряна и не ослаблена: полный прогон запускает все
|
|
225
|
+
Ни одна проверка не потеряна и не ослаблена: полный прогон запускает все 168 теми же
|
|
223
226
|
файлами, а быстрый берёт их часть. Умолчание — полный: файл становится быстрым только
|
|
224
227
|
явно и с причиной, поэтому новое дорогое не может тихо уехать в быстрый. Стерегут это
|
|
225
228
|
объявление `test/suites.test.js` (полнота классификации и причина у каждого файла) и
|
|
@@ -316,9 +319,20 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
316
319
|
папки три состояния — все её файлы включены, часть, ни одного, — и переключатель
|
|
317
320
|
папки ведёт за собой всё поддерево; рядом стоит число файлов. Своего состояния у
|
|
318
321
|
папки и у быстрой кнопки категории нет: обе переставляют галочки файлов, поэтому
|
|
319
|
-
дерево, кнопки и таблица не могут разойтись. Список файлов длиной больше
|
|
320
|
-
|
|
321
|
-
(
|
|
322
|
+
дерево, кнопки и таблица не могут разойтись. Список файлов длиной больше экрана
|
|
323
|
+
прокручивается внутри панели, а не выталкивает таблицу: на живой истории
|
|
324
|
+
(87 строк × 12 колонок) дерево занимает 558 px из 883 у панели.
|
|
325
|
+
|
|
326
|
+
**На широком экране панель стоит слева от таблицы** (от 900 px, `src/page/app.css`).
|
|
327
|
+
Это не украшение: на десктопе бокового места много, а вертикального мало —
|
|
328
|
+
переключатели, дерево и числа видны одновременно, и прокрутка нижних строк не
|
|
329
|
+
уводит управление за верх экрана. Раскладка сделана сеткой на `body`: обёртки в
|
|
330
|
+
разметке нет, потому что страница собирается вклейкой глав и форма страницы должна
|
|
331
|
+
жить в одном месте. Порог один с адаптациями — промежутка без правил между «широко»
|
|
332
|
+
и «узко» нет. Измерено в настоящем Chrome на живой истории: при окне 1440×900
|
|
333
|
+
панель — колонка 300 px слева, таблица начинается на 346-м и на той же высоте
|
|
334
|
+
(103), её собственное окно 1060 × 602; при 1024 — те же 300 и 651; при 899
|
|
335
|
+
раскладка снимается и столбцы снова идут друг под другом (панель 79, таблица 557).
|
|
322
336
|
Стрежет это проверка на числах таблицы, а не на разметке: выключение папки убирает
|
|
323
337
|
ровно её колонки и ровно её объём из итога (`test/contract.test.js`). Проверено в
|
|
324
338
|
настоящем Chrome: 9 папок до трёх уровней вложенности (`.github/workflows`,
|
|
@@ -421,8 +435,8 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
421
435
|
профиль ведёт новые проекты сразу на токены.
|
|
422
436
|
|
|
423
437
|
**Волна 0 чистки пройдена** (`REFACTOR.md`): у отказов командной строки появились
|
|
424
|
-
коды выхода и справка вместо стека, `--help` отвечает, `--
|
|
425
|
-
|
|
438
|
+
коды выхода и справка вместо стека, `--help` отвечает, `--write`
|
|
439
|
+
создаёт недостающий каталог, подсказка в отказе ведёт к работающей команде, а
|
|
426
440
|
вывод настроек больше не предлагает колонкой саму таблицу — иначе первая же
|
|
427
441
|
проверка настроек его отвергала.
|
|
428
442
|
|
|
@@ -473,8 +487,8 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
473
487
|
| `tools/parity-freeze.js` | Снимает эталон паритета (`pnpm run parity`): замороженной копией, на ревизии проекта из манифеста — `--json`, конфиг, хеш артефакта, хеш инструмента |
|
|
474
488
|
| `tools/make-fixture.js` | Собирает синтетическую фикстуру (`pnpm run fixture`): детерминированную историю с ловушками плюс эталонные числа |
|
|
475
489
|
| `tools/synthetic/` | Сюжеты той сборки по предметам: `repo.js` — как говорим с git (закреплённые время, автор, настройки), `content.js` — что лежит в файлах, `history.js` — какие коммиты из этого получаются, `note.js` — записка к фикстуре со списком ловушек |
|
|
476
|
-
| `tools/parity-live.js` | Сверяет движок с живым проектом на клоне: числа и
|
|
477
|
-
| `tools/pack-check.js` | Собирает тарболл и проверяет, что из него всё работает: все исходники доехали,
|
|
490
|
+
| `tools/parity-live.js` | Сверяет движок с живым проектом на клоне: числа и самодостаточный отчёт по пути из настроек потребителя (`pnpm run parity:live`) |
|
|
491
|
+
| `tools/pack-check.js` | Собирает тарболл и проверяет, что из него всё работает: все исходники доехали, числа и отчёт — как из репозитория (`pnpm run pack:check`) |
|
|
478
492
|
| `tools/check-standards.js` | Проверяет, что оба эталона воспроизводятся: пересъём идёт в никуда и сверяется с закоммиченным (наши файлы — побайтово, бандл — по содержимому) и что бандл живой истории несёт `HEAD` (`pnpm run check:standards`) |
|
|
479
493
|
| `.github/workflows/ci.yml` | CI: работа `verify` на каждый пуш и запрос правки зовёт `pnpm run verify` — тот же профиль, что локально; действия закреплены по SHA коммита |
|
|
480
494
|
| `.github/workflows/verify-slow.yml` | Slow-профиль по расписанию: то же плюс покрытие под c8 — дорогое не в каждом прогоне |
|
|
@@ -486,6 +500,7 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
486
500
|
| `tools/gates/gatefiles.js` | Защита гейт-файлов: правка порогов, баз и обвязки без трейлера `Gate-Change:` — красный (хук `commit-msg` и CI по диапазону) |
|
|
487
501
|
| `tools/gates/common.js`, `tools/gate-probe.js` | Общее у датчиков (корень, разбор ключей, отчёты) и обвязка их проб: датчик зовётся командой, а не импортом |
|
|
488
502
|
| `.githooks/commit-msg`, `.githooks/pre-commit`, `.githooks/pre-push` | Хуки: защита гейт-файлов, быстрый профиль на правку и перед отправкой; ставятся `pnpm run hooks:install` (свой менеджер хуков не заводится) |
|
|
503
|
+
| `.githooks/post-commit` | Обновление отчёта после коммита: зов установленной копии пакета (строка вписана человеком — инструмент чужие каталоги хуков не правит) |
|
|
489
504
|
| `eslint.metrics.config.js`, `.eslint-suppressions.json` | Правила датчика раздувания и его база: пороги из замеров, всё, что выше, — в базе и разбирается постепенно |
|
|
490
505
|
| `.jscpd.json`, `dup-baseline.json` | Настройки и база датчика дублей: отпечаток считается по содержимому клона, поэтому база переносима |
|
|
491
506
|
| `.dependency-cruiser.cjs`, `.c8rc.json`, `coverage-baseline.json` | Правила графа связей, настройки снятия покрытия и его база по файлам |
|
|
@@ -493,17 +508,16 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
493
508
|
| `.github/workflows/release.yml` | Выпуск по тегу: тот же полный набор, сверка версии манифеста с тегом и публикация в реестр по удостоверению GitHub Actions — без секрета и без кода из аутентификатора |
|
|
494
509
|
| `templates/` | То, что проект берёт как есть: `size-report.config.json` (черновик настроек), `ci.yml` (описание проверки) и `README.md` (куда что кладётся и что в них менять); едут в поставке и стерегутся `pack:check` и `test/templates.test.js` |
|
|
495
510
|
| `fixtures/parity/` | Эталон с `safe-resets` на коммите `bd6ef9d`: 95 строк × 27 колонок. Копия реализации, которой он снят, в дереве не лежит — её байты живут в истории и берутся оттуда по требованию (`REFACTOR.md` R-1.5) |
|
|
496
|
-
| `fixtures/synthetic/` | Бандл фикстуры на 16 коммитов, её конфиг, эталонные числа и хеш артефакта |
|
|
511
|
+
| `fixtures/synthetic/` | Бандл фикстуры на 16 коммитов, её конфиг, эталонные числа (`--json` прежней копии) и хеш её артефакта прежней формы — запись того, с чем сверялся перенос |
|
|
497
512
|
| `fixtures/live/history.bundle`, `fixtures/live/README.md` | История проекта-потребителя на ревизии эталона `bd6ef9d` и записка о том, какую ревизию бандл несёт и почему он лежит в репозитории: живая сверка работает без доступа к приватному проекту |
|
|
498
513
|
| `bin/size.js` | Команда `size`: то, что ставит пакет (`package.json` → `bin`); сама ничего не считает, только зовёт точку входа |
|
|
499
514
|
| `LICENSE` | MIT: условия лицензии едут в поставке вместе с пакетом |
|
|
500
515
|
| `.gitignore`, `pnpm-lock.yaml` | Что в репозиторий не идёт; lock-файл pnpm, а версия менеджера — в поле `packageManager` (оттуда её берёт CI) |
|
|
501
|
-
| `src/size-table.js` | Точка входа пакета: только реэкспорт публичного API (
|
|
502
|
-
| `src/derived.js` | Общий расчёт отчёта: итоги, дельты, клетка, подпись коммита —
|
|
516
|
+
| `src/size-table.js` | Точка входа пакета: только реэкспорт публичного API (55 имён), ни одного расчёта |
|
|
517
|
+
| `src/derived.js` | Общий расчёт отчёта: итоги, дельты, клетка, подпись коммита — один на движок и программу страницы |
|
|
503
518
|
| `src/css.js` | Чтение оформления с диска: какие наборы стилей есть и какая у них роль |
|
|
504
|
-
| `src/table.css` |
|
|
505
|
-
| `src/
|
|
506
|
-
| `src/page/app.css` | Оформление страницы сверх общей части: панель с деревом файлов, состояния пустоты, узкое окно |
|
|
519
|
+
| `src/table.css` | Таблица отчёта: геометрия клеток, липкие шапка и колонка, цвет дельт |
|
|
520
|
+
| `src/page/app.css` | Оформление страницы сверх общей части: панель с деревом файлов (на широком экране — колонка слева от таблицы), состояния пустоты, узкое окно |
|
|
507
521
|
| `src/page/state.js` | Состояние страницы: данные отчёта, вид галочек, паспорт записи, память браузера и обмен ссылкой — глава программы страницы |
|
|
508
522
|
| `src/page/dom.js` | Узлы страницы: мелкие помощники разметки (`appEl`, `appBox`) — одни на панель и таблицу |
|
|
509
523
|
| `src/page/panel.js` | Панель выбора: галочки метрик и файлов, категории, дерево путей, легенда; перерисовку просит у главы сборки |
|
|
@@ -525,17 +539,17 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
525
539
|
| `src/check.js` | Полнота покрытия (`size check`): настройки, история, пути, датчики — что прошло мимо колонок и чем это чинится |
|
|
526
540
|
| `src/explain.js` | Объяснение пропущенной строки (`size explain <коммит>`): причина, улики и готовая починка |
|
|
527
541
|
| `src/doctor.js` | Диагностика одним ответом (`size doctor`): окружение, зависимости, настройки, покрытие, состояние хука — сборкой из существующих кусков |
|
|
528
|
-
| `src/hook.js` | Хуки
|
|
529
|
-
| `
|
|
542
|
+
| `src/hook.js` | Хуки автообновления: постановка сама (`autoInstall` — из входа и `bin/postinstall.js`), снятие командой, коммит только отчёта, замок и запись о запуске |
|
|
543
|
+
| `bin/postinstall.js` | Установка хука после постановки пакета: ищет проект-потребитель и молчит, если поставить негде |
|
|
544
|
+
| `src/artifact.js` | Отчёт на диске: единственное место, где он превращается в файл (им пользуются и `--write`, и хук); отчёт — самодостаточная страница |
|
|
530
545
|
| `src/journal.js` | Журнал и ссылки: к какому разделу относится коммит и куда ведёт описание |
|
|
531
546
|
| `src/data.js` | Категории файлов и контракт со страницей (`--data`) |
|
|
532
|
-
| `src/render.js` | Статический артефакт: клетки, таблица, примечание (стили — в `src/css.js`) |
|
|
533
547
|
| `src/config.js` | Настройки проекта-потребителя: умолчания, чтение, проверка |
|
|
534
548
|
| `src/project.js` | Настройки, выведенные из самого проекта (дерево и история): колонки, журнал, исключения. Без файла настроек он и есть настройки; `--init` закрепляет его файлом |
|
|
535
549
|
| `src/locales.js`, `src/refusal.js`, `src/tool.js` | Тексты отчёта; коды выхода и справка; имя и версия пакета |
|
|
536
550
|
| `src/cli.js` | Вход инструмента: разбор строки, чтение проекта и доставка запроса режиму; главный файл пакета |
|
|
537
551
|
| `src/args.js` | Грамматика командной строки: режимы, ключи и команды плюс проверки их сочетаний — отказ называет виновника и готовую команду |
|
|
538
|
-
| `src/modes.js` | Режимы: собрать
|
|
552
|
+
| `src/modes.js` | Режимы: собрать отчёт, сверить его с историей, отдать данные, полноту покрытия и диагностику |
|
|
539
553
|
| `src/init.js` | Закрепление настроек файлом (`--init`): то, что проект вывел о себе сам, ложится файлом — и проходит ту же проверку, что первый запуск |
|
|
540
554
|
| `test/api.test.js` | Публичный API пакета: список имён заморожен, разбиение не имеет права его менять |
|
|
541
555
|
| `eslint.config.js` | Правила оформления: те же, что у проекта-потребителя, плюс запрет склейки операторов в строке (`pnpm run lint`, `pnpm run lint:strict`) |
|
|
@@ -546,7 +560,7 @@ deльт задан один раз и по артефакту: рост зел
|
|
|
546
560
|
| `tools/docs-facts.js` | Чтение фактов из документации — один слой на четыре проверки сторожа: что документ называет (пути, зовы, адреса разделов) против того, что есть в репозитории |
|
|
547
561
|
| `tools/yaml.js` | Разбор подмножества YAML — один разборщик на два сторожа описаний (`templates/ci.yml` и `.github/workflows/release.yml`): вне подмножества — ошибка, а не молча пропущенная строка, включая двоеточие с пробелом в незакавыченном значении (именно оно делало описание выпуска неразбираемым, пока проверка искала подстроки) |
|
|
548
562
|
| `tools/refusals.js` | Каталог отказов: по строке на каждый — причина, код выхода, обязательные фразы вывода, **что отказ советует** (`advice`: `run` — команда, `template` — форма с подстановкой, `manual` — действие человека с причиной, `coveredBy` — отдан другой проверке), а для непроверяемого — почему; карты мест отказа (`SITES`, `PRINTED`) держат числа, чтобы новый отказ не появился молча, а маркеры совета — чтобы не появился молча новый совет |
|
|
549
|
-
| `test/parity.test.js` | Паритет движка с эталоном: числа,
|
|
563
|
+
| `test/parity.test.js` | Паритет движка с эталоном: числа, самодостаточность отчёта, локаль |
|
|
550
564
|
| `test/frozen.test.js` | Замороженная копия: та ли это ревизия, с которой снят эталон, и воспроизводит ли она его |
|
|
551
565
|
| `test/environment.test.js` | Герметичность: вывод не зависит от настроек git машины и локали |
|
|
552
566
|
| `test/crlf.test.js` | Выкладка с CRLF (`core.autocrlf`) не мешает сверке |
|
|
@@ -628,7 +642,7 @@ pnpm add -D @vernikr/size-report
|
|
|
628
642
|
```
|
|
629
643
|
|
|
630
644
|
Пакет **опубликован в реестре**, и публично: `npm view @vernikr/size-report
|
|
631
|
-
version` отвечает `
|
|
645
|
+
version` отвечает `2.0.0`, `npm access get status @vernikr/size-report` — `public`,
|
|
632
646
|
а анонимный запрос тарболла — код 200. `npm i -D` и `yarn add -D` принимают то же
|
|
633
647
|
имя; ни ключа, ни ссылки на репозиторий не нужно.
|
|
634
648
|
|
|
@@ -636,11 +650,11 @@ version` отвечает `1.3.0`, `npm access get status @vernikr/size-report`
|
|
|
636
650
|
реестра, но остаётся привязанной к ревизии:
|
|
637
651
|
|
|
638
652
|
```bash
|
|
639
|
-
pnpm add -D github:vernikr/size-report#
|
|
653
|
+
pnpm add -D github:vernikr/size-report#v2.0.0
|
|
640
654
|
```
|
|
641
655
|
|
|
642
656
|
Без сети (или если тянуть из codeload нечем) — тарболл: `pnpm pack` в клоне
|
|
643
|
-
пакета, затем `pnpm add -D ./vernikr-size-report-
|
|
657
|
+
пакета, затем `pnpm add -D ./vernikr-size-report-2.0.0.tgz`.
|
|
644
658
|
|
|
645
659
|
**Почему тег, а не sha.** Короткий sha pnpm разрешает только через видимые рефы, а
|
|
646
660
|
`git ls-remote` отдаёт одни верхушки веток: пока ревизия — верхушка, короткий sha
|
|
@@ -648,7 +662,7 @@ pnpm add -D github:vernikr/size-report#v1.3.0
|
|
|
648
662
|
<sha> to a commit`. Это не рассуждение, а проба: короткий пин `6530237` ставился,
|
|
649
663
|
пока `main` стоял на нём, и перестал — на следующем же коммите, а тот же sha
|
|
650
664
|
целиком поставился. Имя ветки (`#main`) или тег принимаются оба, но ветка —
|
|
651
|
-
движущаяся цель, а тег постоянен: этот выпуск стоит на теге `
|
|
665
|
+
движущаяся цель, а тег постоянен: этот выпуск стоит на теге `v2.0.0`, он же и в
|
|
652
666
|
примере (сорок знаков тоже годятся, но их придётся брать глазами из истории).
|
|
653
667
|
|
|
654
668
|
Ревизия в примере — не украшение, а часть утверждения: она закреплена за тем, что
|
|
@@ -708,7 +722,7 @@ stderr и называет команду, которая их закрепля
|
|
|
708
722
|
проекту молча.
|
|
709
723
|
|
|
710
724
|
> Subкоманды `size init` пока нет — CLI знает только флаги (`--init`, `--write`,
|
|
711
|
-
> `--
|
|
725
|
+
> `--data`, `--json`, без флага — проверка); полный список даёт `size --help`.
|
|
712
726
|
> Subкоманды — шаг 5 плана (`REFACTOR.md` R-4.5).
|
|
713
727
|
|
|
714
728
|
### 3. Что правится в конфиге
|
|
@@ -722,14 +736,14 @@ stderr и называет команду, которая их закрепля
|
|
|
722
736
|
| `metrics` | из чего состоит число: `raw` (размер объекта git), `min` (минифицированная форма — какая именно, решает `minify.engine`), `tok` (токены), `gzip` |
|
|
723
737
|
| `tokens.family`, `tokens.encoding` | словарь для `tok`: семейство (`openai`) и кодировка (`o200k_base` или `cl100k_base`) — кодировка меняет число, поэтому она и в настройках, и в подписи метрики |
|
|
724
738
|
| `minify.engine` | чем считается `min`: `strip` (комментарии и отступы, точность не обещается) или `esbuild` (настоящее сжатие; форматы без минификатора — упрощение, и это видно в подписи метрики) |
|
|
725
|
-
| `output` | файл
|
|
739
|
+
| `output` | файл отчёта (в выведенном профиле — `docs/size-report.html`, если каталог `docs/` есть, иначе в корне; имя отчёта — его имя, а каталог решает только где ему лежать) |
|
|
726
740
|
| `journal` | где искать разделы журнала, на которые ссылаются строки |
|
|
727
741
|
| `links.commitUrl` | шаблон ссылки на коммит, например `https://github.com/org/repo/commit/{sha}`; выводится из адреса `origin` у GitHub и GitLab (у остальных хозяев — пусто, а не догадка) |
|
|
728
742
|
| `skip` | пути, которые колонкой не стали: и те, что ею быть не могут (сам отчёт, замки зависимостей), и те, что в колонки не поместились (выведенный профиль объявляет исключениями всё остальное — поэтому первый `check` полон) |
|
|
729
743
|
| `fixCommand` | команда, которую цитирует подпись отчёта и подсказывает отказ; в выведенном профиле — ваш скрипт `sizes`, если он объявлен, иначе путь к установленному пакету внутри проекта (зов по имени пакета уходит в реестр — `REFACTOR.md` R-4.21) |
|
|
730
744
|
| `locale`, `title`, `heading` | язык текстов отчёта и его заголовки; пустые `title`/`heading` значат «взять из локали» |
|
|
731
745
|
| `minify.guard` | расширения, где результат стриппера проверяется разбором; модуль в `.js` гард понимает сам, трогать его не нужно |
|
|
732
|
-
| `hooks.enabled` | выключатель хука автообновления (`false` — хук
|
|
746
|
+
| `hooks.enabled` | выключатель хука автообновления (`false` — хук не ставится сам и молчит, если уже стоит; убирается он только `size uninstall-hook`) |
|
|
733
747
|
|
|
734
748
|
Остальные ключи и умолчания — `src/config.js` (`DEFAULT_CONFIG`).
|
|
735
749
|
|
|
@@ -741,14 +755,13 @@ stderr и называет команду, которая их закрепля
|
|
|
741
755
|
```
|
|
742
756
|
|
|
743
757
|
```bash
|
|
744
|
-
pnpm run sizes # → docs/size-
|
|
745
|
-
pnpm exec size --page # → docs/size-report.html — интерактивная страница
|
|
758
|
+
pnpm run sizes # → docs/size-report.html — отчёт: таблица, фильтры, ссылка
|
|
746
759
|
```
|
|
747
760
|
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
761
|
+
Отчёт — один самодостаточный файл: открывается двойным щелчком, без сервера и без
|
|
762
|
+
сети (внешних ссылок в нём нет вовсе, данные, оформление и программа вклеены).
|
|
763
|
+
Производные (дельты, итоги, фильтры) считает сама страница — из абсолютных
|
|
764
|
+
значений, которые даёт движок, и тем же кодом, что и его расчёт.
|
|
752
765
|
|
|
753
766
|
**Порядок правок:** код → `pnpm run sizes` → коммит с одной таблицей. Таблица
|
|
754
767
|
обновляется **отдельным коммитом**, потому что строка коммита не может попасть в
|
|
@@ -984,7 +997,7 @@ R-4.1): пути, таблица файлов, зовы и ключи инстр
|
|
|
984
997
|
- `--json` — форма ответа, а не отдельный режим, и правило у него одно: ответ
|
|
985
998
|
бывает ровно у четырёх вызовов. Без команды это прежняя форма данных
|
|
986
999
|
(заморожена эталоном паритета), у `check`, `explain` и `doctor` — их ответ.
|
|
987
|
-
У команды без ответа и рядом с режимом (`--write`, `--data`, `--
|
|
1000
|
+
У команды без ответа и рядом с режимом (`--write`, `--data`, `--init`)
|
|
988
1001
|
он отказ, а не тишина: просить JSON там, где его не бывает, — ошибка вызова.
|
|
989
1002
|
- `size doctor --json` — вся диагностика одним ответом: окружение, зависимости,
|
|
990
1003
|
настройки, покрытие и находки с уровнем (`action` — делать, `note` — знать).
|
|
@@ -1019,8 +1032,8 @@ pnpm test:all # полный прогон (выкладка и
|
|
|
1019
1032
|
# сборка на дисках, сверка с деревом, хуки, метрики
|
|
1020
1033
|
pnpm run suites:measure # замерить длительность каждого файла набора
|
|
1021
1034
|
pnpm run parity:live # паритет с живым проектом на клоне, две среды
|
|
1022
|
-
node bin/size.js --data # контракт данных:
|
|
1023
|
-
node bin/size.js --
|
|
1035
|
+
node bin/size.js --data # контракт данных: отчёт и агент
|
|
1036
|
+
node bin/size.js --write # минимальный отчёт
|
|
1024
1037
|
node bin/size.js --help # справка и коды выхода
|
|
1025
1038
|
pnpm run parity # переснять эталон паритета: проект и ревизия — из манифеста
|
|
1026
1039
|
pnpm run fixture # пересобрать фикстуру и её эталон
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* Постановка хука после установки пакета: чтобы отчёт обновлялся с первого же
|
|
3
|
+
* коммита, не требуя ни запуска инструмента, ни файла настроек.
|
|
4
|
+
*
|
|
5
|
+
* Здесь только поиск проекта-потребителя: сам хук ставит `autoInstall`
|
|
6
|
+
* (`src/hook.js`) — то же место, что и при первом запуске, иначе «поставлено при
|
|
7
|
+
* установке» и «поставлено при запуске» могли бы разойтись содержимым файла.
|
|
8
|
+
*
|
|
9
|
+
* Код выхода всегда 0: установка зависимостей не должна падать из-за того, что
|
|
10
|
+
* услугу не удалось оказать (нет git, нет прав, чужой хук, CI). Причина не
|
|
11
|
+
* печатается: у фоновой работы нет читателя, а точная причина есть у команды
|
|
12
|
+
* `install-hook`.
|
|
13
|
+
*
|
|
14
|
+
* Отдельная тонкость: платформы, где скрипты зависимостей по умолчанию не
|
|
15
|
+
* исполняются (pnpm 10, yarn berry), зовут этот файл не всегда — тогда хук
|
|
16
|
+
* ставится при первом запуске инструмента в проекте. Оба пути ведут в одно место. */
|
|
17
|
+
|
|
18
|
+
import fs from 'fs';
|
|
19
|
+
import path from 'path';
|
|
20
|
+
import { autoInstall } from '../src/hook.js';
|
|
21
|
+
|
|
22
|
+
/* Каталог проекта-потребителя ищется в порядке убывания точности: `INIT_CWD`
|
|
23
|
+
* (его ставят npm и pnpm, запуская скрипт пакета), `npm_config_local_prefix`,
|
|
24
|
+
* затем подъём от текущего каталога вверх до ближайшего `.git`. Подъём нужен,
|
|
25
|
+
* потому что сам скрипт исполняется из `node_modules`, где репозитория нет. */
|
|
26
|
+
function projectRoot() {
|
|
27
|
+
const candidates = [process.env.INIT_CWD, process.env.npm_config_local_prefix, process.cwd()];
|
|
28
|
+
for (const start of candidates) {
|
|
29
|
+
const found = gitRootOf(start);
|
|
30
|
+
if (found !== null) return found;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function gitRootOf(start) {
|
|
36
|
+
if (typeof start !== 'string' || start === '') return null;
|
|
37
|
+
let dir = path.resolve(start);
|
|
38
|
+
for (;;) {
|
|
39
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
40
|
+
const up = path.dirname(dir);
|
|
41
|
+
if (up === dir) return null;
|
|
42
|
+
dir = up;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const root = projectRoot();
|
|
47
|
+
const files = root === null ? null : autoInstall(root, null);
|
|
48
|
+
if (files !== null && process.env.SIZE_REPORT_QUIET !== '1') {
|
|
49
|
+
console.error('· size-report: хук поставлен (' + files.join(', ') + ') — отчёт обновляется после'
|
|
50
|
+
+ ' каждого коммита; снять: size uninstall-hook');
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vernikr/size-report",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"author": "vernikr",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/vernikr/size-report.git"
|
|
8
8
|
},
|
|
9
|
-
"description": "Учёт роста объёма кода и документов по истории git: raw / min /
|
|
9
|
+
"description": "Учёт роста объёма кода и документов по истории git: raw / min / токены; отчёт — один самодостаточный файл, обновляется хуком сам",
|
|
10
10
|
"type": "module",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"packageManager": "pnpm@10.6.1",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
],
|
|
33
33
|
"sideEffects": false,
|
|
34
34
|
"scripts": {
|
|
35
|
+
"postinstall": "node bin/postinstall.js",
|
|
35
36
|
"test": "node tools/run-tests.js fast",
|
|
36
37
|
"test:all": "node tools/run-tests.js full",
|
|
37
38
|
"suites:measure": "node tools/run-tests.js measure",
|
|
@@ -65,7 +66,7 @@
|
|
|
65
66
|
"report"
|
|
66
67
|
],
|
|
67
68
|
"devDependencies": {
|
|
68
|
-
"@vernikr/size-report": "1.
|
|
69
|
+
"@vernikr/size-report": "1.3.1",
|
|
69
70
|
"c8": "10",
|
|
70
71
|
"dependency-cruiser": "17",
|
|
71
72
|
"eslint": "^9.18.0",
|
package/src/args.js
CHANGED
|
@@ -21,15 +21,15 @@ import { cliCommand, advicePath, refuseCause } from './refusal.js';
|
|
|
21
21
|
* места и требует проверки на каждое.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
const MODES = ['--init', '--write', '--data'
|
|
25
|
-
const VALUE_FLAGS = ['--config', '--init', '--
|
|
24
|
+
const MODES = ['--init', '--write', '--data'];
|
|
25
|
+
const VALUE_FLAGS = ['--config', '--init', '--write'];
|
|
26
26
|
const FLAGS = ['--help', '-h'].concat(MODES, VALUE_FLAGS, ['--json', '--force']);
|
|
27
27
|
const COMMANDS = ['check', 'explain', 'doctor', 'install-hook', 'uninstall-hook', 'hook-run'];
|
|
28
28
|
const ANSWER_COMMANDS = ['check', 'explain', 'doctor'];
|
|
29
29
|
export const HOOK_COMMANDS = ['install-hook', 'uninstall-hook', 'hook-run'];
|
|
30
30
|
|
|
31
31
|
/* Ключ со значением: забирает следующий аргумент и возвращает, сколько съел. У
|
|
32
|
-
* `--init` и `--
|
|
32
|
+
* `--init` и `--write` пустое значение — законное «по умолчанию», а у `--config`
|
|
33
33
|
* это молчаливый пропуск: настройки были бы взяты не те, что назвал человек. */
|
|
34
34
|
function takeValue(flag, args, i, values) {
|
|
35
35
|
const next = args[i + 1];
|
|
@@ -95,7 +95,7 @@ function checkModes(plan) {
|
|
|
95
95
|
|
|
96
96
|
/* Слово, которого команда не знает. Отдельным вопросом, потому что виновников
|
|
97
97
|
* тут двое: опечатка в команде — и лишнее значение режима, который своё значение
|
|
98
|
-
* уже забрал (у `--init` и `--
|
|
98
|
+
* уже забрал (у `--init` и `--write` оно одно). Оба случая обязаны назвать своего
|
|
99
99
|
* виновника: у `--config` остаток — именно команда, и зов её разбирается как
|
|
100
100
|
* команда, а не как лишнее слово. */
|
|
101
101
|
function checkUnknownWord(plan) {
|
package/src/artifact.js
CHANGED
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { reportData } from './data.js';
|
|
4
|
+
import { pageHtml } from './page/build.js';
|
|
5
5
|
|
|
6
|
-
/*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
/* Отчёт — один файл: самодостаточная страница. Она и есть артефакт, потому что
|
|
7
|
+
* несёт всё сама (данные, оформление, программу), а второй формы того же отчёта не
|
|
8
|
+
* существует: два вывода одной истории разошлись бы молча, и выбрать, какой из них
|
|
9
|
+
* верный, было бы нечем.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Через это место проходят оба потребителя — режим записи (`--write`) и хук после
|
|
12
|
+
* коммита (`src/hook.js`), поэтому «что записано в файл» не может разойтись между
|
|
13
|
+
* ними: в коммит хук кладёт ровно те байты, которые показывает `--write`.
|
|
14
|
+
*
|
|
15
|
+
* Каталог создаётся здесь же: `--write docs/size-report.html` в свежем проекте —
|
|
16
|
+
* обычный запуск, а не ошибка пользователя. Тем же путём пишется черновик настроек
|
|
17
|
+
* (`--init`), поэтому он один на пакет. */
|
|
13
18
|
|
|
14
|
-
/* Запись файла с созданием каталога:
|
|
15
|
-
*
|
|
16
|
-
* страница (`--page`) и черновик настроек (`--init`), поэтому он один на пакет. */
|
|
19
|
+
/* Запись файла с созданием каталога: путь может не существовать ни одной своей
|
|
20
|
+
* частью — это не ошибка того, кто его назвал. */
|
|
17
21
|
export function writeFileEnsured(file, text) {
|
|
18
22
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
19
23
|
fs.writeFileSync(file, text);
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
/* Собранные байты отчёта без записи: они же нужны проверке (`таблица совпадает с
|
|
27
|
+
* историей`), и собирать их вторым способом значило бы сверять не то, что пишется. */
|
|
28
|
+
export function artifact(cfg, root) {
|
|
29
|
+
const data = reportData(cfg, root);
|
|
30
|
+
return { data: data, html: pageHtml(data, cfg), file: path.join(root, cfg.output) };
|
|
31
|
+
}
|
|
32
|
+
|
|
22
33
|
export function rebuild(cfg, root) {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
writeFileEnsured(file, html);
|
|
27
|
-
return { rows: rows, dropped: dropped, state: state, html: html, file: file };
|
|
34
|
+
const out = artifact(cfg, root);
|
|
35
|
+
writeFileEnsured(out.file, out.html);
|
|
36
|
+
return out;
|
|
28
37
|
}
|
package/src/cli.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import { EXIT, Refusal, USAGE } from './refusal.js';
|
|
2
|
+
import { EXIT, Refusal, USAGE, cliCommand } from './refusal.js';
|
|
3
3
|
import { CONFIG_NAME, gitRoot, loadConfig } from './config.js';
|
|
4
4
|
import { HOOK_COMMANDS, parseArgs } from './args.js';
|
|
5
5
|
import { initMode } from './init.js';
|
|
6
6
|
import { derivedLines } from './project.js';
|
|
7
|
+
import { autoInstall } from './hook.js';
|
|
7
8
|
import {
|
|
8
|
-
checkMode, coverageMode, dataMode, doctorMode, explainMode, hookMode, jsonMode,
|
|
9
|
+
checkMode, coverageMode, dataMode, doctorMode, explainMode, hookMode, jsonMode, writeMode
|
|
9
10
|
} from './modes.js';
|
|
10
11
|
|
|
11
12
|
/* Вход инструмента: разбор строки, чтение проекта и доставка запроса режиму.
|
|
@@ -28,13 +29,23 @@ const RUNNERS = {
|
|
|
28
29
|
check: (c, x) => coverageMode(x.cfg, x.root, x.configFile, c.json),
|
|
29
30
|
explain: (c, x) => explainMode(x.cfg, x.root, c.arg[0], c.json),
|
|
30
31
|
'--data': (c, x) => dataMode(x.cfg, x.root),
|
|
31
|
-
'--
|
|
32
|
-
'--write': (c, x) => writeMode(x.cfg, x.root),
|
|
32
|
+
'--write': (c, x) => writeMode(x.cfg, x.root, c.values['--write']),
|
|
33
33
|
'': (c, x) => (c.json ? jsonMode(x.cfg, x.root) : checkMode(x.cfg, x.root))
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
const asked = (cmd) => (cmd.verb === null ? (cmd.mode === null ? '' : cmd.mode) : cmd.verb);
|
|
37
37
|
|
|
38
|
+
/* Постановка хука без спроса — здесь, а не в `doctor` и не в `hook-run`: первый
|
|
39
|
+
* только докладывает, а второй зовётся уже из поставленного хука. Ставится один раз
|
|
40
|
+
* в клоне и называется вслух, дальше молчит: отчёт обновляется после каждого
|
|
41
|
+
* коммита без ручного шага (устройство и границы — `src/hook.js`). */
|
|
42
|
+
function ensureHook(root, cfg) {
|
|
43
|
+
const files = autoInstall(root, cfg);
|
|
44
|
+
if (files === null) return;
|
|
45
|
+
console.error('· хук поставлен: ' + files.join(', ') + ' — отчёт обновляется после каждого'
|
|
46
|
+
+ ' коммита (снять: ' + cliCommand('uninstall-hook') + ')');
|
|
47
|
+
}
|
|
48
|
+
|
|
38
49
|
/* Доставка. Диагностика и хук отвечают до чтения настроек: им нужен не весь
|
|
39
50
|
* проект, а окружение, и отказывать им из-за настроек было бы неверно — про
|
|
40
51
|
* настройки они как раз и докладывают. */
|
|
@@ -45,6 +56,7 @@ function deliver(cmd, base) {
|
|
|
45
56
|
// Примечание идёт в stderr: у `--json` и `--data` в stdout лежат данные, и
|
|
46
57
|
// подмешивать в них рассказ о настройках значило бы ломать разбор.
|
|
47
58
|
if (ctx.cfg.derived) derivedLines(ctx.cfg).forEach((line) => console.error(line));
|
|
59
|
+
ensureHook(base.root, ctx.cfg);
|
|
48
60
|
return RUNNERS[asked(cmd)](cmd, ctx);
|
|
49
61
|
}
|
|
50
62
|
|
package/src/config.js
CHANGED
|
@@ -16,7 +16,7 @@ import { projectConfig } from './project.js';
|
|
|
16
16
|
export const CONFIG_NAME = 'size-table.config.json';
|
|
17
17
|
|
|
18
18
|
export const DEFAULT_CONFIG = {
|
|
19
|
-
output: 'size-
|
|
19
|
+
output: 'size-report.html',
|
|
20
20
|
locale: 'ru',
|
|
21
21
|
title: '', // по умолчанию — заголовок из локали
|
|
22
22
|
heading: '',
|
|
@@ -30,9 +30,10 @@ export const DEFAULT_CONFIG = {
|
|
|
30
30
|
minify: { engine: 'strip', ext: {}, guard: ['.js', '.mjs', '.cjs'] },
|
|
31
31
|
// Токены: каким словарём считать. Семейство — про модели, кодировка — про число.
|
|
32
32
|
tokens: Object.assign({}, TOKEN_DEFAULTS),
|
|
33
|
-
// Автоматика хука: хук
|
|
34
|
-
//
|
|
35
|
-
//
|
|
33
|
+
// Автоматика хука: хук обновляет отчёт после каждого коммита и ставится сам —
|
|
34
|
+
// после установки пакета (`bin/postinstall.js`) и при первом запуске в проекте
|
|
35
|
+
// (`src/hook.js`); этот ключ — её выключатель (`.size-report/…` не нужен: снятие
|
|
36
|
+
// хука возвращает проект к прежнему поведению).
|
|
36
37
|
hooks: { enabled: true },
|
|
37
38
|
journal: null,
|
|
38
39
|
links: { commitUrl: '' },
|