synthesisui 0.16.326 → 0.16.328
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/anatomy-from-sketch.js +45 -5
- package/dist/commands/doctor.js +12 -1
- package/dist/commands/import.js +38 -1
- package/dist/doctor/ledger.js +54 -0
- package/dist/install-marks.js +10 -1
- package/dist/naming-queue.js +4 -1
- package/dist/populations.spec-input.js +54 -0
- package/dist/repo-state.js +10 -1
- package/package.json +1 -1
|
@@ -318,7 +318,24 @@ export function anatomyFromSketch(sketch, defines,
|
|
|
318
318
|
* from `recharts: ^2.12.0`, since both are spelled the same way. See
|
|
319
319
|
* `frontierOf`.
|
|
320
320
|
*/
|
|
321
|
-
versionOf
|
|
321
|
+
versionOf,
|
|
322
|
+
/**
|
|
323
|
+
* QUAL NÓ JÁ FOI ABSORVIDO EM `base` - ver `CensusLook.consumedAt`, onde o fato nasce.
|
|
324
|
+
*
|
|
325
|
+
* number consuma EXATAMENTE esse nó
|
|
326
|
+
* "none" a coleta mediu e não absorveu nenhum - não consuma nenhum
|
|
327
|
+
* undefined censo LEGADO - a regra antiga, byte a byte
|
|
328
|
+
*
|
|
329
|
+
* `undefined` NUNCA é `"none"`: um censo gravado antes desta medição existir não disse que não
|
|
330
|
+
* absorveu nada; ele não disse nada. Tratá-lo como `"none"` mudaria retroativamente a leitura de
|
|
331
|
+
* 386 componentes num app real, dos quais 26 mudariam de fato - e mudar dado antigo sem uma nova
|
|
332
|
+
* medição é a definição de reinterpretar o passado.
|
|
333
|
+
*
|
|
334
|
+
* Opcional porque 37 dos 39 chamadores são specs que montam um sketch à mão e testam a regra
|
|
335
|
+
* legada de propósito. Os chamadores de PRODUÇÃO são dois, e `anatomy-consumed.guard.spec.ts`
|
|
336
|
+
* nomeia os dois: um parâmetro opcional que se pode esquecer é o defeito que este item desfaz.
|
|
337
|
+
*/
|
|
338
|
+
consumedAt) {
|
|
322
339
|
const notes = [];
|
|
323
340
|
const libraries = [];
|
|
324
341
|
if (!Array.isArray(sketch) || sketch.length === 0)
|
|
@@ -662,10 +679,33 @@ versionOf) {
|
|
|
662
679
|
* root arriving as a sibling (dono, 03/08). The reader stamps which node the
|
|
663
680
|
* component returns - see `SketchNode.root`.
|
|
664
681
|
*/
|
|
665
|
-
|
|
666
|
-
|
|
682
|
+
/**
|
|
683
|
+
* ═══ DADO NOVO NÃO DEDUZ NADA (28/08, T43-b) ═══
|
|
684
|
+
*
|
|
685
|
+
* A linha abaixo era uma dedução por POSIÇÃO - "o nó carimbado, senão o primeiro de d0, senão o
|
|
686
|
+
* zero" - e ela discordava do coletor exatamente onde a âncora falha. Num componente que devolve
|
|
687
|
+
* um Fragment o coletor não absorve nada em `base`, e esta linha consumia um nó mesmo assim: as
|
|
688
|
+
* classes daquele nó caíam no vazio. Medido no `frontend-hub`: 8 componentes.
|
|
689
|
+
*
|
|
690
|
+
* Com o fato, não há o que deduzir. Sem o fato - censo legado - a dedução antiga fica INTEIRA,
|
|
691
|
+
* porque um censo velho não disse "não absorvi nada": ele não disse nada.
|
|
692
|
+
*/
|
|
693
|
+
const top = consumedAt === "none"
|
|
694
|
+
? -1
|
|
695
|
+
: typeof consumedAt === "number"
|
|
696
|
+
? consumedAt
|
|
697
|
+
: /** LEGADO, e esta é a regra antiga sem uma vírgula mudada. */
|
|
698
|
+
(() => {
|
|
699
|
+
const stamped = sketch.findIndex((node) => node?.root);
|
|
700
|
+
return stamped >= 0 ? stamped : roots.length > 0 ? roots[0] : 0;
|
|
701
|
+
})();
|
|
702
|
+
/**
|
|
703
|
+
* `top === -1` é "nenhum nó foi consumido", e então TODO nó de d0 é emitido com as classes dele -
|
|
704
|
+
* que é o conserto: nada se perde e nada é inventado. `roots.filter(at => at !== top)` já devolve
|
|
705
|
+
* todos quando `top` não é um índice, então a mesma linha serve aos dois casos.
|
|
706
|
+
*/
|
|
667
707
|
const read = [
|
|
668
|
-
...(kids[top] ?? []).flatMap((child) => build(child, 0)),
|
|
708
|
+
...(top >= 0 ? (kids[top] ?? []).flatMap((child) => build(child, 0)) : []),
|
|
669
709
|
...roots.filter((at) => at !== top).flatMap((sibling) => build(sibling, 0)),
|
|
670
710
|
];
|
|
671
711
|
/**
|
|
@@ -678,7 +718,7 @@ versionOf) {
|
|
|
678
718
|
* as empty boxes: a Chat that says nothing about messages reads as a component
|
|
679
719
|
* we failed to extract (dono, 01/08).
|
|
680
720
|
*/
|
|
681
|
-
const rootNode = sketch[top];
|
|
721
|
+
const rootNode = top >= 0 ? sketch[top] : undefined;
|
|
682
722
|
if (rootNode?.slot) {
|
|
683
723
|
const only = EXPECTS[String(rootNode.tag ?? "").toLowerCase()];
|
|
684
724
|
/**
|
package/dist/commands/doctor.js
CHANGED
|
@@ -8,7 +8,7 @@ import { emptyTally, internalSpecifiers, scanComponentsInto, tallyToInventory, }
|
|
|
8
8
|
import { checkContracts } from "../doctor/contract-check.js";
|
|
9
9
|
import { describeMissing, missingDependencies, summarizeMissing, } from "../doctor/dependencies.js";
|
|
10
10
|
import { findFrozenBindings } from "../doctor/frozen.js";
|
|
11
|
-
import { appendEvent, COVERAGE_RULE, readEvents, suggestionsFrom, summarize, } from "../doctor/ledger.js";
|
|
11
|
+
import { appendEvent, COVERAGE_RULE, readEvents, suggestionsFrom, unrepresentedFrom, summarize, } from "../doctor/ledger.js";
|
|
12
12
|
import { bindingsFromDocument, countComponents, findOverrides, } from "../doctor/overrides.js";
|
|
13
13
|
import { checkableName, readRequests, verifyAndCloseRequests, } from "../doctor/requests.js";
|
|
14
14
|
import { DEFAULT_ROOT_PX, rootSizeOf, saidOfRoot, } from "../doctor/root-size.js";
|
|
@@ -938,6 +938,8 @@ export async function doctor(opts) {
|
|
|
938
938
|
...(d.repeats.some((r) => nameToWrite(r))
|
|
939
939
|
? { matched: suggestionsFrom(d.repeats) }
|
|
940
940
|
: {}),
|
|
941
|
+
/** SEMPRE, inclusive vazio - ver `CheckEvent.unrepresentedMatches`: o vazio é a medição. */
|
|
942
|
+
unrepresentedMatches: unrepresentedFrom(d.findings, suggestionsFrom(d.repeats)),
|
|
941
943
|
}).catch(() => { });
|
|
942
944
|
console.log("");
|
|
943
945
|
if (opts.fix) {
|
|
@@ -1149,6 +1151,15 @@ export async function doctor(opts) {
|
|
|
1149
1151
|
...(d.repeats.some((r) => nameToWrite(r))
|
|
1150
1152
|
? { matched: suggestionsFrom(d.repeats) }
|
|
1151
1153
|
: {}),
|
|
1154
|
+
/**
|
|
1155
|
+
* E AS OCORRÊNCIAS QUE OS PARES NÃO CARREGAM - ver `CheckEvent.unrepresentedMatches`.
|
|
1156
|
+
*
|
|
1157
|
+
* ESCRITO SEMPRE, inclusive como lista vazia, e é a única forma de o campo significar alguma
|
|
1158
|
+
* coisa: ausente quer dizer "um CLI que não media isto", e `[]` quer dizer "mediu e não há".
|
|
1159
|
+
* Escrevê-lo condicionalmente faria os dois estados virarem um, e um cliente com ledger antigo
|
|
1160
|
+
* passaria a parecer um cliente medido sem achados.
|
|
1161
|
+
*/
|
|
1162
|
+
unrepresentedMatches: unrepresentedFrom(d.findings, suggestionsFrom(d.repeats)),
|
|
1152
1163
|
});
|
|
1153
1164
|
}
|
|
1154
1165
|
if (hasSystem && fullRun) {
|
package/dist/commands/import.js
CHANGED
|
@@ -829,6 +829,22 @@ export async function takeCensus(root, opts) {
|
|
|
829
829
|
if (esize > 0 || etag || esketch.length > 0) {
|
|
830
830
|
looks[extra.name] = {
|
|
831
831
|
...(esketch.length > 0 ? { sketch: esketch } : {}),
|
|
832
|
+
/**
|
|
833
|
+
* O MESMO FATO NO SEGUNDO COMPONENTE DO ARQUIVO - ver `CensusLook.consumedAt`.
|
|
834
|
+
*
|
|
835
|
+
* Escrever só no caminho primário deixaria metade dos looks de um arquivo com dois
|
|
836
|
+
* componentes no estado LEGADO para sempre, e o deriver voltaria a deduzir por posição
|
|
837
|
+
* exatamente neles. Um campo que só metade dos caminhos escreve é um campo que mente
|
|
838
|
+
* sobre o que a medição cobriu.
|
|
839
|
+
*/
|
|
840
|
+
...(esketch.length > 0
|
|
841
|
+
? {
|
|
842
|
+
consumedAt: (() => {
|
|
843
|
+
const at = esketch.findIndex((n) => n.root);
|
|
844
|
+
return at >= 0 ? at : "none";
|
|
845
|
+
})(),
|
|
846
|
+
}
|
|
847
|
+
: {}),
|
|
832
848
|
/**
|
|
833
849
|
* Ver `CensusLook.aside` - o segundo componente do arquivo também.
|
|
834
850
|
*
|
|
@@ -1030,6 +1046,23 @@ export async function takeCensus(root, opts) {
|
|
|
1030
1046
|
* the owner's rule, adopted verbatim (dono, 01/08).
|
|
1031
1047
|
*/
|
|
1032
1048
|
const sketch = sketchOf(src, found[0].name);
|
|
1049
|
+
/**
|
|
1050
|
+
* QUAL NÓ FOI ABSORVIDO EM `base` - o fato, medido onde ele acontece. Ver
|
|
1051
|
+
* `CensusLook.consumedAt`.
|
|
1052
|
+
*
|
|
1053
|
+
* `rootClasses` acha o elemento pela âncora `returnAt` → primeiro `<`, e `sketchOf` carimba
|
|
1054
|
+
* `root` com a MESMA âncora. Quando ela acha um elemento, é o className DELE que entra em
|
|
1055
|
+
* `base` - com classes ou sem, e sem é o caso comum. Quando ela não acha (retorno em
|
|
1056
|
+
* Fragment, ou `returnAt` = -1), nada é absorvido e nenhum nó pode ser consumido.
|
|
1057
|
+
*
|
|
1058
|
+
* Provado nos dois repositórios reais, 139 arquivos: NUNCA existe um caso sem carimbo em que
|
|
1059
|
+
* `rootClasses` tenha lido alguma classe. As duas leituras falham juntas, sempre.
|
|
1060
|
+
*
|
|
1061
|
+
* E o carimbo `root` continua sendo outra coisa - a raiz ESTRUTURAL. Este campo é derivado
|
|
1062
|
+
* dele hoje porque hoje eles coincidem; ele não passa a ser ele.
|
|
1063
|
+
*/
|
|
1064
|
+
const consumedIndex = sketch.findIndex((n) => n.root);
|
|
1065
|
+
const consumed = consumedIndex >= 0 ? consumedIndex : "none";
|
|
1033
1066
|
/**
|
|
1034
1067
|
* THE CSS THE COMPONENT CARRIES INSIDE ITSELF.
|
|
1035
1068
|
*
|
|
@@ -1192,6 +1225,8 @@ export async function takeCensus(root, opts) {
|
|
|
1192
1225
|
}
|
|
1193
1226
|
: {}),
|
|
1194
1227
|
...withoutDark,
|
|
1228
|
+
/** SEMPRE, inclusive `"none"` - ver `CensusLook.consumedAt`: o vazio é a medição. */
|
|
1229
|
+
consumedAt: consumed,
|
|
1195
1230
|
base,
|
|
1196
1231
|
states,
|
|
1197
1232
|
/**
|
|
@@ -3545,7 +3580,9 @@ quiet = false) {
|
|
|
3545
3580
|
*/
|
|
3546
3581
|
const derived = Array.isArray(anatomy) && anatomy.length > 0
|
|
3547
3582
|
? null
|
|
3548
|
-
: anatomyFromSketch(looks[component]?.sketch, resolveRef, (pkg) => deps[pkg]
|
|
3583
|
+
: anatomyFromSketch(looks[component]?.sketch, resolveRef, (pkg) => deps[pkg],
|
|
3584
|
+
/** O fato medido na coleta, ou `undefined` num look legado - ver `CensusLook.consumedAt`. */
|
|
3585
|
+
looks[component]?.consumedAt);
|
|
3549
3586
|
if (derived?.read.length) {
|
|
3550
3587
|
for (const note of derived.notes)
|
|
3551
3588
|
notes.add(note);
|
package/dist/doctor/ledger.js
CHANGED
|
@@ -36,6 +36,17 @@ export const LEDGER_FILE = "ledger.jsonl";
|
|
|
36
36
|
* inteiro o que decide alguma coisa.
|
|
37
37
|
*/
|
|
38
38
|
const MATCHED_CAP = 300;
|
|
39
|
+
/**
|
|
40
|
+
* O MESMO TETO PARA AS OCORRÊNCIAS, e aqui ele corta MAIS, porque cada entrada é uma ocorrência e
|
|
41
|
+
* não um grupo. Medido antes de escolher o número: 1 no escopo que o repositório real mede, 2 no
|
|
42
|
+
* repositório inteiro - o teto está três ordens de grandeza acima do caso real, e existe para que
|
|
43
|
+
* um projeto grande não escreva um evento de centenas de KB no ledger dele.
|
|
44
|
+
*
|
|
45
|
+
* O corte é SILENCIOSO neste arquivo, e isso está dito em vez de calado: sem um campo de contagem
|
|
46
|
+
* não há onde escrever "e mais N". Se algum dia um projeto real encostar no teto, a resposta é um
|
|
47
|
+
* campo que declare o que ficou de fora - nunca subir o número e seguir.
|
|
48
|
+
*/
|
|
49
|
+
const UNREPRESENTED_CAP = 300;
|
|
39
50
|
/**
|
|
40
51
|
* Os pares a mandar, do agregado que o doctor já monta.
|
|
41
52
|
*
|
|
@@ -64,6 +75,49 @@ export function suggestionsFrom(repeats) {
|
|
|
64
75
|
count: r.count,
|
|
65
76
|
}));
|
|
66
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* A IDENTIDADE ESTRUTURAL DE UMA OCORRÊNCIA - a MESMA chave que agrupa os repeats em `scan.ts`.
|
|
80
|
+
*
|
|
81
|
+
* Comparar por texto de apresentação (`shown`) seria julgar o nome que a pessoa leu em vez do fato
|
|
82
|
+
* medido, que é o acoplamento que o #1174 removeu. A família faz parte da identidade: o mesmo
|
|
83
|
+
* literal em duas famílias são dois fatos diferentes, e só um deles pode ser coincidência.
|
|
84
|
+
*/
|
|
85
|
+
const identityOf = (f) => `${f.kind}:${f.literal.toLowerCase()}`;
|
|
86
|
+
/**
|
|
87
|
+
* AS OCORRÊNCIAS QUE `matched` NÃO TRANSPORTOU - ver `CheckEvent.unrepresentedMatches`.
|
|
88
|
+
*
|
|
89
|
+
* A regra é ESTRUTURAL e nunca semântica: entra a ocorrência que casou com um token nosso e cuja
|
|
90
|
+
* identidade não está entre as entradas que `matched` de fato carregou. Nada aqui olha
|
|
91
|
+
* `finding.crossFamily` - filtrar por aquele veredito congelaria a régua do dia da coleta e
|
|
92
|
+
* impediria uma régua futura de reavaliar o que este CLI decidiu não mandar.
|
|
93
|
+
*
|
|
94
|
+
* `matched` entra como ARGUMENTO, e não é detalhe: o que importa é o que foi de fato transportado,
|
|
95
|
+
* depois do filtro e depois do teto. Um repeat que existiu e foi cortado sai daqui como ocorrência,
|
|
96
|
+
* porque do ponto de vista de quem lê ele não chegou - e é isso que o campo promete.
|
|
97
|
+
*/
|
|
98
|
+
export function unrepresentedFrom(findings, matched) {
|
|
99
|
+
const carried = new Set(matched.map(identityOf));
|
|
100
|
+
const out = [];
|
|
101
|
+
for (const f of findings) {
|
|
102
|
+
/** Sem token nosso não houve match nosso, e não há o que a régua de família possa julgar. */
|
|
103
|
+
if (!f.token)
|
|
104
|
+
continue;
|
|
105
|
+
if (carried.has(identityOf(f)))
|
|
106
|
+
continue;
|
|
107
|
+
if (out.length >= UNREPRESENTED_CAP)
|
|
108
|
+
break;
|
|
109
|
+
out.push({
|
|
110
|
+
literal: f.literal,
|
|
111
|
+
kind: f.kind,
|
|
112
|
+
token: f.token,
|
|
113
|
+
file: f.file,
|
|
114
|
+
line: f.line,
|
|
115
|
+
...(f.theirToken ? { theirToken: f.theirToken } : {}),
|
|
116
|
+
...(f.fontRelative ? { fontRelative: true } : {}),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
67
121
|
const ledgerPath = (root) => join(root, "_synthesisui", LEDGER_FILE);
|
|
68
122
|
/** Keep the file from growing forever: past ~1MB, keep the newest half. A
|
|
69
123
|
* trend needs recent history, not an archive. */
|
package/dist/install-marks.js
CHANGED
|
@@ -352,7 +352,16 @@ export const CHECKER_SINCE = "0.16.308";
|
|
|
352
352
|
* nenhum dos 22 apps dourados tem componente com nome de tag de SVG. Quem tem só vê a correção
|
|
353
353
|
* depois de remedir.
|
|
354
354
|
*/
|
|
355
|
-
|
|
355
|
+
/**
|
|
356
|
+
* 0.16.324 -> 0.16.328 em 28/08 (T43-b): o censo passou a carregar `consumedAt` - qual nó do sketch
|
|
357
|
+
* teve as classes absorvidas em `base`, ou `"none"` quando nenhum teve.
|
|
358
|
+
*
|
|
359
|
+
* A marca sobe porque a medição ANTERIOR não tem como produzir o conserto: sem o campo o look cai no
|
|
360
|
+
* estado legado e o deriver volta a deduzir por posição, que é o defeito. Medido no app real: 8
|
|
361
|
+
* componentes que devolvem um Fragment recuperam as classes que hoje caem no vazio, e 386 de 386
|
|
362
|
+
* looks legados leem exatamente como liam.
|
|
363
|
+
*/
|
|
364
|
+
export const READER_SINCE = "0.16.328";
|
|
356
365
|
/**
|
|
357
366
|
* O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
|
|
358
367
|
*
|
package/dist/naming-queue.js
CHANGED
|
@@ -59,7 +59,10 @@ export function namingQueue(looks, defines, versionOf) {
|
|
|
59
59
|
const sketch = looks[component]?.sketch;
|
|
60
60
|
if (!Array.isArray(sketch) || sketch.length === 0)
|
|
61
61
|
continue;
|
|
62
|
-
const derived = anatomyFromSketch(sketch, defines, versionOf
|
|
62
|
+
const derived = anatomyFromSketch(sketch, defines, versionOf,
|
|
63
|
+
/** O fato medido na coleta, ou `undefined` num look legado - ver `CensusLook.consumedAt`. */
|
|
64
|
+
looks[component]
|
|
65
|
+
?.consumedAt);
|
|
63
66
|
if (derived.read.length === 0)
|
|
64
67
|
continue;
|
|
65
68
|
components += 1;
|
|
@@ -39,6 +39,60 @@ export const FRONTEND_HUB_CENSUS = join(POPULATIONS, "frontend-hub.census.json")
|
|
|
39
39
|
* que a jornada é conferida na tela.
|
|
40
40
|
*/
|
|
41
41
|
export const CODELEVEL_CENSUS = join(POPULATIONS, "codelevel-ui.census.json");
|
|
42
|
+
/**
|
|
43
|
+
* O HISTÓRICO DO DOCTOR - a única entrada destas provas que NÃO se deriva de um censo.
|
|
44
|
+
*
|
|
45
|
+
* O que ele carrega e o censo não: os PARES que o doctor casou (`matched`) e o placar que ele
|
|
46
|
+
* fechou (`crossFamily`). O censo é a leitura do CÓDIGO num instante; o ledger é a história das
|
|
47
|
+
* EXECUÇÕES - nenhum dos dois se produz a partir do outro.
|
|
48
|
+
*
|
|
49
|
+
* Congelado em 28/08 porque só existia na máquina do dono, e porque as provas que dependem dele
|
|
50
|
+
* ficariam órfãs no dia em que aquela pasta sumisse - foi exatamente assim que oito provas do
|
|
51
|
+
* `signalui` viraram provas apagadas. Ver `fixtures/populations/README.md`.
|
|
52
|
+
*/
|
|
53
|
+
export const CODELEVEL_LEDGER = join(POPULATIONS, "codelevel-ui.ledger.jsonl");
|
|
54
|
+
/**
|
|
55
|
+
* OS DOIS DOCUMENTOS HISTÓRICOS - a exceção autorizada à regra do derivável (dono, 28/08).
|
|
56
|
+
*
|
|
57
|
+
* A regra desta pasta continua valendo para artefato ATUAL: um `design-system.json` de hoje se
|
|
58
|
+
* deriva do censo, e congelá-lo criaria uma segunda fonte de verdade que envelhece calada.
|
|
59
|
+
*
|
|
60
|
+
* Um documento PUBLICADO no passado é outra coisa. A cadeia só sabe produzir o presente: derivar
|
|
61
|
+
* hoje o que foi publicado em duas versões diferentes devolve o mesmo documento duas vezes, e a
|
|
62
|
+
* propriedade que o `change-preview` protege - que cada lado do par desenhe com o CSS DA SUA
|
|
63
|
+
* versão - deixaria de ter o que comparar. O passado não é derivável nem hoje nem nunca.
|
|
64
|
+
*
|
|
65
|
+
* PROVENIÊNCIA. `~/personal/codelevel-monorepo/_synthesisui/ds/codelevel/{v2,v3}/design-system.json`,
|
|
66
|
+
* escritos em 26/08/2026 pelo próprio produto - `v2` por `import`, `v3` por `sync` (`source.by` em
|
|
67
|
+
* todas as 62 receitas). Copiados byte a byte pelo VALOR: só a formatação foi compactada, e um
|
|
68
|
+
* spec assere que o objeto lido é idêntico ao original. Nenhum valor foi alterado para caber num
|
|
69
|
+
* teste, e nenhuma versão foi gerada artificialmente.
|
|
70
|
+
*
|
|
71
|
+
* O PAR FOI ESCOLHIDO PELA PROPRIEDADE, e a escolha foi medida nos três pares possíveis:
|
|
72
|
+
*
|
|
73
|
+
* v1 -> v2 0 componentes com declaração movida, 0 que mudaram sem pintar - não serve
|
|
74
|
+
* v2 -> v3 20 componentes com declaração movida, 42 que mudaram sem pintar
|
|
75
|
+
* v1 -> v3 idêntico ao v2 -> v3
|
|
76
|
+
*
|
|
77
|
+
* INSPECIONADOS ANTES DE VERSIONAR, e nada precisou ser mascarado - o que importa, porque mascarar
|
|
78
|
+
* mudaria o documento:
|
|
79
|
+
*
|
|
80
|
+
* credenciais / bearer / api-key / password nenhuma
|
|
81
|
+
* caminhos absolutos ou de máquina nenhum
|
|
82
|
+
* e-mails ou identificadores pessoais nenhum
|
|
83
|
+
* URLs uma, o namespace de SVG do W3C
|
|
84
|
+
*
|
|
85
|
+
* O que eles CARREGAM, e está dito em vez de calado: a narrativa e o tagline do produto (texto de
|
|
86
|
+
* marketing do próprio dono), os caminhos RELATIVOS dos arquivos de origem dentro do repositório
|
|
87
|
+
* (`packages/ui/src/...`, os mesmos que o censo congelado ao lado já carrega) e, no `v3`, um
|
|
88
|
+
* carimbo `meta.repairs` com data.
|
|
89
|
+
*
|
|
90
|
+
* E SÃO EVIDÊNCIA HISTÓRICA, NUNCA FONTE NORMATIVA. Nenhuma regra do SynthesisUI pode ler daqui o
|
|
91
|
+
* que é certo - nem um nome de componente, nem um valor, nem uma convenção. Eles existem para que
|
|
92
|
+
* uma prova tenha DOIS instantes do mesmo sistema para comparar, e é só isso.
|
|
93
|
+
*/
|
|
94
|
+
export const CODELEVEL_DOCUMENT_OLDER = join(POPULATIONS, "codelevel-ui.v2.document.json");
|
|
95
|
+
export const CODELEVEL_DOCUMENT_NEWER = join(POPULATIONS, "codelevel-ui.v3.document.json");
|
|
42
96
|
/**
|
|
43
97
|
* OS REPOSITÓRIOS VIVOS - e estes NÃO estão congelados, de propósito.
|
|
44
98
|
*
|
package/dist/repo-state.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { readFile } from "node:fs/promises";
|
|
27
27
|
import { join } from "node:path";
|
|
28
|
-
import { readEvents } from "./doctor/ledger.js";
|
|
28
|
+
import { readEvents, } from "./doctor/ledger.js";
|
|
29
29
|
/**
|
|
30
30
|
* O estado de um slug neste projeto, ou nada quando não há `.lock`.
|
|
31
31
|
*
|
|
@@ -83,6 +83,15 @@ export async function repoStateOf(projectRoot, slug, cli) {
|
|
|
83
83
|
...(doctor?.matched && doctor.matched.length > 0
|
|
84
84
|
? { matched: doctor.matched }
|
|
85
85
|
: {}),
|
|
86
|
+
/**
|
|
87
|
+
* `Array.isArray` E NUNCA `length > 0` - a linha acima é o contraexemplo, e ela está certa para
|
|
88
|
+
* `matched`, que não distingue "não mediu" de "mediu zero". Este campo distingue, e é a razão de
|
|
89
|
+
* ele existir: `[]` é uma medição, e transformá-la em ausência faria um cliente com CLI novo
|
|
90
|
+
* parecer um cliente com ledger antigo.
|
|
91
|
+
*/
|
|
92
|
+
...(Array.isArray(doctor?.unrepresentedMatches)
|
|
93
|
+
? { unrepresentedMatches: doctor.unrepresentedMatches }
|
|
94
|
+
: {}),
|
|
86
95
|
...(runs.length > 0 ? { runs } : {}),
|
|
87
96
|
...(typeof lock?.fetchedAt === "string"
|
|
88
97
|
? { installedAt: lock.fetchedAt }
|
package/package.json
CHANGED