synthesisui 0.16.200 → 0.16.202
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/dist/commands/sync.js +4 -1
- package/dist/doctor/tokens.js +18 -2
- package/dist/last-sync.js +74 -3
- package/package.json +1 -1
package/dist/commands/sync.js
CHANGED
|
@@ -4,7 +4,7 @@ import { isOlderCli } from "../cli-version.js";
|
|
|
4
4
|
import { readToken, resolveRegistry } from "../config.js";
|
|
5
5
|
import { markSent, readEvents } from "../doctor/ledger.js";
|
|
6
6
|
import { checkableName, closeRequest, readRequests, verifyAndCloseRequests, } from "../doctor/requests.js";
|
|
7
|
-
import { describeDelta, readSyncMark, writeSyncMark, } from "../last-sync.js";
|
|
7
|
+
import { describeDelta, fingerprintReadings, readSyncMark, writeSyncMark, } from "../last-sync.js";
|
|
8
8
|
import { measuredScope, rememberScope } from "../measured-scope.js";
|
|
9
9
|
import { body, paint, section, snippet } from "../output.js";
|
|
10
10
|
import { repoStateOf } from "../repo-state.js";
|
|
@@ -363,6 +363,9 @@ export async function remeasure(args) {
|
|
|
363
363
|
?.declarations ?? 0,
|
|
364
364
|
seen: sum(led?.counted),
|
|
365
365
|
interpreted: sum(led?.interpreted),
|
|
366
|
+
/** O que cada componente LÊ - ver `readings` em `SyncMark`, e o defeito que ele conserta. */
|
|
367
|
+
...(args.cli ? { cli: args.cli } : {}),
|
|
368
|
+
readings: fingerprintReadings(census.components),
|
|
366
369
|
};
|
|
367
370
|
console.log(body(paint.faint(describeDelta(mark, await readSyncMark(root)))));
|
|
368
371
|
await writeSyncMark(root, mark);
|
package/dist/doctor/tokens.js
CHANGED
|
@@ -325,8 +325,24 @@ export function parseRootTokens(css) {
|
|
|
325
325
|
if (name.startsWith("--tw-"))
|
|
326
326
|
continue;
|
|
327
327
|
const value = t[2].trim();
|
|
328
|
-
if (!value
|
|
328
|
+
if (!value)
|
|
329
329
|
continue;
|
|
330
|
+
/**
|
|
331
|
+
* O ALIAS FICA, E É RESOLVIDO DEPOIS - antes ele era descartado aqui, e era justamente o
|
|
332
|
+
* token mais cheio de significado que sumia.
|
|
333
|
+
*
|
|
334
|
+
* `--loader-color: var(--color-ocean-500)` não é ruído: é um PAPEL, a frase que diz "esta
|
|
335
|
+
* função é esta cor". Descartá-lo deixava só as primitivas - a paleta sem o vocabulário.
|
|
336
|
+
*
|
|
337
|
+
* A assimetria que isso produzia, medida no repo do dono em 11/08: `declaredAlt` sai de
|
|
338
|
+
* `parseSchemeBlocks`, que não tem este filtro, então o valor ESCURO de `--loader-color` e
|
|
339
|
+
* `--color-track` viajava e o CLARO não. Dois tokens presentes só no dark, e o
|
|
340
|
+
* `CircularProgress.tsx:100` lendo `var(--color-track, …)` sem que ninguém soubesse o que
|
|
341
|
+
* `--color-track` é.
|
|
342
|
+
*
|
|
343
|
+
* Resolver é o mesmo que o caminho `installed` já faz com `resolveAliases`: a máquina existia
|
|
344
|
+
* e só não era usada aqui.
|
|
345
|
+
*/
|
|
330
346
|
if (!out.has(name))
|
|
331
347
|
out.set(name, value);
|
|
332
348
|
}
|
|
@@ -347,7 +363,7 @@ export function buildTable(input) {
|
|
|
347
363
|
*/
|
|
348
364
|
const resolved = source === "installed"
|
|
349
365
|
? resolveAliases(parseTokensWithAliases(input.css))
|
|
350
|
-
: byName;
|
|
366
|
+
: resolveAliases(byName);
|
|
351
367
|
/**
|
|
352
368
|
* Aliases first in every list.
|
|
353
369
|
*
|
package/dist/last-sync.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
3
|
import { join } from "node:path";
|
|
3
4
|
/**
|
|
@@ -13,6 +14,30 @@ import { join } from "node:path";
|
|
|
13
14
|
* "antes" - e diz isso, em vez de inventar um delta.
|
|
14
15
|
*/
|
|
15
16
|
export const LAST_SYNC_FILE = ".last-sync.json";
|
|
17
|
+
/**
|
|
18
|
+
* A IMPRESSÃO DA LINHA INTEIRA, e nunca de campos escolhidos a dedo.
|
|
19
|
+
*
|
|
20
|
+
* A tentação é hashear `props` e `count`. A lição deste repositório é que uma lista de campos
|
|
21
|
+
* escrita hoje esquece o campo de amanhã, em silêncio: `origin` nasceu em 10/08 e uma impressão
|
|
22
|
+
* seletiva não o veria. Serializar a linha com as chaves ordenadas custa nada e não tem como
|
|
23
|
+
* envelhecer.
|
|
24
|
+
*
|
|
25
|
+
* `name` sai do valor porque já É a chave - hasheá-lo junto só gastaria bytes.
|
|
26
|
+
*/
|
|
27
|
+
export function fingerprintReadings(components) {
|
|
28
|
+
const out = {};
|
|
29
|
+
for (const c of components ?? []) {
|
|
30
|
+
const name = typeof c?.name === "string" ? c.name : null;
|
|
31
|
+
if (!name)
|
|
32
|
+
continue;
|
|
33
|
+
const { name: _drop, ...rest } = c;
|
|
34
|
+
out[name] = createHash("sha256")
|
|
35
|
+
.update(JSON.stringify(rest, Object.keys(rest).sort()))
|
|
36
|
+
.digest("hex")
|
|
37
|
+
.slice(0, 12);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
16
41
|
const path = (root) => join(root, "_synthesisui", LAST_SYNC_FILE);
|
|
17
42
|
export async function readSyncMark(root) {
|
|
18
43
|
try {
|
|
@@ -47,11 +72,57 @@ export function describeDelta(now, before) {
|
|
|
47
72
|
moved("declarations", before.declarations, now.declarations);
|
|
48
73
|
moved("fragments read", before.interpreted, now.interpreted);
|
|
49
74
|
moved("fragments seen", before.seen, now.seen);
|
|
75
|
+
/**
|
|
76
|
+
* E O QUE MUDOU DE LEITURA, que é o que um conserto de leitor move. Ver `readings`.
|
|
77
|
+
*
|
|
78
|
+
* Nomeados, e não só contados: "4 components read differently" manda a pessoa procurar; com os
|
|
79
|
+
* nomes ela abre os quatro. O corte em três é o mesmo critério do resto da esteira - alguns
|
|
80
|
+
* mostram a forma, o resto vira contagem.
|
|
81
|
+
*/
|
|
82
|
+
const read = readingDelta(now, before);
|
|
83
|
+
if (read)
|
|
84
|
+
parts.push(read);
|
|
50
85
|
const when = ago(before.at);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
86
|
+
/**
|
|
87
|
+
* O INSTRUMENTO ANDOU, e isso vem junto do número em vez de depois dele. Ver `cli`.
|
|
88
|
+
*/
|
|
89
|
+
const reader = before.cli && now.cli && before.cli !== now.cli
|
|
90
|
+
? `, and the reader moved ${before.cli} → ${now.cli}, so some of this is us reading better rather than your code changing`
|
|
91
|
+
: "";
|
|
92
|
+
if (parts.length > 0)
|
|
93
|
+
return `${parts.join(" · ")} — since your last sync${when ? `, ${when}` : ""}${reader}`;
|
|
94
|
+
/**
|
|
95
|
+
* NADA MUDOU É DIFERENTE DE NÃO DÁ PARA SABER. Um carimbo de uma versão anterior a esta não tem
|
|
96
|
+
* as impressões, então afirmar que nada mudou seria afirmar sobre o que não foi medido - e é
|
|
97
|
+
* justamente a rodada que ESTREIA um leitor novo que cairia nesse silêncio.
|
|
98
|
+
*/
|
|
99
|
+
if (!before.readings)
|
|
100
|
+
return `the four totals are unchanged since your last sync${when ? `, ${when}` : ""} - what each component reads was not recorded back then, so this run has nothing to compare it against. The next one will.`;
|
|
101
|
+
return `nothing moved since your last sync${when ? `, ${when}` : ""}`;
|
|
102
|
+
}
|
|
103
|
+
/** Quantos componentes leem diferente, e quais - ou nada, quando não há o que comparar. */
|
|
104
|
+
function readingDelta(now, before) {
|
|
105
|
+
const was = before.readings;
|
|
106
|
+
const is = now.readings;
|
|
107
|
+
if (!was || !is)
|
|
108
|
+
return null;
|
|
109
|
+
const gone = Object.keys(was).filter((n) => !(n in is));
|
|
110
|
+
const born = Object.keys(is).filter((n) => !(n in was));
|
|
111
|
+
const changed = Object.keys(is).filter((n) => n in was && was[n] !== is[n]);
|
|
112
|
+
const said = [];
|
|
113
|
+
if (changed.length > 0)
|
|
114
|
+
said.push(`${changed.length} ${changedLine(changed)}`);
|
|
115
|
+
if (born.length > 0)
|
|
116
|
+
said.push(`${born.length} new: ${list(born)}`);
|
|
117
|
+
if (gone.length > 0)
|
|
118
|
+
said.push(`${gone.length} gone: ${list(gone)}`);
|
|
119
|
+
return said.length > 0 ? said.join(" · ") : null;
|
|
54
120
|
}
|
|
121
|
+
const SHOW = 3;
|
|
122
|
+
const list = (names) => names.length <= SHOW
|
|
123
|
+
? names.join(", ")
|
|
124
|
+
: `${names.slice(0, SHOW).join(", ")} and ${names.length - SHOW} more`;
|
|
125
|
+
const changedLine = (changed) => `component${changed.length === 1 ? "" : "s"} read differently (${list(changed)})`;
|
|
55
126
|
/** Quanto tempo faz, em palavras. Um carimbo ilegível não vira frase. */
|
|
56
127
|
function ago(at) {
|
|
57
128
|
const then = Date.parse(at);
|
package/package.json
CHANGED