@sun-asterisk/sungen 3.2.33 → 3.2.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +16 -3
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/changed.d.ts.map +1 -1
- package/dist/cli/commands/changed.js +2 -3
- package/dist/cli/commands/changed.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +2 -28
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +40 -35
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/results-merge.d.ts +9 -0
- package/dist/cli/commands/results-merge.d.ts.map +1 -1
- package/dist/cli/commands/results-merge.js +7 -0
- package/dist/cli/commands/results-merge.js.map +1 -1
- package/dist/cli/commands/select.d.ts +12 -0
- package/dist/cli/commands/select.d.ts.map +1 -0
- package/dist/cli/commands/select.js +122 -0
- package/dist/cli/commands/select.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +3 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +7 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/templates/index.html +1 -1
- package/dist/dashboard/types.d.ts +1 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +11 -10
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +7 -0
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/manual-hybrid-oracle.d.ts +54 -0
- package/dist/exporters/manual-hybrid-oracle.d.ts.map +1 -0
- package/dist/exporters/manual-hybrid-oracle.js +114 -0
- package/dist/exporters/manual-hybrid-oracle.js.map +1 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +6 -2
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +3 -0
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +1 -0
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/gates.js +6 -0
- package/dist/exporters/matrix/gates.js.map +1 -1
- package/dist/exporters/matrix/render-testcase-sheet.d.ts.map +1 -1
- package/dist/exporters/matrix/render-testcase-sheet.js +10 -4
- package/dist/exporters/matrix/render-testcase-sheet.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +8 -1
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/exporters/matrix/wording.d.ts +1 -1
- package/dist/exporters/matrix/wording.d.ts.map +1 -1
- package/dist/exporters/matrix/wording.js +10 -1
- package/dist/exporters/matrix/wording.js.map +1 -1
- package/dist/exporters/run-environment.d.ts +32 -0
- package/dist/exporters/run-environment.d.ts.map +1 -0
- package/dist/exporters/run-environment.js +125 -0
- package/dist/exporters/run-environment.js.map +1 -0
- package/dist/exporters/scenario-merger.d.ts +18 -0
- package/dist/exporters/scenario-merger.d.ts.map +1 -1
- package/dist/exporters/scenario-merger.js +47 -3
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/test-data-resolver.d.ts +0 -4
- package/dist/exporters/test-data-resolver.d.ts.map +1 -1
- package/dist/exporters/test-data-resolver.js +0 -7
- package/dist/exporters/test-data-resolver.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +11 -4
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +49 -19
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +4 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/pick-option.hbs +13 -0
- package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +23 -2
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +3 -1
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +3 -1
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/harness/audit.d.ts +3 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +17 -8
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/data-driven-lint.d.ts.map +1 -1
- package/dist/harness/data-driven-lint.js +69 -27
- package/dist/harness/data-driven-lint.js.map +1 -1
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +1 -0
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +24 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +117 -13
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +6 -4
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/read-text.d.ts +15 -0
- package/dist/harness/read-text.d.ts.map +1 -1
- package/dist/harness/read-text.js +25 -0
- package/dist/harness/read-text.js.map +1 -1
- package/dist/harness/select-by-ids.d.ts +31 -0
- package/dist/harness/select-by-ids.d.ts.map +1 -0
- package/dist/harness/select-by-ids.js +106 -0
- package/dist/harness/select-by-ids.js.map +1 -0
- package/dist/harness/sensors.d.ts +8 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +61 -9
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/spec-branches.js +1 -1
- package/dist/harness/spec-branches.js.map +1 -1
- package/dist/harness/ui-inventory.d.ts +40 -0
- package/dist/harness/ui-inventory.d.ts.map +1 -0
- package/dist/harness/ui-inventory.js +191 -0
- package/dist/harness/ui-inventory.js.map +1 -0
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +64 -9
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +3 -11
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/agents/discovery.md +11 -3
- package/dist/orchestrator/templates/ai-src/agents/reviewer.md +8 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +2 -2
- package/dist/orchestrator/templates/ai-src/commands/review.md +2 -2
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +70 -13
- package/dist/orchestrator/templates/ai-src/skills/sungen-capture/mode-local.md +2 -2
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +20 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +17 -8
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +58 -14
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +41 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +7 -0
- package/dist/orchestrator/templates/playwright.config.ts +4 -2
- package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.js +24 -2
- package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.ts +23 -2
- package/dist/orchestrator/trace-mode-install.d.ts +14 -0
- package/dist/orchestrator/trace-mode-install.d.ts.map +1 -0
- package/dist/orchestrator/trace-mode-install.js +132 -0
- package/dist/orchestrator/trace-mode-install.js.map +1 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts +20 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts.map +1 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.js +45 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.js.map +1 -0
- package/package.json +3 -3
- package/src/cli/commands/audit.ts +14 -3
- package/src/cli/commands/changed.ts +2 -4
- package/src/cli/commands/dashboard.ts +1 -26
- package/src/cli/commands/delivery.ts +37 -32
- package/src/cli/commands/results-merge.ts +7 -1
- package/src/cli/commands/select.ts +88 -0
- package/src/cli/commands/update.ts +3 -0
- package/src/cli/index.ts +7 -2
- package/src/dashboard/templates/index.html +1 -1
- package/src/dashboard/types.ts +1 -0
- package/src/exporters/csv-exporter.ts +7 -10
- package/src/exporters/json-exporter.ts +6 -1
- package/src/exporters/manual-hybrid-oracle.ts +112 -0
- package/src/exporters/matrix/build.ts +6 -2
- package/src/exporters/matrix/export.ts +4 -0
- package/src/exporters/matrix/gates.ts +6 -0
- package/src/exporters/matrix/render-testcase-sheet.ts +10 -4
- package/src/exporters/matrix/types.ts +8 -1
- package/src/exporters/matrix/wording.ts +10 -1
- package/src/exporters/run-environment.ts +89 -0
- package/src/exporters/scenario-merger.ts +49 -4
- package/src/exporters/test-data-resolver.ts +0 -6
- package/src/generators/gherkin-parser/index.ts +50 -18
- package/src/generators/test-generator/adapters/adapter-interface.ts +4 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/pick-option.hbs +13 -0
- package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/src/generators/test-generator/code-generator.ts +23 -2
- package/src/generators/test-generator/diagnostics.ts +3 -1
- package/src/harness/audit.ts +20 -9
- package/src/harness/data-driven-lint.ts +82 -24
- package/src/harness/next-step.ts +1 -0
- package/src/harness/parse.ts +123 -16
- package/src/harness/quality-gates.ts +6 -4
- package/src/harness/read-text.ts +25 -0
- package/src/harness/select-by-ids.ts +83 -0
- package/src/harness/sensors.ts +59 -9
- package/src/harness/spec-branches.ts +1 -1
- package/src/harness/ui-inventory.ts +164 -0
- package/src/harness/viewpoint-ledger.ts +57 -11
- package/src/orchestrator/screen-manager.ts +3 -11
- package/src/orchestrator/templates/ai-src/agents/discovery.md +11 -3
- package/src/orchestrator/templates/ai-src/agents/reviewer.md +8 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +2 -2
- package/src/orchestrator/templates/ai-src/commands/review.md +2 -2
- package/src/orchestrator/templates/ai-src/commands/run-test.md +70 -13
- package/src/orchestrator/templates/ai-src/skills/sungen-capture/mode-local.md +2 -2
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +20 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +17 -8
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +58 -14
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +41 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +7 -0
- package/src/orchestrator/templates/playwright.config.ts +4 -2
- package/src/orchestrator/templates/specs-url-assert.ts +23 -2
- package/src/orchestrator/trace-mode-install.ts +94 -0
- package/src/orchestrator/viewpoint-pattern-catalog.ts +58 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Move an existing project's `use.trace` off the old default so local runs keep a trace.
|
|
3
|
+
*
|
|
4
|
+
* The old template paired `trace: 'on-first-retry'` with `retries: process.env.CI ? 2 : 0`: off CI
|
|
5
|
+
* there is no retry, so there is never a "first retry" and a QA fixing a test on their machine never
|
|
6
|
+
* got a trace. The template now records `on-first-retry` on CI and `retain-on-failure` locally.
|
|
7
|
+
*
|
|
8
|
+
* `playwright.config.ts` is written once at `sungen init` and never re-synced (see
|
|
9
|
+
* report-sanitize-reporter-install.ts, the same problem for the sanitize reporter), so `sungen update`
|
|
10
|
+
* calls this. It rewrites the trace line ONLY while it is still the old default — any other value is
|
|
11
|
+
* a choice the user made, and a wrong edit to a user's config is worse than a missing trace. The same
|
|
12
|
+
* goes for a `trace` inside `projects: [...]`: that is a per-project override, not the template default.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
|
|
17
|
+
/** The template's trace value: cheap on CI (retries exist there), a trace for every local failure. */
|
|
18
|
+
export const TRACE_MODE_EXPRESSION = "process.env.CI ? 'on-first-retry' : 'retain-on-failure'";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 'patched' — the old default was rewritten now
|
|
22
|
+
* 'present' — already the template expression (idempotent)
|
|
23
|
+
* 'custom' — another value, no trace line, more than one old-default line, or one inside
|
|
24
|
+
* `projects: [...]`; nothing written
|
|
25
|
+
* 'absent' — no playwright.config.ts (a mobile-only project, or not a sungen project)
|
|
26
|
+
*/
|
|
27
|
+
export type TraceModeOutcome = 'patched' | 'present' | 'custom' | 'absent';
|
|
28
|
+
|
|
29
|
+
const escapeRegExp = (s: string): string => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
30
|
+
|
|
31
|
+
// Both are anchored to the start of a line, so a commented-out copy (`// trace: …`) never counts.
|
|
32
|
+
// OLD_DEFAULT keeps the indentation in $1 and leaves the trailing comma, comment and EOL alone.
|
|
33
|
+
const OLD_DEFAULT = /^([ \t]*trace:[ \t]*)(['"])on-first-retry\2/gm;
|
|
34
|
+
const PRESENT = new RegExp(`^[ \\t]*trace:[ \\t]*${escapeRegExp(TRACE_MODE_EXPRESSION)}`, 'm');
|
|
35
|
+
|
|
36
|
+
// The old template's one-line comment, only when it sits directly above the (patched) trace line.
|
|
37
|
+
// A comment the user wrote is theirs and stays.
|
|
38
|
+
const OLD_COMMENT = new RegExp(
|
|
39
|
+
`^([ \\t]*)/\\* Collect trace when retrying the failed test\\. See https://playwright\\.dev/docs/trace-viewer \\*/(\\r?\\n)(?=[ \\t]*trace:[ \\t]*${escapeRegExp(TRACE_MODE_EXPRESSION)})`,
|
|
40
|
+
'm',
|
|
41
|
+
);
|
|
42
|
+
const newComment = (indent: string, eol: string): string =>
|
|
43
|
+
`${indent}/* Trace for a failed test. CI: recorded on the first retry (CI retries). Local: no retries, so${eol}` +
|
|
44
|
+
`${indent} 'on-first-retry' would never record one — keep the trace of every failed test instead.${eol}` +
|
|
45
|
+
`${indent} See https://playwright.dev/docs/trace-viewer */${eol}`;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* [start, end] offsets of each live `projects: [...]` array, matched by bracket depth. Brackets inside
|
|
49
|
+
* a `//` or `/* *\/` comment or a quoted string are skipped: one stray `]` in a note would otherwise
|
|
50
|
+
* close the span early and expose a per-project override to the patch.
|
|
51
|
+
*/
|
|
52
|
+
function projectsSpans(src: string): Array<[number, number]> {
|
|
53
|
+
const spans: Array<[number, number]> = [];
|
|
54
|
+
for (const m of src.matchAll(/^[ \t]*projects\s*:\s*\[/gm)) {
|
|
55
|
+
const open = m.index! + m[0].length - 1;
|
|
56
|
+
let depth = 0;
|
|
57
|
+
for (let i = open; i < src.length; i++) {
|
|
58
|
+
const ch = src[i];
|
|
59
|
+
if (ch === '/' && src[i + 1] === '/') { const nl = src.indexOf('\n', i); i = nl < 0 ? src.length : nl; continue; }
|
|
60
|
+
if (ch === '/' && src[i + 1] === '*') { const end = src.indexOf('*/', i + 2); i = end < 0 ? src.length : end + 1; continue; }
|
|
61
|
+
if (ch === "'" || ch === '"' || ch === '`') {
|
|
62
|
+
for (i++; i < src.length && src[i] !== ch; i++) if (src[i] === '\\') i++;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (ch === '[') depth++;
|
|
66
|
+
else if (ch === ']' && --depth === 0) { spans.push([open, i]); break; }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return spans;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function patchTraceMode(cwd: string, dryRun: boolean = false): TraceModeOutcome {
|
|
73
|
+
const configPath = path.join(cwd, 'playwright.config.ts');
|
|
74
|
+
if (!fs.existsSync(configPath)) return 'absent';
|
|
75
|
+
const src = fs.readFileSync(configPath, 'utf8');
|
|
76
|
+
if (PRESENT.test(src)) return 'present';
|
|
77
|
+
const hits = [...src.matchAll(OLD_DEFAULT)];
|
|
78
|
+
if (hits.length !== 1) return 'custom'; // none: the user's own value · several: ambiguous, don't guess
|
|
79
|
+
const at = hits[0].index!;
|
|
80
|
+
if (projectsSpans(src).some(([s, e]) => at > s && at < e)) return 'custom'; // a per-project override
|
|
81
|
+
if (!dryRun) {
|
|
82
|
+
const patched = src
|
|
83
|
+
.replace(OLD_DEFAULT, `$1${TRACE_MODE_EXPRESSION}`)
|
|
84
|
+
.replace(OLD_COMMENT, (_m, indent: string, eol: string) => newComment(indent, eol));
|
|
85
|
+
fs.writeFileSync(configPath, patched);
|
|
86
|
+
}
|
|
87
|
+
return 'patched';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** `sungen update` step: patch the trace mode and say so when it changed. */
|
|
91
|
+
export function installTraceMode(cwd: string, dryRun: boolean = false): void {
|
|
92
|
+
if (patchTraceMode(cwd, dryRun) !== 'patched') return;
|
|
93
|
+
console.log(`${dryRun ? '📋 would update' : '✓ updated'} playwright.config.ts: local runs now keep a trace for every failed test (trace: ${TRACE_MODE_EXPRESSION})`);
|
|
94
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sungen-viewpoint pattern catalog by number — the `## N. <Name>` headings of
|
|
3
|
+
* `templates/ai-src/skills/sungen-viewpoint/group-*.md` — for the "UI Patterns Identified" table
|
|
4
|
+
* `sungen add` scaffolds into `test-viewpoint.md` (#842).
|
|
5
|
+
*
|
|
6
|
+
* The scaffold used to hard-code its own ten rows: eight of them numbered differently from the
|
|
7
|
+
* catalog (Data Table 2 vs 7, Modal 9 vs 12…), plus a "Pagination" pattern the catalog does not
|
|
8
|
+
* have, so authors copied the wrong numbers next to a skill that cites the right ones.
|
|
9
|
+
* `tests/harness/viewpoint-comments-and-patterns.run.ts` pins this list to the catalog headings.
|
|
10
|
+
*/
|
|
11
|
+
export interface ViewpointPattern {
|
|
12
|
+
n: number;
|
|
13
|
+
name: string;
|
|
14
|
+
/** Group F — native-app patterns, read IN ADDITION to 1–17 for a mobile screen. */
|
|
15
|
+
mobile?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const VIEWPOINT_PATTERNS: readonly ViewpointPattern[] = [
|
|
19
|
+
{ n: 1, name: 'Form & Inputs' },
|
|
20
|
+
{ n: 2, name: 'File Upload' },
|
|
21
|
+
{ n: 3, name: 'Import / Export' },
|
|
22
|
+
{ n: 4, name: 'Create / Add' },
|
|
23
|
+
{ n: 5, name: 'Update / Edit' },
|
|
24
|
+
{ n: 6, name: 'Delete' },
|
|
25
|
+
{ n: 7, name: 'Data Table' },
|
|
26
|
+
{ n: 8, name: 'Search' },
|
|
27
|
+
{ n: 9, name: 'Filter' },
|
|
28
|
+
{ n: 10, name: 'List / Card View' },
|
|
29
|
+
{ n: 11, name: 'Chart / Analytics' },
|
|
30
|
+
{ n: 12, name: 'Modal / Dialog' },
|
|
31
|
+
{ n: 13, name: 'Navigation' },
|
|
32
|
+
{ n: 14, name: 'Notification / Toast / Alert' },
|
|
33
|
+
{ n: 15, name: 'Login / Logout' },
|
|
34
|
+
{ n: 16, name: 'Register' },
|
|
35
|
+
{ n: 17, name: 'Password Management' },
|
|
36
|
+
{ n: 18, name: 'Bottom Sheet', mobile: true },
|
|
37
|
+
{ n: 19, name: 'Tab Bar / Bottom Navigation', mobile: true },
|
|
38
|
+
{ n: 20, name: 'Swipe-to-Delete Row', mobile: true },
|
|
39
|
+
{ n: 21, name: 'Native Picker', mobile: true },
|
|
40
|
+
{ n: 22, name: 'Permission Dialog', mobile: true },
|
|
41
|
+
{ n: 23, name: 'Biometric Prompt', mobile: true },
|
|
42
|
+
{ n: 24, name: 'Camera / Gallery Picker', mobile: true },
|
|
43
|
+
{ n: 25, name: 'Push Notification', mobile: true },
|
|
44
|
+
{ n: 26, name: 'Deep-link Entry', mobile: true },
|
|
45
|
+
{ n: 27, name: 'Offline Banner', mobile: true },
|
|
46
|
+
{ n: 28, name: 'Onboarding Carousel', mobile: true },
|
|
47
|
+
{ n: 29, name: 'Pull-to-Refresh List', mobile: true },
|
|
48
|
+
{ n: 30, name: 'Soft-Keyboard Overlap', mobile: true },
|
|
49
|
+
{ n: 31, name: 'Settings Toggle List', mobile: true },
|
|
50
|
+
{ n: 32, name: 'App Lifecycle & Orientation', mobile: true },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
/** The scaffold's pattern-table rows: 1–17 for every screen, plus Group F on a mobile project. */
|
|
54
|
+
export function uiPatternRows(isMobile: boolean): string[] {
|
|
55
|
+
return VIEWPOINT_PATTERNS
|
|
56
|
+
.filter((p) => isMobile || !p.mobile)
|
|
57
|
+
.map((p) => `| ${p.n} | ${p.name} | ☐ | |`);
|
|
58
|
+
}
|