@vernikr/size-report 1.1.1
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 +241 -0
- package/LICENSE +21 -0
- package/README.md +892 -0
- package/bin/size.js +6 -0
- package/package.json +61 -0
- package/src/artifact.css +8 -0
- package/src/artifact.js +21 -0
- package/src/check.js +142 -0
- package/src/cli.js +476 -0
- package/src/config.js +158 -0
- package/src/css.js +37 -0
- package/src/data.js +105 -0
- package/src/derived.js +115 -0
- package/src/doctor.js +225 -0
- package/src/explain.js +113 -0
- package/src/git.js +221 -0
- package/src/history.js +206 -0
- package/src/hook.js +404 -0
- package/src/journal.js +66 -0
- package/src/locales.js +124 -0
- package/src/metrics.js +268 -0
- package/src/minify.js +67 -0
- package/src/optional.js +31 -0
- package/src/page/app.css +165 -0
- package/src/page/app.js +560 -0
- package/src/page/build.js +102 -0
- package/src/parse-worker.js +34 -0
- package/src/parse.js +136 -0
- package/src/refusal.js +133 -0
- package/src/render.js +131 -0
- package/src/size-table.js +86 -0
- package/src/strip.js +231 -0
- package/src/table.css +35 -0
- package/src/tokens.js +76 -0
- package/src/tool.js +24 -0
- package/templates/README.md +79 -0
- package/templates/ci.yml +67 -0
- package/templates/size-report.config.json +53 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
История выпусков `@vernikr/size-report`. Версии — SemVer (`PLAN.md` §8.2); версия данных —
|
|
4
|
+
`schema: 1`, она заморожена выпуском 1.0.0 и меняется только вместе с MAJOR.
|
|
5
|
+
|
|
6
|
+
## Что значит «изменились числа»
|
|
7
|
+
|
|
8
|
+
Числа этого инструмента — его продукт, а не отладочная печать: у каждой метрики есть
|
|
9
|
+
источник (`raw` — размер объекта git, `min` — сжатая форма, `tok` — токены) и есть
|
|
10
|
+
честность (точный счёт или приближение с пометкой). Поэтому у выпуска обязателен
|
|
11
|
+
раздел «Что изменится в числах»: он отвечает, **у кого числа поедут и почему**.
|
|
12
|
+
Выпуск, после которого число меняется молча, — дефект этого инструмента, а не выпуск.
|
|
13
|
+
|
|
14
|
+
Замеры в этих разделах сняты на фикстуре пакета — `fixtures/synthetic/history.bundle`,
|
|
15
|
+
16 коммитов и 10 колонок, состояние на её верхушке. Таблица выпуска не пересказ: её
|
|
16
|
+
сверяет с живым прогоном инструмента `test/changelog.test.js`, а повторить замер
|
|
17
|
+
руками можно, склонировав бандл и прогнав `node bin/size.js --config <настройки> --data`,
|
|
18
|
+
где за основу взяты `fixtures/synthetic/config.json`, метрики — `raw`, `min`, `tok`, а
|
|
19
|
+
способ минификации — `strip` или `esbuild`.
|
|
20
|
+
|
|
21
|
+
## 1.1.1 — 2026-09-15
|
|
22
|
+
|
|
23
|
+
Выпуск имени, а не измерения: пакет переехал в область владельца
|
|
24
|
+
(`@vernikr/size-report`) — имя `size-report` в реестре занято чужим пакетом, и
|
|
25
|
+
опубликоваться под ним было нельзя (`PLAN.md` §10). Заодно в поставку вошёл файл
|
|
26
|
+
лицензии, которого манифест обещал, а в дереве не было.
|
|
27
|
+
|
|
28
|
+
- **Имя пакета — `@vernikr/size-report`.** `bin` остался `size`, установка —
|
|
29
|
+
`pnpm add -D @vernikr/size-report`, зов — `pnpm exec size`.
|
|
30
|
+
- Тот же выпуск закрывает три правки после 1.1.0: совет отказа проверяется
|
|
31
|
+
исполнением, а не на слово (`REFACTOR.md` R-4.22), якорь фикстуры выведен из
|
|
32
|
+
дерева в историю (R-1.5, R-3.4) и числа переименования в `PLAN.md` §10 сверены
|
|
33
|
+
с фактом.
|
|
34
|
+
- **Имя инструмента в данных (`--data`) совпадает с именем пакета** — оно же
|
|
35
|
+
входит в паспорт отчёта, от которого зависят ключ памяти страницы и якорь
|
|
36
|
+
ссылки. Поэтому у отчёта, пересобранного этим выпуском, **сохранённый выбор
|
|
37
|
+
читателя в браузере не подхватится один раз**: запись прошлого выпуска лежит
|
|
38
|
+
под другим ключом. Числа и разметка от этого не меняются, а первый читатель и
|
|
39
|
+
так видит умолчание.
|
|
40
|
+
- В поставку добавлен `LICENSE` (MIT) — манифест называл лицензию, а файла в
|
|
41
|
+
тарболле не было.
|
|
42
|
+
|
|
43
|
+
### Что изменится в числах
|
|
44
|
+
|
|
45
|
+
**Ничего.** Это не обещание, а замер: таблица ниже снята выпуском 1.1.1 и
|
|
46
|
+
совпадает с таблицей 1.1.0 до последней клетки — измерение этот выпуск не трогает
|
|
47
|
+
вовсе, а правки лежат в имени пакета, текстах отказов и выводе якоря фикстуры.
|
|
48
|
+
Доказано не словом: вывод `--json` и артефакт побайтово равны замороженному
|
|
49
|
+
эталону на фикстуре и на живой истории проекта-потребителя, а его закоммиченная
|
|
50
|
+
таблица пересобирается в те же байты (`sha256 863ce3e9…`).
|
|
51
|
+
|
|
52
|
+
| Файл | raw | min со strip | min с esbuild | tok |
|
|
53
|
+
|---|---|---|---|---|
|
|
54
|
+
| code.js | 735 | 276 | 185 | 168 |
|
|
55
|
+
| modern.js | 246 | 51 | 45 | 44 |
|
|
56
|
+
| config.mjs | 172 | 45 | 40 | 40 |
|
|
57
|
+
| заметки.md | 306 | 303 | 303 | 53 |
|
|
58
|
+
| crlf.txt | 63 | 60 | 60 | 10 |
|
|
59
|
+
| package.json | 87 | 69 | 69 | 34 |
|
|
60
|
+
| style.css | 156 | 55 | 43 | 38 |
|
|
61
|
+
| table.toml | 300 | 299 | 299 | 52 |
|
|
62
|
+
| empty.js | 0 | 0 | 0 | 0 |
|
|
63
|
+
| WORKLOG.md | 446 | 439 | 439 | 101 |
|
|
64
|
+
| **ИТОГО** | **2511** | **1597** | **1483** | **540** |
|
|
65
|
+
|
|
66
|
+
Разрезы те же, что у 1.0.0 и 1.1.0, и читаются так же: `raw` — размер объекта
|
|
67
|
+
git; `min` со `strip` — упрощение, под которым снят эталон паритета; `min` со
|
|
68
|
+
`esbuild` — то, что даёт настоящий минификатор (`minify.engine`); `tok` — словарь
|
|
69
|
+
`o200k_base` с `gpt-tokenizer 4.0.0`. У проекта прежние настройки означают
|
|
70
|
+
`strip`, поэтому обновление «само» чисел не меняет. gzip в выпуск по-прежнему не
|
|
71
|
+
входит (`PLAN.md` §10, D4).
|
|
72
|
+
|
|
73
|
+
## 1.1.0 — 2026-09-15
|
|
74
|
+
|
|
75
|
+
Первый выпуск после 1.0.0, и в нём **ни одной правки измерения** — только то, что
|
|
76
|
+
нашлось живыми прогонами после выпуска, все в ответах инструмента человеку.
|
|
77
|
+
|
|
78
|
+
- `explain` понимает то, чем коммиты зовут на самом деле: `HEAD`, ветку, тег,
|
|
79
|
+
`HEAD~1`, полный и короткий sha. Раньше имя ревизии выглядело как несуществующий
|
|
80
|
+
коммит («в истории нет коммита «HEAD»») — то есть отказ называл не ту причину.
|
|
81
|
+
Коммит вне истории отчёта теперь отдельная причина с названным sha.
|
|
82
|
+
- У отказов появился **каталог и сторож** (`tools/refusals.js`): по строке на
|
|
83
|
+
каждый отказ с кодом выхода и обязательными фразами, карты мест отказа держат
|
|
84
|
+
числа, а две проверки делят обе половины обещания — одна вызывает отказ, другая
|
|
85
|
+
требует у каждого места пункт каталога. Новый отказ не может появиться без
|
|
86
|
+
проверки. Заодно исправлены шесть мест, где текст врал или молчал о починке, и
|
|
87
|
+
появилась одна новая причина: **`нет git`** — раньше «git не запустился» и
|
|
88
|
+
«здесь нет репозитория» назывались одним текстом с оговоркой «или», то есть не
|
|
89
|
+
назывались вовсе.
|
|
90
|
+
- Проверка настроек отвергает колонку, у которой путь — не непустая строка
|
|
91
|
+
(`"paths": [123]`): раньше такая колонка ни с чем не совпадала, а отчёт отдавал
|
|
92
|
+
нули **за успех**.
|
|
93
|
+
- `--init` в каталоге без знакомых расширений больше не печатает «✗» при коде
|
|
94
|
+
выхода 0: знак и код говорили разное.
|
|
95
|
+
- **Репозиторий пакета стал публичным**, поэтому установка не требует ни ключа,
|
|
96
|
+
ни токена, ни шага в CI: `github:` pnpm разрешает в архив `codeload.github.com`
|
|
97
|
+
по HTTPS (`WORKLOG.md` §44).
|
|
98
|
+
|
|
99
|
+
### Что изменится в числах
|
|
100
|
+
|
|
101
|
+
**Ничего.** Это не обещание, а замер: таблица ниже снята выпуском 1.1.0 и совпадает
|
|
102
|
+
с таблицей 1.0.0 до последней клетки — метрики, настройки по умолчанию и датчики те
|
|
103
|
+
же, а правки этого выпуска лежат в текстах отказов, разборе аргументов командной
|
|
104
|
+
строки и проверке настроек, куда измерение не заходит. Доказано не словом: вывод
|
|
105
|
+
`--json` и артефакт побайтово равны замороженному эталону на фикстуре и на живой
|
|
106
|
+
истории проекта-потребителя, а его закоммиченная таблица (211 КБ) тем же выпуском
|
|
107
|
+
пересобирается в те же байты (`sha256 863ce3e9…`).
|
|
108
|
+
|
|
109
|
+
| Файл | raw | min со strip | min с esbuild | tok |
|
|
110
|
+
|---|---|---|---|---|
|
|
111
|
+
| code.js | 735 | 276 | 185 | 168 |
|
|
112
|
+
| modern.js | 246 | 51 | 45 | 44 |
|
|
113
|
+
| config.mjs | 172 | 45 | 40 | 40 |
|
|
114
|
+
| заметки.md | 306 | 303 | 303 | 53 |
|
|
115
|
+
| crlf.txt | 63 | 60 | 60 | 10 |
|
|
116
|
+
| package.json | 87 | 69 | 69 | 34 |
|
|
117
|
+
| style.css | 156 | 55 | 43 | 38 |
|
|
118
|
+
| table.toml | 300 | 299 | 299 | 52 |
|
|
119
|
+
| empty.js | 0 | 0 | 0 | 0 |
|
|
120
|
+
| WORKLOG.md | 446 | 439 | 439 | 101 |
|
|
121
|
+
| **ИТОГО** | **2511** | **1597** | **1483** | **540** |
|
|
122
|
+
|
|
123
|
+
Разрезы те же, что у 1.0.0, и читаются так же: `raw` — размер объекта git (ни от
|
|
124
|
+
чего, кроме него, не зависит); `min` со `strip` — умолчание, под которым снят
|
|
125
|
+
эталон паритета; `min` со `esbuild` — то, что даёт настоящий минификатор, если его
|
|
126
|
+
включить (`minify.engine`); `tok` — словарь `o200k_base` с `gpt-tokenizer 4.0.0`.
|
|
127
|
+
У проекта прежние настройки означают `strip`, поэтому обновление «само» чисел не
|
|
128
|
+
меняет; способ `esbuild` остаётся осознанным решением того, кто его включает.
|
|
129
|
+
gzip в выпуск по-прежнему не входит (`PLAN.md` §10, D4).
|
|
130
|
+
|
|
131
|
+
## 1.0.0 — 2026-09-14
|
|
132
|
+
|
|
133
|
+
Первый выпуск: инструмент вынесен из проекта-потребителя в отдельный пакет
|
|
134
|
+
(`PLAN.md` §5, шаги 0–5) — раньше он жил копией внутри чужого репозитория. Выпусков
|
|
135
|
+
до него не было: версия в манифесте стояла `0.0.0`, а работа шла внутри этого
|
|
136
|
+
репозитория (`WORKLOG.md`, `REFACTOR.md`, `PLAN.md`); номера `0.1.0`–`0.5.0` в
|
|
137
|
+
`PLAN.md` §12 — план выпусков, а не их история.
|
|
138
|
+
|
|
139
|
+
Версия `1.0.0` — не про объём изменений, а про заморозку: `schema: 1` данных этой
|
|
140
|
+
версией объявлена стабильной, и сломать её теперь можно только MAJOR-выпуском с
|
|
141
|
+
миграцией. Версия инструмента попадает в данные (`tool.version`), версии
|
|
142
|
+
минификатора и словаря — в способ получения числа, поэтому «числа этого выпуска» —
|
|
143
|
+
это числа с `esbuild 0.28.2` и `gpt-tokenizer 4.0.0` в тех разрезах, где они
|
|
144
|
+
задействованы.
|
|
145
|
+
|
|
146
|
+
### Что изменится в числах
|
|
147
|
+
|
|
148
|
+
Замер на фикстуре, состояние на HEAD (`now`), метрики `raw`, `min`, `tok`, словарь
|
|
149
|
+
`o200k_base`:
|
|
150
|
+
|
|
151
|
+
| Файл | raw | min со strip | min с esbuild | tok |
|
|
152
|
+
|---|---|---|---|---|
|
|
153
|
+
| code.js | 735 | 276 | 185 | 168 |
|
|
154
|
+
| modern.js | 246 | 51 | 45 | 44 |
|
|
155
|
+
| config.mjs | 172 | 45 | 40 | 40 |
|
|
156
|
+
| заметки.md | 306 | 303 | 303 | 53 |
|
|
157
|
+
| crlf.txt | 63 | 60 | 60 | 10 |
|
|
158
|
+
| package.json | 87 | 69 | 69 | 34 |
|
|
159
|
+
| style.css | 156 | 55 | 43 | 38 |
|
|
160
|
+
| table.toml | 300 | 299 | 299 | 52 |
|
|
161
|
+
| empty.js | 0 | 0 | 0 | 0 |
|
|
162
|
+
| WORKLOG.md | 446 | 439 | 439 | 101 |
|
|
163
|
+
| **ИТОГО** | **2511** | **1597** | **1483** | **540** |
|
|
164
|
+
|
|
165
|
+
- **У проекта с прежними настройками не поедет ничего.** Существующие конфиги
|
|
166
|
+
`minify.engine` не задают, а умолчание — `strip`: те же комментарии и отступы, те
|
|
167
|
+
же имена, те же байты, что у инструмента до этого выпуска. Это доказано не словом:
|
|
168
|
+
вывод `--json` и собранный артефакт совпадают побайтово с замороженным эталоном —
|
|
169
|
+
на фикстуре и на живой истории проекта-потребителя (`fixtures/synthetic/`,
|
|
170
|
+
`fixtures/parity/`, проверки `test/parity.test.js`, `test/frozen.test.js`).
|
|
171
|
+
- **`raw` не зависит ни от чего, кроме объекта git**: это его размер, содержимое
|
|
172
|
+
файла для этой метрики не читается вовсе. Ни настройки, ни способ минификации, ни
|
|
173
|
+
версия инструмента на него не влияют.
|
|
174
|
+
- **`min` со `esbuild` меньше**, чем со `strip`, и это единственное, что меняет
|
|
175
|
+
числа, если включить настоящее сжатие: имена сокращены, пробелы убраны. На фикстуре
|
|
176
|
+
итог 1597 → **1483** (−7 %), по файлам — **−33 %** на `code.js` (276 → 185) и
|
|
177
|
+
**−22 %** на `style.css` (55 → 43). Для форматов, которых минификатор не берёт
|
|
178
|
+
(`.md`, `.txt`, `.toml`, `.json`), число то же, что со `strip`: 303, 60, 299, 69.
|
|
179
|
+
Именно поэтому метрика помечена приближением **целиком**: точность колонки
|
|
180
|
+
считается по худшей клетке, а не по большинству (пометка стоит и у отдельной
|
|
181
|
+
клетки — `test/minify.test.js`). Способ `esbuild` ставит `--init` новым проектам;
|
|
182
|
+
перевод существующего проекта на него — осознанное решение, а не побочный эффект
|
|
183
|
+
обновления.
|
|
184
|
+
- **`tok` — число новое, сравнивать его не с чем**: метрики не было у прежнего
|
|
185
|
+
инструмента, это не «изменилось», а «появилось». Точный счёт словарём даёт на
|
|
186
|
+
фикстуре **540**; та же фикстура без словаря считается оценкой по длине
|
|
187
|
+
(1 токен ≈ 3 знака) и даёт **583** — число другое, поэтому оно помечено
|
|
188
|
+
приближением, а прогон отдаёт **код 4**, а не зелёный успех
|
|
189
|
+
(`SIZE_REPORT_NO_OPTIONAL` воспроизводит установку без необязательных
|
|
190
|
+
зависимостей).
|
|
191
|
+
- **Без `esbuild`** `min` отступает к `strip`: те же 1597, с пометкой приближения и
|
|
192
|
+
кодом 4. Числа от этого не ломаются, но и не выдаются за сжатие.
|
|
193
|
+
- **`gzip` в 1.0.0 не поставляется**: метрики нет ни в черновике настроек, ни в
|
|
194
|
+
документации; в реестре она пока принимается, а её удаление — `PLAN.md` §10 (D4),
|
|
195
|
+
изменение поведения, а не перенос.
|
|
196
|
+
- **Окружение машины на числа не влияет — и это тоже изменение**, относительно
|
|
197
|
+
инструмента до этого выпуска: он читал пути и переводы строк так, как настроена
|
|
198
|
+
машина, и на установке Git «по умолчанию» либо давал неверные числа, либо падал
|
|
199
|
+
вовсе (`BLOCKERS.md` §B1, §B2, §N10). Теперь вывод одинаков в любой среде, и это
|
|
200
|
+
доказывается прогоном с погашенными настройками машины (`GIT_CONFIG_GLOBAL=/dev/null`).
|
|
201
|
+
|
|
202
|
+
### Что вошло
|
|
203
|
+
|
|
204
|
+
- Три метрики: `raw` (размер объекта git), `min` (в двух способах — снятие балласта
|
|
205
|
+
и настоящее сжатие через `esbuild`), `tok` (токены выбранного словаря). Числа
|
|
206
|
+
абсолютные, производные (дельты, суммы, фильтры) считает страница.
|
|
207
|
+
- Интерактивный отчёт: дерево файлов, категории, переключение метрик, память выбора
|
|
208
|
+
между открытиями и передача выбора ссылкой; страница — один самодостаточный файл,
|
|
209
|
+
открывается с диска без сети.
|
|
210
|
+
- Команды: сборка отчёта, сверка с историей (`size check`), объяснение пропущенной
|
|
211
|
+
строки (`size explain <sha>`), диагностика (`size doctor`), установка и снятие
|
|
212
|
+
хука автообновления отчёта, `--init` с черновиком настроек.
|
|
213
|
+
- Шаблоны для подключаемого проекта: черновик настроек и описание проверки для CI.
|
|
214
|
+
- Сторожа, которыми проверяется не код, а обещания: паритет с замороженным эталоном,
|
|
215
|
+
живая история, работа из собранного пака, утверждения документации, закрепления
|
|
216
|
+
настроек git на границе вызова.
|
|
217
|
+
|
|
218
|
+
### Исправлено
|
|
219
|
+
|
|
220
|
+
- Молчание при опечатках и в несовместимых сочетаниях ключей: неизвестное слово,
|
|
221
|
+
лишнее слово, два режима сразу, ключ без значения и `--json` там, где ответа в
|
|
222
|
+
JSON нет, — теперь отказ с названным виновником и готовой командой, а не код 0 с
|
|
223
|
+
чужой работой.
|
|
224
|
+
- Колонка, чей файл жил в истории и был удалён до HEAD, роняла прогон с бессмысленным
|
|
225
|
+
текстом отказа; выбор пути перестал зависеть от настроек переименований
|
|
226
|
+
(`BLOCKERS.md` §B3, §N8).
|
|
227
|
+
- Зависимость чисел от окружения машины (`BLOCKERS.md` §B1, §B2, §N10).
|
|
228
|
+
|
|
229
|
+
### Не входит в 1.0.0
|
|
230
|
+
|
|
231
|
+
- `docs/METHODS.md`, `docs/DATA-FORMAT.md`, `docs/ARCHITECTURE.md` — документация
|
|
232
|
+
пакета из `PLAN.md` §8.3; сегодня роль каждого числа описана в `README.md`.
|
|
233
|
+
- Кэш замеров, разделение быстрого и медленного наборов проверок, профиль на истории
|
|
234
|
+
в пару тысяч коммитов — `PLAN.md` §5, шаг 6.
|
|
235
|
+
- Удаление метрики `gzip` из реестра (`PLAN.md` §10, D4) и лицензионный файл
|
|
236
|
+
(открытый вопрос §10).
|
|
237
|
+
- Поставка `dist/app.js` (пре-собранная программа отчёта) и публикация в npm:
|
|
238
|
+
установка идёт git-зависимостью из публичного репозитория (публичным он стал
|
|
239
|
+
2026-09-14, `WORKLOG.md` §44), а в npm пакет не опубликован — `PLAN.md` §8.4.
|
|
240
|
+
- Минификация разметки (HTML), JSX/TSX и другие семейства токенизаторов, кроме
|
|
241
|
+
`openai`: у них нет своего словаря, а считать чужим — выдавать догадку за число.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 vernikr
|
|
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.
|