synthesisui 0.16.275 → 0.16.276

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.
@@ -214,11 +214,13 @@ function measuredAt(node, sketch) {
214
214
  if (measured?.passes && Object.keys(measured.passes).length > 0) {
215
215
  out.passes = measured.passes;
216
216
  /**
217
- * A FORMA VIAJA COM O VALOR, sempre. Um `passes` sem `passesExpr` obriga quem emite a adivinhar
218
- * entre aspas e chaves, e as duas adivinhações produzem JSX quebrado no arquivo dele.
217
+ * A FORMA VIAJA COM O VALOR, SEMPRE - inclusive vazia.
218
+ *
219
+ * Um `passes` sem `passesExpr` obriga quem emite a adivinhar entre aspas e chaves, e as duas
220
+ * adivinhações produzem código errado no arquivo dele. A lista vazia responde "nenhuma é
221
+ * expressão"; a AUSÊNCIA responde "este censo é velho", e são coisas diferentes.
219
222
  */
220
- if (measured.passesExpr && measured.passesExpr.length > 0)
221
- out.passesExpr = measured.passesExpr;
223
+ out.passesExpr = measured.passesExpr ?? [];
222
224
  }
223
225
  if (measured?.repeats)
224
226
  out.repeats = measured.repeats;
@@ -109,6 +109,19 @@ export function attrText(key, value, isExpression) {
109
109
  * adaptar e pode citar o nome dela; um arquivo gerado é para compilar.
110
110
  */
111
111
  export function emittableAttrs(node, opts) {
112
+ /**
113
+ * FORMA DESCONHECIDA SEGURA TUDO - e este é o caso do censo tirado antes de 22/08.
114
+ *
115
+ * `passesExpr` ausente não quer dizer "nenhuma é expressão": quer dizer que o leitor daquele dia
116
+ * não sabia responder. Tratar como literal escreveria `title="metric.label"` no arquivo dele onde
117
+ * ele escreveu `title={metric.label}` - uma string no lugar de uma variável, que é leitura errada
118
+ * virando código errado, exatamente o defeito que esta família de consertos existe para não
119
+ * cometer.
120
+ *
121
+ * A omissão, ao contrário, é reparável: um `sync` traz a forma e o atributo aparece.
122
+ */
123
+ if (node.passes && Object.keys(node.passes).length > 0 && !node.passesExpr)
124
+ return { write: "", held: Object.keys(node.passes) };
112
125
  const expr = new Set(node.passesExpr ?? []);
113
126
  const write = [];
114
127
  const held = [];
@@ -563,9 +563,18 @@ export function sketchOf(source, name) {
563
563
  const given = passedProps(event.body, conditional);
564
564
  if (given) {
565
565
  node.passes = given.props;
566
- /** A forma, ao lado do valor - ver `passesExpr`. Vazio não viaja. */
567
- if (given.expression.length > 0)
568
- node.passesExpr = given.expression;
566
+ /**
567
+ * A FORMA VIAJA SEMPRE QUE O VALOR VIAJA, inclusive VAZIA - e a lista vazia é o ponto.
568
+ *
569
+ * Se `passesExpr` só aparecesse quando há expressão, "ausente" significaria duas coisas ao
570
+ * mesmo tempo: *nenhuma delas é expressão* e *este censo é velho e não sabe responder*. Quem
571
+ * emite não tem como distinguir, e as duas exigem comportamentos OPOSTOS - escrever tudo como
572
+ * literal, ou não escrever nada.
573
+ *
574
+ * Com o array sempre presente, ausência quer dizer uma coisa só: censo tirado antes de
575
+ * 0.16.275. Ver `emittableAttrs`, que segura o atributo nesse caso em vez de adivinhar.
576
+ */
577
+ node.passesExpr = given.expression;
569
578
  }
570
579
  const list = repeatOf(source, event.at);
571
580
  if (list)
@@ -128,7 +128,7 @@
128
128
  * é sempre o bump deste PR - nunca o número que o `package.json` já carrega, porque alguém pode
129
129
  * publicar no meio.
130
130
  */
131
- export const MATERIALISER_SINCE = "0.16.275";
131
+ export const MATERIALISER_SINCE = "0.16.276";
132
132
  /**
133
133
  * A ÚLTIMA VERSÃO EM QUE O QUE O HOOK RODA MUDOU.
134
134
  *
@@ -0,0 +1,53 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ /**
4
+ * ONDE ESTÃO AS POPULAÇÕES MEDIDAS - e por que elas não moram mais na máquina de ninguém.
5
+ *
6
+ * O QUÊ. 23 specs medem contra o censo de dois repositórios reais. Até 22/08 cada um apontava para
7
+ * `~/projects/frontend-hub` ou `~/personal/codelevel-monorepo` na home do dono.
8
+ *
9
+ * POR QUÊ ISSO ERA UM DEFEITO. Não porque quebrava - 35 dos 36 pulavam educadamente quando o
10
+ * arquivo sumia. Porque ficava VERDE. Medido em 22/08: três artefatos do `signalui` já não estavam
11
+ * no disco e 12 testes pulavam em silêncio havia sabe-se lá quanto tempo. Uma suíte que fica verde
12
+ * quando parou de medir é pior que uma vermelha, e essa é a única classe de defeito que esta
13
+ * esteira não pode aceitar num instrumento.
14
+ *
15
+ * E O SEGUNDO CUSTO, que é o do produto: sem a segunda população, toda régua nova passa a ser
16
+ * medida num repositório só. Três réguas escritas em 22/08 estariam erradas por isso.
17
+ *
18
+ * COMO. `fixtures/populations/`, versionado, compacto. `npm run populations:refresh` atualiza a
19
+ * partir dos repositórios vivos quando eles existem - e o que mudou aparece no `git diff`, que é
20
+ * onde uma mudança de insumo pode ser revisada em vez de sentida.
21
+ *
22
+ * GÊMEO de `apps/web/src/lib/ds/populations.ts`: o CLI é publicado standalone e não importa de lá. As
23
+ * duas cópias resolvem o mesmo diretório por caminho relativo, então elas não podem divergir de
24
+ * conteúdo - só de posição.
25
+ */
26
+ /** A raiz do monorepo, a partir deste arquivo: `packages/cli/src` → 3 níveis acima. */
27
+ const ROOT = join(import.meta.dirname, "..", "..", "..");
28
+ const POPULATIONS = join(ROOT, "fixtures", "populations");
29
+ /**
30
+ * 323 componentes, escopo `apps/web-dashboard`. A população que derruba régua feita em cima da
31
+ * outra: ela não declara um `--animate-*` sequer, escreve o relógio literal na receita, e tem 62
32
+ * componentes cujo primeiro nó do sketch não é a raiz.
33
+ */
34
+ export const FRONTEND_HUB_CENSUS = join(POPULATIONS, "frontend-hub.census.json");
35
+ /**
36
+ * 59 componentes, escopo `packages/ui`. O caso de teste vivo do dia a dia - é dele que saem os
37
+ * números do `triage` e é nele que a jornada é conferida na tela.
38
+ */
39
+ export const CODELEVEL_CENSUS = join(POPULATIONS, "codelevel-ui.census.json");
40
+ /**
41
+ * OS REPOSITÓRIOS VIVOS - e estes NÃO estão congelados, de propósito.
42
+ *
43
+ * Um punhado de specs não mede o censo: eles varrem os `.tsx` de ORIGEM para exercitar o COLETOR -
44
+ * `sketchOf`, `rootTag`, o leitor de `cn()`. Congelar 69 arquivos de código de cliente dentro deste
45
+ * repositório é uma decisão diferente de congelar uma medição, e ela não foi tomada.
46
+ *
47
+ * Então estes caminhos continuam dependendo da máquina, e é aqui que isso está DITO. Todo spec que
48
+ * os usa tem que guardar com `existsSync` - sem o guard, a ausência derruba a suíte em vez de pular.
49
+ *
50
+ * Medido em 22/08: 5 specs no `apps/web` e no `packages/cli` estão nesta situação.
51
+ */
52
+ export const CODELEVEL_REPO = join(homedir(), "personal", "codelevel-monorepo");
53
+ export const FRONTEND_HUB_REPO = join(homedir(), "projects", "frontend-hub");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.275",
3
+ "version": "0.16.276",
4
4
  "description": "Bring SynthesisUI design systems into any project - tokens, typed components, whole pages and an agent-ready CLAUDE.md manifest.",
5
5
  "type": "module",
6
6
  "bin": {