@dev-blinq/cucumber_client 1.0.1396-dev → 1.0.1396-stage

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 (50) hide show
  1. package/bin/assets/bundled_scripts/recorder.js +105 -105
  2. package/bin/assets/preload/css_gen.js +10 -10
  3. package/bin/assets/preload/toolbar.js +27 -29
  4. package/bin/assets/preload/unique_locators.js +1 -1
  5. package/bin/assets/preload/yaml.js +288 -275
  6. package/bin/assets/scripts/aria_snapshot.js +223 -220
  7. package/bin/assets/scripts/dom_attr.js +329 -329
  8. package/bin/assets/scripts/dom_parent.js +169 -174
  9. package/bin/assets/scripts/event_utils.js +94 -94
  10. package/bin/assets/scripts/pw.js +2050 -1949
  11. package/bin/assets/scripts/recorder.js +70 -45
  12. package/bin/assets/scripts/snapshot_capturer.js +147 -147
  13. package/bin/assets/scripts/unique_locators.js +163 -44
  14. package/bin/assets/scripts/yaml.js +796 -783
  15. package/bin/assets/templates/_hooks_template.txt +6 -2
  16. package/bin/assets/templates/utils_template.txt +1 -1
  17. package/bin/client/code_cleanup/find_step_definition_references.js +0 -2
  18. package/bin/client/code_cleanup/utils.js +5 -1
  19. package/bin/client/code_gen/api_codegen.js +2 -2
  20. package/bin/client/code_gen/code_inversion.js +63 -2
  21. package/bin/client/code_gen/function_signature.js +4 -0
  22. package/bin/client/code_gen/page_reflection.js +846 -906
  23. package/bin/client/code_gen/playwright_codeget.js +27 -3
  24. package/bin/client/cucumber/feature.js +4 -0
  25. package/bin/client/cucumber/feature_data.js +2 -2
  26. package/bin/client/cucumber/project_to_document.js +8 -2
  27. package/bin/client/cucumber/steps_definitions.js +6 -3
  28. package/bin/client/cucumber_selector.js +17 -1
  29. package/bin/client/local_agent.js +3 -2
  30. package/bin/client/parse_feature_file.js +23 -26
  31. package/bin/client/playground/projects/env.json +2 -2
  32. package/bin/client/project.js +186 -202
  33. package/bin/client/recorderv3/bvt_init.js +349 -0
  34. package/bin/client/recorderv3/bvt_recorder.js +1068 -104
  35. package/bin/client/recorderv3/implemented_steps.js +2 -0
  36. package/bin/client/recorderv3/index.js +4 -303
  37. package/bin/client/recorderv3/scriptTest.js +1 -1
  38. package/bin/client/recorderv3/services.js +814 -154
  39. package/bin/client/recorderv3/step_runner.js +315 -206
  40. package/bin/client/recorderv3/step_utils.js +473 -25
  41. package/bin/client/recorderv3/update_feature.js +9 -5
  42. package/bin/client/recorderv3/wbr_entry.js +61 -0
  43. package/bin/client/recording.js +1 -0
  44. package/bin/client/upload-service.js +3 -2
  45. package/bin/client/utils/socket_logger.js +132 -0
  46. package/bin/index.js +4 -1
  47. package/bin/logger.js +3 -2
  48. package/bin/min/consoleApi.min.cjs +2 -3
  49. package/bin/min/injectedScript.min.cjs +16 -16
  50. package/package.json +19 -9
@@ -1,3 +1,7 @@
1
+ import dotenv from "dotenv";
2
+ // Load .env into process.env
3
+ dotenv.config();
4
+
1
5
  import {
2
6
  After,
3
7
  setDefaultTimeout,
@@ -30,8 +34,8 @@ BeforeStep(async function (step) {
30
34
  }
31
35
  });
32
36
 
33
- AfterStep(async function (step) {
37
+ AfterStep(async function ({ result, pickleStep }) {
34
38
  if (context) {
35
- await context.web.afterStep(this, step);
39
+ await context.web.afterStep(this, pickleStep, result);
36
40
  }
37
41
  });
@@ -171,6 +171,6 @@ Then("Verify the page title is {string}", verify_page_title);
171
171
  * @returns Promise that resolves after the specified duration
172
172
  */
173
173
  async function sleep(duration) {
174
- await context.web.sleep(duration, {}, null);
174
+ await context.web.sleep(duration, {}, this);
175
175
  }
176
176
  Then("Sleep for {string} ms", { timeout: -1 }, sleep);
@@ -113,5 +113,3 @@ export const findStepDefinitionReferences = async (projectDir) => {
113
113
  }
114
114
  return referencesList;
115
115
  };
116
-
117
- // qwe
@@ -7,10 +7,11 @@ const { default: traverse } = pkg;
7
7
  import pkg1 from "@babel/generator";
8
8
  const { default: generate } = pkg1;
9
9
  import * as t from "@babel/types";
10
-
11
10
  import { CucumberExpression, ParameterTypeRegistry } from "@cucumber/cucumber-expressions";
12
11
  import { existsSync, readFileSync, writeFileSync } from "fs";
13
12
  import { getAiConfig } from "../code_gen/page_reflection.js";
13
+ import socketLogger from "../utils/socket_logger.js";
14
+
14
15
  const STEP_KEYWORDS = new Set(["Given", "When", "Then"]);
15
16
 
16
17
  /**
@@ -307,14 +308,17 @@ export function getDefaultPrettierConfig() {
307
308
  const configContent = readFileSync(prettierConfigPath, "utf-8");
308
309
  prettierConfig = JSON.parse(configContent);
309
310
  } catch (error) {
311
+ socketLogger.error("Error parsing Prettier config file", error);
310
312
  console.error(`Error parsing Prettier config file: ${error}`);
311
313
  }
312
314
  } else {
313
315
  // save the default config to .prettierrc
314
316
  try {
315
317
  writeFileSync(prettierConfigPath, JSON.stringify(prettierConfig, null, 2), "utf-8");
318
+ socketLogger.info(`Created default Prettier config at ${prettierConfigPath}`);
316
319
  console.log(`Created default Prettier config at ${prettierConfigPath}`);
317
320
  } catch (error) {
321
+ socketLogger.error(`Error writing Prettier config file: ${error}`);
318
322
  console.error(`Error writing Prettier config file: ${error}`);
319
323
  }
320
324
  }
@@ -50,7 +50,7 @@ const generateApiCode = async (
50
50
  // create new codePage
51
51
  mjsFullPath = path.join(
52
52
  projectDir,
53
- stepsDefinitions.isTemp ? process.env.tempFeaturesFolderPath ?? "__temp_features" : "features",
53
+ stepsDefinitions.isTemp ? (process.env.tempFeaturesFolderPath ?? "__temp_features") : "features",
54
54
  "step_definitions",
55
55
  `api_tests_page.mjs`
56
56
  );
@@ -60,7 +60,7 @@ const generateApiCode = async (
60
60
  if (!codePage) {
61
61
  mjsFullPath = path.join(
62
62
  projectDir,
63
- stepsDefinitions.isTemp ? process.env.tempFeaturesFolderPath ?? "__temp_features" : "features",
63
+ stepsDefinitions.isTemp ? (process.env.tempFeaturesFolderPath ?? "__temp_features") : "features",
64
64
  "step_definitions",
65
65
  `api_tests_page.mjs`
66
66
  );
@@ -375,11 +375,13 @@ const invertStableCommand = (call, elements, stepParams) => {
375
375
  case "verifyTextRelatedToText": {
376
376
  step.type = Types.VERIFY_TEXT_RELATED_TO_TEXT;
377
377
  const textAnchorParse = parseDataSource(call.arguments[0], stepParams);
378
- const textAnchor = textAnchorParse.type === "literal" ? textAnchorParse.value : toVariableName(textAnchorParse.dataKey);
378
+ const textAnchor =
379
+ textAnchorParse.type === "literal" ? textAnchorParse.value : toVariableName(textAnchorParse.dataKey);
379
380
  const climbParse = parseDataSource(call.arguments[1], stepParams);
380
381
  const climb = climbParse.type === "literal" ? climbParse.value : toVariableName(climbParse.dataKey);
381
382
  const textToVerifyParse = parseDataSource(call.arguments[2], stepParams);
382
- const textToVerify = textToVerifyParse.type === "literal" ? textToVerifyParse.value : toVariableName(textToVerifyParse.dataKey);
383
+ const textToVerify =
384
+ textToVerifyParse.type === "literal" ? textToVerifyParse.value : toVariableName(textToVerifyParse.dataKey);
383
385
  step.parameters = [textAnchor, climb, textToVerify];
384
386
  break;
385
387
  }
@@ -473,6 +475,65 @@ const invertStableCommand = (call, elements, stepParams) => {
473
475
  }
474
476
  break;
475
477
  }
478
+
479
+ case "conditionalWait": {
480
+ step.type = Types.CONDITIONAL_WAIT;
481
+ step.element = extractElement(call.arguments[0]);
482
+ const condition = call.arguments[1].value;
483
+
484
+ const _timeout = parseDataSource(call.arguments[2], stepParams);
485
+ let timeout = 30;
486
+ if (_timeout.type === "literal") {
487
+ if (isNaN(_timeout.value)) {
488
+ throw new Error(`Timeout value must be a number, got ${_timeout.value}`);
489
+ }
490
+ timeout = Number(_timeout.value) * 1000;
491
+ } else {
492
+ step.dataSource = _timeout.dataSource;
493
+ step.dataKey = _timeout.dataKey;
494
+ timeout = toVariableName(_timeout.dataKey);
495
+ }
496
+ // step.timeout = timeout;
497
+ // step.value = "true";
498
+ step.parameters = [timeout, condition, step.value];
499
+ // step.condition = condition;
500
+ break;
501
+ }
502
+
503
+ case "sleep": {
504
+ step.type = Types.SLEEP;
505
+ const duration = parseDataSource(call.arguments[0], stepParams);
506
+ if (duration.type === "literal") {
507
+ if (isNaN(duration.value)) {
508
+ throw new Error(`Sleep duration must be a number, got ${duration.value}`);
509
+ }
510
+ step.parameters = [Number(duration.value)];
511
+ } else {
512
+ step.dataSource = duration.dataSource;
513
+ step.dataKey = duration.dataKey;
514
+ step.parameters = [toVariableName(duration.dataKey)];
515
+ }
516
+ break;
517
+ }
518
+ case "verify_file_exists": {
519
+ step.type = Types.VERIFY_FILE_EXISTS;
520
+ const filePath = parseDataSource(call.arguments[0], stepParams);
521
+ if (filePath.type === "literal") {
522
+ step.parameters = [filePath.value];
523
+ } else {
524
+ step.dataSource = filePath.dataSource;
525
+ step.dataKey = filePath.dataKey;
526
+ step.parameters = [toVariableName(filePath.dataKey)];
527
+ }
528
+ break;
529
+ }
530
+
531
+ // case "verifyPagePath":
532
+ // {
533
+ // step.type = Types.VERIFY_PAGE_PATH;
534
+ // step.parameters = [call.arguments[0].value];
535
+ // break;
536
+ // }
476
537
  default:
477
538
  return; // Skip if no matching method
478
539
  }
@@ -11,6 +11,8 @@ async function verify_the_opportunity_name_was_created(_name) {
11
11
  }
12
12
  */
13
13
 
14
+ import strip from "strip-comments";
15
+
14
16
  function generateSignature(page, functionName) {
15
17
  let functionCode = null;
16
18
  let method = null;
@@ -28,6 +30,8 @@ function generateSignature(page, functionName) {
28
30
  method.node.body.parent.params.forEach((param) => {
29
31
  parameters.push(param.name);
30
32
  });
33
+ const strippedFunctionCode = strip(functionCode);
34
+ functionCode = strippedFunctionCode !== "" ? strippedFunctionCode : functionCode;
31
35
  let lines = functionCode.split("\n");
32
36
  // trim all lines
33
37
  lines = lines.map((line) => line.trim());