synthesisui 0.16.166 → 0.16.169
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/import.js
CHANGED
|
@@ -982,10 +982,11 @@ export async function takeCensus(root, opts) {
|
|
|
982
982
|
* percorrer o repo inteiro de novo por um dado que este laço já tem na mão. Ver `reachability.ts`.
|
|
983
983
|
*/
|
|
984
984
|
const edges = new Map();
|
|
985
|
-
|
|
985
|
+
/** Por raiz: `@/` é uma pasta diferente em cada app - ver `reachabilityOf`. */
|
|
986
|
+
const graphRoots = [];
|
|
986
987
|
for (const u of opts?.usage ?? []) {
|
|
987
988
|
const uInternal = await internalSpecifiers(u.path);
|
|
988
|
-
|
|
989
|
+
graphRoots.push({ path: u.path, aliases: await aliasesOf(u.path) });
|
|
989
990
|
for await (const file of walk(u.path)) {
|
|
990
991
|
const src = await readFile(file, "utf8").catch(() => "");
|
|
991
992
|
if (!src)
|
|
@@ -1231,7 +1232,7 @@ export async function takeCensus(root, opts) {
|
|
|
1231
1232
|
* O GRAFO SÓ FECHA DEPOIS QUE TODOS OS ARQUIVOS FORAM VISTOS: um especificador só resolve para um
|
|
1232
1233
|
* arquivo que já esteja na lista, então isto não pode rodar dentro do laço que a preenche.
|
|
1233
1234
|
*/
|
|
1234
|
-
const reachability = edges.size > 0 ? await reachabilityOf({ edges,
|
|
1235
|
+
const reachability = edges.size > 0 ? await reachabilityOf({ edges, roots: graphRoots }) : null;
|
|
1235
1236
|
const coverage = summarizeCoverage(shapes, defined.length || componentFiles, Object.keys(looks).length, Object.values(looks).reduce((n, look) => n +
|
|
1236
1237
|
Object.keys(look.base).length +
|
|
1237
1238
|
Object.keys(look.dark ?? {}).length +
|
|
@@ -144,9 +144,27 @@ export function looksLocal(spec) {
|
|
|
144
144
|
* ressalva inflada é tão inútil quanto uma ausente.
|
|
145
145
|
*/
|
|
146
146
|
const ASSET = /\.(css|scss|sass|less|styl|png|jpe?g|gif|svg|webp|avif|ico|woff2?|ttf|otf|mp4|webm|json|md|txt|ya?ml|graphql|wasm)$/i;
|
|
147
|
-
|
|
147
|
+
/**
|
|
148
|
+
* Existe como arquivo? Com memória, porque a mesma resposta é pedida centenas de vezes.
|
|
149
|
+
*
|
|
150
|
+
* Cada especificador tenta até treze candidatos (o base, seis extensões, seis `index`), e um barril
|
|
151
|
+
* importado por cem arquivos repete os mesmos treves `stat` cem vezes. Sem isto, medir um app de 1446
|
|
152
|
+
* arquivos passava de três segundos - e um leitor que roda dentro de todo import não pode pagar isso
|
|
153
|
+
* por um dado que não muda durante a rodada.
|
|
154
|
+
*/
|
|
155
|
+
function fileChecker() {
|
|
156
|
+
const known = new Map();
|
|
157
|
+
return (path) => {
|
|
158
|
+
const seen = known.get(path);
|
|
159
|
+
if (seen)
|
|
160
|
+
return seen;
|
|
161
|
+
const asked = stat(path).then((s) => s.isFile(), () => false);
|
|
162
|
+
known.set(path, asked);
|
|
163
|
+
return asked;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
148
166
|
/** Um especificador vira um arquivo real, ou nada. `null` é contado, nunca engolido. */
|
|
149
|
-
async function toFile(known, from, spec, aliases) {
|
|
167
|
+
async function toFile(known, from, spec, aliases, isFile) {
|
|
150
168
|
const bases = [];
|
|
151
169
|
if (spec.startsWith("."))
|
|
152
170
|
bases.push(resolve(dirname(from), spec));
|
|
@@ -191,18 +209,23 @@ export async function reachabilityOf(input) {
|
|
|
191
209
|
* inflava o denominador com arquivos que são inalcançáveis por definição - 2090 no lugar de 966 no
|
|
192
210
|
* app do dono (07/08), e um número inflado no denominador é uma acusação inflada no numerador.
|
|
193
211
|
*/
|
|
212
|
+
const isFile = fileChecker();
|
|
194
213
|
const known = new Set([...input.edges.keys()].filter((f) => /\.[jt]sx?$/.test(f) &&
|
|
195
214
|
!/\.d\.ts$/.test(f) &&
|
|
196
215
|
!/\/[a-z.-]+\.config\.[jt]sx?$/.test(f)));
|
|
197
216
|
const graph = new Map();
|
|
198
217
|
let unresolved = 0;
|
|
218
|
+
/** A raiz MAIS LONGA que contém o arquivo - um app dentro de outro resolve pelo mais específico. */
|
|
219
|
+
const rootOf = (file) => input.roots
|
|
220
|
+
.filter((r) => file.startsWith(`${r.path}/`))
|
|
221
|
+
.sort((a, b) => b.path.length - a.path.length)[0]?.aliases ?? [];
|
|
199
222
|
for (const [file, specs] of input.edges) {
|
|
200
223
|
if (!known.has(file))
|
|
201
224
|
continue;
|
|
225
|
+
const aliases = rootOf(file);
|
|
202
226
|
const out = [];
|
|
203
227
|
for (const spec of specs) {
|
|
204
|
-
const mine = spec.startsWith(".") ||
|
|
205
|
-
input.aliases.some((a) => spec.startsWith(a.prefix));
|
|
228
|
+
const mine = spec.startsWith(".") || aliases.some((a) => spec.startsWith(a.prefix));
|
|
206
229
|
/**
|
|
207
230
|
* Pacote de terceiro não é aresta deste repo. Mas um apelido LOCAL que nenhum alias casa é uma
|
|
208
231
|
* aresta PERDIDA - e era descartado aqui em silêncio, o que subia o número de mortos sem a
|
|
@@ -213,7 +236,7 @@ export async function reachabilityOf(input) {
|
|
|
213
236
|
unresolved += 1;
|
|
214
237
|
continue;
|
|
215
238
|
}
|
|
216
|
-
const hit = await toFile(known, file, spec,
|
|
239
|
+
const hit = await toFile(known, file, spec, aliases, isFile);
|
|
217
240
|
if (hit)
|
|
218
241
|
out.push(hit);
|
|
219
242
|
/**
|
|
@@ -237,11 +260,21 @@ export async function reachabilityOf(input) {
|
|
|
237
260
|
if (!seen.has(next))
|
|
238
261
|
queue.push(next);
|
|
239
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* ALCANÇADOS DENTRO DO UNIVERSO, e não `seen.size`.
|
|
265
|
+
*
|
|
266
|
+
* A travessia atravessa para fora: um alias que aponta para outro pacote do monorepo resolve no
|
|
267
|
+
* disco e entra em `seen`, mas não está em `known` - o universo é o que foi varrido. Contar
|
|
268
|
+
* `seen.size` inflava `reached` com nós de fora e fazia `reached + unreached` não fechar com
|
|
269
|
+
* `files`, o que produziu um "19% morto" que na verdade é 41% (dono, 07/08). Um número que não
|
|
270
|
+
* fecha com a própria soma é um número que ninguém pode checar.
|
|
271
|
+
*/
|
|
272
|
+
const unreached = [...known].filter((f) => !seen.has(f)).sort();
|
|
240
273
|
return {
|
|
241
274
|
entries: entries.length,
|
|
242
275
|
files: known.size,
|
|
243
|
-
reached:
|
|
244
|
-
unreached
|
|
276
|
+
reached: known.size - unreached.length,
|
|
277
|
+
unreached,
|
|
245
278
|
unresolved,
|
|
246
279
|
};
|
|
247
280
|
}
|
package/package.json
CHANGED