@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
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotTestClass.js","sourceRoot":"","sources":["../../src/ios/snapshotTestClass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshotTestClass.js","sourceRoot":"","sources":["../../src/ios/snapshotTestClass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { IncompleteRenderError } from '../engines/ios.js';
2
+ import type { ManifestEntry } from '../manifest.js';
3
+ import type { ScannedPreview } from '../scan/types.js';
4
+ /**
5
+ * The container of every preview test the runner reported failed, one per test.
6
+ *
7
+ * A snapshot test asserts nothing, so a failure is the preview trapping: the
8
+ * host app goes down with it and the runner relaunches it before carrying on.
9
+ */
10
+ export declare function parseFailedPreviews(output: string): string[];
11
+ export interface FailedContainer {
12
+ /** The container SnapshotPreviews reported, e.g. "Status Row Detail View". */
13
+ container: string;
14
+ failures: number;
15
+ /** The previews in that container's file that did not come back as images.
16
+ * Empty when the source holds no file matching the container. */
17
+ unrendered: {
18
+ file: string;
19
+ line: number;
20
+ name: string;
21
+ }[];
22
+ }
23
+ /**
24
+ * Turns failed preview tests into previews a reader can open.
25
+ *
26
+ * The test name says which file and nothing more: its index follows discovery
27
+ * order, not source order. What pins the preview down is subtraction — the
28
+ * previews the file declares, minus the ones that rendered. When the run was cut
29
+ * short that difference can also hold previews that were never reached, which
30
+ * is why the list is "did not render" and the count is kept apart from it.
31
+ */
32
+ export declare function explainFailedPreviews(failed: string[], rendered: ManifestEntry[], scanned: ScannedPreview[]): FailedContainer[];
33
+ /**
34
+ * The answer to a render that crashed previews. Leads with where to look, because
35
+ * each crash costs about a minute and a half on the next run too, and the reader
36
+ * can only fix the ones it can find.
37
+ */
38
+ export declare function summarizeIncompleteRender(error: IncompleteRenderError, explained: FailedContainer[]): string;
@@ -0,0 +1,92 @@
1
+ import { basename } from 'node:path';
2
+ import { spaceCamelCase } from '../naming.js';
3
+ /**
4
+ * SnapshotPreviews names each preview test `<orientation>-<container>-<j>-<i>`,
5
+ * where the container is the display name it derives from the preview's file
6
+ * or type and `i` is a position in its own discovery order. The container can
7
+ * carry hyphens, so the numbers are anchored at the end.
8
+ */
9
+ const FAILED_PREVIEW_TEST = /Test case '[^']*?\.[A-Za-z]+-(.+)-\d+-\d+\(\)' failed/g;
10
+ /**
11
+ * The container of every preview test the runner reported failed, one per test.
12
+ *
13
+ * A snapshot test asserts nothing, so a failure is the preview trapping: the
14
+ * host app goes down with it and the runner relaunches it before carrying on.
15
+ */
16
+ export function parseFailedPreviews(output) {
17
+ return [...output.matchAll(FAILED_PREVIEW_TEST)].map((m) => m[1]);
18
+ }
19
+ /**
20
+ * Turns failed preview tests into previews a reader can open.
21
+ *
22
+ * The test name says which file and nothing more: its index follows discovery
23
+ * order, not source order. What pins the preview down is subtraction — the
24
+ * previews the file declares, minus the ones that rendered. When the run was cut
25
+ * short that difference can also hold previews that were never reached, which
26
+ * is why the list is "did not render" and the count is kept apart from it.
27
+ */
28
+ export function explainFailedPreviews(failed, rendered, scanned) {
29
+ const failures = new Map();
30
+ for (const container of failed)
31
+ failures.set(container, (failures.get(container) ?? 0) + 1);
32
+ return [...failures].map(([container, count]) => {
33
+ const declared = scanned.filter((p) => spaceCamelCase(basename(p.file, '.swift')) === container);
34
+ const renderedLabels = new Set(rendered.flatMap((e) => {
35
+ if (!e.sourceFile || !declared.some((p) => sameSource(p.file, e.sourceFile)))
36
+ return [];
37
+ return [e.previewName.slice(e.sourceFile.length + 1)];
38
+ }));
39
+ return {
40
+ container,
41
+ failures: count,
42
+ unrendered: declared
43
+ .filter((p) => !renderedLabels.has(sidecarLabel(p)))
44
+ .map((p) => ({ file: p.file, line: p.line, name: p.displayName ?? container })),
45
+ };
46
+ });
47
+ }
48
+ /** What SnapshotPreviews writes as a preview's label: its display name, or
49
+ * Xcode's placeholder for an unnamed one. */
50
+ function sidecarLabel(preview) {
51
+ return preview.displayName ?? `At line #${preview.line}`;
52
+ }
53
+ /** Whether a scanned path is the file a `Module/File.swift` file ID names. */
54
+ function sameSource(path, fileId) {
55
+ const slash = fileId.indexOf('/');
56
+ const file = fileId.slice(slash + 1);
57
+ if (path !== file && !path.endsWith(`/${file}`))
58
+ return false;
59
+ return slash === -1 || path.split('/').includes(fileId.slice(0, slash));
60
+ }
61
+ /**
62
+ * The answer to a render that crashed previews. Leads with where to look, because
63
+ * each crash costs about a minute and a half on the next run too, and the reader
64
+ * can only fix the ones it can find.
65
+ */
66
+ export function summarizeIncompleteRender(error, explained) {
67
+ const crashed = error.failedPreviews.length;
68
+ const lines = [
69
+ `Rendered ${error.manifest.entries.length} previews into ${error.outputDir}; ${crashed} crashed.`,
70
+ '',
71
+ ];
72
+ if (crashed > 0) {
73
+ lines.push('A preview that crashes takes the app hosting the render down with it, and every relaunch costs about a', 'minute and a half of the next run as well. Open each one: a trap at render is often an @Environment', 'object the preview does not supply, which analyze_coverage reports as env-missing.');
74
+ for (const c of explained) {
75
+ if (c.unrendered.length === 0) {
76
+ lines.push(` ${c.container}`);
77
+ }
78
+ else if (c.unrendered.length === c.failures) {
79
+ lines.push(...c.unrendered.map((p) => ` ${p.file}:${p.line} ${p.name}`));
80
+ }
81
+ else {
82
+ lines.push(` ${c.container}: ${c.failures} crashed, and these ${c.unrendered.length} did not render`);
83
+ lines.push(...c.unrendered.map((p) => ` ${p.file}:${p.line} ${p.name}`));
84
+ }
85
+ }
86
+ lines.push('');
87
+ }
88
+ lines.push(...error.diagnosis);
89
+ lines.push('Recorded:', ...error.manifest.entries.map((e) => ` ${e.component}/${e.state}`).sort());
90
+ return lines.join('\n');
91
+ }
92
+ //# sourceMappingURL=unrendered.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unrendered.js","sourceRoot":"","sources":["../../src/ios/unrendered.ts"],"names":[],"mappings":"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"}
@@ -9,15 +9,19 @@ export interface ManifestEntry {
9
9
  module: string;
10
10
  /** Path of the source file containing the preview, relative to the project root, when known */
11
11
  sourceFile?: string;
12
- /** Fully qualified original preview identifier (FQN of the preview function / test) */
12
+ /**
13
+ * Stable, unique identifier for the preview within the project: a fully
14
+ * qualified name on Android, `<source file>:<label>` on iOS. This is
15
+ * identity, not display text — `component` and `state` are what a reader sees.
16
+ */
13
17
  previewName: string;
14
18
  /** Image path relative to the bundle root, e.g. "images/ab12cd.png" */
15
19
  image: string;
20
+ /** Pixel dimensions of `image`, read from its PNG header at generate time */
16
21
  width?: number;
17
22
  height?: number;
18
23
  theme?: 'light' | 'dark';
19
24
  device?: string;
20
- tags?: string[];
21
25
  }
22
26
  export interface Manifest {
23
27
  schemaVersion: typeof SCHEMA_VERSION;
@@ -29,4 +33,21 @@ export interface Manifest {
29
33
  };
30
34
  entries: ManifestEntry[];
31
35
  }
36
+ /**
37
+ * A manifest is untrusted input: it is JSON on disk, and a bundle can be moved,
38
+ * hand-edited, or produced by something other than `phonebook generate`. Both
39
+ * path-bearing fields are documented as relative — `image` to the bundle root,
40
+ * `sourceFile` to the project root — but nothing enforced it, and `phonebook
41
+ * build` renders `image` directly into `<img src>` and into the modal's "Open
42
+ * file" link. An entry claiming `../../../../etc/passwd`, an absolute
43
+ * `/Users/someone/.ssh/id_rsa`, or `file:///etc/hosts` was passed through
44
+ * verbatim; HTML escaping stops markup injection but does nothing about the
45
+ * path itself, and any consumer resolving it against the bundle root reads
46
+ * outside the bundle.
47
+ *
48
+ * A manifest path must therefore be relative, forward-slash separated, and stay
49
+ * inside the root it is resolved against. Both engines only ever emit
50
+ * `images/<sha256-prefix>.png`, so this rejects nothing a real run produces.
51
+ */
52
+ export declare function assertContainedPath(value: unknown, field: string, where: string): void;
32
53
  export declare function validateManifest(data: unknown): Manifest;
package/dist/manifest.js CHANGED
@@ -1,4 +1,56 @@
1
+ import { posix } from 'node:path';
1
2
  export const SCHEMA_VERSION = 1;
3
+ /** Matches "http:", "file:", "data:", "javascript:", and a Windows drive like "C:". */
4
+ const URL_SCHEME_OR_DRIVE = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
5
+ /**
6
+ * A manifest is untrusted input: it is JSON on disk, and a bundle can be moved,
7
+ * hand-edited, or produced by something other than `phonebook generate`. Both
8
+ * path-bearing fields are documented as relative — `image` to the bundle root,
9
+ * `sourceFile` to the project root — but nothing enforced it, and `phonebook
10
+ * build` renders `image` directly into `<img src>` and into the modal's "Open
11
+ * file" link. An entry claiming `../../../../etc/passwd`, an absolute
12
+ * `/Users/someone/.ssh/id_rsa`, or `file:///etc/hosts` was passed through
13
+ * verbatim; HTML escaping stops markup injection but does nothing about the
14
+ * path itself, and any consumer resolving it against the bundle root reads
15
+ * outside the bundle.
16
+ *
17
+ * A manifest path must therefore be relative, forward-slash separated, and stay
18
+ * inside the root it is resolved against. Both engines only ever emit
19
+ * `images/<sha256-prefix>.png`, so this rejects nothing a real run produces.
20
+ */
21
+ export function assertContainedPath(value, field, where) {
22
+ const at = `${where} "${field}"`;
23
+ if (typeof value !== 'string' || value.length === 0) {
24
+ throw new Error(`${at} must be a non-empty string: ${JSON.stringify(value)}`);
25
+ }
26
+ // Control characters, quotes and angle brackets never appear in a path either
27
+ // engine emits (`images/<sha256-prefix>.png`) or in a source filename, and
28
+ // they are exactly what forces every downstream consumer to escape correctly.
29
+ // Refusing them here means the path is safe to interpolate, not merely
30
+ // contained.
31
+ const unsafe = value.match(/[\u0000-\u001f\u007f"'<>`]/);
32
+ if (unsafe) {
33
+ throw new Error(`${at} contains an unsafe character ${JSON.stringify(unsafe[0])}: ${JSON.stringify(value)}`);
34
+ }
35
+ if (value.includes('\\')) {
36
+ throw new Error(`${at} must use forward slashes, not backslashes: ${JSON.stringify(value)}`);
37
+ }
38
+ if (URL_SCHEME_OR_DRIVE.test(value)) {
39
+ throw new Error(`${at} must be a relative path, not a URL or drive-qualified path: ${JSON.stringify(value)}`);
40
+ }
41
+ if (value.startsWith('/')) {
42
+ throw new Error(`${at} must be relative to the bundle root, not absolute: ${JSON.stringify(value)}`);
43
+ }
44
+ // Not an escape under posix join semantics, but a trap for any consumer that
45
+ // expands "~" before resolving. No real bundle path starts with one.
46
+ if (value === '~' || value.startsWith('~/')) {
47
+ throw new Error(`${at} must not start with "~": ${JSON.stringify(value)}`);
48
+ }
49
+ const normalized = posix.normalize(value);
50
+ if (normalized === '..' || normalized.startsWith('../') || normalized.startsWith('/')) {
51
+ throw new Error(`${at} escapes the bundle root: ${JSON.stringify(value)}`);
52
+ }
53
+ }
2
54
  export function validateManifest(data) {
3
55
  const m = data;
4
56
  if (!m || typeof m !== 'object')
@@ -11,12 +63,18 @@ export function validateManifest(data) {
11
63
  }
12
64
  if (!Array.isArray(m.entries))
13
65
  throw new Error('manifest.entries is not an array');
66
+ let index = 0;
14
67
  for (const e of m.entries) {
15
68
  for (const key of ['component', 'state', 'module', 'previewName', 'image']) {
16
69
  if (typeof e[key] !== 'string' || e[key].length === 0) {
17
70
  throw new Error(`manifest entry missing "${key}": ${JSON.stringify(e)}`);
18
71
  }
19
72
  }
73
+ const where = `manifest entry ${index}`;
74
+ assertContainedPath(e.image, 'image', where);
75
+ if (e.sourceFile !== undefined)
76
+ assertContainedPath(e.sourceFile, 'sourceFile', where);
77
+ index += 1;
20
78
  }
21
79
  return m;
22
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAmChC,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,CAAC,GAAG,IAAgB,CAAC;IAC3B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnF,IAAI,CAAC,CAAC,aAAa,KAAK,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,aAAa,cAAc,cAAc,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACnF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAU,EAAE,CAAC;YACpF,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -1 +1,29 @@
1
+ import type { CoverageReport } from '../scan/types.js';
2
+ export declare function summarizeCoverage(report: CoverageReport): string;
3
+ /**
4
+ * What a scoped report would otherwise hide: previews and views outside the
5
+ * scope that show a component inside it.
6
+ *
7
+ * Kept apart from the gaps above, and worded differently, because they are not
8
+ * the same kind of claim. A gap is a defect with a fix. The first list here is
9
+ * a fact — these previews show what you changed, and only their source says
10
+ * whether that matters. The second is a question: nothing renders that context
11
+ * at all, and whether it deserves a preview is a judgment about the product
12
+ * rather than about the code.
13
+ */
14
+ export declare function summarizeReach(report: CoverageReport): string;
15
+ /**
16
+ * What each component is missing, which is the half `summarizeHints` cannot
17
+ * see: a hint needs a preview to exist before it can say anything about it.
18
+ *
19
+ * Grouped by component rather than listed flat. A flat list sorted by severity
20
+ * put every "has no preview" first, and on a repository with a hundred of them
21
+ * the cap fell before a single state gap was reached — the specific, useful
22
+ * half of the report never reached the reader. Components carrying the most
23
+ * missing states come first for the same reason.
24
+ *
25
+ * It reports; it never edits.
26
+ */
27
+ export declare function summarizeGaps(report: CoverageReport): string;
28
+ export declare function summarizeHints(report: CoverageReport): string;
1
29
  export declare function runMcpServer(): Promise<void>;