@stag-build/phonebook 0.1.3 → 0.1.5

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.
@@ -2,19 +2,47 @@ import { spawn } from 'node:child_process';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { copyFile, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises';
4
4
  import { tmpdir } from 'node:os';
5
- import { join, resolve } from 'node:path';
5
+ import { basename, join, resolve } from 'node:path';
6
6
  import { diagnoseXcodebuildFailure } from '../errors.js';
7
7
  import { SCHEMA_VERSION } from '../manifest.js';
8
8
  import { readPngSize } from '../png.js';
9
9
  import { parsePreviewName, spaceCamelCase } from '../naming.js';
10
10
  import { gitInfo } from './git.js';
11
- import { findSnapshotTestSubclass, findSnapshottingTestsTargets, readPbxprojText } from '../ios/snapshotTestClass.js';
11
+ import { findSnapshotTestSubclass, findSnapshottingTestsTargets, moduleForFile, readPbxprojText } from '../ios/snapshotTestClass.js';
12
+ import { parseFailedPreviews } from '../ios/unrendered.js';
13
+ import { changedFiles } from '../scan/scope.js';
12
14
  /** Builds the error/warning text for a `generate` run that exported zero snapshots. Exported for tests. */
13
15
  export function buildEmptySnapshotsMessage(exportDir, scheme) {
14
16
  return (`xcodebuild succeeded but no snapshots were exported to ${exportDir}. ` +
15
17
  `Does the "${scheme}" scheme include a SnapshotPreviews test target, and are your #Preview macros not all ` +
16
18
  'filtered out (e.g. by a snapshotPreviews() override that excludes them)?');
17
19
  }
20
+ /**
21
+ * A run that rendered some previews and did not finish, usually because a
22
+ * preview crashed. The bundle of what did render has been written.
23
+ *
24
+ * Thrown rather than returned so a caller that only knows the happy path — the
25
+ * CLI — still exits non-zero, while one that can use the partial result catches
26
+ * it. The crash list is worth more than a clean failure: every preview that traps
27
+ * costs a host-app relaunch, so it is what makes the next run shorter.
28
+ */
29
+ export class IncompleteRenderError extends Error {
30
+ manifest;
31
+ outputDir;
32
+ failedPreviews;
33
+ diagnosis;
34
+ constructor(manifest, outputDir,
35
+ /** Container of each preview test the runner reported failed, one per test. */
36
+ failedPreviews, diagnosis) {
37
+ const crashed = failedPreviews.length > 0 ? `; ${failedPreviews.length} crashed (${[...new Set(failedPreviews)].join(', ')})` : '';
38
+ super([`Rendered ${manifest.entries.length} previews into ${outputDir}, but the run did not finish${crashed}.`, ...diagnosis].join('\n'));
39
+ this.manifest = manifest;
40
+ this.outputDir = outputDir;
41
+ this.failedPreviews = failedPreviews;
42
+ this.diagnosis = diagnosis;
43
+ this.name = 'IncompleteRenderError';
44
+ }
45
+ }
18
46
  /**
19
47
  * Resolves the -only-testing:Target/Class argument so `generate` runs just the
20
48
  * snapshot test class instead of the app's whole test suite — an unrelated
@@ -42,6 +70,71 @@ export async function resolveOnlyTesting(config, projectDir) {
42
70
  return undefined;
43
71
  }
44
72
  }
73
+ /**
74
+ * A SNAPSHOTS_ONLY_FILTER pattern that matches no preview at all.
75
+ *
76
+ * Patterns are anchored regular expressions matched against a preview's
77
+ * synthesized fileID, and a fileID is never empty, so "^$" can match nothing.
78
+ * It is what a narrowed render with nothing to narrow to asks for: an empty
79
+ * bundle, rather than the whole project.
80
+ */
81
+ const NEVER_MATCHES = '^$';
82
+ /** Escapes a literal so it matches itself inside a regular expression. Exported for tests. */
83
+ export function escapeRegex(literal) {
84
+ return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
85
+ }
86
+ /**
87
+ * The SNAPSHOTS_ONLY_FILTER value that renders only the previews declared in
88
+ * `files`.
89
+ *
90
+ * SnapshotPreviews filters before it creates a test method, so a pattern that
91
+ * misses is a preview that never renders — which makes a half-resolved filter
92
+ * worse than none. A file whose module cannot be read is therefore a failure
93
+ * rather than a filter with a hole in it.
94
+ *
95
+ * It fails rather than widening, which is what it used to do. Dropping the
96
+ * filter and rendering everything looked like the safe choice: no preview is
97
+ * lost and the caller still gets a bundle. What it actually does is answer a
98
+ * different question than the one asked, at a cost that scales with the project
99
+ * rather than the request — one file becomes every preview in the repository
100
+ * and every simulator boot that takes, and nothing in the result says so. A
101
+ * warning on stderr is not consent. A caller that wants the whole project can
102
+ * already say so, by leaving --files and --changed off.
103
+ *
104
+ * Each pattern is anchored against the preview's synthesized fileID,
105
+ * "<Module>/<File>.swift", because the match is a substring search: unanchored,
106
+ * "Card.swift" would also claim UserCard.swift.
107
+ */
108
+ export async function buildSnapshotsOnlyFilter(files, moduleOf) {
109
+ const swift = files.filter((file) => file.endsWith('.swift'));
110
+ if (swift.length === 0) {
111
+ // A well-formed narrow request whose answer is empty: the caller named
112
+ // files, none of them can hold a #Preview, so nothing matches. That is a
113
+ // result, not a failure — the same call Android's --tests filtering makes
114
+ // when a module has none of the requested previews. It is emphatically not
115
+ // a reason to render everything, which is the one answer the caller can be
116
+ // sure they did not ask for.
117
+ console.warn('warning: none of the files given are Swift sources; nothing to render.');
118
+ return NEVER_MATCHES;
119
+ }
120
+ const patterns = [];
121
+ const unresolved = [];
122
+ for (const file of swift) {
123
+ const module = await moduleOf(file);
124
+ if (!module) {
125
+ unresolved.push(file);
126
+ continue;
127
+ }
128
+ patterns.push(`^${escapeRegex(module)}/${escapeRegex(basename(file))}$`);
129
+ }
130
+ if (unresolved.length > 0) {
131
+ throw new Error(`Could not work out which target compiles ${unresolved.join(', ')}, so the previews for those ` +
132
+ 'files cannot be singled out. No filesystem-synchronized folder covers them and no target\'s ' +
133
+ 'build phase lists them — check they are part of the Xcode project, and that ' +
134
+ '`xcodebuild -showBuildSettings` works for their target. Drop --files to render the whole project.');
135
+ }
136
+ return patterns.join('\n');
137
+ }
45
138
  /**
46
139
  * Runs the SnapshotPreviews-backed XCTest target via xcodebuild on a simulator
47
140
  * and harvests the exported PNG + JSON sidecar pairs into a Phonebook bundle.
@@ -71,14 +164,22 @@ export async function generateIos(config, projectDir, outputDir, options = {}) {
71
164
  const onlyTesting = await resolveOnlyTesting(config, projectDir);
72
165
  if (onlyTesting)
73
166
  args.push(`-only-testing:${onlyTesting}`);
74
- await runXcodebuild(projectDir, args, {
167
+ const onlyFilter = await resolveSnapshotsOnlyFilter(config, projectDir, options);
168
+ const run = await runXcodebuild(projectDir, args, {
75
169
  TEST_RUNNER_SNAPSHOTS_EXPORT_DIR: exportDir,
76
170
  TEST_RUNNER_SNAPSHOTS_RUNNING_FOR_PREVIEWS: '1',
171
+ ...(onlyFilter ? { TEST_RUNNER_SNAPSHOTS_ONLY_FILTER: onlyFilter } : {}),
77
172
  }, options.quiet ?? false);
173
+ const finished = run.exitCode === 0;
174
+ // Read before deciding anything: a run that failed may still have rendered
175
+ // most of the gallery, and the export directory is deleted on the way out.
176
+ const pngs = (await readdir(exportDir)).filter((f) => f.endsWith('.png')).sort();
177
+ if (!finished && pngs.length === 0 && run.failedPreviews.length === 0) {
178
+ throw new Error([`xcodebuild failed (exit ${run.exitCode}) running: xcodebuild ${args.join(' ')}`, ...run.diagnosis].join('\n'));
179
+ }
78
180
  const imagesDir = join(outputDir, 'images');
79
181
  await mkdir(imagesDir, { recursive: true });
80
- const pngs = (await readdir(exportDir)).filter((f) => f.endsWith('.png')).sort();
81
- if (pngs.length === 0) {
182
+ if (finished && pngs.length === 0) {
82
183
  const message = buildEmptySnapshotsMessage(exportDir, ios.scheme);
83
184
  if (!(options.allowEmpty ?? false)) {
84
185
  throw new Error(message);
@@ -108,12 +209,28 @@ export async function generateIos(config, projectDir, outputDir, options = {}) {
108
209
  entries,
109
210
  };
110
211
  await writeFile(join(outputDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
212
+ if (!finished) {
213
+ throw new IncompleteRenderError(manifest, outputDir, run.failedPreviews, run.diagnosis);
214
+ }
111
215
  return manifest;
112
216
  }
113
217
  finally {
114
218
  await rm(exportDir, { recursive: true, force: true });
115
219
  }
116
220
  }
221
+ /**
222
+ * Turns the `--changed`/`--files` options into a SNAPSHOTS_ONLY_FILTER value,
223
+ * reading the pbxproj once and resolving each file's module through it.
224
+ */
225
+ async function resolveSnapshotsOnlyFilter(config, projectDir, options) {
226
+ if (!options.changedOnly && !options.files)
227
+ return undefined;
228
+ const ios = config.ios;
229
+ const files = options.files ?? (await changedFiles(projectDir));
230
+ const pbxproj = await readPbxprojText(projectDir, ios.project ? join(projectDir, ios.project) : undefined);
231
+ const cache = new Map();
232
+ return buildSnapshotsOnlyFilter(files, (file) => moduleForFile(pbxproj, projectDir, file, { project: ios.project, workspace: ios.workspace, scheme: ios.scheme }, cache));
233
+ }
117
234
  async function readSidecar(path) {
118
235
  try {
119
236
  return JSON.parse(await readFile(path, 'utf8'));
@@ -169,9 +286,10 @@ export function mapSidecar(png, sidecar) {
169
286
  * tail is kept and nothing is echoed live; the tail is written to stderr once
170
287
  * if the build fails.
171
288
  *
172
- * On a non-zero exit, the tail is run through `diagnoseXcodebuildFailure`
173
- * any matched diagnosis lines are printed to stderr (`phonebook: `-prefixed)
174
- * and folded into the rejected Error's message, mirroring `runGradle`.
289
+ * Resolves however the run ends, and rejects only when xcodebuild cannot be
290
+ * started: a failed run can still have rendered previews, and that is for the
291
+ * caller to judge. Failed preview tests are read from the whole stream rather
292
+ * than the tail, and line by line, since a chunk can end mid-line.
175
293
  */
176
294
  export function runXcodebuild(cwd, args, env, quiet) {
177
295
  return new Promise((resolvePromise, reject) => {
@@ -181,33 +299,34 @@ export function runXcodebuild(cwd, args, env, quiet) {
181
299
  env: { ...process.env, ...env },
182
300
  });
183
301
  let tail = [];
184
- const onData = (target) => (data) => {
185
- if (!quiet)
186
- target.write(data);
187
- tail.push(...data.toString('utf8').split('\n'));
302
+ const failedPreviews = [];
303
+ const partial = { stdout: '', stderr: '' };
304
+ const takeLines = (lines) => {
305
+ failedPreviews.push(...parseFailedPreviews(lines.join('\n')));
306
+ tail.push(...lines);
188
307
  if (tail.length > 200)
189
308
  tail = tail.slice(-200);
190
309
  };
191
- child.stdout?.on('data', onData(process.stdout));
192
- child.stderr?.on('data', onData(process.stderr));
310
+ const onData = (stream, target) => (data) => {
311
+ if (!quiet)
312
+ target.write(data);
313
+ const lines = (partial[stream] + data.toString('utf8')).split('\n');
314
+ partial[stream] = lines.pop() ?? '';
315
+ takeLines(lines);
316
+ };
317
+ child.stdout?.on('data', onData('stdout', process.stdout));
318
+ child.stderr?.on('data', onData('stderr', process.stderr));
193
319
  child.on('error', reject);
194
320
  child.on('close', (code) => {
195
- if (code === 0) {
196
- resolvePromise();
197
- return;
198
- }
321
+ takeLines([partial.stdout, partial.stderr].filter((l) => l.length > 0));
199
322
  const tailText = tail.join('\n');
200
- const diagnosis = diagnoseXcodebuildFailure(tailText);
323
+ const diagnosis = code === 0 ? [] : diagnoseXcodebuildFailure(tailText);
201
324
  if (diagnosis.length > 0) {
202
325
  process.stderr.write(diagnosis.map((line) => `phonebook: ${line}`).join('\n') + '\n');
203
326
  }
204
- if (quiet && tail.length > 0)
327
+ if (quiet && code !== 0 && tail.length > 0)
205
328
  process.stderr.write(tailText + '\n');
206
- const message = [
207
- `xcodebuild failed (exit ${code}) running: xcodebuild ${args.join(' ')}`,
208
- ...diagnosis,
209
- ].join('\n');
210
- reject(new Error(message));
329
+ resolvePromise({ exitCode: code, failedPreviews, diagnosis });
211
330
  });
212
331
  });
213
332
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/engines/ios.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/engines/ios.ts"],"names":[],"mappings":"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"}
package/dist/errors.js CHANGED
@@ -50,12 +50,23 @@ export function diagnoseXcodebuildFailure(output) {
50
50
  lines.push("The SnapshotTest base class lives in the SnapshottingTests module — the snapshot test file should say " +
51
51
  '`import SnapshottingTests`. Otherwise, add the missing package product to the test target in Xcode.');
52
52
  }
53
- if (/Failed to install or launch the test runner|Mach error -308|\(ipc\/mig\) server died/.test(output)) {
53
+ // The runtime also dies with -308 after previews have been trapping for a
54
+ // while. Then the previews are the cause, and resetting the simulator
55
+ // mid-run only destroys the device the run is using.
56
+ const previewsFailed = /Test case '[^']+' failed/.test(output);
57
+ if (!previewsFailed &&
58
+ /Failed to install or launch the test runner|Mach error -308|\(ipc\/mig\) server died/.test(output)) {
54
59
  lines.push('The iOS simulator runtime died while installing the test runner — usually transient, not a setup problem.');
55
60
  lines.push('Retry once; if it persists run: xcrun simctl shutdown all (and if still failing: xcrun simctl erase ' +
56
61
  '"<device name>"). First boot of a newly installed runtime can also take minutes — let it finish in ' +
57
62
  'Simulator.app before retrying.');
58
63
  }
64
+ if (/never finished bootstrapping|before establishing connection/.test(output)) {
65
+ lines.push('The app hosting the previews was stopped before the test runner connected to it, so no preview ran: it ' +
66
+ 'hung or crashed while launching.');
67
+ lines.push('If the same app launched in an earlier run, the simulator is the difference, not the app: retry once. ' +
68
+ 'If it fails again, the app\'s own launch is what to look at, before any preview.');
69
+ }
59
70
  if (/Scheme (.+?) is not currently configured for the test action|does not contain any tests|There are no test bundles/.test(output)) {
60
71
  lines.push("The scheme's Test action has no runnable tests. Ensure the test target with your SnapshotTest subclass " +
61
72
  'is included in the scheme\'s Test action, then run `phonebook doctor`.');
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -57,3 +57,78 @@ export interface SnapshotTestClassLocation {
57
57
  * undefined if the target can't be identified or parsing fails.
58
58
  */
59
59
  export declare function findSnapshotTestClassLocation(pbxproj: string): SnapshotTestClassLocation | undefined;
60
+ /**
61
+ * A folder covered by a PBXFileSystemSynchronizedRootGroup, and the target that
62
+ * owns it. Xcode 16+ projects assign whole folders to a target this way, so a
63
+ * source file's target — and therefore its Swift module — can be read off the
64
+ * pbxproj without any per-file build-phase membership.
65
+ *
66
+ * This covers one of the two ways Xcode records membership. The other —
67
+ * per-file PBXBuildFile entries listed in a target's PBXSourcesBuildPhase — is
68
+ * what every project written before Xcode 16 uses, and what XcodeGen and Tuist
69
+ * still generate today. See sourcesBuildPhaseOwner for that half.
70
+ */
71
+ export interface SynchronizedGroupOwner {
72
+ targetName: string;
73
+ /** Folder path, relative to the project directory, "/"-joined and unquoted. */
74
+ path: string;
75
+ /** Paths (relative to the project directory) explicitly excluded from this target. */
76
+ exclusions: Set<string>;
77
+ }
78
+ /**
79
+ * Every filesystem-synchronized folder in the project, with the target it
80
+ * belongs to and the files explicitly excepted from that target.
81
+ */
82
+ export declare function synchronizedGroupOwners(pbxproj: string): SynchronizedGroupOwner[];
83
+ /**
84
+ * The target that compiles `filePath`, via the synchronized folder that covers
85
+ * it. The longest covering folder wins, so a nested folder assigned to its own
86
+ * target beats the parent that contains it; a file explicitly excepted from a
87
+ * folder's target falls through to the next-longest candidate.
88
+ */
89
+ export declare function targetForFile(pbxproj: string, filePath: string): string | undefined;
90
+ /**
91
+ * Every file reference in the project, by its path relative to the project
92
+ * directory.
93
+ *
94
+ * A PBXFileReference carries only its own last path component; the rest comes
95
+ * from the PBXGroups above it, each contributing its own `path` when it has
96
+ * one. So the map is built by walking down from every group rather than up
97
+ * from each file: a group with no `path` is a pure grouping folder that Xcode
98
+ * shows in the navigator and that contributes nothing to the path on disk,
99
+ * which is exactly what makes walking up from a file ambiguous.
100
+ *
101
+ * A group whose sourceTree is SOURCE_ROOT restarts the path at the project
102
+ * directory, because that is what the field means; one that is "<absolute>"
103
+ * describes a file outside the project entirely and is skipped, since nothing
104
+ * here can express it as a project-relative path.
105
+ */
106
+ export declare function fileReferencePaths(pbxproj: string): Map<string, string>;
107
+ /**
108
+ * The target whose PBXSourcesBuildPhase compiles `filePath`, for a project that
109
+ * records membership per file rather than per folder.
110
+ *
111
+ * This is the classic Xcode layout and still the common one: XcodeGen and Tuist
112
+ * both generate it, and every project predating Xcode 16 uses it. A file
113
+ * reaches a target through two hops — a PBXBuildFile wraps the file reference,
114
+ * and the target's sources phase lists that build file — so both are followed
115
+ * rather than guessed at.
116
+ *
117
+ * `filePath` is relative to the project directory.
118
+ */
119
+ export declare function sourcesBuildPhaseOwner(pbxproj: string, filePath: string): string | undefined;
120
+ /**
121
+ * The Swift module name a source file compiles into, or undefined when the
122
+ * project structure cannot say (no synchronized folder covers it, or xcodebuild
123
+ * cannot report the target's settings).
124
+ *
125
+ * The module name is the first half of a #Preview's synthesized fileID
126
+ * ("<Module>/<File>.swift"), which is what SnapshotPreviews matches its filter
127
+ * patterns against. `cache` is keyed by target name so a run that filters a
128
+ * dozen files still shells out to xcodebuild once per target.
129
+ */
130
+ export declare function moduleForFile(pbxproj: string, projectDir: string, filePath: string, xcodebuildTarget: {
131
+ project?: string;
132
+ workspace?: string;
133
+ scheme?: string;
134
+ }, cache?: Map<string, string | undefined>): Promise<string | undefined>;