fidelity-kit 0.1.1 → 0.2.1

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.
Files changed (85) hide show
  1. package/README.md +28 -3
  2. package/dist/commands/build.d.ts +2 -0
  3. package/dist/commands/build.d.ts.map +1 -1
  4. package/dist/commands/build.js +2 -1
  5. package/dist/commands/build.js.map +1 -1
  6. package/dist/commands/dev.d.ts +7 -1
  7. package/dist/commands/dev.d.ts.map +1 -1
  8. package/dist/commands/dev.js +9 -2
  9. package/dist/commands/dev.js.map +1 -1
  10. package/dist/commands/hash.d.ts +2 -0
  11. package/dist/commands/hash.d.ts.map +1 -1
  12. package/dist/commands/hash.js +7 -3
  13. package/dist/commands/hash.js.map +1 -1
  14. package/dist/commands/process.d.ts +6 -0
  15. package/dist/commands/process.d.ts.map +1 -1
  16. package/dist/commands/process.js +35 -7
  17. package/dist/commands/process.js.map +1 -1
  18. package/dist/commands/serve.d.ts +3 -1
  19. package/dist/commands/serve.d.ts.map +1 -1
  20. package/dist/commands/serve.js +2 -1
  21. package/dist/commands/serve.js.map +1 -1
  22. package/dist/core/compare.d.ts +9 -2
  23. package/dist/core/compare.d.ts.map +1 -1
  24. package/dist/core/compare.js +9 -5
  25. package/dist/core/compare.js.map +1 -1
  26. package/dist/core/hash.d.ts +3 -1
  27. package/dist/core/hash.d.ts.map +1 -1
  28. package/dist/core/hash.js +39 -12
  29. package/dist/core/hash.js.map +1 -1
  30. package/dist/core/hash.test.js +24 -1
  31. package/dist/core/hash.test.js.map +1 -1
  32. package/dist/core/paths.d.ts +5 -2
  33. package/dist/core/paths.d.ts.map +1 -1
  34. package/dist/core/paths.js +6 -3
  35. package/dist/core/paths.js.map +1 -1
  36. package/dist/core/process.d.ts +54 -3
  37. package/dist/core/process.d.ts.map +1 -1
  38. package/dist/core/process.js +485 -55
  39. package/dist/core/process.js.map +1 -1
  40. package/dist/core/process.test.d.ts +2 -0
  41. package/dist/core/process.test.d.ts.map +1 -0
  42. package/dist/core/process.test.js +405 -0
  43. package/dist/core/process.test.js.map +1 -0
  44. package/dist/core/progress.d.ts +8 -0
  45. package/dist/core/progress.d.ts.map +1 -0
  46. package/dist/core/progress.js +2 -0
  47. package/dist/core/progress.js.map +1 -0
  48. package/dist/core/scan.d.ts +11 -2
  49. package/dist/core/scan.d.ts.map +1 -1
  50. package/dist/core/scan.js +104 -18
  51. package/dist/core/scan.js.map +1 -1
  52. package/dist/core/suite.test.js +24 -1
  53. package/dist/core/suite.test.js.map +1 -1
  54. package/dist/progress.d.ts +12 -0
  55. package/dist/progress.d.ts.map +1 -0
  56. package/dist/progress.js +46 -0
  57. package/dist/progress.js.map +1 -0
  58. package/dist/progress.test.d.ts +2 -0
  59. package/dist/progress.test.d.ts.map +1 -0
  60. package/dist/progress.test.js +36 -0
  61. package/dist/progress.test.js.map +1 -0
  62. package/dist/run.d.ts +4 -1
  63. package/dist/run.d.ts.map +1 -1
  64. package/dist/run.js +32 -6
  65. package/dist/run.js.map +1 -1
  66. package/dist/server.d.ts +1 -1
  67. package/dist/server.d.ts.map +1 -1
  68. package/dist/server.js +23 -5
  69. package/dist/server.js.map +1 -1
  70. package/dist/server.test.js +73 -1
  71. package/dist/server.test.js.map +1 -1
  72. package/dist/watch.d.ts +9 -0
  73. package/dist/watch.d.ts.map +1 -0
  74. package/dist/watch.js +96 -0
  75. package/dist/watch.js.map +1 -0
  76. package/dist/watch.test.d.ts +2 -0
  77. package/dist/watch.test.d.ts.map +1 -0
  78. package/dist/watch.test.js +171 -0
  79. package/dist/watch.test.js.map +1 -0
  80. package/package.json +2 -1
  81. package/viewer/assets/{ViewControls-Ck9smy3A.js → ViewControls-CTETl5oY.js} +1 -1
  82. package/viewer/assets/{_-Bn1LyOgm.js → _-U-2B0GSx.js} +1 -1
  83. package/viewer/assets/{index-BZCd8VsK.js → index-G0mSU6zI.js} +2 -2
  84. package/viewer/assets/{routes-sEPFkb5w.js → routes-DX90MTkh.js} +1 -1
  85. package/viewer/index.html +1 -1
@@ -1,71 +1,501 @@
1
- import { mkdir, readFile, stat, writeFile } from 'node:fs/promises';
2
- import { dirname, join } from 'node:path';
1
+ import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { availableParallelism } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import pLimit from 'p-limit';
3
6
  import { compareImages } from './compare.js';
4
- import { allScenes, scanSuite } from './scan.js';
5
- import { deltaFile, imageFile, metricsFile } from './paths.js';
6
- const mtime = (p) => stat(p).then((s) => s.mtimeMs, () => 0);
7
- /** Writes metrics + delta for every (scene, output, reference, renderer) pair whose outputs are older than either input, then `index.json`. */
8
- export async function processSuite(root, opts = {}) {
9
- const suite = await scanSuite(root);
10
- const refs = suite.config.renderers.filter((r) => r.reference).map((r) => r.id);
11
- const result = { computed: 0, skipped: 0, failed: [] };
12
- const validMetrics = new Set();
13
- for (const scene of allScenes(suite.root)) {
14
- for (const [output, renderers] of Object.entries(scene.images)) {
15
- const dir = join(root, scene.path, output);
16
- for (const ref of refs.filter((r) => renderers.includes(r))) {
17
- for (const r of renderers.filter((x) => x !== ref)) {
18
- const [refPath, testPath] = [join(dir, imageFile(ref)), join(dir, imageFile(r))];
19
- const metricsPath = join(dir, metricsFile(r, ref));
20
- const metricsRel = `${scene.path}/${output}/${metricsFile(r, ref)}`;
21
- const deltaPath = join(dir, deltaFile(r, ref));
22
- const inputs = Math.max(await mtime(refPath), await mtime(testPath));
23
- const outputs = [metricsPath, ...(suite.config.delta ? [deltaPath] : [])];
24
- const oldest = Math.min(...(await Promise.all(outputs.map(mtime))));
25
- if (!opts.force && oldest > inputs) {
26
- result.skipped += 1;
27
- validMetrics.add(metricsRel);
7
+ import { readConfig, scanScene, scanSuite } from './scan.js';
8
+ import { deltaFile, imageFile, IMAGE_EXTENSIONS, isImageFile, metricsFile } from './paths.js';
9
+ const emptyResult = () => ({ computed: 0, skipped: 0, failed: [] });
10
+ const signatureKey = (inputs) => JSON.stringify(inputs);
11
+ async function signature(path) {
12
+ try {
13
+ const s = await stat(path);
14
+ return s.isFile() ? { mtimeMs: s.mtimeMs, size: s.size } : null;
15
+ }
16
+ catch (error) {
17
+ if (error.code === 'ENOENT' || error.code === 'ENOTDIR')
18
+ return null;
19
+ throw error;
20
+ }
21
+ }
22
+ /** Version 1 AVIF metrics predate explicit source filenames and independent delta records. */
23
+ function matchesSource(saved, inputs) {
24
+ if (!saved || typeof saved !== 'object')
25
+ return false;
26
+ const source = saved;
27
+ return (source.version === 1 &&
28
+ ['reference', 'renderer'].every((side) => {
29
+ const previous = source[side];
30
+ const current = inputs[side];
31
+ return (previous?.size === current.size &&
32
+ previous.mtimeMs === current.mtimeMs &&
33
+ (previous.path === current.path || (previous.path === undefined && current.path.endsWith('.avif'))));
34
+ }));
35
+ }
36
+ function validMetrics(value) {
37
+ if (!value || typeof value !== 'object')
38
+ return false;
39
+ const r = value;
40
+ return ((r.psnr === null || Number.isFinite(r.psnr)) &&
41
+ [r.rmse, r.mae, r.maxError].every((n) => Number.isFinite(n) && n >= 0 && n <= 1) &&
42
+ Number.isInteger(r.width) &&
43
+ r.width > 0 &&
44
+ Number.isInteger(r.height) &&
45
+ r.height > 0 &&
46
+ typeof r.generatedAt === 'string');
47
+ }
48
+ async function atomicWrite(file, data) {
49
+ const tmp = `${file}.${randomUUID()}.tmp`;
50
+ try {
51
+ await writeFile(tmp, data);
52
+ await rename(tmp, file);
53
+ }
54
+ finally {
55
+ await rm(tmp, { force: true });
56
+ }
57
+ }
58
+ /** A fixed configuration, small per-scene dependency maps, and one bounded comparison queue. */
59
+ export class SuiteProcessor {
60
+ root;
61
+ opts;
62
+ config;
63
+ suite;
64
+ scenes = new Map();
65
+ metrics = {};
66
+ pending = new Set();
67
+ unsettled = new Set();
68
+ epochs = new Map();
69
+ dirty = new Set();
70
+ active = new Set();
71
+ limit;
72
+ concurrency;
73
+ result = emptyResult();
74
+ flushing;
75
+ force;
76
+ indexDirty = false;
77
+ progressCompleted = 0;
78
+ progressTotal = 0;
79
+ reportComparing() {
80
+ this.opts.onProgress?.({
81
+ phase: 'Comparing',
82
+ completed: this.progressCompleted,
83
+ total: this.progressTotal,
84
+ unit: 'pairs',
85
+ });
86
+ }
87
+ constructor(root, config, opts) {
88
+ this.root = root;
89
+ this.opts = opts;
90
+ this.config = config;
91
+ this.suite = { config, hasReadme: false, root: { path: '', hasReadme: false, groups: [], scenes: [] } };
92
+ this.concurrency = opts.concurrency ?? availableParallelism();
93
+ if (!Number.isInteger(this.concurrency) || this.concurrency < 1)
94
+ throw new Error('Concurrency must be a positive integer');
95
+ this.limit = pLimit(this.concurrency);
96
+ this.force = opts.force ?? false;
97
+ }
98
+ static async create(root, opts = {}) {
99
+ return new SuiteProcessor(root, await readConfig(root), opts);
100
+ }
101
+ /** Only source inputs qualify. Generated deltas, metrics, index and temporary files never do. */
102
+ sceneForInput(path) {
103
+ const parts = path.split('/');
104
+ if (parts.some((p) => !p || p.startsWith('.')))
105
+ return null;
106
+ const file = parts.pop();
107
+ if (file === 'scene.json' && parts.length)
108
+ return parts.join('/');
109
+ if (file === 'README.md')
110
+ return parts.join('/');
111
+ if (file.includes('.vs-') && IMAGE_EXTENSIONS.some((ext) => file.endsWith(`.delta${ext}`)))
112
+ return null;
113
+ const output = parts.pop();
114
+ if (!parts.length || !this.config.outputs.some((o) => o.id === output))
115
+ return null;
116
+ if (!isImageFile(file) ||
117
+ !this.config.renderers.some((r) => IMAGE_EXTENSIONS.some((ext) => imageFile(r.id, ext) === file)))
118
+ return null;
119
+ return parts.join('/');
120
+ }
121
+ /** Invalidate synchronously, including work already running; reconciliation happens at the batch boundary. */
122
+ notify(paths, defer = false) {
123
+ for (const path of paths) {
124
+ const scene = this.sceneForInput(path);
125
+ if (scene === null)
126
+ continue;
127
+ (defer ? this.unsettled : this.pending).add(scene);
128
+ this.epochs.set(scene, (this.epochs.get(scene) ?? 0) + 1);
129
+ }
130
+ }
131
+ /** Release one coalesced watcher batch without delaying invalidation of running work. */
132
+ settle() {
133
+ for (const scene of this.unsettled)
134
+ this.pending.add(scene);
135
+ this.unsettled.clear();
136
+ }
137
+ get needsFlush() {
138
+ return !!(this.pending.size || this.active.size || this.indexDirty);
139
+ }
140
+ removeDirectory(path, defer = false) {
141
+ for (const scene of this.scenes.keys()) {
142
+ if (scene === path || scene.startsWith(`${path}/`) || path.startsWith(`${scene}/`)) {
143
+ (defer ? this.unsettled : this.pending).add(scene);
144
+ this.epochs.set(scene, (this.epochs.get(scene) ?? 0) + 1);
145
+ }
146
+ }
147
+ }
148
+ /** Comparisons start as scenes are discovered; no second walk or metrics reread is needed. */
149
+ async initialize(process = true) {
150
+ if (!process) {
151
+ const index = JSON.parse(await readFile(join(this.root, 'index.json'), 'utf8'));
152
+ this.metrics = index.metrics;
153
+ }
154
+ try {
155
+ this.suite = await scanSuite(this.root, {
156
+ config: this.config,
157
+ onProgress: this.opts.onProgress,
158
+ onScene: async (scene) => {
159
+ await this.reconcile(scene.path, scene, process);
160
+ },
161
+ });
162
+ }
163
+ catch (error) {
164
+ this.dirty.clear();
165
+ await Promise.all(this.active);
166
+ throw error;
167
+ }
168
+ if (!process) {
169
+ const valid = new Set([...this.scenes.values()].flatMap((scene) => [...scene.pairs.keys()]));
170
+ for (const key of Object.keys(this.metrics))
171
+ if (!valid.has(key))
172
+ delete this.metrics[key];
173
+ }
174
+ this.indexDirty = process;
175
+ // Events collected during discovery are reconciled even when the initial processing was disabled.
176
+ return this.flush();
177
+ }
178
+ flush() {
179
+ if (!this.flushing)
180
+ this.flushing = this.drain().finally(() => {
181
+ this.flushing = undefined;
182
+ });
183
+ return this.flushing;
184
+ }
185
+ async reconcile(rel, node, process = true) {
186
+ const old = this.scenes.get(rel);
187
+ const pairs = new Map();
188
+ if (node) {
189
+ for (const [output, renderers] of Object.entries(node.images)) {
190
+ const images = new Map(await Promise.all(renderers.map(async (r) => {
191
+ const path = `${rel}/${output}/${node.imageFiles?.[output]?.[r] ?? imageFile(r)}`;
192
+ return [r, { path, signature: await signature(join(this.root, path)) }];
193
+ })));
194
+ for (const ref of this.config.renderers.filter((r) => r.reference && images.has(r.id))) {
195
+ for (const renderer of renderers.filter((r) => r !== ref.id)) {
196
+ const a = images.get(ref.id);
197
+ const b = images.get(renderer);
198
+ if (!a.signature || !b.signature)
199
+ continue;
200
+ const key = `${rel}/${output}/${metricsFile(renderer, ref.id)}`;
201
+ const inputs = { reference: { ...a.signature, path: a.path }, renderer: { ...b.signature, path: b.path } };
202
+ const pair = old?.pairs.get(key) ?? {
203
+ key,
204
+ scene: rel,
205
+ reference: a.path,
206
+ renderer: b.path,
207
+ delta: `${rel}/${output}/${deltaFile(renderer, ref.id)}`,
208
+ inputs,
209
+ running: false,
210
+ force: this.force,
211
+ };
212
+ if (signatureKey(pair.inputs) !== signatureKey(inputs)) {
213
+ pair.inputs = inputs;
214
+ pair.reference = a.path;
215
+ pair.renderer = b.path;
216
+ pair.attempted = undefined;
217
+ delete this.metrics[key];
218
+ }
219
+ pairs.set(key, pair);
220
+ }
221
+ }
222
+ }
223
+ this.scenes.set(rel, { node, pairs });
224
+ // A completing task can pump the queue during any await above. Publish the entire scene
225
+ // before making its pairs runnable, otherwise new pairs can be discarded as obsolete.
226
+ if (process)
227
+ for (const pair of pairs.values()) {
228
+ if (pair.attempted === signatureKey(pair.inputs))
28
229
  continue;
230
+ if (!this.dirty.has(pair) && !pair.running) {
231
+ this.progressTotal++;
232
+ this.reportComparing();
29
233
  }
234
+ this.dirty.add(pair);
235
+ }
236
+ }
237
+ else {
238
+ this.scenes.delete(rel);
239
+ this.epochs.delete(rel);
240
+ }
241
+ for (const [key, pair] of old?.pairs ?? []) {
242
+ if (!pairs.has(key)) {
243
+ this.dirty.delete(pair);
244
+ delete this.metrics[key];
245
+ }
246
+ }
247
+ replaceScene(this.suite.root, rel, node);
248
+ this.indexDirty = true;
249
+ if (process)
250
+ this.pump();
251
+ }
252
+ current(pair, epoch) {
253
+ return this.scenes.get(pair.scene)?.pairs.get(pair.key) === pair && (this.epochs.get(pair.scene) ?? 0) === epoch;
254
+ }
255
+ pump() {
256
+ for (const pair of this.dirty) {
257
+ if (this.active.size >= this.concurrency)
258
+ break;
259
+ if (pair.running || this.unsettled.has(pair.scene))
260
+ continue;
261
+ this.dirty.delete(pair);
262
+ if (pair.attempted === signatureKey(pair.inputs))
263
+ continue;
264
+ pair.running = true;
265
+ const task = this.limit(() => this.processPair(pair)).finally(() => {
266
+ this.progressCompleted++;
267
+ this.reportComparing();
268
+ pair.running = false;
269
+ this.active.delete(task);
270
+ this.pump();
271
+ });
272
+ this.active.add(task);
273
+ }
274
+ }
275
+ async readInputs(pair) {
276
+ const [reference, renderer] = await Promise.all([
277
+ signature(join(this.root, pair.reference)),
278
+ signature(join(this.root, pair.renderer)),
279
+ ]);
280
+ return reference && renderer
281
+ ? { reference: { ...reference, path: pair.reference }, renderer: { ...renderer, path: pair.renderer } }
282
+ : null;
283
+ }
284
+ async processPair(pair) {
285
+ const epoch = this.epochs.get(pair.scene) ?? 0;
286
+ const inputs = pair.inputs;
287
+ const key = signatureKey(inputs);
288
+ const metricsPath = join(this.root, pair.key);
289
+ // Independent commit markers let either artifact be refreshed without rewriting the other.
290
+ const source = { version: 1, ...inputs };
291
+ const deltaPath = join(this.root, pair.delta);
292
+ const deltaCachePath = `${deltaPath}.json`;
293
+ const stillCurrent = async () => {
294
+ const actual = await this.readInputs(pair);
295
+ return this.current(pair, epoch) && signatureKey(actual) === key;
296
+ };
297
+ const retry = () => {
298
+ if (this.scenes.get(pair.scene)?.pairs.get(pair.key) === pair) {
299
+ pair.attempted = undefined;
300
+ if (!this.unsettled.has(pair.scene))
301
+ this.pending.add(pair.scene);
302
+ this.indexDirty = true;
303
+ delete this.metrics[pair.key];
304
+ }
305
+ };
306
+ try {
307
+ if (!(await stillCurrent())) {
308
+ retry();
309
+ return;
310
+ }
311
+ let record;
312
+ let deltaCurrent = !this.config.delta;
313
+ if (!pair.force) {
314
+ try {
315
+ const { source: saved, ...cached } = JSON.parse(await readFile(metricsPath, 'utf8'));
316
+ if (matchesSource(saved, inputs) && validMetrics(cached))
317
+ record = cached;
318
+ }
319
+ catch {
320
+ /* Missing or invalid metrics are recomputed independently of the delta. */
321
+ }
322
+ if (this.config.delta) {
30
323
  try {
31
- const { metrics, width, height, deltaImage } = await compareImages(refPath, testPath);
32
- const rec = { ...metrics, width, height, generatedAt: new Date().toISOString() };
33
- await writeFile(metricsPath, JSON.stringify(rec, null, 2) + '\n');
34
- if (suite.config.delta)
35
- await writeFile(deltaPath, deltaImage);
36
- result.computed += 1;
37
- validMetrics.add(metricsRel);
38
- opts.onCompute?.(metricsPath);
324
+ const saved = JSON.parse(await readFile(deltaCachePath, 'utf8'));
325
+ deltaCurrent = matchesSource(saved, inputs) && !!(await signature(deltaPath));
39
326
  }
40
- catch (e) {
41
- result.failed.push({ file: testPath, error: e instanceof Error ? e.message : String(e) });
327
+ catch {
328
+ /* The delta has its own input signature and commit marker. */
42
329
  }
43
330
  }
44
331
  }
332
+ if (record && deltaCurrent) {
333
+ if (!(await stillCurrent())) {
334
+ retry();
335
+ return;
336
+ }
337
+ this.result.skipped++;
338
+ }
339
+ else {
340
+ const compared = await compareImages(join(this.root, pair.reference), join(this.root, pair.renderer), {
341
+ delta: !deltaCurrent,
342
+ });
343
+ if (!(await stillCurrent())) {
344
+ retry();
345
+ return;
346
+ }
347
+ if (!deltaCurrent) {
348
+ await atomicWrite(deltaPath, compared.deltaImage);
349
+ await atomicWrite(deltaCachePath, JSON.stringify(source, null, 2) + '\n');
350
+ }
351
+ if (!record) {
352
+ record = {
353
+ ...compared.metrics,
354
+ width: compared.width,
355
+ height: compared.height,
356
+ generatedAt: new Date().toISOString(),
357
+ };
358
+ await atomicWrite(metricsPath, JSON.stringify({ ...record, source }, null, 2) + '\n');
359
+ }
360
+ if (!(await stillCurrent())) {
361
+ retry();
362
+ return;
363
+ }
364
+ this.result.computed++;
365
+ this.opts.onCompute?.(metricsPath);
366
+ }
367
+ pair.attempted = key;
368
+ pair.force = false;
369
+ this.metrics[pair.key] = { ...record, ...(this.config.delta ? { deltaFile: pair.delta.split('/').pop() } : {}) };
370
+ this.indexDirty = true;
371
+ }
372
+ catch (error) {
373
+ if (!this.current(pair, epoch) || signatureKey(await this.readInputs(pair).catch(() => null)) !== key) {
374
+ retry();
375
+ return;
376
+ }
377
+ pair.attempted = key; // Wait for changed inputs; do not spin on corrupt images.
378
+ delete this.metrics[pair.key];
379
+ this.indexDirty = true;
380
+ this.result.failed.push({
381
+ file: join(this.root, pair.renderer),
382
+ error: error instanceof Error ? error.message : String(error),
383
+ });
45
384
  }
46
385
  }
47
- await writeIndex(root, await scanSuite(root), validMetrics);
48
- return result;
49
- }
50
- /** `index.json`: the scan plus metrics for successful or up-to-date pairs, so the viewer never walks the disk per request. */
51
- async function writeIndex(root, suite, validMetrics) {
52
- const metrics = {};
53
- for (const scene of allScenes(suite.root)) {
54
- for (const [output, renderers] of Object.entries(scene.images)) {
55
- for (const r of renderers) {
56
- for (const ref of suite.config.renderers.filter((x) => x.reference)) {
57
- const rel = `${scene.path}/${output}/${metricsFile(r, ref.id)}`;
58
- if (!validMetrics.has(rel))
59
- continue;
60
- const raw = await readFile(join(root, rel), 'utf8').catch(() => null);
61
- if (raw)
62
- metrics[rel] = JSON.parse(raw);
386
+ async drain() {
387
+ do {
388
+ while (this.pending.size || this.dirty.size || this.active.size) {
389
+ const pending = [...this.pending];
390
+ this.pending.clear();
391
+ let scanned = 0;
392
+ const reportScanning = () => this.opts.onProgress?.({
393
+ phase: 'Scanning changes',
394
+ completed: scanned,
395
+ total: pending.length,
396
+ unit: 'scenes',
397
+ });
398
+ if (pending.length)
399
+ reportScanning();
400
+ for (const rel of pending) {
401
+ try {
402
+ if (!rel) {
403
+ this.suite.hasReadme = !!(await signature(join(this.root, 'README.md')));
404
+ this.suite.root.hasReadme = this.suite.hasReadme;
405
+ this.indexDirty = true;
406
+ }
407
+ else {
408
+ await this.reconcile(rel, await scanScene(this.root, rel, this.config));
409
+ // Newly inserted groups and README-only changes need current presence flags too.
410
+ let group = this.suite.root;
411
+ for (const part of rel.split('/')) {
412
+ const path = group.path ? `${group.path}/${part}` : part;
413
+ const child = group.groups.find((g) => g.path === path);
414
+ if (!child)
415
+ break;
416
+ child.hasReadme = !!(await signature(join(this.root, path, 'README.md')));
417
+ group = child;
418
+ }
419
+ }
420
+ }
421
+ catch (error) {
422
+ this.result.failed.push({
423
+ file: join(this.root, rel),
424
+ error: error instanceof Error ? error.message : String(error),
425
+ });
426
+ }
427
+ scanned++;
428
+ reportScanning();
63
429
  }
430
+ this.pump();
431
+ if (this.active.size)
432
+ await Promise.race(this.active);
433
+ else if (!this.pending.size)
434
+ break; // Remaining dirty nodes belong to an unsettled watcher batch.
435
+ }
436
+ if (this.indexDirty) {
437
+ this.opts.onProgress?.({ phase: 'Writing index', completed: 0, total: 1, unit: 'files' });
438
+ const index = {
439
+ ...this.suite,
440
+ metrics: Object.fromEntries(Object.entries(this.metrics).toSorted(([a], [b]) => a.localeCompare(b))),
441
+ };
442
+ await mkdir(this.root, { recursive: true });
443
+ await atomicWrite(join(this.root, 'index.json'), JSON.stringify(index, null, 2) + '\n');
444
+ this.indexDirty = false;
445
+ this.opts.onProgress?.({ phase: 'Writing index', completed: 1, total: 1, unit: 'files' });
64
446
  }
447
+ } while (this.pending.size);
448
+ this.force = false;
449
+ this.progressCompleted = 0;
450
+ this.progressTotal = 0;
451
+ const result = this.result;
452
+ this.result = emptyResult();
453
+ result.failed.sort((a, b) => a.file.localeCompare(b.file));
454
+ return result;
455
+ }
456
+ }
457
+ /** Process discovered scenes through the same scheduler used by watch mode. */
458
+ export async function processSuite(root, opts = {}) {
459
+ return (await SuiteProcessor.create(root, opts)).initialize();
460
+ }
461
+ /** One-shot compatibility helper. Watch mode retains its SuiteProcessor instead. */
462
+ export async function processChanges(root, paths, onProgress) {
463
+ const processor = await SuiteProcessor.create(root, { onProgress });
464
+ try {
465
+ await processor.initialize(false);
466
+ }
467
+ catch {
468
+ return processSuite(root, { onProgress });
469
+ }
470
+ processor.notify(paths);
471
+ return processor.flush();
472
+ }
473
+ function replaceScene(root, path, scene) {
474
+ const parts = path.split('/');
475
+ const parents = [root];
476
+ let group = root;
477
+ for (const part of parts.slice(0, -1)) {
478
+ const groupPath = group.path ? `${group.path}/${part}` : part;
479
+ let child = group.groups.find((g) => g.path === groupPath);
480
+ if (!child && scene) {
481
+ child = { path: groupPath, hasReadme: false, groups: [], scenes: [] };
482
+ group.groups.push(child);
483
+ group.groups.sort((a, b) => a.path.localeCompare(b.path));
65
484
  }
485
+ if (!child)
486
+ return;
487
+ group = child;
488
+ parents.push(group);
489
+ }
490
+ group.scenes = group.scenes.filter((s) => s.path !== path);
491
+ if (scene)
492
+ group.scenes.push(scene);
493
+ group.scenes.sort((a, b) => a.path.localeCompare(b.path));
494
+ for (let i = parents.length - 1; i > 0; i--) {
495
+ const current = parents[i];
496
+ if (current.groups.length || current.scenes.length)
497
+ break;
498
+ parents[i - 1].groups = parents[i - 1].groups.filter((g) => g !== current);
66
499
  }
67
- const file = join(root, 'index.json');
68
- await mkdir(dirname(file), { recursive: true });
69
- await writeFile(file, JSON.stringify({ ...suite, metrics }, null, 2) + '\n');
70
500
  }
71
501
  //# sourceMappingURL=process.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.test.d.ts","sourceRoot":"","sources":["../../src/core/process.test.ts"],"names":[],"mappings":""}