playwright-cucumber-ts-steps 1.1.5 → 1.1.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAMA,OAAO,0BAA0B,CAAC;AAClC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,uBAAuB,CAAC;AAE/B,OAAO,qBAAqB,CAAC;AAE7B,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,QA2HpE"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAMA,OAAO,0BAA0B,CAAC;AAClC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,uBAAuB,CAAC;AAE/B,OAAO,qBAAqB,CAAC;AAE7B,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,QAyIpE"}
@@ -52,51 +52,54 @@ function runTests(featureGlob, options) {
52
52
  }
53
53
  const files = (0, glob_1.globSync)(featureGlob);
54
54
  const envTag = process.env.TAGS;
55
+ if (files.length === 0) {
56
+ console.log(`⚠️ No Feature files found for: ${featureGlob}`);
57
+ }
55
58
  for (const file of files) {
56
59
  const content = fs.readFileSync(file, "utf8");
57
- // 1. CAPTURE FEATURE-LEVEL TAGS (Inheritance)
58
- // Looks for lines starting with @ above "Feature:"
59
- const featureTagMatch = content.match(/((?:@[\w-]+\s*)+)Feature:/);
60
+ // 1. CAPTURE FEATURE TAGS
61
+ // Loose Regex: Matches any lines starting with @ above "Feature:"
62
+ const featureTagMatch = content.match(/((?:@\S+\s*)+)Feature:/);
60
63
  const rawFeatureTags = featureTagMatch ? featureTagMatch[1] : "";
61
- // Normalize newlines to spaces
62
64
  const featureTags = rawFeatureTags.replace(/[\r\n]+/g, " ").trim();
63
65
  const featureMatch = content.match(/Feature:\s*(.+)/);
64
66
  const featureName = featureMatch
65
67
  ? featureMatch[1].trim()
66
68
  : "Unnamed Feature";
67
69
  test_1.test.describe(featureName, () => {
68
- // 2. CAPTURE SCENARIO-LEVEL TAGS
69
- // Looks for optional tags above "Scenario:"
70
- const scenarioRegex = /(?:((?:@[\w-]+\s*)+))?Scenario:\s*(.+)/g;
70
+ // 2. LOOSE SCENARIO REGEX
71
+ // Matches: Optional Tags -> (Scenario OR Scenario Outline) -> Name
72
+ // Change: @\S+ allows dots/dashes. "Scenario|Scenario Outline" supports outlines.
73
+ const scenarioRegex = /(?:((?:@\S+\s*)+))?(?:Scenario|Scenario Outline):\s*(.+)/g;
71
74
  let match;
75
+ let foundCount = 0;
72
76
  while ((match = scenarioRegex.exec(content)) !== null) {
77
+ foundCount++;
73
78
  const rawScenarioTags = match[1] || "";
74
79
  const scenarioTags = rawScenarioTags.replace(/[\r\n]+/g, " ").trim();
75
80
  const scenarioName = match[2].trim();
76
- // 3. MERGE ALL TAGS
77
- // We combine Feature Tags + Scenario Tags into one master list
78
- // e.g. "@smoke @regression" + "@api" = "@smoke @regression @api"
81
+ // 3. MERGE TAGS
79
82
  const combinedTags = `${featureTags} ${scenarioTags}`.trim();
80
- // 4. APPEND TO TITLE
81
- // Now the test title contains EVERYTHING.
82
- // Playwright's -g can now "see" the feature tags on this specific test.
83
83
  const fullName = combinedTags
84
84
  ? `${scenarioName} ${combinedTags}`
85
85
  : scenarioName;
86
- // 5. CUSTOM FILTERING (Optional - if using TAGS env var)
86
+ // DEBUG LOG: See what we found
87
+ // console.log(` 👉 Found: "${scenarioName}" [Tags: ${combinedTags}]`);
88
+ // 4. ENV FILTERING (Optional)
87
89
  const activeFilter = options?.tags || envTag;
88
90
  if (activeFilter) {
89
91
  const targetGroups = activeFilter.split(",").map((t) => t.trim());
90
92
  const isMatch = targetGroups.some((group) => {
91
93
  const requiredTags = group.split("+").map((t) => t.trim());
92
- // Check against the COMBINED list
93
94
  return requiredTags.every((t) => combinedTags.includes(t));
94
95
  });
95
96
  if (!isMatch)
96
97
  continue;
97
98
  }
98
99
  const startIndex = match.index + match[0].length;
99
- const nextMatchIndex = content.slice(startIndex).search(/Scenario:/);
100
+ const nextMatchIndex = content
101
+ .slice(startIndex)
102
+ .search(/(?:Scenario|Scenario Outline):/);
100
103
  const blockEnd = nextMatchIndex === -1 ? content.length : startIndex + nextMatchIndex;
101
104
  const scenarioBlock = content.slice(startIndex, blockEnd);
102
105
  (0, test_1.test)(fullName, async ({ page }, testInfo) => {
@@ -111,6 +114,7 @@ function runTests(featureGlob, options) {
111
114
  stepText.startsWith("@") ||
112
115
  stepText === "")
113
116
  continue;
117
+ // Handle Data Tables
114
118
  const tableData = [];
115
119
  while (i + 1 < lines.length && lines[i + 1].startsWith("|")) {
116
120
  i++;
@@ -149,6 +153,11 @@ function runTests(featureGlob, options) {
149
153
  }
150
154
  });
151
155
  }
156
+ // SAFETY CHECK
157
+ if (foundCount === 0) {
158
+ console.warn(`⚠️ File matched but 0 Scenarios found in: ${file}`);
159
+ console.warn(` Check if you are using 'Scenario Outline' or strange spacing.`);
160
+ }
152
161
  });
153
162
  }
154
163
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "playwright-cucumber-ts-steps",
3
3
  "description": "A collection of reusable Playwright step definitions for Cucumber in TypeScript, designed to streamline end-to-end testing across web, API, and mobile applications.",
4
- "version": "1.1.5",
4
+ "version": "1.1.6",
5
5
  "private": false,
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",