create-wdio 9.27.0 → 9.27.2

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":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,iBAqBlF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAE,QAA2B,mBA+B9H;AAED,eAAO,MAAM,YAAY,GAAmB,KAAK,OAAO,KAAG,OAAO,CAAC,aAAa,CAyF/E,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,qBAAqB,EAAC,MAAM,EAAE,UAAU,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAcrH"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,iBA+BlF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAE,QAA2B,mBA+B9H;AAED,eAAO,MAAM,YAAY,GAAmB,KAAK,OAAO,KAAG,OAAO,CAAC,aAAa,CAyF/E,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,qBAAqB,EAAC,MAAM,EAAE,UAAU,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAcrH"}
@@ -676,7 +676,7 @@ async function formatConfigFilePaths(config) {
676
676
  // package.json
677
677
  var package_default = {
678
678
  name: "create-wdio",
679
- version: "9.26.1",
679
+ version: "9.27.1",
680
680
  description: "Install and setup a WebdriverIO project with all its dependencies in a single run",
681
681
  author: "WebdriverIO Team <mail@webdriver.io>",
682
682
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/create-wdio",
@@ -788,8 +788,7 @@ var SUPPORTED_PACKAGES = {
788
788
  runner: [
789
789
  { name: "E2E Testing - of Web or Mobile Applications", value: "@wdio/local-runner$--$local$--$e2e" },
790
790
  { name: "Component or Unit Testing - in the browser\n > https://webdriver.io/docs/component-testing", value: "@wdio/browser-runner$--$browser$--$component" },
791
- { name: "Desktop Testing - of Electron Applications\n > https://webdriver.io/docs/desktop-testing/electron", value: "@wdio/local-runner$--$local$--$electron" },
792
- { name: "Desktop Testing - of MacOS Applications\n > https://webdriver.io/docs/desktop-testing/macos", value: "@wdio/local-runner$--$local$--$macos" },
791
+ { name: "Desktop Testing - of Electron, Tauri, or macOS Applications\n > https://webdriver.io/docs/desktop-testing", value: "@wdio/local-runner$--$local$--$desktop" },
793
792
  { name: "VS Code Extension Testing\n > https://webdriver.io/docs/vscode-extension-testing", value: "@wdio/local-runner$--$local$--$vscode" },
794
793
  { name: "Roku Testing - of OTT apps running on RokuOS\n > https://webdriver.io/docs/wdio-roku-service", value: "@wdio/local-runner$--$local$--$roku" }
795
794
  ],
@@ -840,7 +839,9 @@ var SUPPORTED_PACKAGES = {
840
839
  { name: "browserstack", value: "@wdio/browserstack-service$--$browserstack" },
841
840
  { name: "lighthouse", value: "@wdio/lighthouse-service$--$lighthouse" },
842
841
  { name: "vscode", value: "wdio-vscode-service$--$vscode" },
843
- { name: "electron", value: "wdio-electron-service$--$electron" },
842
+ { name: "electron", value: "@wdio/electron-service$--$electron" },
843
+ { name: "tauri", value: "@wdio/tauri-service$--$tauri" },
844
+ { name: "tauri-plugin", value: "@wdio/tauri-plugin$--$tauri-plugin" },
844
845
  { name: "appium", value: "@wdio/appium-service$--$appium" },
845
846
  // external
846
847
  { name: "camera", value: "wdio-camera-service$--$camera" },
@@ -910,6 +911,55 @@ Learn more about Serenity/JS:
910
911
  function usesSerenity(answers) {
911
912
  return answers.framework.includes("serenity-js");
912
913
  }
914
+ function buildTauriBanner(driverProvider, useFrontendPlugin) {
915
+ const lines = [
916
+ "",
917
+ "\u{1F980} Tauri requires a couple of Rust-side additions before tests can run:",
918
+ ""
919
+ ];
920
+ if (driverProvider === "Embedded driver via tauri-plugin-wdio-webdriver crate" /* Embedded */) {
921
+ lines.push(
922
+ " 1. Add the embedded WebDriver crate to `src-tauri/Cargo.toml`:",
923
+ "",
924
+ " [dependencies]",
925
+ ' tauri-plugin-wdio-webdriver = "1"',
926
+ "",
927
+ " 2. Register the plugin in `src-tauri/src/lib.rs`:",
928
+ "",
929
+ " tauri::Builder::default()",
930
+ " .plugin(tauri_plugin_wdio_webdriver::init())",
931
+ " // ...",
932
+ ""
933
+ );
934
+ } else if (driverProvider === "Official tauri-driver (cross-platform, Cargo-installed)" /* Official */) {
935
+ lines.push(
936
+ " 1. Install the official tauri-driver via Cargo:",
937
+ "",
938
+ " cargo install tauri-driver --locked",
939
+ "",
940
+ " 2. On Linux, set `WEBKIT_DISABLE_DMABUF_RENDERER=1` in your shell when running tests.",
941
+ ""
942
+ );
943
+ } else if (driverProvider === "CrabNebula tauri-driver (managed cloud / drop-in)" /* CrabNebula */) {
944
+ lines.push(
945
+ " 1. Follow the CrabNebula tauri-driver setup guide:",
946
+ " \u{1F517} https://crabnebula.dev/docs/tauri-driver",
947
+ ""
948
+ );
949
+ }
950
+ if (useFrontendPlugin) {
951
+ lines.push(
952
+ " Frontend plugin (@wdio/tauri-plugin) was added to your npm dependencies.",
953
+ " See https://webdriver.io/docs/desktop-testing/tauri/plugin-setup for wiring instructions.",
954
+ ""
955
+ );
956
+ }
957
+ lines.push(
958
+ "Full Tauri setup docs:",
959
+ " \u{1F517} https://webdriver.io/docs/desktop-testing/tauri"
960
+ );
961
+ return lines.join("\n");
962
+ }
913
963
  var ProtocolOptions = /* @__PURE__ */ ((ProtocolOptions2) => {
914
964
  ProtocolOptions2["HTTPS"] = "https";
915
965
  ProtocolOptions2["HTTP"] = "http";
@@ -935,6 +985,18 @@ var ElectronBuildToolChoice = /* @__PURE__ */ ((ElectronBuildToolChoice2) => {
935
985
  ElectronBuildToolChoice2["SomethingElse"] = "Something else";
936
986
  return ElectronBuildToolChoice2;
937
987
  })(ElectronBuildToolChoice || {});
988
+ var DesktopFrameworkChoice = /* @__PURE__ */ ((DesktopFrameworkChoice2) => {
989
+ DesktopFrameworkChoice2["Electron"] = "Electron (https://www.electronjs.org/)";
990
+ DesktopFrameworkChoice2["Tauri"] = "Tauri (https://tauri.app/)";
991
+ DesktopFrameworkChoice2["MacOS"] = "Native macOS app";
992
+ return DesktopFrameworkChoice2;
993
+ })(DesktopFrameworkChoice || {});
994
+ var TauriDriverProviderChoice = /* @__PURE__ */ ((TauriDriverProviderChoice2) => {
995
+ TauriDriverProviderChoice2["Official"] = "Official tauri-driver (cross-platform, Cargo-installed)";
996
+ TauriDriverProviderChoice2["CrabNebula"] = "CrabNebula tauri-driver (managed cloud / drop-in)";
997
+ TauriDriverProviderChoice2["Embedded"] = "Embedded driver via tauri-plugin-wdio-webdriver crate";
998
+ return TauriDriverProviderChoice2;
999
+ })(TauriDriverProviderChoice || {});
938
1000
  var SUPPORTED_BROWSER_RUNNER_PRESETS = [
939
1001
  { name: "Lit (https://lit.dev/)", value: "$--$" },
940
1002
  { name: "Vue.js (https://vuejs.org/)", value: "@vitejs/plugin-vue$--$vue" },
@@ -951,6 +1013,21 @@ function isBrowserRunner(answers) {
951
1013
  function getTestingPurpose(answers) {
952
1014
  return convertPackageHashToObject(answers.runner).purpose;
953
1015
  }
1016
+ function getResolvedPurpose(answers) {
1017
+ const raw = getTestingPurpose(answers);
1018
+ if (raw !== "desktop") {
1019
+ return raw;
1020
+ }
1021
+ switch (answers.desktopFramework) {
1022
+ case "Tauri (https://tauri.app/)" /* Tauri */:
1023
+ return "tauri";
1024
+ case "Native macOS app" /* MacOS */:
1025
+ return "macos";
1026
+ case "Electron (https://www.electronjs.org/)" /* Electron */:
1027
+ default:
1028
+ return "electron";
1029
+ }
1030
+ }
954
1031
  var TESTING_LIBRARY_PACKAGES = {
955
1032
  react: "@testing-library/react",
956
1033
  preact: "@testing-library/preact",
@@ -1013,6 +1090,15 @@ var QUESTIONNAIRE = [{
1013
1090
  */
1014
1091
  answers.preset && TESTING_LIBRARY_PACKAGES[convertPackageHashToObject(answers.preset).short]
1015
1092
  )
1093
+ }, {
1094
+ type: "list",
1095
+ name: "desktopFramework",
1096
+ message: "What type of desktop application are you testing?",
1097
+ choices: Object.values(DesktopFrameworkChoice),
1098
+ when: (
1099
+ /* istanbul ignore next */
1100
+ (answers) => getTestingPurpose(answers) === "desktop"
1101
+ )
1016
1102
  }, {
1017
1103
  type: "list",
1018
1104
  name: "electronBuildTool",
@@ -1020,7 +1106,7 @@ var QUESTIONNAIRE = [{
1020
1106
  choices: Object.values(ElectronBuildToolChoice),
1021
1107
  when: (
1022
1108
  /* instanbul ignore next */
1023
- (answers) => getTestingPurpose(answers) === "electron"
1109
+ (answers) => getResolvedPurpose(answers) === "electron"
1024
1110
  )
1025
1111
  }, {
1026
1112
  type: "input",
@@ -1028,7 +1114,33 @@ var QUESTIONNAIRE = [{
1028
1114
  message: "What is the path to the binary of your built Electron app?",
1029
1115
  when: (
1030
1116
  /* istanbul ignore next */
1031
- (answers) => getTestingPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
1117
+ (answers) => getResolvedPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
1118
+ )
1119
+ }, {
1120
+ type: "list",
1121
+ name: "tauriDriverProvider",
1122
+ message: "Which WebDriver provider would you like to use for Tauri?",
1123
+ choices: Object.values(TauriDriverProviderChoice),
1124
+ when: (
1125
+ /* istanbul ignore next */
1126
+ (answers) => getResolvedPurpose(answers) === "tauri"
1127
+ )
1128
+ }, {
1129
+ type: "confirm",
1130
+ name: "tauriUseFrontendPlugin",
1131
+ message: "Install @wdio/tauri-plugin for richer in-webview integration (browser.tauri.execute, mocking)?",
1132
+ default: true,
1133
+ when: (
1134
+ /* istanbul ignore next */
1135
+ (answers) => getResolvedPurpose(answers) === "tauri"
1136
+ )
1137
+ }, {
1138
+ type: "input",
1139
+ name: "tauriAppBinaryPath",
1140
+ message: "Path to your built Tauri binary (leave blank to use the default `cargo tauri build` output)?",
1141
+ when: (
1142
+ /* istanbul ignore next */
1143
+ (answers) => getResolvedPurpose(answers) === "tauri"
1032
1144
  )
1033
1145
  }, {
1034
1146
  type: "list",
@@ -1230,7 +1342,7 @@ var QUESTIONNAIRE = [{
1230
1342
  if (isBrowserRunner(answers)) {
1231
1343
  return SUPPORTED_PACKAGES.framework.slice(0, 1);
1232
1344
  }
1233
- if (getTestingPurpose(answers) === "electron") {
1345
+ if (["electron", "tauri"].includes(getResolvedPurpose(answers))) {
1234
1346
  return SUPPORTED_PACKAGES.framework.filter(
1235
1347
  ({ value }) => !value.startsWith("@serenity-js")
1236
1348
  );
@@ -1263,7 +1375,7 @@ var QUESTIONNAIRE = [{
1263
1375
  when: (
1264
1376
  /* istanbul ignore next */
1265
1377
  (answers) => {
1266
- if (["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && answers.framework.includes("cucumber")) {
1378
+ if (["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && answers.framework.includes("cucumber")) {
1267
1379
  return false;
1268
1380
  }
1269
1381
  return true;
@@ -1316,7 +1428,7 @@ var QUESTIONNAIRE = [{
1316
1428
  * and also not needed when running VS Code tests since the service comes with
1317
1429
  * its own page object implementation, nor when running Electron or MacOS tests
1318
1430
  */
1319
- !["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && /**
1431
+ !["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && /**
1320
1432
  * Serenity/JS generates Lean Page Objects by default, so there's no need to ask about it
1321
1433
  * See https://serenity-js.org/handbook/web-testing/page-objects-pattern/
1322
1434
  */
@@ -1364,7 +1476,7 @@ var QUESTIONNAIRE = [{
1364
1476
  }, {
1365
1477
  type: "confirm",
1366
1478
  name: "includeVisualTesting",
1367
- message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing!",
1479
+ message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing",
1368
1480
  default: false,
1369
1481
  when: (
1370
1482
  /* istanbul ignore next */
@@ -1386,16 +1498,22 @@ var QUESTIONNAIRE = [{
1386
1498
  if (answers.e2eEnvironment === "mobile") {
1387
1499
  services.push("appium");
1388
1500
  }
1389
- if (getTestingPurpose(answers) === "e2e" && isNuxtProject) {
1501
+ if (getResolvedPurpose(answers) === "e2e" && isNuxtProject) {
1390
1502
  services.push("nuxt");
1391
1503
  }
1392
- if (getTestingPurpose(answers) === "vscode") {
1504
+ if (getResolvedPurpose(answers) === "vscode") {
1393
1505
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "vscode")];
1394
- } else if (getTestingPurpose(answers) === "electron") {
1506
+ } else if (getResolvedPurpose(answers) === "electron") {
1395
1507
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "electron")];
1396
- } else if (getTestingPurpose(answers) === "macos") {
1508
+ } else if (getResolvedPurpose(answers) === "tauri") {
1509
+ const tauriEntries = [SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri")];
1510
+ if (answers.tauriUseFrontendPlugin) {
1511
+ tauriEntries.push(SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri-plugin"));
1512
+ }
1513
+ return tauriEntries;
1514
+ } else if (getResolvedPurpose(answers) === "macos") {
1397
1515
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "appium")];
1398
- } else if (getTestingPurpose(answers) === "roku") {
1516
+ } else if (getResolvedPurpose(answers) === "roku") {
1399
1517
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "roku")];
1400
1518
  }
1401
1519
  return prioServiceOrderFor(services);
@@ -1407,14 +1525,19 @@ var QUESTIONNAIRE = [{
1407
1525
  } else if (answers.backend === "In the cloud using Sauce Labs" /* Saucelabs */) {
1408
1526
  defaultServices.push("sauce");
1409
1527
  }
1410
- if (answers.e2eEnvironment === "mobile" || getTestingPurpose(answers) === "macos") {
1528
+ if (answers.e2eEnvironment === "mobile" || getResolvedPurpose(answers) === "macos") {
1411
1529
  defaultServices.push("appium");
1412
1530
  }
1413
- if (getTestingPurpose(answers) === "vscode") {
1531
+ if (getResolvedPurpose(answers) === "vscode") {
1414
1532
  defaultServices.push("vscode");
1415
- } else if (getTestingPurpose(answers) === "electron") {
1533
+ } else if (getResolvedPurpose(answers) === "electron") {
1416
1534
  defaultServices.push("electron");
1417
- } else if (getTestingPurpose(answers) === "roku") {
1535
+ } else if (getResolvedPurpose(answers) === "tauri") {
1536
+ defaultServices.push("tauri");
1537
+ if (answers.tauriUseFrontendPlugin) {
1538
+ defaultServices.push("tauri-plugin");
1539
+ }
1540
+ } else if (getResolvedPurpose(answers) === "roku") {
1418
1541
  defaultServices.push("roku");
1419
1542
  }
1420
1543
  if (isNuxtProject) {
@@ -1459,7 +1582,6 @@ var QUESTIONNAIRE = [{
1459
1582
  default: true
1460
1583
  }];
1461
1584
  var COMMUNITY_PACKAGES_WITH_TS_SUPPORT = [
1462
- "wdio-electron-service",
1463
1585
  "wdio-vscode-service",
1464
1586
  "wdio-nuxt-service",
1465
1587
  "wdio-vite-service",
@@ -1483,11 +1605,21 @@ async function runConfigCommand(parsedAnswers, npmTag) {
1483
1605
  await npmInstall(parsedAnswers, npmTag);
1484
1606
  await createWDIOConfig(parsedAnswers);
1485
1607
  await createWDIOScript(parsedAnswers);
1608
+ const extraInfoParts = [];
1609
+ if (parsedAnswers.serenityAdapter) {
1610
+ extraInfoParts.push(CONFIG_HELPER_SERENITY_BANNER);
1611
+ }
1612
+ if (parsedAnswers.purpose === "tauri") {
1613
+ extraInfoParts.push(buildTauriBanner(
1614
+ parsedAnswers.rawAnswers.tauriDriverProvider,
1615
+ parsedAnswers.rawAnswers.tauriUseFrontendPlugin
1616
+ ));
1617
+ }
1486
1618
  console.log(
1487
1619
  configHelperSuccessMessage({
1488
1620
  projectRootDir: parsedAnswers.projectRootDir,
1489
1621
  runScript: parsedAnswers.serenityAdapter ? "serenity" : "wdio",
1490
- extraInfo: parsedAnswers.serenityAdapter ? CONFIG_HELPER_SERENITY_BANNER : ""
1622
+ extraInfo: extraInfoParts.join("\n")
1491
1623
  })
1492
1624
  );
1493
1625
  await runAppiumInstaller(parsedAnswers);
@@ -1554,7 +1686,7 @@ var parseAnswers = async function(yes) {
1554
1686
  runner: runnerPackage.short,
1555
1687
  preset: presetPackage.short,
1556
1688
  framework: frameworkPackage.short,
1557
- purpose: runnerPackage.purpose,
1689
+ purpose: getResolvedPurpose(answers),
1558
1690
  serenityAdapter: frameworkPackage.package === "@serenity-js/webdriverio" && frameworkPackage.purpose,
1559
1691
  reporters: reporterPackages.map(({ short }) => short),
1560
1692
  plugins: pluginPackages.map(({ short }) => short),
@@ -55,6 +55,11 @@ export declare const isNuxtProject: boolean;
55
55
  export declare const SUPPORTED_CONFIG_FILE_EXTENSION: string[];
56
56
  export declare const CONFIG_HELPER_SERENITY_BANNER = "\nLearn more about Serenity/JS:\n \uD83D\uDD17 https://serenity-js.org/\n \uD83D\uDD17 https://serenity-js.org/handbook/test-runners/webdriverio/\n";
57
57
  export declare function usesSerenity(answers: Questionnair): boolean;
58
+ /**
59
+ * Build the post-install instructions for Tauri users. The npm side is auto-installed,
60
+ * but the Rust side (Cargo.toml + plugin registration) needs manual edits.
61
+ */
62
+ export declare function buildTauriBanner(driverProvider: TauriDriverProviderChoice | undefined, useFrontendPlugin: boolean | undefined): string;
58
63
  declare enum ProtocolOptions {
59
64
  HTTPS = "https",
60
65
  HTTP = "http"
@@ -76,6 +81,16 @@ export declare enum ElectronBuildToolChoice {
76
81
  ElectronBuilder = "electron-builder (https://www.electron.build/)",
77
82
  SomethingElse = "Something else"
78
83
  }
84
+ export declare enum DesktopFrameworkChoice {
85
+ Electron = "Electron (https://www.electronjs.org/)",
86
+ Tauri = "Tauri (https://tauri.app/)",
87
+ MacOS = "Native macOS app"
88
+ }
89
+ export declare enum TauriDriverProviderChoice {
90
+ Official = "Official tauri-driver (cross-platform, Cargo-installed)",
91
+ CrabNebula = "CrabNebula tauri-driver (managed cloud / drop-in)",
92
+ Embedded = "Embedded driver via tauri-plugin-wdio-webdriver crate"
93
+ }
79
94
  export declare const SUPPORTED_BROWSER_RUNNER_PRESETS: ({
80
95
  name: string;
81
96
  value: string;
@@ -84,6 +99,7 @@ export declare const SUPPORTED_BROWSER_RUNNER_PRESETS: ({
84
99
  value: null;
85
100
  })[];
86
101
  declare function isBrowserRunner(answers: Questionnair): boolean;
102
+ export declare function getResolvedPurpose(answers: Questionnair): "e2e" | "vscode" | "electron" | "tauri" | "roku" | "component" | "macos";
87
103
  export declare const TESTING_LIBRARY_PACKAGES: Record<string, string>;
88
104
  export declare const E2E_ENVIRONMENTS: {
89
105
  name: string;
@@ -132,6 +148,13 @@ export declare const QUESTIONNAIRE: ({
132
148
  default: boolean;
133
149
  when: (answers: Questionnair) => string | false | undefined;
134
150
  choices?: undefined;
151
+ } | {
152
+ type: string;
153
+ name: string;
154
+ message: string;
155
+ choices: DesktopFrameworkChoice[];
156
+ when: (answers: Questionnair) => boolean;
157
+ default?: undefined;
135
158
  } | {
136
159
  type: string;
137
160
  name: string;
@@ -139,6 +162,20 @@ export declare const QUESTIONNAIRE: ({
139
162
  choices: ElectronBuildToolChoice[];
140
163
  when: (answers: Questionnair) => boolean;
141
164
  default?: undefined;
165
+ } | {
166
+ type: string;
167
+ name: string;
168
+ message: string;
169
+ choices: TauriDriverProviderChoice[];
170
+ when: (answers: Questionnair) => boolean;
171
+ default?: undefined;
172
+ } | {
173
+ type: string;
174
+ name: string;
175
+ message: string;
176
+ default: boolean;
177
+ when: (answers: Questionnair) => boolean;
178
+ choices?: undefined;
142
179
  } | {
143
180
  type: string;
144
181
  name: string;
@@ -184,13 +221,6 @@ export declare const QUESTIONNAIRE: ({
184
221
  choices: RegionOptions[];
185
222
  when: (answers: Questionnair) => boolean;
186
223
  default?: undefined;
187
- } | {
188
- type: string;
189
- name: string;
190
- message: string;
191
- default: boolean;
192
- when: (answers: Questionnair) => boolean;
193
- choices?: undefined;
194
224
  } | {
195
225
  type: string;
196
226
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
package/build/index.js CHANGED
@@ -24,7 +24,7 @@ import spawn from "cross-spawn";
24
24
  // package.json
25
25
  var package_default = {
26
26
  name: "create-wdio",
27
- version: "9.26.1",
27
+ version: "9.27.1",
28
28
  description: "Install and setup a WebdriverIO project with all its dependencies in a single run",
29
29
  author: "WebdriverIO Team <mail@webdriver.io>",
30
30
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/create-wdio",
@@ -191,8 +191,7 @@ var SUPPORTED_PACKAGES = {
191
191
  runner: [
192
192
  { name: "E2E Testing - of Web or Mobile Applications", value: "@wdio/local-runner$--$local$--$e2e" },
193
193
  { name: "Component or Unit Testing - in the browser\n > https://webdriver.io/docs/component-testing", value: "@wdio/browser-runner$--$browser$--$component" },
194
- { name: "Desktop Testing - of Electron Applications\n > https://webdriver.io/docs/desktop-testing/electron", value: "@wdio/local-runner$--$local$--$electron" },
195
- { name: "Desktop Testing - of MacOS Applications\n > https://webdriver.io/docs/desktop-testing/macos", value: "@wdio/local-runner$--$local$--$macos" },
194
+ { name: "Desktop Testing - of Electron, Tauri, or macOS Applications\n > https://webdriver.io/docs/desktop-testing", value: "@wdio/local-runner$--$local$--$desktop" },
196
195
  { name: "VS Code Extension Testing\n > https://webdriver.io/docs/vscode-extension-testing", value: "@wdio/local-runner$--$local$--$vscode" },
197
196
  { name: "Roku Testing - of OTT apps running on RokuOS\n > https://webdriver.io/docs/wdio-roku-service", value: "@wdio/local-runner$--$local$--$roku" }
198
197
  ],
@@ -243,7 +242,9 @@ var SUPPORTED_PACKAGES = {
243
242
  { name: "browserstack", value: "@wdio/browserstack-service$--$browserstack" },
244
243
  { name: "lighthouse", value: "@wdio/lighthouse-service$--$lighthouse" },
245
244
  { name: "vscode", value: "wdio-vscode-service$--$vscode" },
246
- { name: "electron", value: "wdio-electron-service$--$electron" },
245
+ { name: "electron", value: "@wdio/electron-service$--$electron" },
246
+ { name: "tauri", value: "@wdio/tauri-service$--$tauri" },
247
+ { name: "tauri-plugin", value: "@wdio/tauri-plugin$--$tauri-plugin" },
247
248
  { name: "appium", value: "@wdio/appium-service$--$appium" },
248
249
  // external
249
250
  { name: "camera", value: "wdio-camera-service$--$camera" },
@@ -319,6 +320,18 @@ var ElectronBuildToolChoice = /* @__PURE__ */ ((ElectronBuildToolChoice2) => {
319
320
  ElectronBuildToolChoice2["SomethingElse"] = "Something else";
320
321
  return ElectronBuildToolChoice2;
321
322
  })(ElectronBuildToolChoice || {});
323
+ var DesktopFrameworkChoice = /* @__PURE__ */ ((DesktopFrameworkChoice2) => {
324
+ DesktopFrameworkChoice2["Electron"] = "Electron (https://www.electronjs.org/)";
325
+ DesktopFrameworkChoice2["Tauri"] = "Tauri (https://tauri.app/)";
326
+ DesktopFrameworkChoice2["MacOS"] = "Native macOS app";
327
+ return DesktopFrameworkChoice2;
328
+ })(DesktopFrameworkChoice || {});
329
+ var TauriDriverProviderChoice = /* @__PURE__ */ ((TauriDriverProviderChoice2) => {
330
+ TauriDriverProviderChoice2["Official"] = "Official tauri-driver (cross-platform, Cargo-installed)";
331
+ TauriDriverProviderChoice2["CrabNebula"] = "CrabNebula tauri-driver (managed cloud / drop-in)";
332
+ TauriDriverProviderChoice2["Embedded"] = "Embedded driver via tauri-plugin-wdio-webdriver crate";
333
+ return TauriDriverProviderChoice2;
334
+ })(TauriDriverProviderChoice || {});
322
335
  var SUPPORTED_BROWSER_RUNNER_PRESETS = [
323
336
  { name: "Lit (https://lit.dev/)", value: "$--$" },
324
337
  { name: "Vue.js (https://vuejs.org/)", value: "@vitejs/plugin-vue$--$vue" },
@@ -335,6 +348,21 @@ function isBrowserRunner(answers) {
335
348
  function getTestingPurpose(answers) {
336
349
  return convertPackageHashToObject(answers.runner).purpose;
337
350
  }
351
+ function getResolvedPurpose(answers) {
352
+ const raw = getTestingPurpose(answers);
353
+ if (raw !== "desktop") {
354
+ return raw;
355
+ }
356
+ switch (answers.desktopFramework) {
357
+ case "Tauri (https://tauri.app/)" /* Tauri */:
358
+ return "tauri";
359
+ case "Native macOS app" /* MacOS */:
360
+ return "macos";
361
+ case "Electron (https://www.electronjs.org/)" /* Electron */:
362
+ default:
363
+ return "electron";
364
+ }
365
+ }
338
366
  var TESTING_LIBRARY_PACKAGES = {
339
367
  react: "@testing-library/react",
340
368
  preact: "@testing-library/preact",
@@ -397,6 +425,15 @@ var QUESTIONNAIRE = [{
397
425
  */
398
426
  answers.preset && TESTING_LIBRARY_PACKAGES[convertPackageHashToObject(answers.preset).short]
399
427
  )
428
+ }, {
429
+ type: "list",
430
+ name: "desktopFramework",
431
+ message: "What type of desktop application are you testing?",
432
+ choices: Object.values(DesktopFrameworkChoice),
433
+ when: (
434
+ /* istanbul ignore next */
435
+ (answers) => getTestingPurpose(answers) === "desktop"
436
+ )
400
437
  }, {
401
438
  type: "list",
402
439
  name: "electronBuildTool",
@@ -404,7 +441,7 @@ var QUESTIONNAIRE = [{
404
441
  choices: Object.values(ElectronBuildToolChoice),
405
442
  when: (
406
443
  /* instanbul ignore next */
407
- (answers) => getTestingPurpose(answers) === "electron"
444
+ (answers) => getResolvedPurpose(answers) === "electron"
408
445
  )
409
446
  }, {
410
447
  type: "input",
@@ -412,7 +449,33 @@ var QUESTIONNAIRE = [{
412
449
  message: "What is the path to the binary of your built Electron app?",
413
450
  when: (
414
451
  /* istanbul ignore next */
415
- (answers) => getTestingPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
452
+ (answers) => getResolvedPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
453
+ )
454
+ }, {
455
+ type: "list",
456
+ name: "tauriDriverProvider",
457
+ message: "Which WebDriver provider would you like to use for Tauri?",
458
+ choices: Object.values(TauriDriverProviderChoice),
459
+ when: (
460
+ /* istanbul ignore next */
461
+ (answers) => getResolvedPurpose(answers) === "tauri"
462
+ )
463
+ }, {
464
+ type: "confirm",
465
+ name: "tauriUseFrontendPlugin",
466
+ message: "Install @wdio/tauri-plugin for richer in-webview integration (browser.tauri.execute, mocking)?",
467
+ default: true,
468
+ when: (
469
+ /* istanbul ignore next */
470
+ (answers) => getResolvedPurpose(answers) === "tauri"
471
+ )
472
+ }, {
473
+ type: "input",
474
+ name: "tauriAppBinaryPath",
475
+ message: "Path to your built Tauri binary (leave blank to use the default `cargo tauri build` output)?",
476
+ when: (
477
+ /* istanbul ignore next */
478
+ (answers) => getResolvedPurpose(answers) === "tauri"
416
479
  )
417
480
  }, {
418
481
  type: "list",
@@ -614,7 +677,7 @@ var QUESTIONNAIRE = [{
614
677
  if (isBrowserRunner(answers)) {
615
678
  return SUPPORTED_PACKAGES.framework.slice(0, 1);
616
679
  }
617
- if (getTestingPurpose(answers) === "electron") {
680
+ if (["electron", "tauri"].includes(getResolvedPurpose(answers))) {
618
681
  return SUPPORTED_PACKAGES.framework.filter(
619
682
  ({ value }) => !value.startsWith("@serenity-js")
620
683
  );
@@ -647,7 +710,7 @@ var QUESTIONNAIRE = [{
647
710
  when: (
648
711
  /* istanbul ignore next */
649
712
  (answers) => {
650
- if (["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && answers.framework.includes("cucumber")) {
713
+ if (["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && answers.framework.includes("cucumber")) {
651
714
  return false;
652
715
  }
653
716
  return true;
@@ -700,7 +763,7 @@ var QUESTIONNAIRE = [{
700
763
  * and also not needed when running VS Code tests since the service comes with
701
764
  * its own page object implementation, nor when running Electron or MacOS tests
702
765
  */
703
- !["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && /**
766
+ !["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && /**
704
767
  * Serenity/JS generates Lean Page Objects by default, so there's no need to ask about it
705
768
  * See https://serenity-js.org/handbook/web-testing/page-objects-pattern/
706
769
  */
@@ -748,7 +811,7 @@ var QUESTIONNAIRE = [{
748
811
  }, {
749
812
  type: "confirm",
750
813
  name: "includeVisualTesting",
751
- message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing!",
814
+ message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing",
752
815
  default: false,
753
816
  when: (
754
817
  /* istanbul ignore next */
@@ -770,16 +833,22 @@ var QUESTIONNAIRE = [{
770
833
  if (answers.e2eEnvironment === "mobile") {
771
834
  services.push("appium");
772
835
  }
773
- if (getTestingPurpose(answers) === "e2e" && isNuxtProject) {
836
+ if (getResolvedPurpose(answers) === "e2e" && isNuxtProject) {
774
837
  services.push("nuxt");
775
838
  }
776
- if (getTestingPurpose(answers) === "vscode") {
839
+ if (getResolvedPurpose(answers) === "vscode") {
777
840
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "vscode")];
778
- } else if (getTestingPurpose(answers) === "electron") {
841
+ } else if (getResolvedPurpose(answers) === "electron") {
779
842
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "electron")];
780
- } else if (getTestingPurpose(answers) === "macos") {
843
+ } else if (getResolvedPurpose(answers) === "tauri") {
844
+ const tauriEntries = [SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri")];
845
+ if (answers.tauriUseFrontendPlugin) {
846
+ tauriEntries.push(SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri-plugin"));
847
+ }
848
+ return tauriEntries;
849
+ } else if (getResolvedPurpose(answers) === "macos") {
781
850
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "appium")];
782
- } else if (getTestingPurpose(answers) === "roku") {
851
+ } else if (getResolvedPurpose(answers) === "roku") {
783
852
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "roku")];
784
853
  }
785
854
  return prioServiceOrderFor(services);
@@ -791,14 +860,19 @@ var QUESTIONNAIRE = [{
791
860
  } else if (answers.backend === "In the cloud using Sauce Labs" /* Saucelabs */) {
792
861
  defaultServices.push("sauce");
793
862
  }
794
- if (answers.e2eEnvironment === "mobile" || getTestingPurpose(answers) === "macos") {
863
+ if (answers.e2eEnvironment === "mobile" || getResolvedPurpose(answers) === "macos") {
795
864
  defaultServices.push("appium");
796
865
  }
797
- if (getTestingPurpose(answers) === "vscode") {
866
+ if (getResolvedPurpose(answers) === "vscode") {
798
867
  defaultServices.push("vscode");
799
- } else if (getTestingPurpose(answers) === "electron") {
868
+ } else if (getResolvedPurpose(answers) === "electron") {
800
869
  defaultServices.push("electron");
801
- } else if (getTestingPurpose(answers) === "roku") {
870
+ } else if (getResolvedPurpose(answers) === "tauri") {
871
+ defaultServices.push("tauri");
872
+ if (answers.tauriUseFrontendPlugin) {
873
+ defaultServices.push("tauri-plugin");
874
+ }
875
+ } else if (getResolvedPurpose(answers) === "roku") {
802
876
  defaultServices.push("roku");
803
877
  }
804
878
  if (isNuxtProject) {
@@ -85,7 +85,7 @@ import spawn from "cross-spawn";
85
85
  // package.json
86
86
  var package_default = {
87
87
  name: "create-wdio",
88
- version: "9.26.1",
88
+ version: "9.27.1",
89
89
  description: "Install and setup a WebdriverIO project with all its dependencies in a single run",
90
90
  author: "WebdriverIO Team <mail@webdriver.io>",
91
91
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/create-wdio",
@@ -197,8 +197,7 @@ var SUPPORTED_PACKAGES = {
197
197
  runner: [
198
198
  { name: "E2E Testing - of Web or Mobile Applications", value: "@wdio/local-runner$--$local$--$e2e" },
199
199
  { name: "Component or Unit Testing - in the browser\n > https://webdriver.io/docs/component-testing", value: "@wdio/browser-runner$--$browser$--$component" },
200
- { name: "Desktop Testing - of Electron Applications\n > https://webdriver.io/docs/desktop-testing/electron", value: "@wdio/local-runner$--$local$--$electron" },
201
- { name: "Desktop Testing - of MacOS Applications\n > https://webdriver.io/docs/desktop-testing/macos", value: "@wdio/local-runner$--$local$--$macos" },
200
+ { name: "Desktop Testing - of Electron, Tauri, or macOS Applications\n > https://webdriver.io/docs/desktop-testing", value: "@wdio/local-runner$--$local$--$desktop" },
202
201
  { name: "VS Code Extension Testing\n > https://webdriver.io/docs/vscode-extension-testing", value: "@wdio/local-runner$--$local$--$vscode" },
203
202
  { name: "Roku Testing - of OTT apps running on RokuOS\n > https://webdriver.io/docs/wdio-roku-service", value: "@wdio/local-runner$--$local$--$roku" }
204
203
  ],
@@ -249,7 +248,9 @@ var SUPPORTED_PACKAGES = {
249
248
  { name: "browserstack", value: "@wdio/browserstack-service$--$browserstack" },
250
249
  { name: "lighthouse", value: "@wdio/lighthouse-service$--$lighthouse" },
251
250
  { name: "vscode", value: "wdio-vscode-service$--$vscode" },
252
- { name: "electron", value: "wdio-electron-service$--$electron" },
251
+ { name: "electron", value: "@wdio/electron-service$--$electron" },
252
+ { name: "tauri", value: "@wdio/tauri-service$--$tauri" },
253
+ { name: "tauri-plugin", value: "@wdio/tauri-plugin$--$tauri-plugin" },
253
254
  { name: "appium", value: "@wdio/appium-service$--$appium" },
254
255
  // external
255
256
  { name: "camera", value: "wdio-camera-service$--$camera" },
@@ -319,6 +320,55 @@ Learn more about Serenity/JS:
319
320
  function usesSerenity(answers) {
320
321
  return answers.framework.includes("serenity-js");
321
322
  }
323
+ function buildTauriBanner(driverProvider, useFrontendPlugin) {
324
+ const lines = [
325
+ "",
326
+ "\u{1F980} Tauri requires a couple of Rust-side additions before tests can run:",
327
+ ""
328
+ ];
329
+ if (driverProvider === "Embedded driver via tauri-plugin-wdio-webdriver crate" /* Embedded */) {
330
+ lines.push(
331
+ " 1. Add the embedded WebDriver crate to `src-tauri/Cargo.toml`:",
332
+ "",
333
+ " [dependencies]",
334
+ ' tauri-plugin-wdio-webdriver = "1"',
335
+ "",
336
+ " 2. Register the plugin in `src-tauri/src/lib.rs`:",
337
+ "",
338
+ " tauri::Builder::default()",
339
+ " .plugin(tauri_plugin_wdio_webdriver::init())",
340
+ " // ...",
341
+ ""
342
+ );
343
+ } else if (driverProvider === "Official tauri-driver (cross-platform, Cargo-installed)" /* Official */) {
344
+ lines.push(
345
+ " 1. Install the official tauri-driver via Cargo:",
346
+ "",
347
+ " cargo install tauri-driver --locked",
348
+ "",
349
+ " 2. On Linux, set `WEBKIT_DISABLE_DMABUF_RENDERER=1` in your shell when running tests.",
350
+ ""
351
+ );
352
+ } else if (driverProvider === "CrabNebula tauri-driver (managed cloud / drop-in)" /* CrabNebula */) {
353
+ lines.push(
354
+ " 1. Follow the CrabNebula tauri-driver setup guide:",
355
+ " \u{1F517} https://crabnebula.dev/docs/tauri-driver",
356
+ ""
357
+ );
358
+ }
359
+ if (useFrontendPlugin) {
360
+ lines.push(
361
+ " Frontend plugin (@wdio/tauri-plugin) was added to your npm dependencies.",
362
+ " See https://webdriver.io/docs/desktop-testing/tauri/plugin-setup for wiring instructions.",
363
+ ""
364
+ );
365
+ }
366
+ lines.push(
367
+ "Full Tauri setup docs:",
368
+ " \u{1F517} https://webdriver.io/docs/desktop-testing/tauri"
369
+ );
370
+ return lines.join("\n");
371
+ }
322
372
  var ProtocolOptions = /* @__PURE__ */ ((ProtocolOptions2) => {
323
373
  ProtocolOptions2["HTTPS"] = "https";
324
374
  ProtocolOptions2["HTTP"] = "http";
@@ -344,6 +394,18 @@ var ElectronBuildToolChoice = /* @__PURE__ */ ((ElectronBuildToolChoice2) => {
344
394
  ElectronBuildToolChoice2["SomethingElse"] = "Something else";
345
395
  return ElectronBuildToolChoice2;
346
396
  })(ElectronBuildToolChoice || {});
397
+ var DesktopFrameworkChoice = /* @__PURE__ */ ((DesktopFrameworkChoice2) => {
398
+ DesktopFrameworkChoice2["Electron"] = "Electron (https://www.electronjs.org/)";
399
+ DesktopFrameworkChoice2["Tauri"] = "Tauri (https://tauri.app/)";
400
+ DesktopFrameworkChoice2["MacOS"] = "Native macOS app";
401
+ return DesktopFrameworkChoice2;
402
+ })(DesktopFrameworkChoice || {});
403
+ var TauriDriverProviderChoice = /* @__PURE__ */ ((TauriDriverProviderChoice2) => {
404
+ TauriDriverProviderChoice2["Official"] = "Official tauri-driver (cross-platform, Cargo-installed)";
405
+ TauriDriverProviderChoice2["CrabNebula"] = "CrabNebula tauri-driver (managed cloud / drop-in)";
406
+ TauriDriverProviderChoice2["Embedded"] = "Embedded driver via tauri-plugin-wdio-webdriver crate";
407
+ return TauriDriverProviderChoice2;
408
+ })(TauriDriverProviderChoice || {});
347
409
  var SUPPORTED_BROWSER_RUNNER_PRESETS = [
348
410
  { name: "Lit (https://lit.dev/)", value: "$--$" },
349
411
  { name: "Vue.js (https://vuejs.org/)", value: "@vitejs/plugin-vue$--$vue" },
@@ -360,6 +422,21 @@ function isBrowserRunner(answers) {
360
422
  function getTestingPurpose(answers) {
361
423
  return convertPackageHashToObject(answers.runner).purpose;
362
424
  }
425
+ function getResolvedPurpose(answers) {
426
+ const raw = getTestingPurpose(answers);
427
+ if (raw !== "desktop") {
428
+ return raw;
429
+ }
430
+ switch (answers.desktopFramework) {
431
+ case "Tauri (https://tauri.app/)" /* Tauri */:
432
+ return "tauri";
433
+ case "Native macOS app" /* MacOS */:
434
+ return "macos";
435
+ case "Electron (https://www.electronjs.org/)" /* Electron */:
436
+ default:
437
+ return "electron";
438
+ }
439
+ }
363
440
  var TESTING_LIBRARY_PACKAGES = {
364
441
  react: "@testing-library/react",
365
442
  preact: "@testing-library/preact",
@@ -422,6 +499,15 @@ var QUESTIONNAIRE = [{
422
499
  */
423
500
  answers.preset && TESTING_LIBRARY_PACKAGES[convertPackageHashToObject(answers.preset).short]
424
501
  )
502
+ }, {
503
+ type: "list",
504
+ name: "desktopFramework",
505
+ message: "What type of desktop application are you testing?",
506
+ choices: Object.values(DesktopFrameworkChoice),
507
+ when: (
508
+ /* istanbul ignore next */
509
+ (answers) => getTestingPurpose(answers) === "desktop"
510
+ )
425
511
  }, {
426
512
  type: "list",
427
513
  name: "electronBuildTool",
@@ -429,7 +515,7 @@ var QUESTIONNAIRE = [{
429
515
  choices: Object.values(ElectronBuildToolChoice),
430
516
  when: (
431
517
  /* instanbul ignore next */
432
- (answers) => getTestingPurpose(answers) === "electron"
518
+ (answers) => getResolvedPurpose(answers) === "electron"
433
519
  )
434
520
  }, {
435
521
  type: "input",
@@ -437,7 +523,33 @@ var QUESTIONNAIRE = [{
437
523
  message: "What is the path to the binary of your built Electron app?",
438
524
  when: (
439
525
  /* istanbul ignore next */
440
- (answers) => getTestingPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
526
+ (answers) => getResolvedPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
527
+ )
528
+ }, {
529
+ type: "list",
530
+ name: "tauriDriverProvider",
531
+ message: "Which WebDriver provider would you like to use for Tauri?",
532
+ choices: Object.values(TauriDriverProviderChoice),
533
+ when: (
534
+ /* istanbul ignore next */
535
+ (answers) => getResolvedPurpose(answers) === "tauri"
536
+ )
537
+ }, {
538
+ type: "confirm",
539
+ name: "tauriUseFrontendPlugin",
540
+ message: "Install @wdio/tauri-plugin for richer in-webview integration (browser.tauri.execute, mocking)?",
541
+ default: true,
542
+ when: (
543
+ /* istanbul ignore next */
544
+ (answers) => getResolvedPurpose(answers) === "tauri"
545
+ )
546
+ }, {
547
+ type: "input",
548
+ name: "tauriAppBinaryPath",
549
+ message: "Path to your built Tauri binary (leave blank to use the default `cargo tauri build` output)?",
550
+ when: (
551
+ /* istanbul ignore next */
552
+ (answers) => getResolvedPurpose(answers) === "tauri"
441
553
  )
442
554
  }, {
443
555
  type: "list",
@@ -639,7 +751,7 @@ var QUESTIONNAIRE = [{
639
751
  if (isBrowserRunner(answers)) {
640
752
  return SUPPORTED_PACKAGES.framework.slice(0, 1);
641
753
  }
642
- if (getTestingPurpose(answers) === "electron") {
754
+ if (["electron", "tauri"].includes(getResolvedPurpose(answers))) {
643
755
  return SUPPORTED_PACKAGES.framework.filter(
644
756
  ({ value }) => !value.startsWith("@serenity-js")
645
757
  );
@@ -672,7 +784,7 @@ var QUESTIONNAIRE = [{
672
784
  when: (
673
785
  /* istanbul ignore next */
674
786
  (answers) => {
675
- if (["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && answers.framework.includes("cucumber")) {
787
+ if (["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && answers.framework.includes("cucumber")) {
676
788
  return false;
677
789
  }
678
790
  return true;
@@ -725,7 +837,7 @@ var QUESTIONNAIRE = [{
725
837
  * and also not needed when running VS Code tests since the service comes with
726
838
  * its own page object implementation, nor when running Electron or MacOS tests
727
839
  */
728
- !["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && /**
840
+ !["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && /**
729
841
  * Serenity/JS generates Lean Page Objects by default, so there's no need to ask about it
730
842
  * See https://serenity-js.org/handbook/web-testing/page-objects-pattern/
731
843
  */
@@ -773,7 +885,7 @@ var QUESTIONNAIRE = [{
773
885
  }, {
774
886
  type: "confirm",
775
887
  name: "includeVisualTesting",
776
- message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing!",
888
+ message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing",
777
889
  default: false,
778
890
  when: (
779
891
  /* istanbul ignore next */
@@ -795,16 +907,22 @@ var QUESTIONNAIRE = [{
795
907
  if (answers.e2eEnvironment === "mobile") {
796
908
  services.push("appium");
797
909
  }
798
- if (getTestingPurpose(answers) === "e2e" && isNuxtProject) {
910
+ if (getResolvedPurpose(answers) === "e2e" && isNuxtProject) {
799
911
  services.push("nuxt");
800
912
  }
801
- if (getTestingPurpose(answers) === "vscode") {
913
+ if (getResolvedPurpose(answers) === "vscode") {
802
914
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "vscode")];
803
- } else if (getTestingPurpose(answers) === "electron") {
915
+ } else if (getResolvedPurpose(answers) === "electron") {
804
916
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "electron")];
805
- } else if (getTestingPurpose(answers) === "macos") {
917
+ } else if (getResolvedPurpose(answers) === "tauri") {
918
+ const tauriEntries = [SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri")];
919
+ if (answers.tauriUseFrontendPlugin) {
920
+ tauriEntries.push(SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri-plugin"));
921
+ }
922
+ return tauriEntries;
923
+ } else if (getResolvedPurpose(answers) === "macos") {
806
924
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "appium")];
807
- } else if (getTestingPurpose(answers) === "roku") {
925
+ } else if (getResolvedPurpose(answers) === "roku") {
808
926
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "roku")];
809
927
  }
810
928
  return prioServiceOrderFor(services);
@@ -816,14 +934,19 @@ var QUESTIONNAIRE = [{
816
934
  } else if (answers.backend === "In the cloud using Sauce Labs" /* Saucelabs */) {
817
935
  defaultServices.push("sauce");
818
936
  }
819
- if (answers.e2eEnvironment === "mobile" || getTestingPurpose(answers) === "macos") {
937
+ if (answers.e2eEnvironment === "mobile" || getResolvedPurpose(answers) === "macos") {
820
938
  defaultServices.push("appium");
821
939
  }
822
- if (getTestingPurpose(answers) === "vscode") {
940
+ if (getResolvedPurpose(answers) === "vscode") {
823
941
  defaultServices.push("vscode");
824
- } else if (getTestingPurpose(answers) === "electron") {
942
+ } else if (getResolvedPurpose(answers) === "electron") {
825
943
  defaultServices.push("electron");
826
- } else if (getTestingPurpose(answers) === "roku") {
944
+ } else if (getResolvedPurpose(answers) === "tauri") {
945
+ defaultServices.push("tauri");
946
+ if (answers.tauriUseFrontendPlugin) {
947
+ defaultServices.push("tauri-plugin");
948
+ }
949
+ } else if (getResolvedPurpose(answers) === "roku") {
827
950
  defaultServices.push("roku");
828
951
  }
829
952
  if (isNuxtProject) {
@@ -868,7 +991,6 @@ var QUESTIONNAIRE = [{
868
991
  default: true
869
992
  }];
870
993
  var COMMUNITY_PACKAGES_WITH_TS_SUPPORT = [
871
- "wdio-electron-service",
872
994
  "wdio-vscode-service",
873
995
  "wdio-nuxt-service",
874
996
  "wdio-vite-service",
@@ -1516,11 +1638,21 @@ async function runConfigCommand(parsedAnswers, npmTag) {
1516
1638
  await npmInstall(parsedAnswers, npmTag);
1517
1639
  await createWDIOConfig(parsedAnswers);
1518
1640
  await createWDIOScript(parsedAnswers);
1641
+ const extraInfoParts = [];
1642
+ if (parsedAnswers.serenityAdapter) {
1643
+ extraInfoParts.push(CONFIG_HELPER_SERENITY_BANNER);
1644
+ }
1645
+ if (parsedAnswers.purpose === "tauri") {
1646
+ extraInfoParts.push(buildTauriBanner(
1647
+ parsedAnswers.rawAnswers.tauriDriverProvider,
1648
+ parsedAnswers.rawAnswers.tauriUseFrontendPlugin
1649
+ ));
1650
+ }
1519
1651
  console.log(
1520
1652
  configHelperSuccessMessage({
1521
1653
  projectRootDir: parsedAnswers.projectRootDir,
1522
1654
  runScript: parsedAnswers.serenityAdapter ? "serenity" : "wdio",
1523
- extraInfo: parsedAnswers.serenityAdapter ? CONFIG_HELPER_SERENITY_BANNER : ""
1655
+ extraInfo: extraInfoParts.join("\n")
1524
1656
  })
1525
1657
  );
1526
1658
  await runAppiumInstaller(parsedAnswers);
@@ -1587,7 +1719,7 @@ var parseAnswers = async function(yes) {
1587
1719
  runner: runnerPackage.short,
1588
1720
  preset: presetPackage.short,
1589
1721
  framework: frameworkPackage.short,
1590
- purpose: runnerPackage.purpose,
1722
+ purpose: getResolvedPurpose(answers),
1591
1723
  serenityAdapter: frameworkPackage.package === "@serenity-js/webdriverio" && frameworkPackage.purpose,
1592
1724
  reporters: reporterPackages.map(({ short }) => short),
1593
1725
  plugins: pluginPackages.map(({ short }) => short),
@@ -1,6 +1,25 @@
1
1
  services: [<%- answers.services.map((service) => {
2
2
  if (service === 'electron') {
3
3
  return /*js*/`'electron'`
4
+ } else if (service === 'tauri') {
5
+ const providerMap = {
6
+ 'Official tauri-driver (cross-platform, Cargo-installed)': 'official',
7
+ 'CrabNebula tauri-driver (managed cloud / drop-in)': 'crabnebula',
8
+ 'Embedded driver via tauri-plugin-wdio-webdriver crate': 'embedded',
9
+ }
10
+ const provider = providerMap[answers.rawAnswers.tauriDriverProvider] ?? 'official'
11
+ const binaryLine = answers.rawAnswers.tauriAppBinaryPath
12
+ ? `\n appBinaryPath: ${JSON.stringify(answers.rawAnswers.tauriAppBinaryPath)},`
13
+ : ''
14
+ return /*js*/`[
15
+ 'tauri',
16
+ {
17
+ driverProvider: '${provider}',${binaryLine}
18
+ // see https://webdriver.io/docs/desktop-testing/tauri/configuration for all options
19
+ }
20
+ ]`
21
+ } else if (service === 'tauri-plugin') {
22
+ return /*js*/`'tauri-plugin'`
4
23
  } else if (service === 'sauce' && answers.useSauceConnect) {
5
24
  return /*js*/`[
6
25
  'sauce',
@@ -1,6 +1,10 @@
1
1
  <%
2
2
  if (answers.isUsingTypeScript && answers.purpose === 'electron') {
3
- %>/// <reference types="wdio-electron-service" />
3
+ %>/// <reference types="@wdio/electron-service" />
4
+ <% }
5
+
6
+ if (answers.isUsingTypeScript && answers.purpose === 'tauri') {
7
+ %>/// <reference types="@wdio/tauri-service" />
4
8
  <% }
5
9
 
6
10
  if (answers.isUsingTypeScript && answers.serenityAdapter) {
package/build/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { BackendChoice, RegionOptions, ElectronBuildToolChoice } from './constants.js';
1
+ import type { BackendChoice, RegionOptions, ElectronBuildToolChoice, DesktopFrameworkChoice, TauriDriverProviderChoice } from './constants.js';
2
2
  import type { PackageJson as typeFestPackageJson } from 'type-fest';
3
3
  import type { Package as normalizePackage } from 'normalize-package-data';
4
4
  export type NormalizedPackageJson = PackageJson & normalizePackage;
@@ -16,6 +16,10 @@ export interface Questionnair {
16
16
  electronAppBinaryPath?: string;
17
17
  electronBuildTool?: ElectronBuildToolChoice;
18
18
  electronBuilderConfigPath?: string;
19
+ desktopFramework?: DesktopFrameworkChoice;
20
+ tauriDriverProvider?: TauriDriverProviderChoice;
21
+ tauriUseFrontendPlugin?: boolean;
22
+ tauriAppBinaryPath?: string;
19
23
  backend?: BackendChoice;
20
24
  hostname?: string;
21
25
  port?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -88,7 +88,7 @@ async function detectCompiler(answers) {
88
88
  // package.json
89
89
  var package_default = {
90
90
  name: "create-wdio",
91
- version: "9.26.1",
91
+ version: "9.27.1",
92
92
  description: "Install and setup a WebdriverIO project with all its dependencies in a single run",
93
93
  author: "WebdriverIO Team <mail@webdriver.io>",
94
94
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/create-wdio",
@@ -195,8 +195,7 @@ var SUPPORTED_PACKAGES = {
195
195
  runner: [
196
196
  { name: "E2E Testing - of Web or Mobile Applications", value: "@wdio/local-runner$--$local$--$e2e" },
197
197
  { name: "Component or Unit Testing - in the browser\n > https://webdriver.io/docs/component-testing", value: "@wdio/browser-runner$--$browser$--$component" },
198
- { name: "Desktop Testing - of Electron Applications\n > https://webdriver.io/docs/desktop-testing/electron", value: "@wdio/local-runner$--$local$--$electron" },
199
- { name: "Desktop Testing - of MacOS Applications\n > https://webdriver.io/docs/desktop-testing/macos", value: "@wdio/local-runner$--$local$--$macos" },
198
+ { name: "Desktop Testing - of Electron, Tauri, or macOS Applications\n > https://webdriver.io/docs/desktop-testing", value: "@wdio/local-runner$--$local$--$desktop" },
200
199
  { name: "VS Code Extension Testing\n > https://webdriver.io/docs/vscode-extension-testing", value: "@wdio/local-runner$--$local$--$vscode" },
201
200
  { name: "Roku Testing - of OTT apps running on RokuOS\n > https://webdriver.io/docs/wdio-roku-service", value: "@wdio/local-runner$--$local$--$roku" }
202
201
  ],
@@ -247,7 +246,9 @@ var SUPPORTED_PACKAGES = {
247
246
  { name: "browserstack", value: "@wdio/browserstack-service$--$browserstack" },
248
247
  { name: "lighthouse", value: "@wdio/lighthouse-service$--$lighthouse" },
249
248
  { name: "vscode", value: "wdio-vscode-service$--$vscode" },
250
- { name: "electron", value: "wdio-electron-service$--$electron" },
249
+ { name: "electron", value: "@wdio/electron-service$--$electron" },
250
+ { name: "tauri", value: "@wdio/tauri-service$--$tauri" },
251
+ { name: "tauri-plugin", value: "@wdio/tauri-plugin$--$tauri-plugin" },
251
252
  { name: "appium", value: "@wdio/appium-service$--$appium" },
252
253
  // external
253
254
  { name: "camera", value: "wdio-camera-service$--$camera" },
@@ -323,6 +324,18 @@ var ElectronBuildToolChoice = /* @__PURE__ */ ((ElectronBuildToolChoice2) => {
323
324
  ElectronBuildToolChoice2["SomethingElse"] = "Something else";
324
325
  return ElectronBuildToolChoice2;
325
326
  })(ElectronBuildToolChoice || {});
327
+ var DesktopFrameworkChoice = /* @__PURE__ */ ((DesktopFrameworkChoice2) => {
328
+ DesktopFrameworkChoice2["Electron"] = "Electron (https://www.electronjs.org/)";
329
+ DesktopFrameworkChoice2["Tauri"] = "Tauri (https://tauri.app/)";
330
+ DesktopFrameworkChoice2["MacOS"] = "Native macOS app";
331
+ return DesktopFrameworkChoice2;
332
+ })(DesktopFrameworkChoice || {});
333
+ var TauriDriverProviderChoice = /* @__PURE__ */ ((TauriDriverProviderChoice2) => {
334
+ TauriDriverProviderChoice2["Official"] = "Official tauri-driver (cross-platform, Cargo-installed)";
335
+ TauriDriverProviderChoice2["CrabNebula"] = "CrabNebula tauri-driver (managed cloud / drop-in)";
336
+ TauriDriverProviderChoice2["Embedded"] = "Embedded driver via tauri-plugin-wdio-webdriver crate";
337
+ return TauriDriverProviderChoice2;
338
+ })(TauriDriverProviderChoice || {});
326
339
  var SUPPORTED_BROWSER_RUNNER_PRESETS = [
327
340
  { name: "Lit (https://lit.dev/)", value: "$--$" },
328
341
  { name: "Vue.js (https://vuejs.org/)", value: "@vitejs/plugin-vue$--$vue" },
@@ -339,6 +352,21 @@ function isBrowserRunner(answers) {
339
352
  function getTestingPurpose(answers) {
340
353
  return convertPackageHashToObject(answers.runner).purpose;
341
354
  }
355
+ function getResolvedPurpose(answers) {
356
+ const raw = getTestingPurpose(answers);
357
+ if (raw !== "desktop") {
358
+ return raw;
359
+ }
360
+ switch (answers.desktopFramework) {
361
+ case "Tauri (https://tauri.app/)" /* Tauri */:
362
+ return "tauri";
363
+ case "Native macOS app" /* MacOS */:
364
+ return "macos";
365
+ case "Electron (https://www.electronjs.org/)" /* Electron */:
366
+ default:
367
+ return "electron";
368
+ }
369
+ }
342
370
  var TESTING_LIBRARY_PACKAGES = {
343
371
  react: "@testing-library/react",
344
372
  preact: "@testing-library/preact",
@@ -401,6 +429,15 @@ var QUESTIONNAIRE = [{
401
429
  */
402
430
  answers.preset && TESTING_LIBRARY_PACKAGES[convertPackageHashToObject(answers.preset).short]
403
431
  )
432
+ }, {
433
+ type: "list",
434
+ name: "desktopFramework",
435
+ message: "What type of desktop application are you testing?",
436
+ choices: Object.values(DesktopFrameworkChoice),
437
+ when: (
438
+ /* istanbul ignore next */
439
+ (answers) => getTestingPurpose(answers) === "desktop"
440
+ )
404
441
  }, {
405
442
  type: "list",
406
443
  name: "electronBuildTool",
@@ -408,7 +445,7 @@ var QUESTIONNAIRE = [{
408
445
  choices: Object.values(ElectronBuildToolChoice),
409
446
  when: (
410
447
  /* instanbul ignore next */
411
- (answers) => getTestingPurpose(answers) === "electron"
448
+ (answers) => getResolvedPurpose(answers) === "electron"
412
449
  )
413
450
  }, {
414
451
  type: "input",
@@ -416,7 +453,33 @@ var QUESTIONNAIRE = [{
416
453
  message: "What is the path to the binary of your built Electron app?",
417
454
  when: (
418
455
  /* istanbul ignore next */
419
- (answers) => getTestingPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
456
+ (answers) => getResolvedPurpose(answers) === "electron" && answers.electronBuildTool === "Something else" /* SomethingElse */
457
+ )
458
+ }, {
459
+ type: "list",
460
+ name: "tauriDriverProvider",
461
+ message: "Which WebDriver provider would you like to use for Tauri?",
462
+ choices: Object.values(TauriDriverProviderChoice),
463
+ when: (
464
+ /* istanbul ignore next */
465
+ (answers) => getResolvedPurpose(answers) === "tauri"
466
+ )
467
+ }, {
468
+ type: "confirm",
469
+ name: "tauriUseFrontendPlugin",
470
+ message: "Install @wdio/tauri-plugin for richer in-webview integration (browser.tauri.execute, mocking)?",
471
+ default: true,
472
+ when: (
473
+ /* istanbul ignore next */
474
+ (answers) => getResolvedPurpose(answers) === "tauri"
475
+ )
476
+ }, {
477
+ type: "input",
478
+ name: "tauriAppBinaryPath",
479
+ message: "Path to your built Tauri binary (leave blank to use the default `cargo tauri build` output)?",
480
+ when: (
481
+ /* istanbul ignore next */
482
+ (answers) => getResolvedPurpose(answers) === "tauri"
420
483
  )
421
484
  }, {
422
485
  type: "list",
@@ -618,7 +681,7 @@ var QUESTIONNAIRE = [{
618
681
  if (isBrowserRunner(answers)) {
619
682
  return SUPPORTED_PACKAGES.framework.slice(0, 1);
620
683
  }
621
- if (getTestingPurpose(answers) === "electron") {
684
+ if (["electron", "tauri"].includes(getResolvedPurpose(answers))) {
622
685
  return SUPPORTED_PACKAGES.framework.filter(
623
686
  ({ value }) => !value.startsWith("@serenity-js")
624
687
  );
@@ -651,7 +714,7 @@ var QUESTIONNAIRE = [{
651
714
  when: (
652
715
  /* istanbul ignore next */
653
716
  (answers) => {
654
- if (["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && answers.framework.includes("cucumber")) {
717
+ if (["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && answers.framework.includes("cucumber")) {
655
718
  return false;
656
719
  }
657
720
  return true;
@@ -704,7 +767,7 @@ var QUESTIONNAIRE = [{
704
767
  * and also not needed when running VS Code tests since the service comes with
705
768
  * its own page object implementation, nor when running Electron or MacOS tests
706
769
  */
707
- !["vscode", "electron", "macos"].includes(getTestingPurpose(answers)) && /**
770
+ !["vscode", "electron", "tauri", "macos"].includes(getResolvedPurpose(answers)) && /**
708
771
  * Serenity/JS generates Lean Page Objects by default, so there's no need to ask about it
709
772
  * See https://serenity-js.org/handbook/web-testing/page-objects-pattern/
710
773
  */
@@ -752,7 +815,7 @@ var QUESTIONNAIRE = [{
752
815
  }, {
753
816
  type: "confirm",
754
817
  name: "includeVisualTesting",
755
- message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing!",
818
+ message: "Would you like to include Visual Testing to your setup? For more information see https://webdriver.io/docs/visual-testing",
756
819
  default: false,
757
820
  when: (
758
821
  /* istanbul ignore next */
@@ -774,16 +837,22 @@ var QUESTIONNAIRE = [{
774
837
  if (answers.e2eEnvironment === "mobile") {
775
838
  services.push("appium");
776
839
  }
777
- if (getTestingPurpose(answers) === "e2e" && isNuxtProject) {
840
+ if (getResolvedPurpose(answers) === "e2e" && isNuxtProject) {
778
841
  services.push("nuxt");
779
842
  }
780
- if (getTestingPurpose(answers) === "vscode") {
843
+ if (getResolvedPurpose(answers) === "vscode") {
781
844
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "vscode")];
782
- } else if (getTestingPurpose(answers) === "electron") {
845
+ } else if (getResolvedPurpose(answers) === "electron") {
783
846
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "electron")];
784
- } else if (getTestingPurpose(answers) === "macos") {
847
+ } else if (getResolvedPurpose(answers) === "tauri") {
848
+ const tauriEntries = [SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri")];
849
+ if (answers.tauriUseFrontendPlugin) {
850
+ tauriEntries.push(SUPPORTED_PACKAGES.service.find(({ name }) => name === "tauri-plugin"));
851
+ }
852
+ return tauriEntries;
853
+ } else if (getResolvedPurpose(answers) === "macos") {
785
854
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "appium")];
786
- } else if (getTestingPurpose(answers) === "roku") {
855
+ } else if (getResolvedPurpose(answers) === "roku") {
787
856
  return [SUPPORTED_PACKAGES.service.find(({ name }) => name === "roku")];
788
857
  }
789
858
  return prioServiceOrderFor(services);
@@ -795,14 +864,19 @@ var QUESTIONNAIRE = [{
795
864
  } else if (answers.backend === "In the cloud using Sauce Labs" /* Saucelabs */) {
796
865
  defaultServices.push("sauce");
797
866
  }
798
- if (answers.e2eEnvironment === "mobile" || getTestingPurpose(answers) === "macos") {
867
+ if (answers.e2eEnvironment === "mobile" || getResolvedPurpose(answers) === "macos") {
799
868
  defaultServices.push("appium");
800
869
  }
801
- if (getTestingPurpose(answers) === "vscode") {
870
+ if (getResolvedPurpose(answers) === "vscode") {
802
871
  defaultServices.push("vscode");
803
- } else if (getTestingPurpose(answers) === "electron") {
872
+ } else if (getResolvedPurpose(answers) === "electron") {
804
873
  defaultServices.push("electron");
805
- } else if (getTestingPurpose(answers) === "roku") {
874
+ } else if (getResolvedPurpose(answers) === "tauri") {
875
+ defaultServices.push("tauri");
876
+ if (answers.tauriUseFrontendPlugin) {
877
+ defaultServices.push("tauri-plugin");
878
+ }
879
+ } else if (getResolvedPurpose(answers) === "roku") {
806
880
  defaultServices.push("roku");
807
881
  }
808
882
  if (isNuxtProject) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-wdio",
3
- "version": "9.27.0",
3
+ "version": "9.27.2",
4
4
  "description": "Install and setup a WebdriverIO project with all its dependencies in a single run",
5
5
  "author": "WebdriverIO Team <mail@webdriver.io>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/create-wdio",
@@ -77,5 +77,5 @@
77
77
  "publishConfig": {
78
78
  "access": "public"
79
79
  },
80
- "gitHead": "2a7beb52c6d6f9aa81445a258202c9eb830b1a00"
80
+ "gitHead": "a95ab41f3ac1fd9510341a21d365a359528212ac"
81
81
  }