@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/src/render.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { fill, LOCALES } from './locales.js';
|
|
2
|
-
import { METRICS, metricView } from './metrics.js';
|
|
3
|
-
import { rowHref } from './journal.js';
|
|
4
|
-
import { cellParts, commitParts, nowModel, rowModel, valueParts } from './derived.js';
|
|
5
|
-
import { ARTIFACT_CSS, TABLE_CSS } from './css.js';
|
|
6
|
-
|
|
7
|
-
/* Статический отчёт: стили, разметка клетки и таблицы, примечание. Производные
|
|
8
|
-
* величины берёт из общего расчёта («derived.js») — того же, который исполняет
|
|
9
|
-
* страница. */
|
|
10
|
-
|
|
11
|
-
/* Оформление артефакта — своё плюс общая часть таблицы: ровно тот же текст
|
|
12
|
-
* таблицы получает и страница, поэтому оформление самой таблицы у двух отчётов
|
|
13
|
-
* одно. Что именно входит в каждую часть — в `src/css.js`. */
|
|
14
|
-
const CSS = ARTIFACT_CSS + '\n' + TABLE_CSS;
|
|
15
|
-
|
|
16
|
-
export function esc(s) {
|
|
17
|
-
return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/* Разметка клетки строки-коммита: правила — в `cellParts`, здесь только тег и
|
|
21
|
-
* классы. Клетка-дельта: абсолютные числа стоят один раз в верхней строке, иначе
|
|
22
|
-
* крупное число повторялось бы в каждой строке и колонки расползались бы. */
|
|
23
|
-
export function cellHtml(cell, first) {
|
|
24
|
-
const parts = cellParts(cell.value, cell.delta, '-');
|
|
25
|
-
const cls = 'num' + (first ? ' g' : '') + (parts.miss ? ' miss' : '');
|
|
26
|
-
if (parts.dir === null) return '<td class="' + cls + '">' + parts.text + '</td>';
|
|
27
|
-
return '<td class="' + cls + '"><span class="delta ' + parts.dir + '">' + parts.text + '</span></td>';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Разметка клетки верхней строки: правила — в `valueParts`.
|
|
31
|
-
export function valueHtml(value, first) {
|
|
32
|
-
const parts = valueParts(value);
|
|
33
|
-
return '<td class="num' + (first ? ' g' : '') + (parts.miss ? ' miss' : '') + '">' + parts.text + '</td>';
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function commitCell(row, index, cfg) {
|
|
37
|
-
const loc = LOCALES[cfg.locale];
|
|
38
|
-
const parts = commitParts(row, cfg.rows.sha, rowHref(row.section, row.sha, cfg));
|
|
39
|
-
const when = '<span class="when">' + esc(parts.when) + '</span>';
|
|
40
|
-
const title = esc(parts.title);
|
|
41
|
-
const plain = row.section === null && parts.href === null;
|
|
42
|
-
const body = parts.href
|
|
43
|
-
? '<a class="subj" title="' + title + '" href="' + esc(parts.href) + '">' + esc(parts.subject) + '</a>'
|
|
44
|
-
: '<span class="subj' + (plain ? ' plain' : '') + '" title="' + title + '">' + esc(parts.subject) + '</span>';
|
|
45
|
-
const markTitle = parts.mark.title === null
|
|
46
|
-
? (cfg.journal ? fill(loc.note.noJournalMark, { journal: cfg.journal.path }) : loc.note.noJournal)
|
|
47
|
-
: parts.mark.title;
|
|
48
|
-
const id = cfg.rows.sha ? 'c-' + row.sha.slice(0, 7) : 'c-' + (index + 1);
|
|
49
|
-
return '<th class="c-commit" id="' + id + '">'
|
|
50
|
-
+ '<div class="clip">' + when + body
|
|
51
|
-
+ '<span class="sect" title="' + esc(markTitle) + '">' + esc(parts.mark.text) + '</span>'
|
|
52
|
-
+ '</div></th>';
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function noteText(rows, cfg) {
|
|
56
|
-
const loc = LOCALES[cfg.locale];
|
|
57
|
-
const metrics = cfg.metrics.map((m) => {
|
|
58
|
-
const view = metricView(m, cfg);
|
|
59
|
-
return '<b>' + view.label + '</b> — ' + view.note;
|
|
60
|
-
}).join(loc.note.metricSep);
|
|
61
|
-
const journal = cfg.journal ? loc.note.journal : loc.note.noJournal;
|
|
62
|
-
return loc.note.intro + metrics + loc.note.metricEnd + fill(loc.note.numbers, { now: loc.now })
|
|
63
|
-
+ (cfg.journal ? fill(journal, { journal: cfg.journal.path }) : journal)
|
|
64
|
-
+ fill(loc.note.columns, { columns: cfg.columns.map((c) => c.label).join(', ') })
|
|
65
|
-
+ fill(loc.note.rows, { rows: rows.length, command: cfg.fixCommand });
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* Шапка таблицы: строка групп (итог и колонки) и под ней строка метрик. */
|
|
69
|
-
function tableHead(cfg, loc) {
|
|
70
|
-
const metrics = cfg.metrics;
|
|
71
|
-
const groupHead = (label, cls) => '<th colspan="' + metrics.length + '" class="' + cls + '">' + esc(label) + '</th>';
|
|
72
|
-
const subHead = () => metrics.map((m, i) => '<th' + (i === 0 ? ' class="g"' : '') + '>'
|
|
73
|
-
+ esc(METRICS[m].label) + '</th>').join('');
|
|
74
|
-
return '<tr>'
|
|
75
|
-
+ '<th rowspan="2" class="c-commit">' + esc(loc.commit) + '</th>'
|
|
76
|
-
+ groupHead(loc.total, 'g')
|
|
77
|
-
+ cfg.columns.map((c) => groupHead(c.label, 'g')).join('')
|
|
78
|
-
+ '</tr>\n<tr>'
|
|
79
|
-
+ subHead()
|
|
80
|
-
+ cfg.columns.map(() => subHead()).join('')
|
|
81
|
-
+ '</tr>';
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/* Тело таблицы: строки-коммиты сверху вниз — от старых к новым, — а над ними
|
|
85
|
-
* строка «сейчас» с абсолютными размерами.
|
|
86
|
-
*
|
|
87
|
-
* Дельта считается к предыдущему коммиту (в списке ниже он идёт строкой ниже),
|
|
88
|
-
* а появление файла — рост на весь его объём: иначе сумма дельт по колонке не
|
|
89
|
-
* сходилась бы с текущим размером, и верхняя строка была бы недоказуемой. Всё
|
|
90
|
-
* это считает `rowModel` — тот же, что и на странице. */
|
|
91
|
-
function tableBody(rows, cfg, loc) {
|
|
92
|
-
const metrics = cfg.metrics;
|
|
93
|
-
const cellsHtml = (make) => (cells) => cells.map((c, mi) => make(c, mi === 0)).join('');
|
|
94
|
-
const rowCells = cellsHtml((c, first) => cellHtml(c, first));
|
|
95
|
-
const nowCells = cellsHtml((v, first) => valueHtml(v, first));
|
|
96
|
-
const blocksHtml = (model, one) => one(model.total) + model.files.map(one).join('');
|
|
97
|
-
const body = rows.map((row, i) => {
|
|
98
|
-
const prev = i === 0 ? null : rows[i - 1];
|
|
99
|
-
return '<tr>' + commitCell(row, i, cfg)
|
|
100
|
-
+ blocksHtml(rowModel(row.cells, prev === null ? null : prev.cells, metrics), rowCells)
|
|
101
|
-
+ '</tr>';
|
|
102
|
-
}).reverse().join('\n');
|
|
103
|
-
const nowRow = rows.length === 0 ? '' : '<tr class="now">'
|
|
104
|
-
+ '<th class="c-commit">' + esc(loc.now) + '</th>'
|
|
105
|
-
+ blocksHtml(nowModel(rows[rows.length - 1].cells, metrics), nowCells)
|
|
106
|
-
+ '</tr>';
|
|
107
|
-
return nowRow + '\n' + body;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function render(rows, cfg) {
|
|
111
|
-
const loc = LOCALES[cfg.locale];
|
|
112
|
-
/* Подпись называет только то, что не меняется от самих служебных коммитов:
|
|
113
|
-
* число строк и список колонок. Иначе таблица считалась бы устаревшей сразу
|
|
114
|
-
* после собственного коммита — из-за пересчитанного «пропущено N» в тексте. */
|
|
115
|
-
return `<!doctype html>
|
|
116
|
-
<html lang="${loc.html}">
|
|
117
|
-
<head>
|
|
118
|
-
<meta charset="utf-8">
|
|
119
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
120
|
-
<title>${esc(cfg.title || loc.heading)}</title>
|
|
121
|
-
<style>
|
|
122
|
-
${CSS}
|
|
123
|
-
</style>
|
|
124
|
-
</head>
|
|
125
|
-
<body>
|
|
126
|
-
<h1>${esc(cfg.heading || loc.heading)}</h1>
|
|
127
|
-
<p class="note">${noteText(rows, cfg)}</p>
|
|
128
|
-
<table>
|
|
129
|
-
<thead>
|
|
130
|
-
${tableHead(cfg, loc)}
|
|
131
|
-
</thead>
|
|
132
|
-
<tbody>
|
|
133
|
-
${tableBody(rows, cfg, loc)}
|
|
134
|
-
</tbody>
|
|
135
|
-
</table>
|
|
136
|
-
</body>
|
|
137
|
-
</html>
|
|
138
|
-
`;
|
|
139
|
-
}
|