@sun-asterisk/sungen 3.2.32 → 3.2.33

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 (243) hide show
  1. package/dist/cli/commands/audit.d.ts +1 -0
  2. package/dist/cli/commands/audit.d.ts.map +1 -1
  3. package/dist/cli/commands/audit.js +10 -1
  4. package/dist/cli/commands/audit.js.map +1 -1
  5. package/dist/cli/commands/capability.d.ts.map +1 -1
  6. package/dist/cli/commands/capability.js +35 -17
  7. package/dist/cli/commands/capability.js.map +1 -1
  8. package/dist/cli/commands/delivery.d.ts.map +1 -1
  9. package/dist/cli/commands/delivery.js +39 -18
  10. package/dist/cli/commands/delivery.js.map +1 -1
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +14 -7
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/results-merge.d.ts.map +1 -1
  15. package/dist/cli/commands/results-merge.js +2 -12
  16. package/dist/cli/commands/results-merge.js.map +1 -1
  17. package/dist/cli/commands/results-sanitize.d.ts.map +1 -1
  18. package/dist/cli/commands/results-sanitize.js +2 -13
  19. package/dist/cli/commands/results-sanitize.js.map +1 -1
  20. package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
  21. package/dist/dashboard/snapshot-builder.js +6 -10
  22. package/dist/dashboard/snapshot-builder.js.map +1 -1
  23. package/dist/exporters/feature-parser.d.ts +21 -0
  24. package/dist/exporters/feature-parser.d.ts.map +1 -1
  25. package/dist/exporters/feature-parser.js +32 -1
  26. package/dist/exporters/feature-parser.js.map +1 -1
  27. package/dist/exporters/locale-variants.d.ts +7 -1
  28. package/dist/exporters/locale-variants.d.ts.map +1 -1
  29. package/dist/exporters/locale-variants.js +23 -16
  30. package/dist/exporters/locale-variants.js.map +1 -1
  31. package/dist/exporters/matrix/build.d.ts.map +1 -1
  32. package/dist/exporters/matrix/build.js +13 -7
  33. package/dist/exporters/matrix/build.js.map +1 -1
  34. package/dist/exporters/matrix/carry-manual-results.d.ts +70 -0
  35. package/dist/exporters/matrix/carry-manual-results.d.ts.map +1 -0
  36. package/dist/exporters/matrix/carry-manual-results.js +232 -0
  37. package/dist/exporters/matrix/carry-manual-results.js.map +1 -0
  38. package/dist/exporters/matrix/export.d.ts +2 -0
  39. package/dist/exporters/matrix/export.d.ts.map +1 -1
  40. package/dist/exporters/matrix/export.js +7 -1
  41. package/dist/exporters/matrix/export.js.map +1 -1
  42. package/dist/exporters/matrix/wording.d.ts +7 -0
  43. package/dist/exporters/matrix/wording.d.ts.map +1 -1
  44. package/dist/exporters/matrix/wording.js +27 -1
  45. package/dist/exporters/matrix/wording.js.map +1 -1
  46. package/dist/exporters/xlsx-exporter.d.ts +2 -0
  47. package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
  48. package/dist/exporters/xlsx-exporter.js +7 -2
  49. package/dist/exporters/xlsx-exporter.js.map +1 -1
  50. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
  51. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
  52. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
  53. package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +68 -4
  54. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
  55. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
  56. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +5 -1
  57. package/dist/generators/test-generator/code-generator.d.ts +2 -1
  58. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  59. package/dist/generators/test-generator/code-generator.js +67 -3
  60. package/dist/generators/test-generator/code-generator.js.map +1 -1
  61. package/dist/generators/test-generator/diagnostics.d.ts +33 -4
  62. package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
  63. package/dist/generators/test-generator/diagnostics.js +32 -3
  64. package/dist/generators/test-generator/diagnostics.js.map +1 -1
  65. package/dist/generators/test-generator/patterns/index.d.ts +12 -2
  66. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  67. package/dist/generators/test-generator/patterns/index.js +15 -9
  68. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  69. package/dist/generators/test-generator/patterns/types.d.ts +15 -0
  70. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  71. package/dist/generators/test-generator/patterns/with-parent-scope.d.ts +5 -0
  72. package/dist/generators/test-generator/patterns/with-parent-scope.d.ts.map +1 -1
  73. package/dist/generators/test-generator/patterns/with-parent-scope.js +6 -0
  74. package/dist/generators/test-generator/patterns/with-parent-scope.js.map +1 -1
  75. package/dist/generators/test-generator/step-mapper.d.ts +46 -0
  76. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  77. package/dist/generators/test-generator/step-mapper.js +84 -9
  78. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  79. package/dist/generators/test-generator/utils/data-resolver.d.ts +25 -0
  80. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  81. package/dist/generators/test-generator/utils/data-resolver.js +39 -8
  82. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  83. package/dist/generators/test-generator/utils/selector-entry-fields.d.ts.map +1 -1
  84. package/dist/generators/test-generator/utils/selector-entry-fields.js +1 -0
  85. package/dist/generators/test-generator/utils/selector-entry-fields.js.map +1 -1
  86. package/dist/generators/test-generator/utils/selector-resolver.d.ts +37 -4
  87. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  88. package/dist/generators/test-generator/utils/selector-resolver.js +212 -79
  89. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  90. package/dist/harness/audit.d.ts.map +1 -1
  91. package/dist/harness/audit.js +12 -4
  92. package/dist/harness/audit.js.map +1 -1
  93. package/dist/harness/capability.d.ts +7 -1
  94. package/dist/harness/capability.d.ts.map +1 -1
  95. package/dist/harness/capability.js +15 -12
  96. package/dist/harness/capability.js.map +1 -1
  97. package/dist/harness/catalog/universal-viewpoints.yaml +5 -5
  98. package/dist/harness/config-file.d.ts +17 -0
  99. package/dist/harness/config-file.d.ts.map +1 -0
  100. package/dist/harness/config-file.js +100 -0
  101. package/dist/harness/config-file.js.map +1 -0
  102. package/dist/harness/depth-lint.d.ts.map +1 -1
  103. package/dist/harness/depth-lint.js +2 -1
  104. package/dist/harness/depth-lint.js.map +1 -1
  105. package/dist/harness/flow-check.d.ts.map +1 -1
  106. package/dist/harness/flow-check.js +6 -2
  107. package/dist/harness/flow-check.js.map +1 -1
  108. package/dist/harness/keyword-match.d.ts +59 -0
  109. package/dist/harness/keyword-match.d.ts.map +1 -0
  110. package/dist/harness/keyword-match.js +86 -0
  111. package/dist/harness/keyword-match.js.map +1 -0
  112. package/dist/harness/perf.d.ts +7 -1
  113. package/dist/harness/perf.d.ts.map +1 -1
  114. package/dist/harness/perf.js +13 -10
  115. package/dist/harness/perf.js.map +1 -1
  116. package/dist/harness/quality-gates.d.ts +9 -2
  117. package/dist/harness/quality-gates.d.ts.map +1 -1
  118. package/dist/harness/quality-gates.js +16 -4
  119. package/dist/harness/quality-gates.js.map +1 -1
  120. package/dist/harness/query-catalog.js +0 -0
  121. package/dist/harness/query-catalog.js.map +1 -1
  122. package/dist/harness/read-text.d.ts +6 -0
  123. package/dist/harness/read-text.d.ts.map +1 -1
  124. package/dist/harness/read-text.js +7 -1
  125. package/dist/harness/read-text.js.map +1 -1
  126. package/dist/harness/secret-scan.d.ts +27 -1
  127. package/dist/harness/secret-scan.d.ts.map +1 -1
  128. package/dist/harness/secret-scan.js +57 -4
  129. package/dist/harness/secret-scan.js.map +1 -1
  130. package/dist/harness/sensors.d.ts +12 -0
  131. package/dist/harness/sensors.d.ts.map +1 -1
  132. package/dist/harness/sensors.js +41 -18
  133. package/dist/harness/sensors.js.map +1 -1
  134. package/dist/harness/spec-branches.d.ts +0 -18
  135. package/dist/harness/spec-branches.d.ts.map +1 -1
  136. package/dist/harness/spec-branches.js +23 -2
  137. package/dist/harness/spec-branches.js.map +1 -1
  138. package/dist/harness/spec-coverage.d.ts.map +1 -1
  139. package/dist/harness/spec-coverage.js +14 -4
  140. package/dist/harness/spec-coverage.js.map +1 -1
  141. package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
  142. package/dist/harness/viewpoint-ledger.js +2 -1
  143. package/dist/harness/viewpoint-ledger.js.map +1 -1
  144. package/dist/harness/write-atomic.d.ts +2 -0
  145. package/dist/harness/write-atomic.d.ts.map +1 -0
  146. package/dist/harness/write-atomic.js +62 -0
  147. package/dist/harness/write-atomic.js.map +1 -0
  148. package/dist/orchestrator/ai-skills/writer.d.ts.map +1 -1
  149. package/dist/orchestrator/ai-skills/writer.js +15 -7
  150. package/dist/orchestrator/ai-skills/writer.js.map +1 -1
  151. package/dist/orchestrator/assets-drift.d.ts.map +1 -1
  152. package/dist/orchestrator/assets-drift.js +11 -6
  153. package/dist/orchestrator/assets-drift.js.map +1 -1
  154. package/dist/orchestrator/project-deps-sync.d.ts.map +1 -1
  155. package/dist/orchestrator/project-deps-sync.js +22 -1
  156. package/dist/orchestrator/project-deps-sync.js.map +1 -1
  157. package/dist/orchestrator/project-initializer.d.ts +8 -0
  158. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  159. package/dist/orchestrator/project-initializer.js +49 -7
  160. package/dist/orchestrator/project-initializer.js.map +1 -1
  161. package/dist/orchestrator/security-overrides-catalog.d.ts +39 -0
  162. package/dist/orchestrator/security-overrides-catalog.d.ts.map +1 -0
  163. package/dist/orchestrator/security-overrides-catalog.js +63 -0
  164. package/dist/orchestrator/security-overrides-catalog.js.map +1 -0
  165. package/dist/orchestrator/security-overrides.d.ts +51 -0
  166. package/dist/orchestrator/security-overrides.d.ts.map +1 -0
  167. package/dist/orchestrator/security-overrides.js +165 -0
  168. package/dist/orchestrator/security-overrides.js.map +1 -0
  169. package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
  170. package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +3 -1
  171. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +9 -0
  172. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
  173. package/dist/orchestrator/templates/specs-locale-fixture.ts +21 -9
  174. package/dist/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  175. package/dist/orchestrator/templates/specs-url-assert.d.ts +17 -1
  176. package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
  177. package/dist/orchestrator/templates/specs-url-assert.js +14 -2
  178. package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
  179. package/dist/orchestrator/templates/specs-url-assert.ts +24 -2
  180. package/dist/orchestrator/templates/wdio.conf.ts +24 -1
  181. package/package.json +3 -3
  182. package/src/cli/commands/audit.ts +10 -2
  183. package/src/cli/commands/capability.ts +51 -18
  184. package/src/cli/commands/delivery.ts +38 -16
  185. package/src/cli/commands/generate.ts +15 -7
  186. package/src/cli/commands/results-merge.ts +2 -8
  187. package/src/cli/commands/results-sanitize.ts +2 -9
  188. package/src/dashboard/snapshot-builder.ts +6 -8
  189. package/src/exporters/feature-parser.ts +32 -2
  190. package/src/exporters/locale-variants.ts +23 -17
  191. package/src/exporters/matrix/build.ts +14 -8
  192. package/src/exporters/matrix/carry-manual-results.ts +229 -0
  193. package/src/exporters/matrix/export.ts +10 -4
  194. package/src/exporters/matrix/wording.ts +26 -1
  195. package/src/exporters/xlsx-exporter.ts +7 -2
  196. package/src/generators/test-generator/adapters/adapter-interface.ts +2 -2
  197. package/src/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
  198. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
  199. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
  200. package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +68 -4
  201. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
  202. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
  203. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +5 -1
  204. package/src/generators/test-generator/code-generator.ts +54 -3
  205. package/src/generators/test-generator/diagnostics.ts +33 -4
  206. package/src/generators/test-generator/patterns/index.ts +15 -8
  207. package/src/generators/test-generator/patterns/types.ts +15 -0
  208. package/src/generators/test-generator/patterns/with-parent-scope.ts +6 -0
  209. package/src/generators/test-generator/step-mapper.ts +90 -8
  210. package/src/generators/test-generator/utils/data-resolver.ts +41 -12
  211. package/src/generators/test-generator/utils/selector-entry-fields.ts +1 -0
  212. package/src/generators/test-generator/utils/selector-resolver.ts +238 -82
  213. package/src/harness/audit.ts +17 -7
  214. package/src/harness/capability.ts +23 -12
  215. package/src/harness/catalog/universal-viewpoints.yaml +5 -5
  216. package/src/harness/config-file.ts +66 -0
  217. package/src/harness/depth-lint.ts +2 -1
  218. package/src/harness/flow-check.ts +6 -2
  219. package/src/harness/keyword-match.ts +85 -0
  220. package/src/harness/perf.ts +15 -7
  221. package/src/harness/quality-gates.ts +16 -4
  222. package/src/harness/query-catalog.ts +0 -0
  223. package/src/harness/read-text.ts +7 -1
  224. package/src/harness/secret-scan.ts +60 -4
  225. package/src/harness/sensors.ts +50 -19
  226. package/src/harness/spec-branches.ts +5 -2
  227. package/src/harness/spec-coverage.ts +14 -4
  228. package/src/harness/viewpoint-ledger.ts +2 -1
  229. package/src/harness/write-atomic.ts +22 -0
  230. package/src/orchestrator/ai-skills/writer.ts +18 -3
  231. package/src/orchestrator/assets-drift.ts +10 -5
  232. package/src/orchestrator/project-deps-sync.ts +23 -1
  233. package/src/orchestrator/project-initializer.ts +54 -6
  234. package/src/orchestrator/security-overrides-catalog.ts +69 -0
  235. package/src/orchestrator/security-overrides.ts +149 -0
  236. package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
  237. package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +3 -1
  238. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +9 -0
  239. package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
  240. package/src/orchestrator/templates/specs-locale-fixture.ts +21 -9
  241. package/src/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  242. package/src/orchestrator/templates/specs-url-assert.ts +24 -2
  243. package/src/orchestrator/templates/wdio.conf.ts +24 -1
@@ -16,6 +16,7 @@
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.RUNTIME_CAPTURE = void 0;
18
18
  exports.runtimeVarsOf = runtimeVarsOf;
19
+ exports.afterSubstitution = afterSubstitution;
19
20
  exports.renderAction = renderAction;
20
21
  exports.renderExpected = renderExpected;
21
22
  exports.renderPrecondition = renderPrecondition;
@@ -49,8 +50,25 @@ function runtimeVarsOf(stepTexts, tags) {
49
50
  return out;
50
51
  }
51
52
  // `[Email] field` → `Email field` (the visible label + its element type).
53
+ // Only the DSL's own refs: a `"quoted literal"` and a `{{token}}` are data, so their
54
+ // brackets stay (#772) — `"[DRAFT] report"`, `{{q.rows[0].id}}`. Callers render BEFORE
55
+ // substituting values, so a value's brackets (`^[A-Za-z]{3}`) never reach this.
56
+ // A literal opens only where a word does not end: in free text (manual procedures) `5"`
57
+ // is an inch mark, and two of them must not shield the `[Ref]` between them.
52
58
  function deRef(text) {
53
- return text.replace(/\[([^\]]+)\]/g, '$1');
59
+ return text.replace(/(?<![\p{L}\p{N}])"[^"]*"|\{\{[^}]*\}\}|\[([^\]]+)\]/gu, (m, ref) => ref ?? m);
60
+ }
61
+ /**
62
+ * Finish a cell rendered with `{{tokens}}` still in it, once the values are substituted
63
+ * (#772: render first, substitute after, so deRef never sees a value). Keeps what
64
+ * `sentence()` did when values went in first: a leading value is capitalised, and a
65
+ * value that already ends a sentence does not gain a second mark (`value..`).
66
+ */
67
+ function afterSubstitution(text) {
68
+ if (!text)
69
+ return text;
70
+ const s = text.charAt(0).toUpperCase() + text.slice(1);
71
+ return s.replace(/([.!?…"])\.$/, '$1');
54
72
  }
55
73
  function sentence(text) {
56
74
  // Trim the ENDS only — internal whitespace may be the test data itself
@@ -123,7 +141,15 @@ function renderExpected(raw) {
123
141
  if (exports.RUNTIME_CAPTURE.test(raw) && /\bas\s+\{\{/.test(raw))
124
142
  return renderAction(raw);
125
143
  let s = raw.trim().replace(/^(User|The user)\s+/i, '');
144
+ // `table match data:` rows (folded in by feature-parser, #771) are the EXPECTED VALUES —
145
+ // `[E2E-01] Q1` is data, not a ref — so only the table's own ref is de-ref'd (#772).
146
+ const md = s.match(/^sees? \[([^\]]+)\]\s*table match(?:es)? data: (.+)$/i);
147
+ if (md)
148
+ return sentence(`The ${md[1]} table shows these rows: ${md[2]}`);
126
149
  const rules = [
150
+ // tab order: (#771) row 1 is the focused origin, each later row is one Tab press —
151
+ // its cells ARE refs, so they are de-ref'd like any step's.
152
+ [/^sees? tab order: (.+)$/i, (m) => `Pressing Tab moves focus in this order: ${m[1]}`],
127
153
  // expect A is (not) B — comparing two captured values (order matters: "is not" first)
128
154
  [/^expects? (.+?) is not (.+)$/i, (m) => `${m[1]} differs from ${m[2]}`],
129
155
  [/^expects? (.+?) is (.+)$/i, (m) => `${m[1]} equals ${m[2]}`],
@@ -1 +1 @@
1
- {"version":3,"file":"wording.js","sourceRoot":"","sources":["../../../src/exporters/matrix/wording.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wording.js","sourceRoot":"","sources":["../../../src/exporters/matrix/wording.ts"],"names":[],"mappings":"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"}
@@ -69,6 +69,8 @@ export declare function buildApiDetailRows(catalog: Record<string, ApiCatalogEnt
69
69
  * used by the multi-locale delivery aggregator. Pass `null` / empty string
70
70
  * to force the base (no suffix) variant.
71
71
  */
72
+ /** Where `writeXlsx` puts a unit's workbook — shared so a reader targets the identical file. */
73
+ export declare function deliverableXlsxPath(cwd: string, screen: string, locale?: string | null): string;
72
74
  export declare function writeXlsx(cwd: string, screen: string, wb: ExcelJS.Workbook, locale?: string | null): Promise<string>;
73
75
  /**
74
76
  * Post-process the workbook buffer: extend `<a:picLocks>` on every drawing
@@ -1 +1 @@
1
- {"version":3,"file":"xlsx-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/xlsx-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQpF,OAAO,EAIL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,uDAAuD;IACvD,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,WAAW,EAAE,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,QAAQ,CAMlB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GACnC,YAAY,EAAE,CAMhB;AAED;;;;GAIG;AACH;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,OAAO,CAAC,QAAQ,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBxE"}
1
+ {"version":3,"file":"xlsx-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/xlsx-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQpF,OAAO,EAIL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,uDAAuD;IACvD,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,WAAW,EAAE,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,QAAQ,CAMlB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GACnC,YAAY,EAAE,CAMhB;AAED;;;;GAIG;AACH;;;;GAIG;AACH,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/F;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,OAAO,CAAC,QAAQ,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBxE"}
@@ -53,6 +53,7 @@ exports.addApiDetailSheet = void 0;
53
53
  exports.renderXlsx = renderXlsx;
54
54
  exports.renderXlsxMultiSheet = renderXlsxMultiSheet;
55
55
  exports.buildApiDetailRows = buildApiDetailRows;
56
+ exports.deliverableXlsxPath = deliverableXlsxPath;
56
57
  exports.writeXlsx = writeXlsx;
57
58
  exports.lockEmbeddedImages = lockEmbeddedImages;
58
59
  const fs = __importStar(require("fs"));
@@ -96,11 +97,15 @@ function buildApiDetailRows(catalog, scenarios) {
96
97
  * used by the multi-locale delivery aggregator. Pass `null` / empty string
97
98
  * to force the base (no suffix) variant.
98
99
  */
100
+ /** Where `writeXlsx` puts a unit's workbook — shared so a reader targets the identical file. */
101
+ function deliverableXlsxPath(cwd, screen, locale) {
102
+ return path.join(cwd, 'qa', 'deliverables', `${(0, csv_exporter_1.deliverableBasename)(screen, locale)}.xlsx`);
103
+ }
99
104
  async function writeXlsx(cwd, screen, wb, locale) {
100
- const outDir = path.join(cwd, 'qa', 'deliverables');
105
+ const outPath = deliverableXlsxPath(cwd, screen, locale);
106
+ const outDir = path.dirname(outPath);
101
107
  if (!fs.existsSync(outDir))
102
108
  fs.mkdirSync(outDir, { recursive: true });
103
- const outPath = path.join(outDir, `${(0, csv_exporter_1.deliverableBasename)(screen, locale)}.xlsx`);
104
109
  const buffer = await wb.xlsx.writeBuffer();
105
110
  const locked = await lockEmbeddedImages(Buffer.from(buffer));
106
111
  fs.writeFileSync(outPath, locked);
@@ -1 +1 @@
1
- {"version":3,"file":"xlsx-exporter.js","sourceRoot":"","sources":["../../src/exporters/xlsx-exporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xlsx-exporter.js","sourceRoot":"","sources":["../../src/exporters/xlsx-exporter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCH,gCAWC;AAqBD,oDAEC;AAYD,gDASC;AAaD,kDAEC;AAED,8BAaC;AAQD,gDAuBC;AAtJD,uCAAyB;AACzB,2CAA6B;AAE7B,kDAA0B;AAE1B,iDAAmD;AACnD,iDAAqD;AACrD,qDAI0B;AAC1B,+DAK+B;AAGtB,kGAJP,uCAAiB,OAIO;AAc1B,SAAgB,UAAU,CACxB,OAAsB,EACtB,IAAmB,EACnB,QAAgB,EAChB,SAA4B;IAE5B,OAAO,IAAA,iDAA2B,EAChC,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EACnD,SAAS,EACT,EAAE,aAAa,EAAE,IAAA,gCAAiB,GAAE,EAAE,CACvC,CAAC;AACJ,CAAC;AAqBD,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,OAAO,IAAA,2CAAqB,EAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAA,gCAAiB,GAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAChC,OAAwC,EACxC,SAAoC;IAEpC,OAAO,IAAA,wCAAsB,EAAC,OAAO,EAAE,SAAS,EAAE;QAChD,mBAAmB,EAAnB,oCAAmB;QACnB,mBAAmB,EAAnB,oCAAmB;QACnB,2BAA2B,EAA3B,4CAA2B;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH;;;;GAIG;AACH,gGAAgG;AAChG,SAAgB,mBAAmB,CAAC,GAAW,EAAE,MAAc,EAAE,MAAsB;IACrF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,IAAA,kCAAmB,EAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7F,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,MAAc,EACd,EAAoB,EACpB,MAAsB;IAEtB,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC,CAAC;IAC5E,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAChD,CAAC,IAAI,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CACzB,wBAAwB,EACxB,CAAC,MAAM,EAAE,KAAa,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;iBACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;iBACvB,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO,cAAc,KAAK,GAAG,SAAS,IAAI,CAAC;QAC7C,CAAC,CACF,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -2,8 +2,8 @@
2
2
  // Persistence oracles (dismissals, pins) hinge on what survives a reinstall.
3
3
  await (async () => {
4
4
  const __pkg = __resolveAppId();
5
- const __caps = (driver.requestedCapabilities || {}) as Record<string, string>;
6
- const __appPath = __caps['appium:app'] || __caps['app'];
5
+ // Same reader the reset tiers use — one place decides what "the session has a build file" means.
6
+ const __appPath = __appBuildPath();
7
7
  if (!__appPath) {
8
8
  throw new Error('reinstall the app: the session must install from a build file — set APP_APK (Android) / IOS_APP (iOS) so the appium:app capability is present.');
9
9
  }
@@ -9,12 +9,18 @@
9
9
  Flutter screen; UiSelector has no OR, hence the xpath. iOS scatters it across
10
10
  label/value, which the predicate already ORs.
11
11
 
12
+ SCOPE (#747): an `in [Parent] <type>` clause chains this under the parent element. The android
13
+ xpath must go RELATIVE (`.//`) to do so — a child xpath beginning with `//` is ABSOLUTE in
14
+ Appium even when chained, so keeping it would emit code that LOOKS scoped and searches the whole
15
+ screen, which is the same silent widening the scope clause exists to prevent. The iOS predicate
16
+ carries no such trap and chains as written.
17
+
12
18
  The expected value must stay a standalone quoted literal so the runtime-data transform
13
19
  can swap it for testData.get(...). --}}
14
20
  {
15
21
  const __expected = String('{{escapeQuotes dataValue}}').trim();
16
22
  const __sel = driver.isIOS
17
23
  ? `-ios predicate string:label == "${__expected}" OR value == "${__expected}"`
18
- : `//*[@text="${__expected}" or @content-desc="${__expected}"]`;
19
- await expect($(__sel)).toBeDisplayed();
24
+ : `{{#if parentLocator}}.{{/if}}//*[@text="${__expected}" or @content-desc="${__expected}"]`;
25
+ await expect({{#if parentLocator}}{{parentLocator}}.$(__sel){{else}}$(__sel){{/if}}).toBeDisplayed();
20
26
  }
@@ -1,13 +1,17 @@
1
1
  {{!-- Role variable, visible (mobile best-effort): ARIA role has no native-mobile analog — reuse
2
2
  the role→accessibility-id mapping in appium-selector.hbs (`~name`) when a static name
3
3
  exists; the resolver already folds dataValue into name when there is none, so this is only
4
- the fallback for a caller that omits both. --}}
4
+ the fallback for a caller that omits both.
5
+
6
+ SCOPE (#747): an `in [Parent] <type>` clause chains this under the parent element. Both
7
+ branches locate by accessibility id / predicate, neither of which carries the absolute-xpath
8
+ trap the label-value twin has to work around. --}}
5
9
  {{#if name}}
6
- await expect($('~{{escapeQuotes name}}')).toBeDisplayed();
10
+ await expect({{#if parentLocator}}{{parentLocator}}.$('~{{escapeQuotes name}}'){{else}}$('~{{escapeQuotes name}}'){{/if}}).toBeDisplayed();
7
11
  {{else}}
8
12
  {
9
13
  const __expected = String('{{escapeQuotes dataValue}}').trim();
10
14
  const __sel = driver.isIOS ? `-ios predicate string:label == "${__expected}" OR value == "${__expected}"` : `android=new UiSelector().text("${__expected}")`;
11
- await expect($(__sel)).toBeDisplayed();
15
+ await expect({{#if parentLocator}}{{parentLocator}}.$(__sel){{else}}$(__sel){{/if}}).toBeDisplayed();
12
16
  }
13
17
  {{/if}}
@@ -502,9 +502,36 @@ describe('{{featureName}}', () => {
502
502
  // lose the escalation between them — SG-W024 already reports that shape when tiers are involved.)
503
503
  let __escalateAfter: string | null = null;
504
504
 
505
+ // `@known-defect` marks a scenario that is EXPECTED to be red — it asserts a live defect. The
506
+ // scaffolded /sungen:run-test command tells authors exactly that ("expected-red scenarios stay red;
507
+ // never 'fix' them"), so the ladder honours it here: such a failure is the suite working as
508
+ // designed, not evidence of leftover state. Arming escalation off it would make the NEXT scenario
509
+ // pay a harder reset for nothing — on every run, forever, because the defect is known.
510
+ //
511
+ // Read off the TITLE because `@known-defect` is a pass-through tag: appium appends it there as the
512
+ // `[@a @b]` suffix (which is what keeps it greppable via `--grep`), and that is how the field
513
+ // report shows it. Anchored to that trailing group, so a scenario merely NAMED `… known-defect …`
514
+ // cannot exempt itself — the same reason __tierFor refuses to strip a trailing `[Selector]` ref.
515
+ //
516
+ // Matched as a whole TAG TOKEN, never as a substring. `@known-defect-list` is a DIFFERENT tag, and
517
+ // reading it as this one would silently stop the next scenario's real dirty-state failure from
518
+ // getting the escalated reset it needs — with no log line at all, because "never armed" is not the
519
+ // "capped" path and prints nothing. The `:<ref>` parameter form is accepted because that is what
520
+ // the rest of the vocabulary does (`@manual:M10`, `@reset:data`).
521
+ //
522
+ // Caveat, inherited rather than introduced: a @cases scenario builds its title at runtime as
523
+ // `name — <row label>`, so a row LABEL that itself ends in `[@…]` would be read as the tag group.
524
+ // Same trailing-bracket ambiguity __tierFor accepts for a `[Selector]` ref.
525
+ function __isExpectedFail(title: string): boolean {
526
+ const tagGroup = title.match(/ \[@[^\]]*\]$/);
527
+ if (!tagGroup) return false;
528
+ return tagGroup[0].slice(2, -1).split(/\s+/)
529
+ .some((t) => t === '@known-defect' || t.startsWith('@known-defect:'));
530
+ }
531
+
505
532
  // Registered BEFORE any user @afterEach block so a throwing user hook cannot skip the bookkeeping.
506
533
  afterEach(async function () {
507
- __escalateAfter = this.currentTest?.state === 'failed' ? (this.currentTest?.title ?? '') : null;
534
+ __escalateAfter = this.currentTest?.state === 'failed' && !__isExpectedFail(this.currentTest?.title ?? '') ? (this.currentTest?.title ?? '') : null;
508
535
  });
509
536
 
510
537
  {{#if scenarioResetTiers}}
@@ -583,9 +610,31 @@ describe('{{featureName}}', () => {
583
610
  await driver.execute('mobile: clearApp', { appId: pkg });
584
611
  }
585
612
 
586
- async function __reinstallApp(pkg: string): Promise<void> {
613
+ /** The app's build file, when the session was given one. Absent when the app was attached BY PACKAGE. */
614
+ function __appBuildPath(): string | undefined {
587
615
  const caps = (driver.requestedCapabilities || {}) as Record<string, string>;
588
- const appPath = caps['appium:app'] || caps['app'];
616
+ return caps['appium:app'] || caps['app'];
617
+ }
618
+
619
+ /**
620
+ * The strongest tier THIS SESSION can actually carry out.
621
+ *
622
+ * Reinstalling needs the app's build file, and `data` on iOS IS a reinstall (no `mobile: clearApp`
623
+ * outside UiAutomator2). Attaching the app by package — the common local setup — leaves no build
624
+ * file, so those tiers cannot run at all.
625
+ *
626
+ * This exists so ESCALATION can cap itself. Escalation is a recovery the runner CHOSE; nothing
627
+ * asked for it. Escalating into a tier that throws turns one failed scenario into a dead spec file,
628
+ * because the throw lands in `beforeEach` and mocha then skips every remaining test in the file.
629
+ * A DECLARED tier is never capped — that is an unmet contract and must still throw by name.
630
+ */
631
+ function __performableTier(): string {
632
+ if (__appBuildPath()) return 'full';
633
+ return driver.isIOS ? 'soft' : 'data';
634
+ }
635
+
636
+ async function __reinstallApp(pkg: string): Promise<void> {
637
+ const appPath = __appBuildPath();
589
638
  if (!appPath) {
590
639
  throw new Error(
591
640
  `reset tier needs the app's build file to reinstall — set APP_APK (Android) / IOS_APP (iOS) so the appium:app capability is present, or drop to @reset:soft.`,
@@ -637,9 +686,24 @@ describe('{{featureName}}', () => {
637
686
  // Same title ⟹ this is a retry of the scenario that just failed: keep its declared tier so a real
638
687
  // failure fails both attempts (see __escalateAfter above).
639
688
  const __escalate = __escalateAfter !== null && __escalateAfter !== (this.currentTest?.title ?? '');
640
- const __tier = __escalate ? __ESCALATE[__base] : __base;
689
+ // Escalation caps at what this session can perform, with the DECLARED tier as the FLOOR.
690
+ // The cap stops a tier NOBODY ASKED FOR from throwing in this hook and taking the rest of the
691
+ // spec file with it. The floor stops the cap from silently WEAKENING what the feature declared:
692
+ // a declared tier this session cannot perform still reaches __resetApp and still throws by name,
693
+ // because that one IS an unmet contract.
694
+ const __want = __escalate ? __ESCALATE[__base] : __base;
695
+ const __tier = __escalate
696
+ ? __TIER_ORDER[Math.max(
697
+ __TIER_ORDER.indexOf(__base),
698
+ Math.min(__TIER_ORDER.indexOf(__want), __TIER_ORDER.indexOf(__performableTier())),
699
+ )]
700
+ : __want;
641
701
  if (__tier !== __base) {
642
702
  console.log(` \u2191 reset escalated ${__base} \u2192 ${__tier} (previous scenario failed: "${__escalateAfter}")`);
703
+ } else if (__want !== __base) {
704
+ // Said per occurrence, not once per run: this names the scenario that did NOT get the stronger
705
+ // reset it was owed, which is a fact about THIS scenario, not just about the session.
706
+ console.warn(` ! reset could not escalate ${__base} \u2192 ${__want} — this session has no app build file to reinstall from (the app was attached by package). Staying at ${__base}; set APP_APK (Android) / IOS_APP (iOS) to enable the stronger reset.`);
643
707
  }
644
708
  await __resetApp(__tier);
645
709
  {{#if backgroundSteps}}
@@ -1 +1,7 @@
1
- await expect(page.getByText(/{{#if label}}{{escapeRegex label}}\s*{{else}}(?:^|\s){{/if}}{{escapeRegex dataValue}}$/)).toBeVisible();
1
+ {{!-- Caption+value read: the ref names on-screen TEXT ("学科 -"), not an element, so the locator is
2
+ built inline from the caption rather than through the `locator` partial. That is why the scope
3
+ clause needs its own slot here — the partial's `parentLocator` handling never runs (#747).
4
+ Unscoped, `… in [Education Card 6] card` compiled away to nothing: on a screen repeating ten
5
+ 学歴・職歴 cards the assertion strict-mode-failed where the caption repeats, and where it
6
+ happened to be unique elsewhere it passed having read a DIFFERENT card than the sentence names. --}}
7
+ await expect({{#if parentLocator}}{{parentLocator}}{{else}}page{{/if}}.getByText(/{{#if label}}{{escapeRegex label}}\s*{{else}}(?:^|\s){{/if}}{{escapeRegex dataValue}}$/)).toBeVisible();
@@ -1,9 +1,13 @@
1
+ {{!-- `getByRole` is built inline from role/name rather than through the `locator` partial, so the
2
+ scope clause needs its own slot here exactly as in label-value-assertion — the label branch's
3
+ twin (#747). `see [Logo] image with {{alt}} in [Product Card 3] card` searched every card on
4
+ the page before this. --}}
1
5
  {{#if name}}
2
6
  {{#if dataValue}}
3
- await expect(page.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeVisible();
7
+ await expect({{#if parentLocator}}{{parentLocator}}{{else}}page{{/if}}.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeVisible();
4
8
  {{else}}
5
- await expect(page.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{> locator-nth}}).toBeVisible();
9
+ await expect({{#if parentLocator}}{{parentLocator}}{{else}}page{{/if}}.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{> locator-nth}}).toBeVisible();
6
10
  {{/if}}
7
11
  {{else}}
8
- await expect(page.getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeVisible();
9
- {{/if}}
12
+ await expect({{#if parentLocator}}{{parentLocator}}{{else}}page{{/if}}.getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeVisible();
13
+ {{/if}}
@@ -23,8 +23,12 @@
23
23
  `https://admin.example.com/jobs` asserted the PATH on any host, and the public site's /jobs
24
24
  satisfied it.
25
25
 
26
+ `ignoreQuery` comes from the page ENTRY's `query: any`, not from the step, because it is a fact
27
+ about the page rather than about one assertion (#748). It relaxes only the bare-page rule; the
28
+ declared-value half below is untouched, so the two compose rather than override each other.
29
+
26
30
  The declared-value half is gated on `dataRef`, not on `query`. The step wrote `with {{v}}`
27
31
  either way; gating on the resolved VALUE meant an empty test-data entry silently dropped the
28
32
  whole check and fell back to the bare-page rule, which is the one case specs/url-assert.ts
29
33
  exists to throw on. --}}
30
- await expectPage(page, { pathname: /^{{pathRegex}}\/?$/{{#if hostRegex}}, hostname: /^{{hostRegex}}$/{{/if}}{{#if dataRef}}, dataRef: '{{escapeQuotes dataRef}}', declared: '{{escapeQuotes query}}'{{/if}} });
34
+ await expectPage(page, { pathname: /^{{pathRegex}}\/?$/{{#if hostRegex}}, hostname: /^{{hostRegex}}$/{{/if}}{{#if ignoreQuery}}, ignoreQuery: true{{/if}}{{#if dataRef}}, dataRef: '{{escapeQuotes dataRef}}', declared: '{{escapeQuotes query}}'{{/if}} });
@@ -139,7 +139,8 @@ export declare class CodeGenerator {
139
139
  * a name in the committed .env.qa.example. An undeclared ref means the test throws
140
140
  * "environment variable not set" the moment the key is used — surface it at compile
141
141
  * time instead. Only the `${QA_*}` shape is checked: any other `${...}` text is
142
- * ordinary literal data by design (never resolved, never warned about).
142
+ * ordinary literal data by design (never resolved, never warned about). A `${QA_*}`
143
+ * that appears only inside a `#` comment is prose, not a reference, and is ignored.
143
144
  */
144
145
  private reportedEnvRefs;
145
146
  private checkEnvSecretRefs;
@@ -1 +1 @@
1
- {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8B,MAAM,mBAAmB,CAAC;AAI9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAsQrD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAM;IAErB,OAAO,CAAC,eAAe,CAAc;IAErC,OAAO,CAAC,aAAa,CAAqC;IAE1D,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO;IAiBtK,oFAAoF;IACpF,cAAc,IAAI,oBAAoB;IAItC;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC;IAqGzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAS7C;;OAEG;IACH;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAY3B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAczB,gBAAgB;YAiahB,uBAAuB;YAYvB,kBAAkB;IAoBhC;;;;;;;;;;;;;;;;OAgBG;YACW,YAAY;IA+C1B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,wBAA+B;YAEnC,gBAAgB;IA6H9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,kBAAkB;IAyBpB,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC;CA+D5B"}
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8B,MAAM,mBAAmB,CAAC;AAI9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAwTrD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAM;IAErB,OAAO,CAAC,eAAe,CAAc;IAErC,OAAO,CAAC,aAAa,CAAqC;IAE1D,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO;IAiBtK,oFAAoF;IACpF,cAAc,IAAI,oBAAoB;IAItC;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC;IAqGzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAS7C;;OAEG;IACH;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAY3B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAczB,gBAAgB;YAiahB,uBAAuB;YAYvB,kBAAkB;IAoBhC;;;;;;;;;;;;;;;;OAgBG;YACW,YAAY;IA+C1B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,wBAA+B;YAEnC,gBAAgB;IA6H9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,kBAAkB;IAyBpB,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC;CA+D5B"}
@@ -193,7 +193,7 @@ function getAuthMode(scenarioTags, featureTags) {
193
193
  * Grouping key for the anonymous bucket. A literal that no `@auth:<role>` can produce, so an
194
194
  * imaginative role name can never land in the same group as `@no-auth`.
195
195
  */
196
- const NO_AUTH_GROUP_KEY = 'no-auth';
196
+ const NO_AUTH_GROUP_KEY = '\0no-auth';
197
197
  /**
198
198
  * True when the scenario has at least one step in the Then bucket —
199
199
  * And/But inherit the preceding primary keyword (Given/When/Then).
@@ -243,6 +243,69 @@ function warnMultipleAuthTags(tags, context) {
243
243
  ` Ignoring: ${authTags.slice(1).join(', ')}`);
244
244
  }
245
245
  }
246
+ /**
247
+ * Drop the YAML comment from ONE line: a `#` at line start or preceded by whitespace,
248
+ * and not inside a quoted scalar. Line-level only — see `yamlWithoutComments` for the
249
+ * block-scalar case, which this function cannot see from a single line.
250
+ */
251
+ function stripYamlComment(line) {
252
+ let quote = null;
253
+ for (let i = 0; i < line.length; i++) {
254
+ const c = line[i];
255
+ if (quote) {
256
+ if (quote === '"' && c === '\\') {
257
+ i++;
258
+ continue;
259
+ }
260
+ if (c === quote)
261
+ quote = null;
262
+ continue;
263
+ }
264
+ if (c === '"' || c === "'") {
265
+ quote = c;
266
+ continue;
267
+ }
268
+ if (c === '#' && (i === 0 || /\s/.test(line[i - 1])))
269
+ return line.slice(0, i);
270
+ }
271
+ return line;
272
+ }
273
+ /**
274
+ * The YAML text a `${QA_*}` scan may look at: comments removed, block scalars kept whole.
275
+ *
276
+ * SG-W009's reference scan used to run over the whole raw file, so a `${QA_*}` that only ever
277
+ * appeared in a `#` comment counted as a live reference — including the one sungen's own
278
+ * scaffolded "HOW TO FILL VALUES" block writes into every test-data file. The declared side has
279
+ * always been line-wise; this brings the reference side to the same footing.
280
+ *
281
+ * Inside a `|`/`>` block scalar every character is literal content, `#` included, so those lines
282
+ * pass through untouched. Stripping them would send the check the other way — a real, undeclared
283
+ * `${QA_*}` written after a `#` in a block scalar would go unreported, and the run would only fail
284
+ * later with "environment variable not set". A missed warning is worse than a noisy one.
285
+ */
286
+ function yamlWithoutComments(text) {
287
+ const out = [];
288
+ let blockIndent = null;
289
+ for (const line of text.split('\n')) {
290
+ if (blockIndent !== null) {
291
+ const indent = line.search(/\S/);
292
+ // blank lines and anything indented deeper than the key stay inside the scalar
293
+ if (indent === -1 || indent > blockIndent) {
294
+ out.push(line);
295
+ continue;
296
+ }
297
+ blockIndent = null;
298
+ }
299
+ const block = /^(\s*)[^#\s][^:]*:\s*[|>][+-]?\d*[+-]?\s*$/.exec(line);
300
+ if (block) {
301
+ blockIndent = block[1].length;
302
+ out.push(line);
303
+ continue;
304
+ }
305
+ out.push(stripYamlComment(line));
306
+ }
307
+ return out.join('\n');
308
+ }
246
309
  class CodeGenerator {
247
310
  constructor(options = {}) {
248
311
  // Screen/flow name for the CURRENT feature, in catalog-resolution form (`flows/<x>` for flows).
@@ -265,7 +328,8 @@ class CodeGenerator {
265
328
  * a name in the committed .env.qa.example. An undeclared ref means the test throws
266
329
  * "environment variable not set" the moment the key is used — surface it at compile
267
330
  * time instead. Only the `${QA_*}` shape is checked: any other `${...}` text is
268
- * ordinary literal data by design (never resolved, never warned about).
331
+ * ordinary literal data by design (never resolved, never warned about). A `${QA_*}`
332
+ * that appears only inside a `#` comment is prose, not a reference, and is ignored.
269
333
  */
270
334
  this.reportedEnvRefs = new Set();
271
335
  this.options = options;
@@ -1184,7 +1248,7 @@ class CodeGenerator {
1184
1248
  return;
1185
1249
  const referenced = new Set();
1186
1250
  for (const f of fs_1.default.readdirSync(testDataDir).filter((x) => x.endsWith('.yaml') || x.endsWith('.yml'))) {
1187
- const text = fs_1.default.readFileSync(path_1.default.join(testDataDir, f), 'utf-8');
1251
+ const text = yamlWithoutComments(fs_1.default.readFileSync(path_1.default.join(testDataDir, f), 'utf-8'));
1188
1252
  for (const m of text.matchAll(/\$\{(QA_[A-Z0-9_]+)\}/g))
1189
1253
  referenced.add(m[1]);
1190
1254
  }