@o3r/testing 10.0.0-prerelease.99 → 10.1.0-prerelease.0

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 (57) hide show
  1. package/README.md +2 -1
  2. package/core/angular/angular-materials/autocomplete-material.js.map +1 -1
  3. package/core/angular/angular-materials/select-material.js.map +1 -1
  4. package/core/angular/component-fixture.js.map +1 -1
  5. package/core/angular/elements/checkbox-element.js.map +1 -1
  6. package/core/angular/elements/radio-element.js.map +1 -1
  7. package/core/angular/elements/select-element.js.map +1 -1
  8. package/core/angular/groups/radio-group.js.map +1 -1
  9. package/core/angular/page-fixture.js.map +1 -1
  10. package/core/angular-materials/autocomplete-material.js.map +1 -1
  11. package/core/angular-materials/select-material.js.map +1 -1
  12. package/core/elements/checkbox-element.js.map +1 -1
  13. package/core/elements/radio-element.js.map +1 -1
  14. package/core/elements/select-element.js.map +1 -1
  15. package/core/groups/radio-group.js.map +1 -1
  16. package/core/helpers.js.map +1 -1
  17. package/core/page-fixture.js.map +1 -1
  18. package/core/playwright/angular-materials/autocomplete-material.js.map +1 -1
  19. package/core/playwright/angular-materials/select-material.js.map +1 -1
  20. package/core/playwright/component-fixture.js.map +1 -1
  21. package/core/playwright/elements/checkbox-element.js.map +1 -1
  22. package/core/playwright/elements/radio-element.js.map +1 -1
  23. package/core/playwright/elements/select-element.js.map +1 -1
  24. package/core/playwright/groups/radio-group.js.map +1 -1
  25. package/core/playwright/page-fixture.js.map +1 -1
  26. package/core/protractor/angular-materials/autocomplete-material.js.map +1 -1
  27. package/core/protractor/angular-materials/select-material.js.map +1 -1
  28. package/core/protractor/component-fixture.js.map +1 -1
  29. package/core/protractor/elements/checkbox-element.js.map +1 -1
  30. package/core/protractor/elements/radio-element.js.map +1 -1
  31. package/core/protractor/elements/select-element.js.map +1 -1
  32. package/core/protractor/groups/radio-group.js.map +1 -1
  33. package/core/protractor/page-fixture.js.map +1 -1
  34. package/errors/fixture-usage-error.js.map +1 -1
  35. package/errors/transpilation-purpose-only.js.map +1 -1
  36. package/kassette/update-dates-in-mocks.js.map +1 -1
  37. package/mocks/mock-component-generator.js.map +1 -1
  38. package/package.json +13 -13
  39. package/schematics/add-functions-to-fixture/helpers.js.map +1 -1
  40. package/schematics/add-functions-to-fixture/index.js.map +1 -1
  41. package/schematics/fixture-to-component/index.js.map +1 -1
  42. package/schematics/ng-add/fixture/index.d.ts.map +1 -1
  43. package/schematics/ng-add/fixture/index.js +2 -1
  44. package/schematics/ng-add/fixture/index.js.map +1 -1
  45. package/schematics/ng-add/index.d.ts.map +1 -1
  46. package/schematics/ng-add/index.js +32 -26
  47. package/schematics/ng-add/index.js.map +1 -1
  48. package/schematics/ng-add/playwright/index.d.ts +3 -2
  49. package/schematics/ng-add/playwright/index.d.ts.map +1 -1
  50. package/schematics/ng-add/playwright/index.js +19 -8
  51. package/schematics/ng-add/playwright/index.js.map +1 -1
  52. package/schematics/playwright/sanity/index.js.map +1 -1
  53. package/schematics/playwright/scenario/index.js.map +1 -1
  54. package/store/testable-select.js.map +1 -1
  55. package/tools/path-replacement/path-replacement.js.map +1 -1
  56. package/visual-test/utils.js.map +1 -1
  57. package/visual-test/visual-test.js.map +1 -1
@@ -6,11 +6,27 @@ const schematics_1 = require("@angular-devkit/schematics");
6
6
  const schematics_2 = require("@o3r/schematics");
7
7
  const dependencies_1 = require("@schematics/angular/utility/dependencies");
8
8
  const path = require("node:path");
9
+ const fs = require("node:fs");
9
10
  /**
10
11
  * Add Playwright to Otter application
11
12
  * @param options @see RuleFactory.options
13
+ * @param dependencies
12
14
  */
13
- function updatePlaywright(options = {}) {
15
+ function updatePlaywright(options, dependencies) {
16
+ const corePackageJsonPath = path.resolve(__dirname, '..', '..', '..', 'package.json');
17
+ const ownPackageJson = JSON.parse(fs.readFileSync(corePackageJsonPath, { encoding: 'utf-8' }));
18
+ dependencies['@playwright/test'] = {
19
+ inManifest: [{
20
+ range: ownPackageJson.devDependencies['@playwright/test'],
21
+ types: [dependencies_1.NodeDependencyType.Dev]
22
+ }]
23
+ };
24
+ dependencies.rimraf = {
25
+ inManifest: [{
26
+ range: ownPackageJson.devDependencies.rimraf,
27
+ types: [dependencies_1.NodeDependencyType.Dev]
28
+ }]
29
+ };
14
30
  return (tree, context) => {
15
31
  const workingDirectory = options?.projectName && (0, schematics_2.getWorkspaceConfig)(tree)?.projects[options.projectName]?.root || '.';
16
32
  // update gitignore
@@ -36,8 +52,6 @@ playwright-reports
36
52
  packageJson.scripts['test:playwright:sanity'] ||= 'playwright test --config=e2e-playwright/playwright-config.sanity.ts';
37
53
  tree.overwrite(packageJsonPath, JSON.stringify(packageJson, null, 2));
38
54
  }
39
- const corePackageJsonPath = path.resolve(__dirname, '..', '..', '..', 'package.json');
40
- const ngAddRules = (0, schematics_2.ngAddPeerDependencyPackages)(['@playwright/test', 'rimraf'], corePackageJsonPath, dependencies_1.NodeDependencyType.Dev, { ...options, skipNgAddSchematicRun: true, workingDirectory });
41
55
  // generate files
42
56
  if (!tree.exists(path.posix.join(workingDirectory, 'e2e-playwright', 'playwright-config.ts'))) {
43
57
  const name = 'my-scenario';
@@ -55,12 +69,9 @@ playwright-reports
55
69
  (0, schematics_1.renameTemplateFiles)(),
56
70
  (0, schematics_1.move)(workingDirectory)
57
71
  ]);
58
- return (0, schematics_1.chain)([
59
- ngAddRules,
60
- (0, schematics_1.mergeWith)(templateSource, schematics_1.MergeStrategy.Overwrite)
61
- ])(tree, context);
72
+ return (0, schematics_1.mergeWith)(templateSource, schematics_1.MergeStrategy.Overwrite)(tree, context);
62
73
  }
63
- return ngAddRules(tree, context);
74
+ return tree;
64
75
  };
65
76
  }
66
77
  exports.updatePlaywright = updatePlaywright;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/ng-add/playwright/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/ng-add/playwright/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/playwright/sanity/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,2DAAuI;AACvI,gDAA6H;AAG7H;;;GAGG;AACH,SAAS,4BAA4B,CAAC,OAAmD;IACvF,MAAM,aAAa,GAAG,CAAC,IAAU,CAAA,gCAAgC,EAAE,EAAE;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnH,IAAI,CAAC,gBAAgB,EAAE;YACrB,MAAM,IAAI,wBAAW,CAAC,mCAAmC,CAAC,CAAC;SAC5D;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,cAAO,CAAC,UAAU,CAAC,cAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE;;;;OAIG;IACH,MAAM,aAAa,GAAS,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QACpE,MAAM,UAAU,GAAG,IAAA,+BAAkB,EAAC,gCAAgC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEjH,MAAM,cAAc,GAAG,IAAA,kBAAK,EAAC,IAAA,gBAAG,EAAC,aAAa,CAAC,EAAE;YAC/C,IAAA,qBAAQ,EAAC;gBACP,GAAG,cAAO;gBACV,GAAG,OAAO;gBACV,UAAU;aACX,CAAC;YACF,IAAA,iBAAI,EAAC,UAAU,CAAC;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAS,EAAC,cAAc,EAAE,0BAAa,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO,IAAA,kBAAK,EAAC;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACU,QAAA,0BAA0B,GAAG,IAAA,kDAAqC,EAAC,4BAA4B,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/playwright/sanity/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,2DAAuI;AACvI,gDAA6H;AAG7H;;;GAGG;AACH,SAAS,4BAA4B,CAAC,OAAmD;IACvF,MAAM,aAAa,GAAG,CAAC,IAAU,CAAA,gCAAgC,EAAE,EAAE;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnH,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAW,CAAC,mCAAmC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,cAAO,CAAC,UAAU,CAAC,cAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE;;;;OAIG;IACH,MAAM,aAAa,GAAS,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QACpE,MAAM,UAAU,GAAG,IAAA,+BAAkB,EAAC,gCAAgC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEjH,MAAM,cAAc,GAAG,IAAA,kBAAK,EAAC,IAAA,gBAAG,EAAC,aAAa,CAAC,EAAE;YAC/C,IAAA,qBAAQ,EAAC;gBACP,GAAG,cAAO;gBACV,GAAG,OAAO;gBACV,UAAU;aACX,CAAC;YACF,IAAA,iBAAI,EAAC,UAAU,CAAC;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAS,EAAC,cAAc,EAAE,0BAAa,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO,IAAA,kBAAK,EAAC;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACU,QAAA,0BAA0B,GAAG,IAAA,kDAAqC,EAAC,4BAA4B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/playwright/scenario/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,2DAAuI;AACvI,gDAA6H;AAG7H;;;GAGG;AACH,SAAS,8BAA8B,CAAC,OAAqD;IAC3F,MAAM,aAAa,GAAG,CAAC,IAAU,CAAA,gCAAgC,EAAE,EAAE;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnH,IAAI,CAAC,gBAAgB,EAAE;YACrB,MAAM,IAAI,wBAAW,CAAC,qCAAqC,CAAC,CAAC;SAC9D;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,cAAO,CAAC,UAAU,CAAC,cAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE;;;;OAIG;IACH,MAAM,aAAa,GAAS,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QACpE,MAAM,YAAY,GAAG,IAAA,+BAAkB,EAAC,kCAAkC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAErH,MAAM,cAAc,GAAG,IAAA,kBAAK,EAAC,IAAA,gBAAG,EAAC,aAAa,CAAC,EAAE;YAC/C,IAAA,qBAAQ,EAAC;gBACP,GAAG,cAAO;gBACV,GAAG,OAAO;gBACV,YAAY;aACb,CAAC;YACF,IAAA,iBAAI,EAAC,YAAY,CAAC;SACnB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAS,EAAC,cAAc,EAAE,0BAAa,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO,IAAA,kBAAK,EAAC;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACU,QAAA,4BAA4B,GAAG,IAAA,kDAAqC,EAAC,8BAA8B,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../schematics/playwright/scenario/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,2DAAuI;AACvI,gDAA6H;AAG7H;;;GAGG;AACH,SAAS,8BAA8B,CAAC,OAAqD;IAC3F,MAAM,aAAa,GAAG,CAAC,IAAU,CAAA,gCAAgC,EAAE,EAAE;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnH,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAW,CAAC,qCAAqC,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,cAAO,CAAC,UAAU,CAAC,cAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE;;;;OAIG;IACH,MAAM,aAAa,GAAS,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QACpE,MAAM,YAAY,GAAG,IAAA,+BAAkB,EAAC,kCAAkC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAErH,MAAM,cAAc,GAAG,IAAA,kBAAK,EAAC,IAAA,gBAAG,EAAC,aAAa,CAAC,EAAE;YAC/C,IAAA,qBAAQ,EAAC;gBACP,GAAG,cAAO;gBACV,GAAG,OAAO;gBACV,YAAY;aACb,CAAC;YACF,IAAA,iBAAI,EAAC,YAAY,CAAC;SACnB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAS,EAAC,cAAc,EAAE,0BAAa,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO,IAAA,kBAAK,EAAC;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACU,QAAA,4BAA4B,GAAG,IAAA,kDAAqC,EAAC,8BAA8B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"testable-select.js","sourceRoot":"","sources":["../../src/store/testable-select.ts"],"names":[],"mappings":";;;;AAAA,iDAAiD;AACjD,sDAA4B;AAE5B,qCAAmD;AACnD,6BAAsC;AACtC,qCAA6F;AAG7F,sDAAsD;AACtD,IAAI,eAAe,GAAuB,EAAE,CAAC;AAE7C;;;;GAIG;AAEH;;;GAGG;AACH,IAAM,WAAW,GAAG,UAAmB,QAAkC,IAAK,OAAA,eAAe,CAAC,SAAS,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAzB,CAAyB,CAAC,EAA7D,CAA6D,CAAC;AAC5I;;;GAGG;AACH,IAAM,MAAM,GAAG,UAAC,QAAuC;IACrD,IAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC,CAAC;AACF;;;GAGG;AACH,SAAS,MAAM,CAAI,GAAmB;IACpC,OAAO,IAAA,2BAAiB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,cAAM,OAAA,IAAA,SAAE,EAAC,GAAG,CAAC,UAAU,CAAC,EAAlB,CAAkB,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AAEH;;GAEG;AACH,SAAgB,kBAAkB;IAChC,eAAe,GAAG,EAAE,CAAC;AACvB,CAAC;AAFD,gDAEC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,kBAAkB,EAAE,CAAC;AACvB,CAAC;AAFD,0DAEC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAA+B,QAAgC,EAAE,UAAiC;IAC7H,IAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC,EAAE;QACjB,eAAe,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;KACnD;SAAM;QACL,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAuC,EAAE,UAAU,YAAA,EAAE,CAAC,CAAC;KACzF;AACH,CAAC;AAPD,sCAOC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAA+B,QAAgC;IAC7F,IAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC,EAAE;QACjB,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KACrC;AACH,CAAC;AALD,4CAKC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,QAAuC,EAAE,KAAc;IAC5E,IAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,cAAU,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAHD,wBAGC","sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport * from '@ngrx/store';\n\nimport { select as baseSelect } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { FakeSelectCall, isSelectorSpyCall, SelectorFunction, SelectorSpy } from './typings';\n\n\n/** Global variable that holds the registered spies */\nlet registeredSpies: SelectorSpy<any>[] = [];\n\n/**\n *\n * PRIVATE METHODS\n *\n */\n\n/**\n * Searches for the index of given selector\n * @param selectFn Selector function to be searched\n */\nconst getSpyIndex = <S extends object>(selectFn: SelectorFunction<S, any>) => registeredSpies.findIndex((spy) => spy.selector === selectFn);\n/**\n * Searches for the given selector spy. Returns undefined if none is registered\n * @param selectFn Selector function to be searched\n */\nconst getSpy = (selectFn: SelectorFunction<object, any>) => {\n const index = getSpyIndex(selectFn);\n return index >= 0 ? registeredSpies[index] : undefined;\n};\n/**\n * Uses the spy as the return of a select\n * @param spy The selector spy\n */\nfunction useSpy<R>(spy: SelectorSpy<R>): (source$: Observable<any>) => Observable<R> {\n return isSelectorSpyCall(spy) ? spy.fakeResult : () => of(spy.fakeResult);\n}\n\n/**\n *\n * PUBLIC METHODS\n *\n */\n\n/**\n * Clears all the registered selector spies\n */\nexport function clearSelectorSpies() {\n registeredSpies = [];\n}\n\n/**\n * Initialize the selector spies structure\n */\nexport function initializeSelectorSpies() {\n clearSelectorSpies();\n}\n\n/**\n * Spy on a selector function\n * @param selector Selector function to be spied on\n * @param fakeResult The fake result to be used when a select is triggered\n */\nexport function spyOnSelector<R, S extends object = object>(selector: SelectorFunction<S, R>, fakeResult: R | FakeSelectCall<R>) {\n const spyIndex = getSpyIndex(selector);\n if (spyIndex >= 0) {\n registeredSpies[spyIndex].fakeResult = fakeResult;\n } else {\n registeredSpies.push({ selector: selector as SelectorFunction<object, R>, fakeResult });\n }\n}\n\n/**\n * Removes the spy on a given selector function\n * @param selector Selector function that is being spied on\n */\nexport function clearSelectorSpy<R, S extends object = object>(selector: SelectorFunction<S, R>) {\n const spyIndex = getSpyIndex(selector);\n if (spyIndex >= 0) {\n registeredSpies.splice(spyIndex, 1);\n }\n}\n\n/**\n * Highjacked ngrx/store select. It checks if the selector function is being spied on\n * and returns it's fake result. Otherwise, it runs the original ngrx/store select\n * @param selectFn Selector function to be used\n * @param props optional properties to be used by the selector\n */\nexport function select(selectFn: SelectorFunction<object, any>, props?: object) {\n const spy = getSpy(selectFn);\n return spy ? useSpy(spy) : baseSelect(selectFn, props);\n}\n"]}
1
+ {"version":3,"file":"testable-select.js","sourceRoot":"","sources":["../../src/store/testable-select.ts"],"names":[],"mappings":";;;;AAAA,iDAAiD;AACjD,sDAA4B;AAE5B,qCAAmD;AACnD,6BAAsC;AACtC,qCAA6F;AAG7F,sDAAsD;AACtD,IAAI,eAAe,GAAuB,EAAE,CAAC;AAE7C;;;;GAIG;AAEH;;;GAGG;AACH,IAAM,WAAW,GAAG,UAAmB,QAAkC,IAAK,OAAA,eAAe,CAAC,SAAS,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAzB,CAAyB,CAAC,EAA7D,CAA6D,CAAC;AAC5I;;;GAGG;AACH,IAAM,MAAM,GAAG,UAAC,QAAuC;IACrD,IAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC,CAAC;AACF;;;GAGG;AACH,SAAS,MAAM,CAAI,GAAmB;IACpC,OAAO,IAAA,2BAAiB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,cAAM,OAAA,IAAA,SAAE,EAAC,GAAG,CAAC,UAAU,CAAC,EAAlB,CAAkB,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AAEH;;GAEG;AACH,SAAgB,kBAAkB;IAChC,eAAe,GAAG,EAAE,CAAC;AACvB,CAAC;AAFD,gDAEC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,kBAAkB,EAAE,CAAC;AACvB,CAAC;AAFD,0DAEC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAA+B,QAAgC,EAAE,UAAiC;IAC7H,IAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,eAAe,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAuC,EAAE,UAAU,YAAA,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAPD,sCAOC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAA+B,QAAgC;IAC7F,IAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AALD,4CAKC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,QAAuC,EAAE,KAAc;IAC5E,IAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,cAAU,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAHD,wBAGC","sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport * from '@ngrx/store';\n\nimport { select as baseSelect } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { FakeSelectCall, isSelectorSpyCall, SelectorFunction, SelectorSpy } from './typings';\n\n\n/** Global variable that holds the registered spies */\nlet registeredSpies: SelectorSpy<any>[] = [];\n\n/**\n *\n * PRIVATE METHODS\n *\n */\n\n/**\n * Searches for the index of given selector\n * @param selectFn Selector function to be searched\n */\nconst getSpyIndex = <S extends object>(selectFn: SelectorFunction<S, any>) => registeredSpies.findIndex((spy) => spy.selector === selectFn);\n/**\n * Searches for the given selector spy. Returns undefined if none is registered\n * @param selectFn Selector function to be searched\n */\nconst getSpy = (selectFn: SelectorFunction<object, any>) => {\n const index = getSpyIndex(selectFn);\n return index >= 0 ? registeredSpies[index] : undefined;\n};\n/**\n * Uses the spy as the return of a select\n * @param spy The selector spy\n */\nfunction useSpy<R>(spy: SelectorSpy<R>): (source$: Observable<any>) => Observable<R> {\n return isSelectorSpyCall(spy) ? spy.fakeResult : () => of(spy.fakeResult);\n}\n\n/**\n *\n * PUBLIC METHODS\n *\n */\n\n/**\n * Clears all the registered selector spies\n */\nexport function clearSelectorSpies() {\n registeredSpies = [];\n}\n\n/**\n * Initialize the selector spies structure\n */\nexport function initializeSelectorSpies() {\n clearSelectorSpies();\n}\n\n/**\n * Spy on a selector function\n * @param selector Selector function to be spied on\n * @param fakeResult The fake result to be used when a select is triggered\n */\nexport function spyOnSelector<R, S extends object = object>(selector: SelectorFunction<S, R>, fakeResult: R | FakeSelectCall<R>) {\n const spyIndex = getSpyIndex(selector);\n if (spyIndex >= 0) {\n registeredSpies[spyIndex].fakeResult = fakeResult;\n } else {\n registeredSpies.push({ selector: selector as SelectorFunction<object, R>, fakeResult });\n }\n}\n\n/**\n * Removes the spy on a given selector function\n * @param selector Selector function that is being spied on\n */\nexport function clearSelectorSpy<R, S extends object = object>(selector: SelectorFunction<S, R>) {\n const spyIndex = getSpyIndex(selector);\n if (spyIndex >= 0) {\n registeredSpies.splice(spyIndex, 1);\n }\n}\n\n/**\n * Highjacked ngrx/store select. It checks if the selector function is being spied on\n * and returns it's fake result. Otherwise, it runs the original ngrx/store select\n * @param selectFn Selector function to be used\n * @param props optional properties to be used by the selector\n */\nexport function select(selectFn: SelectorFunction<object, any>, props?: object) {\n const spy = getSpy(selectFn);\n return spy ? useSpy(spy) : baseSelect(selectFn, props);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"path-replacement.js","sourceRoot":"","sources":["../../../src/tools/path-replacement/path-replacement.ts"],"names":[],"mappings":";;;;AAAA,6BAA6B;AAC7B,mCAA0D;AAC1D,4BAA8B;AAC9B,2CAAqC;AACrC,yDAAuD;AACvD,gCAAkC;AAClC;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,aAA0C,EAAE,sBAA6C;IAA7C,uCAAA,EAAA,2BAA6C;IAClH,IAAM,YAAY,GAAwB,EAAE,CAAC;IAC7C,IAAM,eAAe,GAAG,oBAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACjD,IAAM,KAAK,GAAG,IAAI,MAAM,CAAC,+BAAwB,aAAa,UAAO,CAAC,CAAC;IACvE,oBAAM,CAAC,SAAS,CAAC,OAAO,GAAG,UAA+B,EAAU;QAClE,IAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,4BAAqB,aAAa,OAAI,CAAC,CAAC;QAExE,IAAI;YACF,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7C;QAAC,OAAO,KAAU,EAAE;YACnB,IAAM,KAAK,GAAI,EAAe;iBAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAnC,CAAmC,CAAC,CAAC,CAAC;YAEhF,IAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;gBAC3B,IAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC/C,0CAA0C;gBAC1C,IAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,WAAW,CAAC,QAAQ,EAAE,qBAChD,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,GAAG,IACZ,sBAAsB,EACzB,CAAC;gBAEH;;;;;;mBAMG;gBACH,IAAI;oBACF,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAA,sCAAiB,EAAC,KAAK,CAAC,IAAI,EAAE;wBACrD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAC/B,gBAAgB,EAAE,IAAI;qBACvB,CAAC,CAAC;iBACJ;gBAAC,OAAO,EAAE,EAAE;oBACX,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;iBACnB;aACF;YAED,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;SAC/B;IAEH,CAAmB,CAAC;AACtB,CAAC;AAjDD,gCAiDC","sourcesContent":["/* eslint-disable no-undef */\nimport { TransformOptions, transformSync } from 'esbuild';\nimport * as fs from 'node:fs';\nimport { Module } from 'node:module';\nimport { requireFromString } from 'module-from-string';\nimport * as path from 'node:path';\n/**\n * Switch to the needed implementation of core testing, when running e2e tests\n * transforms ESM into CJS when needed\n * @param frameworkName Name of the framework used for e2e testing (playwright|protractor)\n * @param customTransformOptions\n */\nexport function adjustPath(frameworkName: 'playwright' | 'protractor', customTransformOptions: TransformOptions = {}) {\n const modulesCache: Record<string, any> = {};\n const originalRequire = Module.prototype.require;\n const regex = new RegExp(`@o3r/testing/core(?!/${frameworkName})(.*)`);\n Module.prototype.require = function (this: NodeJS.Module, id: string) {\n const newId = id.replace(regex, `@o3r/testing/core/${frameworkName}$1`);\n\n try {\n return originalRequire.apply(this, [newId]);\n } catch (error: any) {\n const paths = ([] as string[])\n .concat(this.paths, this.paths.map(i => i.replace(/[\\\\/]node_modules$/, '')));\n\n const filePath = require.resolve(newId, { paths });\n if (!modulesCache[filePath]) {\n const fileContent = fs.readFileSync(filePath);\n const cwd = path.resolve(process.cwd(), 'src');\n // we use ESBUILD to transform it into CJS\n const trans = transformSync(fileContent.toString(), {\n loader: 'js',\n format: 'cjs',\n target: 'es2016',\n sourcesContent: true,\n sourceRoot: cwd,\n ...customTransformOptions\n });\n\n /**\n * requireFromString will execute the file apart from just returning a module\n * It can throw an exception which will prevent stop the execution\n *\n * That main blocker includes IVY-compatible libraries which have\n * no compiler facade in a global scope.\n */\n try {\n modulesCache[filePath] = requireFromString(trans.code, {\n dirname: path.dirname(filePath),\n useCurrentGlobal: true\n });\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error(ex);\n }\n }\n\n return modulesCache[filePath];\n }\n\n } as NodeJS.Require;\n}\n"]}
1
+ {"version":3,"file":"path-replacement.js","sourceRoot":"","sources":["../../../src/tools/path-replacement/path-replacement.ts"],"names":[],"mappings":";;;;AAAA,6BAA6B;AAC7B,mCAA0D;AAC1D,4BAA8B;AAC9B,2CAAqC;AACrC,yDAAuD;AACvD,gCAAkC;AAClC;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,aAA0C,EAAE,sBAA6C;IAA7C,uCAAA,EAAA,2BAA6C;IAClH,IAAM,YAAY,GAAwB,EAAE,CAAC;IAC7C,IAAM,eAAe,GAAG,oBAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACjD,IAAM,KAAK,GAAG,IAAI,MAAM,CAAC,+BAAwB,aAAa,UAAO,CAAC,CAAC;IACvE,oBAAM,CAAC,SAAS,CAAC,OAAO,GAAG,UAA+B,EAAU;QAClE,IAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,4BAAqB,aAAa,OAAI,CAAC,CAAC;QAExE,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAM,KAAK,GAAI,EAAe;iBAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAnC,CAAmC,CAAC,CAAC,CAAC;YAEhF,IAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC/C,0CAA0C;gBAC1C,IAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,WAAW,CAAC,QAAQ,EAAE,qBAChD,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,GAAG,IACZ,sBAAsB,EACzB,CAAC;gBAEH;;;;;;mBAMG;gBACH,IAAI,CAAC;oBACH,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAA,sCAAiB,EAAC,KAAK,CAAC,IAAI,EAAE;wBACrD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAC/B,gBAAgB,EAAE,IAAI;qBACvB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IAEH,CAAmB,CAAC;AACtB,CAAC;AAjDD,gCAiDC","sourcesContent":["/* eslint-disable no-undef */\nimport { TransformOptions, transformSync } from 'esbuild';\nimport * as fs from 'node:fs';\nimport { Module } from 'node:module';\nimport { requireFromString } from 'module-from-string';\nimport * as path from 'node:path';\n/**\n * Switch to the needed implementation of core testing, when running e2e tests\n * transforms ESM into CJS when needed\n * @param frameworkName Name of the framework used for e2e testing (playwright|protractor)\n * @param customTransformOptions\n */\nexport function adjustPath(frameworkName: 'playwright' | 'protractor', customTransformOptions: TransformOptions = {}) {\n const modulesCache: Record<string, any> = {};\n const originalRequire = Module.prototype.require;\n const regex = new RegExp(`@o3r/testing/core(?!/${frameworkName})(.*)`);\n Module.prototype.require = function (this: NodeJS.Module, id: string) {\n const newId = id.replace(regex, `@o3r/testing/core/${frameworkName}$1`);\n\n try {\n return originalRequire.apply(this, [newId]);\n } catch (error: any) {\n const paths = ([] as string[])\n .concat(this.paths, this.paths.map(i => i.replace(/[\\\\/]node_modules$/, '')));\n\n const filePath = require.resolve(newId, { paths });\n if (!modulesCache[filePath]) {\n const fileContent = fs.readFileSync(filePath);\n const cwd = path.resolve(process.cwd(), 'src');\n // we use ESBUILD to transform it into CJS\n const trans = transformSync(fileContent.toString(), {\n loader: 'js',\n format: 'cjs',\n target: 'es2016',\n sourcesContent: true,\n sourceRoot: cwd,\n ...customTransformOptions\n });\n\n /**\n * requireFromString will execute the file apart from just returning a module\n * It can throw an exception which will prevent stop the execution\n *\n * That main blocker includes IVY-compatible libraries which have\n * no compiler facade in a global scope.\n */\n try {\n modulesCache[filePath] = requireFromString(trans.code, {\n dirname: path.dirname(filePath),\n useCurrentGlobal: true\n });\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error(ex);\n }\n }\n\n return modulesCache[filePath];\n }\n\n } as NodeJS.Require;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/visual-test/utils.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,WAA0B;IAA1B,4BAAA,EAAA,0BAA0B;IAC7D,IAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,gBAAgB,CAAC,WAAW,GAAG,iBAC1B,kBAAkB,eAAK,WAAW,4CAElC,kBAAkB,eAAK,WAAW,wLASrC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAlBD,oDAkBC;AAED;;GAEG;AACH,SAAgB,sBAAsB;IACpC,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC9D,CAAC;AAHD,wDAGC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,IAAI,OAAO,EAAE;QACX,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;KACjD;SAAM;QACL,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;KACpD;AACH,CAAC;AAPD,8DAOC","sourcesContent":["/**\n * Prepare css rule to hide specific blocks\n *\n * Should be called only once during the visual test.\n * @note: this function is evaluated in the context of the page and should not use external variables\n * @param ignoreClass\n */\nexport function prepareVisualTesting(ignoreClass = 'e2e-ignore') {\n const visualTestingCss = document.createElement('style');\n const visualTestingClass = 'visual-testing-render';\n visualTestingCss.textContent = `\n .${visualTestingClass} .${ignoreClass} {position: relative;}\n\n .${visualTestingClass} .${ignoreClass}:before {\n z-index: 999;\n content: '';\n width: 100%;\n height: 100%;\n background: grey;\n position: absolute;\n left: 0;\n top: 0;\n }`;\n\n document.head.appendChild(visualTestingCss);\n}\n\n/**\n * Determine if the visual testing is enabled\n */\nexport function isVisualTestingEnabled() {\n const visualTestingClass = 'visual-testing-render';\n return document.body.classList.contains(visualTestingClass);\n}\n\n/**\n * Toggle the visual testing view : if it is active, will hide tagged components as grey blocks.\n * @note: this function is evaluated in the context of the page and cannot use external code\n * @param enabled\n */\nexport function toggleVisualTestingRender(enabled: boolean) {\n const visualTestingClass = 'visual-testing-render';\n if (enabled) {\n document.body.classList.add(visualTestingClass);\n } else {\n document.body.classList.remove(visualTestingClass);\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/visual-test/utils.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,WAA0B;IAA1B,4BAAA,EAAA,0BAA0B;IAC7D,IAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,gBAAgB,CAAC,WAAW,GAAG,iBAC1B,kBAAkB,eAAK,WAAW,4CAElC,kBAAkB,eAAK,WAAW,wLASrC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAlBD,oDAkBC;AAED;;GAEG;AACH,SAAgB,sBAAsB;IACpC,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC9D,CAAC;AAHD,wDAGC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,IAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAPD,8DAOC","sourcesContent":["/**\n * Prepare css rule to hide specific blocks\n *\n * Should be called only once during the visual test.\n * @note: this function is evaluated in the context of the page and should not use external variables\n * @param ignoreClass\n */\nexport function prepareVisualTesting(ignoreClass = 'e2e-ignore') {\n const visualTestingCss = document.createElement('style');\n const visualTestingClass = 'visual-testing-render';\n visualTestingCss.textContent = `\n .${visualTestingClass} .${ignoreClass} {position: relative;}\n\n .${visualTestingClass} .${ignoreClass}:before {\n z-index: 999;\n content: '';\n width: 100%;\n height: 100%;\n background: grey;\n position: absolute;\n left: 0;\n top: 0;\n }`;\n\n document.head.appendChild(visualTestingCss);\n}\n\n/**\n * Determine if the visual testing is enabled\n */\nexport function isVisualTestingEnabled() {\n const visualTestingClass = 'visual-testing-render';\n return document.body.classList.contains(visualTestingClass);\n}\n\n/**\n * Toggle the visual testing view : if it is active, will hide tagged components as grey blocks.\n * @note: this function is evaluated in the context of the page and cannot use external code\n * @param enabled\n */\nexport function toggleVisualTestingRender(enabled: boolean) {\n const visualTestingClass = 'visual-testing-render';\n if (enabled) {\n document.body.classList.add(visualTestingClass);\n } else {\n document.body.classList.remove(visualTestingClass);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"visual-test.js","sourceRoot":"","sources":["../../src/visual-test/visual-test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {PNG} from 'pngjs';\nimport * as pixelmatch from 'pixelmatch';\n\nexport {\n prepareVisualTesting,\n toggleVisualTestingRender\n} from './utils';\n\n/** Error types returned by visual testing comparison */\nexport interface VisualTestMessage {\n /** Error message when base image and actual image have different sizes */\n imagesSize: string;\n /** Error message when base screensot not found */\n baseImgNotFound: string;\n /** Error message when the threshold is passed */\n diffMessage: string;\n /** The message in case of success */\n success: string;\n /** The message in case of generate mode run */\n generateMode: string;\n}\n\n/** Error messages in case of visual testing failure */\nexport const visualTestMessages: VisualTestMessage = {\n imagesSize: 'Image sizes do not match for:',\n diffMessage: 'Diff between images is greater than threshold for:',\n baseImgNotFound: 'Base screenshot file not found:',\n success: 'Visual test successful',\n generateMode: 'Run in generate screenshot mode'\n};\n\n/**\n * Object returned by a visual test operation\n */\nexport interface VisualTestResult {\n /** Error object when base image and actual image have different sizes; Contains the screenshot ffile name */\n imagesSize?: {screenshotName: string};\n /** Error object when base screensot not found. Contains the not found path as a string */\n baseScreenshotNotFound?: {baseScreenshotPath: string};\n /** Object containing the actual diff between images as percentage, the threshold and screenshot file name */\n diff?: {actualDiff: number; threshold: number; screenshotName: string};\n /** Run only generation of screenshots */\n generateMode?: boolean;\n}\n\n/**\n * Visual test matcher\n * Based on the VisualTestResult object return by compareScreenshots function, this matcher will compute the error messages\n */\nexport function toBeVisuallySimilar() {\n return {\n compare: (actual: VisualTestResult, _expected: VisualTestResult) => {\n if (actual.generateMode) {\n return {\n pass: true,\n message: visualTestMessages.generateMode\n };\n }\n if (actual.baseScreenshotNotFound) {\n return {\n pass: false,\n message: `${visualTestMessages.baseImgNotFound} ${actual.baseScreenshotNotFound.baseScreenshotPath}`};\n }\n if (actual.imagesSize) {\n return {\n pass: false,\n message: `${visualTestMessages.imagesSize} ${actual.imagesSize.screenshotName}`\n };\n }\n if (actual.diff && actual.diff.actualDiff > actual.diff.threshold) {\n return {\n pass: false,\n message: `${actual.diff.actualDiff} > ${actual.diff.threshold} : ${visualTestMessages.diffMessage} ${actual.diff.screenshotName}`\n };\n }\n return {\n pass: true,\n message: visualTestMessages.success\n };\n }\n };\n}\n\n/**\n * It will create a file for the passed screenshot object.\n * The path of the new file will be calculated using the parameters\n * Ex: ./dist-screenshots\\OWBooking\\windows_chrome_91\\fare-page-after-click-on-continue-0.png\n * distScreenshotsDir/scenarionName/device/filenameWithoutExtension.png\n * @param screenshot The screenshot object captured. Ex: for protractor - browser.takeScreenshot()\n * @param scenarioName E2e Scenario class name\n * @param device Details of the platform on which the test is run. If there are spaces the helper will do the concatenation. Ex: `Windows 10 chrome 89`\n * @param filenameWithoutExtension file name to save the screenshot - .png will be added at the end\n * @param distScreenshotsDir Name of the directory to save the screenshots\n */\nexport function saveScreenshot(screenshot: string, scenarioName: string, device: string, filenameWithoutExtension: string, distScreenshotsDir = 'dist-screenshots') {\n const screenshotsDir = path.resolve(distScreenshotsDir, scenarioName, `${device.replace(/ +/g, '_')}`);\n if (!fs.existsSync(screenshotsDir)) {\n fs.mkdirSync(screenshotsDir, {recursive: true});\n }\n const fullFileName = `${filenameWithoutExtension}.png`;\n const stream = fs.createWriteStream(path.resolve(screenshotsDir, fullFileName));\n stream.write(Buffer.from(screenshot, 'base64'));\n stream.end();\n}\n\n/**\n * Write the 3 images (base/new/diff) on the reports folder\n * The path inside the reports forlder will be calculated using the parameters\n * @param pathToScenarioReport Path where the scenario report is saved inside reports folder\n * @param screenshotsDirName Name of the directory which will contain the 3 images\n * @param diff diff image\n * @param baseImage the base image\n * @param currentImg the actual taken screenshot image\n */\nexport function writeScreenshotsDiff(pathToScenarioReport: string, screenshotsDirName: string, diff: PNG, baseImage: PNG, currentImg: PNG) {\n const destScreenshotsDiffDir = path.join(pathToScenarioReport, 'screenshots-diff', screenshotsDirName);\n if (!fs.existsSync(destScreenshotsDiffDir)) {\n fs.mkdirSync(destScreenshotsDiffDir, { recursive: true });\n }\n\n const diffPath = path.resolve(destScreenshotsDiffDir, 'diff.png');\n const oldPath = path.resolve(destScreenshotsDiffDir, 'old.png');\n const newPath = path.resolve(destScreenshotsDiffDir, 'new.png');\n fs.writeFileSync(diffPath, PNG.sync.write(diff));\n fs.writeFileSync(oldPath, PNG.sync.write(baseImage));\n fs.writeFileSync(newPath, PNG.sync.write(currentImg));\n}\n\n/**\n * Compare images helper function. If the comparison fails the 3 images (base/new/diff) will be written inside the reports folder of the actual scenario\n * @param screenshot Actual captured screenshot object\n * @param baseImagePath The path to the base screenshot\n * @param threshold The diff between base screenshot and the current one should not be bigger than this value.\n * @param pathToScenarioReport Path where the scenario report is saved inside reports folder. Used to compute the path to write diff images in case there is a diff at comparison\n * @returns An object of visual test result type\n */\nexport function compareScreenshot(screenshot: string, baseImagePath: string, threshold: number, pathToScenarioReport: string): VisualTestResult {\n const baseImageExists = fs.existsSync(baseImagePath);\n if (!baseImageExists) {\n return {baseScreenshotNotFound: {baseScreenshotPath: baseImagePath}};\n }\n else {\n const baseImage = PNG.sync.read(fs.readFileSync(baseImagePath));\n const {width, height} = baseImage;\n const diff = new PNG({width, height});\n\n const screenshotBuffer = Buffer.from(screenshot, 'base64');\n const currentImg = PNG.sync.read(screenshotBuffer);\n const diffDirName = path.basename(baseImagePath, '.png');\n let result;\n try {\n result = pixelmatch(baseImage.data, currentImg.data, diff.data, width, height, {threshold: 0.1});\n } catch (err: any) {\n if (err.toString().indexOf('Image sizes do not match.') === -1) {\n throw err;\n }\n writeScreenshotsDiff(pathToScenarioReport, diffDirName, diff, baseImage, currentImg);\n return {imagesSize: {screenshotName: diffDirName}};\n }\n const pr = Math.round(100 * 100 * result / (width * height)) / 100;\n if (pr > threshold) {\n writeScreenshotsDiff(pathToScenarioReport, diffDirName, diff, baseImage, currentImg);\n }\n return {diff: {actualDiff: pr, threshold, screenshotName: diffDirName}};\n }\n}\n\n/**\n * Helper function to perform a visual test operation\n * @param screenshotObj Ex: for protractor browser.takeScreenshot()\n * @param filenameWithoutExtension file name to save the screenshot - .png will be added at the end\n * @param device os followed by browser version - ex: `Windows 10 chrome 89`\n * @param scenarioName E2e Scenario class name\n * @param pathToScenarioReport Path used in compare mode for saving the base,new,diff images in reports in case there is a diff\n * @param threshold The diff between base screenshot and the current one should not be bigger than this value.\n * If the diff is bigger, 3 png files will be created: base screenshot, new screenshot and diff image\n * @param generateMode If true it will generate the screenshot file without screenshots comparison\n * @param baseScreenshotsDirPath The folder path to search base screenshots; used only in compare mode\n */\nexport function o3rVisualTest(\n screenshotObj: string,\n filenameWithoutExtension: string,\n device: string,\n scenarioName: string,\n pathToScenarioReport = 'reports',\n threshold = 0,\n generateMode = false,\n baseScreenshotsDirPath = 'dist-screenshots-base'\n) {\n if (generateMode) {\n saveScreenshot(screenshotObj, scenarioName, device, filenameWithoutExtension);\n return {generateMode: true};\n } else {\n const baseImagePath = path.resolve(baseScreenshotsDirPath, scenarioName, device, `${filenameWithoutExtension}.png`);\n const visualTestResult = compareScreenshot(screenshotObj, baseImagePath, threshold, pathToScenarioReport);\n return visualTestResult;\n }\n}\n"]}
1
+ {"version":3,"file":"visual-test.js","sourceRoot":"","sources":["../../src/visual-test/visual-test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {PNG} from 'pngjs';\nimport * as pixelmatch from 'pixelmatch';\n\nexport {\n prepareVisualTesting,\n toggleVisualTestingRender\n} from './utils';\n\n/** Error types returned by visual testing comparison */\nexport interface VisualTestMessage {\n /** Error message when base image and actual image have different sizes */\n imagesSize: string;\n /** Error message when base screensot not found */\n baseImgNotFound: string;\n /** Error message when the threshold is passed */\n diffMessage: string;\n /** The message in case of success */\n success: string;\n /** The message in case of generate mode run */\n generateMode: string;\n}\n\n/** Error messages in case of visual testing failure */\nexport const visualTestMessages: VisualTestMessage = {\n imagesSize: 'Image sizes do not match for:',\n diffMessage: 'Diff between images is greater than threshold for:',\n baseImgNotFound: 'Base screenshot file not found:',\n success: 'Visual test successful',\n generateMode: 'Run in generate screenshot mode'\n};\n\n/**\n * Object returned by a visual test operation\n */\nexport interface VisualTestResult {\n /** Error object when base image and actual image have different sizes; Contains the screenshot ffile name */\n imagesSize?: {screenshotName: string};\n /** Error object when base screensot not found. Contains the not found path as a string */\n baseScreenshotNotFound?: {baseScreenshotPath: string};\n /** Object containing the actual diff between images as percentage, the threshold and screenshot file name */\n diff?: {actualDiff: number; threshold: number; screenshotName: string};\n /** Run only generation of screenshots */\n generateMode?: boolean;\n}\n\n/**\n * Visual test matcher\n * Based on the VisualTestResult object return by compareScreenshots function, this matcher will compute the error messages\n */\nexport function toBeVisuallySimilar() {\n return {\n compare: (actual: VisualTestResult, _expected: VisualTestResult) => {\n if (actual.generateMode) {\n return {\n pass: true,\n message: visualTestMessages.generateMode\n };\n }\n if (actual.baseScreenshotNotFound) {\n return {\n pass: false,\n message: `${visualTestMessages.baseImgNotFound} ${actual.baseScreenshotNotFound.baseScreenshotPath}`};\n }\n if (actual.imagesSize) {\n return {\n pass: false,\n message: `${visualTestMessages.imagesSize} ${actual.imagesSize.screenshotName}`\n };\n }\n if (actual.diff && actual.diff.actualDiff > actual.diff.threshold) {\n return {\n pass: false,\n message: `${actual.diff.actualDiff} > ${actual.diff.threshold} : ${visualTestMessages.diffMessage} ${actual.diff.screenshotName}`\n };\n }\n return {\n pass: true,\n message: visualTestMessages.success\n };\n }\n };\n}\n\n/**\n * It will create a file for the passed screenshot object.\n * The path of the new file will be calculated using the parameters\n * Ex: ./dist-screenshots\\OWBooking\\windows_chrome_91\\fare-page-after-click-on-continue-0.png\n * distScreenshotsDir/scenarionName/device/filenameWithoutExtension.png\n * @param screenshot The screenshot object captured. Ex: for protractor - browser.takeScreenshot()\n * @param scenarioName E2e Scenario class name\n * @param device Details of the platform on which the test is run. If there are spaces the helper will do the concatenation. Ex: `Windows 10 chrome 89`\n * @param filenameWithoutExtension file name to save the screenshot - .png will be added at the end\n * @param distScreenshotsDir Name of the directory to save the screenshots\n */\nexport function saveScreenshot(screenshot: string, scenarioName: string, device: string, filenameWithoutExtension: string, distScreenshotsDir = 'dist-screenshots') {\n const screenshotsDir = path.resolve(distScreenshotsDir, scenarioName, `${device.replace(/ +/g, '_')}`);\n if (!fs.existsSync(screenshotsDir)) {\n fs.mkdirSync(screenshotsDir, {recursive: true});\n }\n const fullFileName = `${filenameWithoutExtension}.png`;\n const stream = fs.createWriteStream(path.resolve(screenshotsDir, fullFileName));\n stream.write(Buffer.from(screenshot, 'base64'));\n stream.end();\n}\n\n/**\n * Write the 3 images (base/new/diff) on the reports folder\n * The path inside the reports forlder will be calculated using the parameters\n * @param pathToScenarioReport Path where the scenario report is saved inside reports folder\n * @param screenshotsDirName Name of the directory which will contain the 3 images\n * @param diff diff image\n * @param baseImage the base image\n * @param currentImg the actual taken screenshot image\n */\nexport function writeScreenshotsDiff(pathToScenarioReport: string, screenshotsDirName: string, diff: PNG, baseImage: PNG, currentImg: PNG) {\n const destScreenshotsDiffDir = path.join(pathToScenarioReport, 'screenshots-diff', screenshotsDirName);\n if (!fs.existsSync(destScreenshotsDiffDir)) {\n fs.mkdirSync(destScreenshotsDiffDir, { recursive: true });\n }\n\n const diffPath = path.resolve(destScreenshotsDiffDir, 'diff.png');\n const oldPath = path.resolve(destScreenshotsDiffDir, 'old.png');\n const newPath = path.resolve(destScreenshotsDiffDir, 'new.png');\n fs.writeFileSync(diffPath, PNG.sync.write(diff));\n fs.writeFileSync(oldPath, PNG.sync.write(baseImage));\n fs.writeFileSync(newPath, PNG.sync.write(currentImg));\n}\n\n/**\n * Compare images helper function. If the comparison fails the 3 images (base/new/diff) will be written inside the reports folder of the actual scenario\n * @param screenshot Actual captured screenshot object\n * @param baseImagePath The path to the base screenshot\n * @param threshold The diff between base screenshot and the current one should not be bigger than this value.\n * @param pathToScenarioReport Path where the scenario report is saved inside reports folder. Used to compute the path to write diff images in case there is a diff at comparison\n * @returns An object of visual test result type\n */\nexport function compareScreenshot(screenshot: string, baseImagePath: string, threshold: number, pathToScenarioReport: string): VisualTestResult {\n const baseImageExists = fs.existsSync(baseImagePath);\n if (!baseImageExists) {\n return {baseScreenshotNotFound: {baseScreenshotPath: baseImagePath}};\n }\n else {\n const baseImage = PNG.sync.read(fs.readFileSync(baseImagePath));\n const {width, height} = baseImage;\n const diff = new PNG({width, height});\n\n const screenshotBuffer = Buffer.from(screenshot, 'base64');\n const currentImg = PNG.sync.read(screenshotBuffer);\n const diffDirName = path.basename(baseImagePath, '.png');\n let result;\n try {\n result = pixelmatch(baseImage.data, currentImg.data, diff.data, width, height, {threshold: 0.1});\n } catch (err: any) {\n if (err.toString().indexOf('Image sizes do not match.') === -1) {\n throw err;\n }\n writeScreenshotsDiff(pathToScenarioReport, diffDirName, diff, baseImage, currentImg);\n return {imagesSize: {screenshotName: diffDirName}};\n }\n const pr = Math.round(100 * 100 * result / (width * height)) / 100;\n if (pr > threshold) {\n writeScreenshotsDiff(pathToScenarioReport, diffDirName, diff, baseImage, currentImg);\n }\n return {diff: {actualDiff: pr, threshold, screenshotName: diffDirName}};\n }\n}\n\n/**\n * Helper function to perform a visual test operation\n * @param screenshotObj Ex: for protractor browser.takeScreenshot()\n * @param filenameWithoutExtension file name to save the screenshot - .png will be added at the end\n * @param device os followed by browser version - ex: `Windows 10 chrome 89`\n * @param scenarioName E2e Scenario class name\n * @param pathToScenarioReport Path used in compare mode for saving the base,new,diff images in reports in case there is a diff\n * @param threshold The diff between base screenshot and the current one should not be bigger than this value.\n * If the diff is bigger, 3 png files will be created: base screenshot, new screenshot and diff image\n * @param generateMode If true it will generate the screenshot file without screenshots comparison\n * @param baseScreenshotsDirPath The folder path to search base screenshots; used only in compare mode\n */\nexport function o3rVisualTest(\n screenshotObj: string,\n filenameWithoutExtension: string,\n device: string,\n scenarioName: string,\n pathToScenarioReport = 'reports',\n threshold = 0,\n generateMode = false,\n baseScreenshotsDirPath = 'dist-screenshots-base'\n) {\n if (generateMode) {\n saveScreenshot(screenshotObj, scenarioName, device, filenameWithoutExtension);\n return {generateMode: true};\n } else {\n const baseImagePath = path.resolve(baseScreenshotsDirPath, scenarioName, device, `${filenameWithoutExtension}.png`);\n const visualTestResult = compareScreenshot(screenshotObj, baseImagePath, threshold, pathToScenarioReport);\n return visualTestResult;\n }\n}\n"]}