@stag-build/phonebook 0.1.2 → 0.1.4

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 (47) hide show
  1. package/README.md +10 -1
  2. package/dist/cli.js +22 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts +21 -2
  5. package/dist/commands/init.js +33 -4
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/engines/android.d.ts +54 -0
  8. package/dist/engines/android.js +152 -6
  9. package/dist/engines/android.js.map +1 -1
  10. package/dist/engines/ios.d.ts +53 -4
  11. package/dist/engines/ios.js +142 -27
  12. package/dist/engines/ios.js.map +1 -1
  13. package/dist/errors.js +12 -1
  14. package/dist/errors.js.map +1 -1
  15. package/dist/ios/snapshotTestClass.d.ts +44 -0
  16. package/dist/ios/snapshotTestClass.js +115 -0
  17. package/dist/ios/snapshotTestClass.js.map +1 -1
  18. package/dist/ios/unrendered.d.ts +38 -0
  19. package/dist/ios/unrendered.js +92 -0
  20. package/dist/ios/unrendered.js.map +1 -0
  21. package/dist/manifest.d.ts +23 -2
  22. package/dist/manifest.js +58 -0
  23. package/dist/manifest.js.map +1 -1
  24. package/dist/mcp/server.d.ts +28 -0
  25. package/dist/mcp/server.js +232 -11
  26. package/dist/mcp/server.js.map +1 -1
  27. package/dist/png.d.ts +18 -0
  28. package/dist/png.js +44 -0
  29. package/dist/png.js.map +1 -0
  30. package/dist/scan/android.js +142 -16
  31. package/dist/scan/android.js.map +1 -1
  32. package/dist/scan/gaps.d.ts +52 -0
  33. package/dist/scan/gaps.js +169 -0
  34. package/dist/scan/gaps.js.map +1 -0
  35. package/dist/scan/ios.d.ts +44 -0
  36. package/dist/scan/ios.js +445 -41
  37. package/dist/scan/ios.js.map +1 -1
  38. package/dist/scan/scope.d.ts +30 -0
  39. package/dist/scan/scope.js +208 -0
  40. package/dist/scan/scope.js.map +1 -0
  41. package/dist/scan/stats.d.ts +12 -0
  42. package/dist/scan/stats.js +24 -0
  43. package/dist/scan/stats.js.map +1 -0
  44. package/dist/scan/types.d.ts +87 -1
  45. package/dist/site/build.js +0 -0
  46. package/dist/site/build.js.map +1 -1
  47. package/package.json +1 -1
package/dist/scan/ios.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { readdir, readFile } from 'node:fs/promises';
2
2
  import { join, relative } from 'node:path';
3
3
  import { previewHints } from './hints.js';
4
+ import { componentGaps } from './gaps.js';
5
+ import { computeStats } from './stats.js';
4
6
  /**
5
7
  * Regex-based heuristic scanner for SwiftUI `View` structs and `#Preview`
6
8
  * macros (plus legacy `PreviewProvider` structs). Walks the project tree and
@@ -10,34 +12,88 @@ export async function scanIos(projectDir) {
10
12
  const components = [];
11
13
  const orphanPreviews = [];
12
14
  const files = await walkSwiftFiles(projectDir);
15
+ const extraLocales = await detectLocales(projectDir);
16
+ const enumTypes = new Set();
17
+ // Project-wide: a preview calls `withPreviewsEnv()` in one module and the
18
+ // function that says what that supplies lives in another, so this cannot be
19
+ // resolved a file at a time.
20
+ const envHelpers = new Map();
21
+ // Component bodies, kept only for the duration of the scan: which components
22
+ // a body renders cannot be answered until every component name is known, and
23
+ // the bodies themselves are far too large to put in a report.
24
+ const bodies = new Map();
13
25
  for (const file of files) {
14
26
  const relFile = relative(projectDir, file);
15
27
  const content = await readFile(file, 'utf8');
16
- const fileComponents = findViewStructs(content, relFile);
28
+ for (const enumName of findEnums(content))
29
+ enumTypes.add(enumName);
30
+ for (const [name, provided] of findEnvironmentHelpers(content))
31
+ envHelpers.set(name, provided);
32
+ const fileComponents = findViewStructs(content, relFile, bodies);
17
33
  const filePreviews = findPreviews(content, relFile);
18
34
  for (const comp of fileComponents)
19
35
  components.push(comp);
20
36
  matchPreviewsToComponents(filePreviews, fileComponents, orphanPreviews);
21
37
  }
38
+ const names = new Set(components.map((c) => c.name));
39
+ for (const component of components) {
40
+ const body = bodies.get(component.name);
41
+ if (body === undefined)
42
+ continue;
43
+ const uses = [...names].filter((n) => n !== component.name && rendersComponent(body, n));
44
+ if (uses.length > 0)
45
+ component.uses = uses;
46
+ // The body starts at the struct's opening brace, so its line 0 is the line
47
+ // the component was declared on and the offset carries the rest.
48
+ const guarded = uses.flatMap((name) => {
49
+ const at = onlyRendersConditionally(body, name);
50
+ return at === undefined ? [] : [{ name, guard: at.guard, line: component.line + at.line }];
51
+ });
52
+ if (guarded.length > 0)
53
+ component.conditionalUses = guarded;
54
+ }
22
55
  components.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
23
56
  orphanPreviews.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
57
+ for (const component of components) {
58
+ const gaps = componentGaps({
59
+ platform: 'ios',
60
+ component: component.name,
61
+ properties: component.properties ?? [],
62
+ previewNames: component.previews.map((p) => p.displayName ?? p.name),
63
+ hasDarkPreview: component.previews.some((p) => p.dark),
64
+ previewText: component.previews.map((p) => p.annotationText ?? '').join('\n'),
65
+ extraLocales,
66
+ enumTypes: [...enumTypes],
67
+ ...(component.environmentTypes ? { environmentTypes: component.environmentTypes } : {}),
68
+ environmentProvided: environmentProvided(component.previews.map((p) => p.annotationText ?? '').join('\n'), envHelpers),
69
+ });
70
+ if (gaps.length > 0)
71
+ component.gaps = gaps;
72
+ }
24
73
  return {
25
74
  platform: 'ios',
26
75
  components,
27
76
  orphanPreviews,
77
+ extraLocales,
28
78
  stats: computeStats(components, orphanPreviews),
29
79
  };
30
80
  }
31
- function findViewStructs(content, relFile) {
81
+ function findViewStructs(content, relFile, bodies) {
32
82
  const results = [];
33
83
  const regex = /(?:struct|final class)\s+([A-Z]\w*)\s*:\s*[^{]*\bView\b/g;
34
84
  let match;
35
85
  while ((match = regex.exec(content)) !== null) {
86
+ const body = structBody(content, regex.lastIndex);
87
+ const properties = findStoredProperties(body);
88
+ const environmentTypes = findEnvironmentReads(body);
89
+ bodies.set(match[1], body);
36
90
  results.push({
37
91
  name: match[1],
38
92
  file: relFile,
39
93
  line: lineNumberAt(content, match.index),
40
94
  previews: [],
95
+ ...(properties.length > 0 ? { properties } : {}),
96
+ ...(environmentTypes.length > 0 ? { environmentTypes } : {}),
41
97
  });
42
98
  }
43
99
  return results;
@@ -52,8 +108,8 @@ function findPreviews(content, relFile) {
52
108
  const nameMatch = argsText.match(/"([^"]*)"/);
53
109
  const displayName = nameMatch ? nameMatch[1] : undefined;
54
110
  const line = lineNumberAt(content, match.index);
55
- const dark = isDarkPreview(content, match.index, displayName);
56
- const annotationText = extractAnnotationText(content, match.index);
111
+ const annotationText = previewSource(content, match.index, match.index + match[0].length);
112
+ const dark = isDarkPreview(annotationText, displayName);
57
113
  const functionName = displayName ?? 'unnamed';
58
114
  const hints = previewHints({
59
115
  platform: 'ios',
@@ -74,35 +130,401 @@ function findPreviews(content, relFile) {
74
130
  // Legacy: struct X_Previews: PreviewProvider
75
131
  const legacyRegex = /struct\s+(\w+)_Previews\s*:\s*PreviewProvider/g;
76
132
  while ((match = legacyRegex.exec(content)) !== null) {
133
+ // Read the struct, same as a #Preview body. Reporting nothing here made a
134
+ // legacy preview look like it declared nothing: never dark, and supplying
135
+ // no environment object it in fact supplies — two false alarms on the
136
+ // oldest previews in a project, which are the ones least likely to be wrong.
137
+ const source = `${match[0]} {${structBody(content, legacyRegex.lastIndex)}}`;
77
138
  results.push({
78
139
  name: `${match[1]}_Previews`,
79
140
  file: relFile,
80
141
  line: lineNumberAt(content, match.index),
81
- dark: false,
142
+ dark: isDarkPreview(source, undefined),
143
+ annotationText: source,
82
144
  });
83
145
  }
84
146
  return results;
85
147
  }
86
- /** True when the ~10 lines following a #Preview declaration set a dark color scheme. */
87
- function isDarkPreview(content, matchIndex, displayName) {
148
+ /** True when a preview declares a dark colour scheme, by name or by modifier. */
149
+ function isDarkPreview(source, displayName) {
88
150
  if (displayName && displayName.endsWith('Dark'))
89
151
  return true;
90
- const rest = content.slice(matchIndex);
91
- const restLines = rest.split('\n');
92
- // Stop at the next #Preview / preview-provider struct so we don't bleed into it.
93
- const boundary = restLines.findIndex((l, i) => i > 0 && (/#Preview\b/.test(l) || /:\s*PreviewProvider\b/.test(l)));
94
- const window = boundary === -1 ? restLines.slice(0, 11) : restLines.slice(0, Math.min(11, boundary));
95
- return /\.preferredColorScheme\(\s*\.dark\s*\)/.test(window.join('\n'));
96
- }
97
- /** The #Preview(...) line plus the following lines of its body, up to the next
98
- * #Preview/PreviewProvider or ~15 lines, whichever comes first. */
99
- function extractAnnotationText(content, matchIndex) {
100
- const rest = content.slice(matchIndex);
101
- const restLines = rest.split('\n');
102
- const boundary = restLines.findIndex((l, i) => i > 0 && (/#Preview\b/.test(l) || /:\s*PreviewProvider\b/.test(l)));
103
- const cap = 15;
104
- const limit = boundary === -1 ? cap : Math.min(cap, boundary);
105
- return restLines.slice(0, limit).join('\n');
152
+ return /\.preferredColorScheme\(\s*\.dark\s*\)/.test(source);
153
+ }
154
+ /**
155
+ * The `#Preview(...)` declaration together with its body, from the macro to the
156
+ * brace that closes it.
157
+ *
158
+ * Reading a fixed number of lines instead — the 15-line window this replaces,
159
+ * and the 11-line one dark detection used truncates exactly the previews
160
+ * worth reading. A long body pushes the modifiers that carry the configuration
161
+ * past the cap, so a preview that declares `.preferredColorScheme(.dark)` is
162
+ * reported as not declaring it. Seen on IceCubesApp: a 17-line preview flagged
163
+ * for a modifier written on its line 16, in a report that called that same
164
+ * preview dark because the two checks read two different windows.
165
+ *
166
+ * Balancing braces has neither failure mode. It ends where the preview ends, so
167
+ * it can no more truncate a long body than bleed into the next declaration, and
168
+ * one reading now serves every check. `cap` is runaway protection for a file
169
+ * whose braces never balance — an unterminated string literal, most likely —
170
+ * not a window: a preview that reaches it is already unparseable.
171
+ */
172
+ function previewSource(content, matchIndex, bodyFrom) {
173
+ const cap = Math.min(content.length, matchIndex + 8000);
174
+ const open = content.indexOf('{', bodyFrom);
175
+ if (open === -1 || open >= cap)
176
+ return content.slice(matchIndex, cap);
177
+ let depth = 0;
178
+ for (let i = open; i < cap; i++) {
179
+ if (content[i] === '{')
180
+ depth++;
181
+ else if (content[i] === '}') {
182
+ depth--;
183
+ if (depth === 0)
184
+ return content.slice(matchIndex, i + 1);
185
+ }
186
+ }
187
+ return content.slice(matchIndex, cap);
188
+ }
189
+ /**
190
+ * Stored properties of a struct, given its body.
191
+ *
192
+ * Only the declaration line matters, so this reads lines rather than parsing
193
+ * Swift: a stored property is `let`/`var name: Type`, optionally preceded by
194
+ * property wrappers and an access modifier. `var body: some View` is the one
195
+ * that always appears and never describes a state, and a `var` with a `{`
196
+ * before any `=` is computed, so both are skipped.
197
+ */
198
+ function findStoredProperties(body) {
199
+ const properties = [];
200
+ const declaration = /^\s*(?:@\w+(?:\([^)]*\))?\s+)*(?:(?:private|fileprivate|internal|public|package)\s+)?(?:let|var)\s+(\w+)\s*:\s*([^={\n]+)/;
201
+ for (const line of body.split('\n')) {
202
+ const match = line.match(declaration);
203
+ if (!match)
204
+ continue;
205
+ const name = match[1];
206
+ const type = match[2].trim();
207
+ if (name === 'body')
208
+ continue;
209
+ // Computed: a brace opens before any assignment.
210
+ const rest = line.slice(line.indexOf(type) + type.length);
211
+ if (rest.includes('{') && !rest.includes('='))
212
+ continue;
213
+ properties.push({ name, type, kind: classifyType(type) });
214
+ }
215
+ return properties;
216
+ }
217
+ /**
218
+ * Types the struct reads out of the environment by type — `@Environment(X.self)`.
219
+ *
220
+ * The keypath form, `@Environment(\\.openURL)`, is deliberately not matched: it
221
+ * reads a value SwiftUI always provides, so it can never be the missing thing.
222
+ * Only an object looked up by its own type can be absent, and when it is, the
223
+ * read traps.
224
+ */
225
+ function findEnvironmentReads(body) {
226
+ const found = new Set();
227
+ const regex = /@Environment\(\s*([A-Z]\w*)\.self\s*\)/g;
228
+ let match;
229
+ while ((match = regex.exec(body)) !== null)
230
+ found.add(match[1]);
231
+ return [...found];
232
+ }
233
+ /**
234
+ * What each `-> some View` helper in this file supplies to the environment,
235
+ * keyed by function name.
236
+ *
237
+ * A preview that calls `withPreviewsEnv()` supplies everything that function
238
+ * supplies, and the preview's own text names none of it. Without this the rule
239
+ * would flag every component in a project that has such a helper — which is
240
+ * every project that has more than a handful of previews.
241
+ */
242
+ function findEnvironmentHelpers(content) {
243
+ const helpers = new Map();
244
+ const regex = /func\s+(\w+)\s*\([^)]*\)\s*->\s*some\s+View/g;
245
+ let match;
246
+ while ((match = regex.exec(content)) !== null) {
247
+ helpers.set(match[1], environmentArguments(structBody(content, regex.lastIndex)));
248
+ }
249
+ return helpers;
250
+ }
251
+ /** Everything the previews supply, directly or through a helper they call. */
252
+ function environmentProvided(previewText, helpers) {
253
+ const parts = [environmentArguments(previewText)];
254
+ for (const [name, provided] of helpers) {
255
+ if (new RegExp(`\\b${name}\\s*\\(`).test(previewText))
256
+ parts.push(provided);
257
+ }
258
+ return parts.join('\n');
259
+ }
260
+ /**
261
+ * The arguments of every `.environment(...)` call in some source, concatenated.
262
+ *
263
+ * Kept as text rather than resolved to type names because the value passed is
264
+ * rarely the type itself: `.environment(StatusDataControllerProvider.shared
265
+ * .dataController(for:client:))` supplies a StatusDataController and never
266
+ * writes that name as the head of the expression. Matching on the text covers
267
+ * both spellings, and its failure mode is silence rather than a false alarm.
268
+ *
269
+ * The leading dot is optional because a helper written as an extension on View
270
+ * calls the first one on itself — `environment(CurrentAccount.shared)` — and
271
+ * only chains the rest. Requiring the dot loses whatever the first call
272
+ * supplies, which is the one a project's preview helper opens with.
273
+ */
274
+ function environmentArguments(source) {
275
+ const parts = [];
276
+ const regex = /\benvironment\(/g;
277
+ let match;
278
+ while ((match = regex.exec(source)) !== null) {
279
+ parts.push(balancedArgument(source, regex.lastIndex - 1));
280
+ }
281
+ return parts.join('\n');
282
+ }
283
+ /** The text inside the parenthesis opening at `openIndex`, to its match. */
284
+ function balancedArgument(source, openIndex) {
285
+ let depth = 0;
286
+ for (let i = openIndex; i < source.length; i++) {
287
+ if (source[i] === '(')
288
+ depth++;
289
+ else if (source[i] === ')') {
290
+ depth--;
291
+ if (depth === 0)
292
+ return source.slice(openIndex + 1, i);
293
+ }
294
+ }
295
+ return source.slice(openIndex + 1);
296
+ }
297
+ /**
298
+ * True when `source` renders `component` — the name followed by an opening
299
+ * parenthesis, which is how a SwiftUI view is instantiated.
300
+ *
301
+ * A bare mention is not a render: `StatusRowView.Context` names the type
302
+ * without showing anything, and a comment saying "like AvatarView" shows even
303
+ * less. Requiring the parenthesis costs the zero-argument spelling nothing —
304
+ * `RowList()` still matches — and keeps the answer to something a reader
305
+ * would agree with.
306
+ */
307
+ export function rendersComponent(source, component) {
308
+ return new RegExp(`\\b${component}\\s*\\(`).test(source);
309
+ }
310
+ /**
311
+ * Where `source` renders `component` behind a condition, when every place it
312
+ * does is behind one — so whether it appears depends on state the caller sets.
313
+ *
314
+ * This is what separates a parent that shows a child from a parent that might.
315
+ * IceCubes' StatusRowView renders StatusRowDetailView only `if isFocused`, and
316
+ * its one preview builds a timeline row, where nothing is focused: the preview
317
+ * exists, and the detail view is not in it. Treating that as coverage is how a
318
+ * redesigned view reaches no screenshot and no one is told.
319
+ *
320
+ * The brace stack is the whole trick — a frame remembers the text that opened
321
+ * it, and that text is the condition when it reads as one. No Swift is
322
+ * evaluated and none needs to be: the question is whether a render is guarded
323
+ * and behind what, not which way the guard goes.
324
+ *
325
+ * Returns the innermost condition around the first guarded render. A component
326
+ * that renders the same child behind two different conditions is rare, and the
327
+ * answer to the first is the answer to both: nothing shows it.
328
+ */
329
+ export function onlyRendersConditionally(source, component) {
330
+ const stack = [];
331
+ let segment = '';
332
+ let line = 0;
333
+ let guarded;
334
+ for (let i = 0; i < source.length; i++) {
335
+ const char = source[i];
336
+ if (char === '\n')
337
+ line++;
338
+ if (char === '{') {
339
+ stack.push(conditionOpening(segment));
340
+ segment = '';
341
+ continue;
342
+ }
343
+ if (char === '}') {
344
+ stack.pop();
345
+ segment = '';
346
+ continue;
347
+ }
348
+ segment += char;
349
+ // The name has just been completed by an opening parenthesis.
350
+ if (char === '(' && segment.trimEnd().endsWith(`${component}(`)) {
351
+ const name = segment.trimEnd().slice(0, -1);
352
+ if (name.endsWith(component) && !/\w/.test(name.slice(0, -component.length).slice(-1))) {
353
+ const condition = [...stack].reverse().find((c) => c !== undefined);
354
+ // One unguarded render settles it: the parent does show the child.
355
+ if (condition === undefined)
356
+ return undefined;
357
+ guarded ??= { guard: condition, line };
358
+ }
359
+ }
360
+ }
361
+ return guarded;
362
+ }
363
+ /**
364
+ * The condition in the text that opened a brace, or undefined when it opened
365
+ * something else.
366
+ *
367
+ * Takes the last condition keyword in the segment rather than the first: the
368
+ * text since the previous brace can carry a whole statement before the one that
369
+ * opens this frame.
370
+ */
371
+ function conditionOpening(segment) {
372
+ const opener = /(^|[^\w.])(if|guard|switch)[\s(]/g;
373
+ let last = null;
374
+ let match;
375
+ while ((match = opener.exec(segment)) !== null)
376
+ last = match;
377
+ if (last === null)
378
+ return undefined;
379
+ return segment
380
+ .slice(last.index + last[1].length)
381
+ .replace(/\s+/g, ' ')
382
+ .trim();
383
+ }
384
+ /**
385
+ * Which of `known` this source renders — the same rule as `rendersComponent`,
386
+ * asked once for the whole set.
387
+ *
388
+ * Reading the names out of the source and intersecting beats testing every
389
+ * known component against it: a project has hundreds of components and a scan
390
+ * asks this of every preview body, and the regex-per-name version is that
391
+ * product.
392
+ */
393
+ export function componentsNamedIn(source, known) {
394
+ const named = new Set();
395
+ const regex = /\b([A-Z]\w*)\s*\(/g;
396
+ let match;
397
+ while ((match = regex.exec(source)) !== null) {
398
+ if (known.has(match[1]))
399
+ named.add(match[1]);
400
+ }
401
+ return [...named];
402
+ }
403
+ /** Enum type names declared in this file, including indirect and raw-value enums. */
404
+ function findEnums(content) {
405
+ const results = [];
406
+ const regex = /(?:^|\n)\s*(?:public\s+|internal\s+|private\s+|fileprivate\s+|package\s+)?(?:indirect\s+)?enum\s+([A-Z]\w*)/g;
407
+ let match;
408
+ while ((match = regex.exec(content)) !== null)
409
+ results.push(match[1]);
410
+ return results;
411
+ }
412
+ /** The text between the struct's opening brace and its matching close, capped. */
413
+ function structBody(content, from) {
414
+ const open = content.indexOf('{', from);
415
+ if (open === -1)
416
+ return '';
417
+ let depth = 0;
418
+ const cap = Math.min(content.length, open + 8000);
419
+ for (let i = open; i < cap; i++) {
420
+ if (content[i] === '{')
421
+ depth++;
422
+ else if (content[i] === '}') {
423
+ depth--;
424
+ if (depth === 0)
425
+ return content.slice(open + 1, i);
426
+ }
427
+ }
428
+ return content.slice(open + 1, cap);
429
+ }
430
+ /** Types whose values are a spectrum rather than a set of states worth previewing. */
431
+ const SCALAR_TYPES = new Set([
432
+ 'String', 'Int', 'Double', 'Float', 'CGFloat', 'Date', 'URL', 'UUID', 'Data',
433
+ 'Color', 'Font', 'Image', 'Text', 'TimeInterval', 'Any', 'AnyView',
434
+ ]);
435
+ function classifyType(type) {
436
+ const bare = type.replace(/\s+/g, '');
437
+ if (bare.endsWith('?') || bare.startsWith('Optional<'))
438
+ return 'optional';
439
+ if (bare.startsWith('[') || bare.startsWith('Set<') || bare.startsWith('Array<'))
440
+ return 'collection';
441
+ if (bare === 'Bool')
442
+ return 'bool';
443
+ if (SCALAR_TYPES.has(bare))
444
+ return 'other';
445
+ // A capitalized type of the project's own is the shape an enum takes; the
446
+ // agent reads it to find out whether it actually is one.
447
+ if (/^[A-Z]\w*$/.test(bare))
448
+ return 'enum-like';
449
+ return 'other';
450
+ }
451
+ /**
452
+ * Locales the project ships beyond its development language, from `.lproj`
453
+ * directories and String Catalog localizations. "Base" is not a locale.
454
+ */
455
+ async function detectLocales(projectDir) {
456
+ const found = new Set();
457
+ const developmentRegion = await readDevelopmentRegion(projectDir);
458
+ async function walk(dir, depth) {
459
+ if (depth > 6)
460
+ return;
461
+ let entries;
462
+ try {
463
+ entries = await readdir(dir, { withFileTypes: true });
464
+ }
465
+ catch {
466
+ return;
467
+ }
468
+ for (const entry of entries) {
469
+ if (entry.isDirectory()) {
470
+ if (SKIP_DIRS.has(entry.name))
471
+ continue;
472
+ if (entry.name.endsWith('.lproj')) {
473
+ const code = entry.name.slice(0, -'.lproj'.length);
474
+ if (code !== 'Base')
475
+ found.add(code);
476
+ continue;
477
+ }
478
+ await walk(join(dir, entry.name), depth + 1);
479
+ }
480
+ else if (entry.isFile() && entry.name.endsWith('.xcstrings')) {
481
+ try {
482
+ const catalogue = JSON.parse(await readFile(join(dir, entry.name), 'utf8'));
483
+ const source = catalogue.sourceLanguage;
484
+ for (const entryValue of Object.values(catalogue.strings ?? {})) {
485
+ for (const code of Object.keys(entryValue.localizations ?? {})) {
486
+ if (code !== source)
487
+ found.add(code);
488
+ }
489
+ }
490
+ }
491
+ catch {
492
+ // A catalogue we cannot read tells us nothing; it is not an error.
493
+ }
494
+ }
495
+ }
496
+ }
497
+ await walk(projectDir, 0);
498
+ if (developmentRegion)
499
+ found.delete(developmentRegion);
500
+ return [...found].sort();
501
+ }
502
+ /**
503
+ * The project's development language, which is not a localization of itself.
504
+ * Xcode records it as `developmentRegion` in the project file.
505
+ */
506
+ async function readDevelopmentRegion(projectDir) {
507
+ let entries;
508
+ try {
509
+ entries = await readdir(projectDir, { withFileTypes: true });
510
+ }
511
+ catch {
512
+ return undefined;
513
+ }
514
+ for (const entry of entries) {
515
+ if (!entry.isDirectory() || !entry.name.endsWith('.xcodeproj'))
516
+ continue;
517
+ try {
518
+ const pbxproj = await readFile(join(projectDir, entry.name, 'project.pbxproj'), 'utf8');
519
+ const match = pbxproj.match(/developmentRegion\s*=\s*(\w+)/);
520
+ if (match)
521
+ return match[1];
522
+ }
523
+ catch {
524
+ // No readable project file: fall through and report every locale found.
525
+ }
526
+ }
527
+ return undefined;
106
528
  }
107
529
  function lineNumberAt(content, index) {
108
530
  let line = 1;
@@ -154,24 +576,6 @@ function matchPreviewsToComponents(previews, components, orphanPreviews) {
154
576
  function normalize(name) {
155
577
  return name.replace(/\s+/g, '').toLowerCase();
156
578
  }
157
- function computeStats(components, orphanPreviews) {
158
- const withPreview = components.filter((c) => c.previews.length > 0).length;
159
- const withDarkPreview = components.filter((c) => c.previews.some((p) => p.dark)).length;
160
- const totalPreviews = components.reduce((sum, c) => sum + c.previews.length, 0) + orphanPreviews.length;
161
- const allPreviews = [...components.flatMap((c) => c.previews), ...orphanPreviews];
162
- const hintCount = allPreviews.reduce((sum, p) => sum + (p.hints?.length ?? 0), 0);
163
- // Unlike Android's @Preview (which annotates the composable itself), #Preview is
164
- // always a separate top-level block, so a SwiftUI View struct can't be its own
165
- // preview. No self-preview pattern exists here.
166
- return {
167
- components: components.length,
168
- withPreview,
169
- withDarkPreview,
170
- totalPreviews,
171
- hintCount,
172
- selfPreviewed: 0,
173
- };
174
- }
175
579
  const SKIP_DIRS = new Set(['build', '.build', 'DerivedData', 'Pods']);
176
580
  async function walkSwiftFiles(dir) {
177
581
  const results = [];
@@ -1 +1 @@
1
- {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/scan/ios.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/scan/ios.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CoverageReport } from './types.js';
2
+ /**
3
+ * Narrow a finished report to the components declared in `paths`.
4
+ *
5
+ * The scan itself is never narrowed, and that distinction is the whole design.
6
+ * Which types are enums, what a project's preview helper supplies, which
7
+ * locales ship — all of it is a fact about the project, not about one file, and
8
+ * a scan that walked only the changed files would get every one of them wrong.
9
+ * So the walk stays whole and the report is filtered afterwards, which costs a
10
+ * few hundred milliseconds and buys an answer that is still correct.
11
+ *
12
+ * What it saves is the reader. A run that touched five components was handed
13
+ * five hundred gaps, of which ten were its own; the rest are a backlog nobody
14
+ * asked it about, and an agent cannot tell which is which.
15
+ */
16
+ export declare function scopeReport(report: CoverageReport, paths: string[]): CoverageReport;
17
+ /**
18
+ * Files with uncommitted changes, relative to the project directory.
19
+ *
20
+ * `git status --porcelain` reports staged, unstaged and untracked in one pass,
21
+ * which is what an agent's turn leaves behind: it edits and adds, it does not
22
+ * commit. Paths come back relative to the repository root, so they are rebased
23
+ * onto the project directory — the two differ whenever phonebook.config.json
24
+ * sits in a subdirectory of a larger repository.
25
+ *
26
+ * A directory that is not a repository, or a git that is not installed, is not
27
+ * an error here. It means the caller cannot scope by change and gets the whole
28
+ * project, which is the behaviour they had before asking.
29
+ */
30
+ export declare function changedFiles(projectDir: string): Promise<string[]>;