@bigbinary/neeto-playwright-commons 1.26.22 → 1.26.24

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.
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { spawn, execSync } from 'child_process';
1
2
  import { keysToSnakeCase, hyphenate, isPresent, isNotPresent, humanize, dynamicArray, findBy, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
2
3
  import { faker } from '@faker-js/faker';
3
4
  import * as require$$0$3 from 'fs';
@@ -9,7 +10,6 @@ import test, { expect, test as test$1, chromium as chromium$1, defineConfig, dev
9
10
  import { getI18nInstance, initI18n } from 'playwright-i18next-fixture';
10
11
  import require$$0$4 from 'util';
11
12
  import { curry, isNotNil, not, isEmpty, pluck, mergeDeepLeft, isNil, mergeAll } from 'ramda';
12
- import { execSync, spawn } from 'child_process';
13
13
  import dayjs from 'dayjs';
14
14
  import require$$0$7 from 'stream';
15
15
  import { createRequire } from 'node:module';
@@ -200,6 +200,91 @@ class MemberApis {
200
200
  }
201
201
  }
202
202
 
203
+ class RailsEmailRakeClient {
204
+ constructor() {
205
+ this.convertRawEmail = (rawEmail) => {
206
+ var _a;
207
+ return ({
208
+ from: rawEmail.from,
209
+ to: rawEmail.to,
210
+ cc: rawEmail.cc,
211
+ bcc: rawEmail.bcc,
212
+ replyTo: rawEmail.reply_to,
213
+ subject: rawEmail.subject,
214
+ htmlBody: rawEmail.html_body,
215
+ textBody: rawEmail.text_body,
216
+ receivedAt: rawEmail.received_at,
217
+ attachments: (_a = rawEmail.attachments) === null || _a === void 0 ? void 0 : _a.map(att => ({
218
+ name: att.filename,
219
+ type: att.mime_type,
220
+ content: att.data,
221
+ })),
222
+ });
223
+ };
224
+ this.executeRakeTask = async (taskName, args = []) => {
225
+ var _a, _b;
226
+ const childProcess = spawn("bundle", ["exec", "rake", taskName, "--", ...args], {
227
+ cwd: this.workingDirectory,
228
+ stdio: ["ignore", "pipe", "pipe"],
229
+ });
230
+ let stdout = "";
231
+ let stderr = "";
232
+ (_a = childProcess.stdout) === null || _a === void 0 ? void 0 : _a.on("data", data => {
233
+ stdout += data.toString();
234
+ });
235
+ (_b = childProcess.stderr) === null || _b === void 0 ? void 0 : _b.on("data", data => {
236
+ stderr += data.toString();
237
+ });
238
+ const exitCode = await new Promise((resolve, reject) => {
239
+ childProcess.on("error", reject);
240
+ childProcess.on("close", resolve);
241
+ });
242
+ if (exitCode !== 0) {
243
+ throw new Error(`Rake task ${taskName} failed: ${stderr || stdout || `Exit code ${exitCode}`}`);
244
+ }
245
+ return this.extractJsonFromOutput(stdout);
246
+ };
247
+ this.extractJsonFromOutput = (output) => {
248
+ const delimiterMatch = output.match(/<-- Captured Emails Start-->([\s\S]*?)<-- Captured Emails End-->/);
249
+ return delimiterMatch ? delimiterMatch[1].trim() : output.trim();
250
+ };
251
+ this.listEmails = async (searchParams) => {
252
+ try {
253
+ const args = this.buildSearchArgs(searchParams);
254
+ const output = await this.executeRakeTask("playwright:fetch_captured_emails", args);
255
+ if (!output)
256
+ return [];
257
+ const rawEmails = JSON.parse(output);
258
+ return rawEmails.map(this.convertRawEmail);
259
+ }
260
+ catch (error) {
261
+ console.error("Failed to fetch emails:", error);
262
+ return [];
263
+ }
264
+ };
265
+ this.buildSearchArgs = (searchParams) => Object.entries(keysToSnakeCase(searchParams !== null && searchParams !== void 0 ? searchParams : {}))
266
+ .filter(([, value]) => value != null && value !== "")
267
+ .map(([key, value]) => `--${key}=${value}`);
268
+ this.getLatestEmail = async (searchParams) => {
269
+ const emails = await this.listEmails(searchParams);
270
+ if (emails.length === 0)
271
+ return null;
272
+ return emails.reduce((latest, current) => new Date(current.receivedAt) > new Date(latest.receivedAt)
273
+ ? current
274
+ : latest);
275
+ };
276
+ this.clearEmails = async () => {
277
+ try {
278
+ await this.executeRakeTask("playwright:clear_captured_emails");
279
+ }
280
+ catch (error) {
281
+ console.error("Failed to clear emails:", error);
282
+ }
283
+ };
284
+ this.workingDirectory = process.env.RAILS_ROOT || "..";
285
+ }
286
+ }
287
+
203
288
  class RoleApis {
204
289
  constructor(neetoPlaywrightUtilities) {
205
290
  this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
@@ -57340,6 +57425,168 @@ const hexToRGB = (hex) => {
57340
57425
  return `rgb(${Number(r)}, ${Number(g)}, ${Number(b)})`;
57341
57426
  };
57342
57427
 
57428
+ class RailsEmailUtils {
57429
+ constructor(neetoPlaywrightUtilities) {
57430
+ this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
57431
+ this.convertRailsEmailToFormattedList = (railsEmail) => {
57432
+ var _a;
57433
+ if (!railsEmail)
57434
+ return null;
57435
+ const LINK_REGEX = /(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])/g;
57436
+ const CODE_REGEX = /(?<![#/])\b\d{4,}\b/g;
57437
+ const htmlBody = railsEmail.htmlBody || "";
57438
+ const textBody = railsEmail.textBody || "";
57439
+ const htmlBodyWithStrippedHead = htmlBody.split("</head>").at(-1) || htmlBody;
57440
+ const extractMatches = (text, regex) => text.match(regex) || null;
57441
+ const parseEmailAddress = (address) => {
57442
+ if (!address)
57443
+ return [];
57444
+ const addresses = Array.isArray(address) ? address : [address];
57445
+ return addresses.map(addr => {
57446
+ const match = addr.match(/^(.+?)\s*<(.+?)>$|^(.+)$/);
57447
+ return match
57448
+ ? {
57449
+ name: match[1] || match[3] || "",
57450
+ email: match[2] || match[3] || addr,
57451
+ }
57452
+ : { name: "", email: addr };
57453
+ });
57454
+ };
57455
+ return {
57456
+ html: {
57457
+ body: htmlBody,
57458
+ links: extractMatches(htmlBodyWithStrippedHead, LINK_REGEX),
57459
+ codes: extractMatches(htmlBodyWithStrippedHead, CODE_REGEX),
57460
+ },
57461
+ text: {
57462
+ body: textBody,
57463
+ links: extractMatches(textBody, LINK_REGEX),
57464
+ codes: extractMatches(textBody, CODE_REGEX),
57465
+ },
57466
+ id: `${railsEmail.receivedAt}-${Math.random().toString(36).substring(2, 9)}`,
57467
+ from: parseEmailAddress(railsEmail.from),
57468
+ to: parseEmailAddress(railsEmail.to),
57469
+ cc: parseEmailAddress(railsEmail.cc),
57470
+ bcc: parseEmailAddress(railsEmail.bcc),
57471
+ replyTo: parseEmailAddress(railsEmail.replyTo),
57472
+ received: new Date(railsEmail.receivedAt).toISOString(),
57473
+ subject: railsEmail.subject,
57474
+ attachments: ((_a = railsEmail.attachments) === null || _a === void 0 ? void 0 : _a.map(att => ({
57475
+ name: att.name,
57476
+ type: att.type,
57477
+ }))) || [],
57478
+ blobId: "",
57479
+ };
57480
+ };
57481
+ this.clearEmails = () => this.railsEmailRakeClient.clearEmails();
57482
+ this.getLatestEmail = (searchParams) => this.railsEmailRakeClient.getLatestEmail(searchParams);
57483
+ this.listEmails = (searchParams) => this.railsEmailRakeClient.listEmails(searchParams);
57484
+ this.listMessages = async (messageSearchCriteria = {}, { receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), } = {}) => {
57485
+ const emails = await this.railsEmailRakeClient.listEmails({
57486
+ ...messageSearchCriteria,
57487
+ receivedAfter: receivedAfter.toISOString(),
57488
+ });
57489
+ return emails
57490
+ .map(email => this.convertRailsEmailToFormattedList(email))
57491
+ .filter((email) => email !== null);
57492
+ };
57493
+ this.findMessage = async (messageSearchCriteria = {}, { timeout = 2 * 60 * 1000, receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
57494
+ const email = (await this.neetoPlaywrightUtilities.executeRecursively({
57495
+ callback: async () => {
57496
+ const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
57497
+ ...messageSearchCriteria,
57498
+ receivedAfter: receivedAfter.toISOString(),
57499
+ });
57500
+ if (!railsEmail)
57501
+ return null;
57502
+ return this.convertRailsEmailToFormattedList(railsEmail);
57503
+ },
57504
+ condition: async () => {
57505
+ const emails = await this.railsEmailRakeClient.listEmails({
57506
+ ...messageSearchCriteria,
57507
+ receivedAfter: receivedAfter.toISOString(),
57508
+ });
57509
+ return emails.length >= expectedEmailCount;
57510
+ },
57511
+ timeout,
57512
+ }));
57513
+ if (!email) {
57514
+ if (shouldThrowErrorOnTimeout) {
57515
+ throw new Error("Timed out waiting for matching message");
57516
+ }
57517
+ return {};
57518
+ }
57519
+ return email;
57520
+ };
57521
+ this.findOtpFromEmail = async ({ email, subjectSubstring = OTP_EMAIL_PATTERN, timeout = 2 * 60 * 1000, receivedAfter = new Date(), expectedEmailCount = 1, }) => {
57522
+ const otp = await this.neetoPlaywrightUtilities.executeRecursively({
57523
+ callback: async () => {
57524
+ var _a, _b;
57525
+ const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
57526
+ to: email,
57527
+ subject: subjectSubstring,
57528
+ receivedAfter: receivedAfter.toISOString(),
57529
+ });
57530
+ if (!railsEmail)
57531
+ return null;
57532
+ const formattedEmail = this.convertRailsEmailToFormattedList(railsEmail);
57533
+ if (!formattedEmail)
57534
+ return null;
57535
+ return ((_a = formattedEmail.html.codes) === null || _a === void 0 ? void 0 : _a[0]) || ((_b = formattedEmail.text.codes) === null || _b === void 0 ? void 0 : _b[0]);
57536
+ },
57537
+ condition: async () => {
57538
+ const emails = await this.railsEmailRakeClient.listEmails({
57539
+ to: email,
57540
+ subject: subjectSubstring,
57541
+ receivedAfter: receivedAfter.toISOString(),
57542
+ });
57543
+ return emails.length >= expectedEmailCount;
57544
+ },
57545
+ timeout,
57546
+ });
57547
+ return otp || undefined;
57548
+ };
57549
+ this.getEmailAttachment = async (attachmentName, messageSearchCriteria = {}, { receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
57550
+ const attachmentDetails = (await this.neetoPlaywrightUtilities.executeRecursively({
57551
+ callback: async () => {
57552
+ var _a;
57553
+ const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
57554
+ ...messageSearchCriteria,
57555
+ receivedAfter: receivedAfter.toISOString(),
57556
+ });
57557
+ if (!railsEmail)
57558
+ return null;
57559
+ const attachment = (_a = railsEmail.attachments) === null || _a === void 0 ? void 0 : _a.find(att => att.name.includes(attachmentName));
57560
+ if (!attachment)
57561
+ return null;
57562
+ return {
57563
+ filename: attachment.name,
57564
+ type: attachment.type,
57565
+ content: Buffer.from(attachment.content, "base64"),
57566
+ contentType: attachment.type,
57567
+ };
57568
+ },
57569
+ condition: async () => {
57570
+ const emails = await this.railsEmailRakeClient.listEmails({
57571
+ ...messageSearchCriteria,
57572
+ receivedAfter: receivedAfter.toISOString(),
57573
+ });
57574
+ return emails.length >= expectedEmailCount;
57575
+ },
57576
+ timeout: 2 * 60 * 1000,
57577
+ }));
57578
+ if (!attachmentDetails) {
57579
+ if (shouldThrowErrorOnTimeout) {
57580
+ throw new Error("Timed out waiting for matching message or attachment not found");
57581
+ }
57582
+ return undefined;
57583
+ }
57584
+ return attachmentDetails;
57585
+ };
57586
+ this.railsEmailRakeClient = new RailsEmailRakeClient();
57587
+ }
57588
+ }
57589
+
57343
57590
  const dateTimeOneHourAgo = () => new Date(new Date().valueOf() - 60 * 60 * 1000);
57344
57591
  class MailerUtils {
57345
57592
  constructor(neetoPlaywrightUtilities) {
@@ -57383,8 +57630,10 @@ class MailerUtils {
57383
57630
  const emailBodyWithStrippedHead = emailBody.split("</head>").at(-1);
57384
57631
  const links = emailBodyWithStrippedHead.match(LINK_REGEX);
57385
57632
  const codes = emailBodyWithStrippedHead.match(CODE_REGEX);
57633
+ // Remove first and last links as Fastmail adds dot image links
57634
+ const filteredLinks = links && links.length > 2 ? links.slice(1, -1) : links;
57386
57635
  const contentRecognitions = {
57387
- links: links && [...links],
57636
+ links: filteredLinks,
57388
57637
  codes: codes && [...codes],
57389
57638
  };
57390
57639
  const html = { body: emailBody, ...contentRecognitions };
@@ -57412,6 +57661,9 @@ class MailerUtils {
57412
57661
  return formattedList;
57413
57662
  };
57414
57663
  this.listMessages = async (messageSearchCriteria = {}, listMessagesFilterCriteria = {}) => {
57664
+ if (IS_DEV_ENV) {
57665
+ return this.railsEmailUtils.listMessages(messageSearchCriteria, listMessagesFilterCriteria);
57666
+ }
57415
57667
  const { ids } = await this.queryEmail(messageSearchCriteria, listMessagesFilterCriteria);
57416
57668
  return this.getEmails(ids);
57417
57669
  };
@@ -57439,12 +57691,24 @@ class MailerUtils {
57439
57691
  return ids;
57440
57692
  };
57441
57693
  this.findMessage = async (messageSearchCriteria = {}, { timeout = 10000, receivedAfter = dateTimeOneHourAgo(), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
57694
+ if (IS_DEV_ENV) {
57695
+ return this.railsEmailUtils.findMessage(messageSearchCriteria, { receivedAfter, timeout, expectedEmailCount }, shouldThrowErrorOnTimeout);
57696
+ }
57442
57697
  const ids = await this.getEmailIds(messageSearchCriteria, { expectedEmailCount, receivedAfter, timeout }, shouldThrowErrorOnTimeout);
57443
57698
  const emails = await this.getEmails(ids);
57444
57699
  const filteredEmails = emails.filter(email => this.matchesCriteria(email, messageSearchCriteria));
57445
57700
  return filteredEmails[0] || {};
57446
57701
  };
57447
57702
  this.findOtpFromEmail = async ({ email, subjectSubstring = OTP_EMAIL_PATTERN, timeout = 2 * 60 * 1000, receivedAfter = new Date(), expectedEmailCount = 1, }) => {
57703
+ if (IS_DEV_ENV) {
57704
+ return this.railsEmailUtils.findOtpFromEmail({
57705
+ email,
57706
+ subjectSubstring,
57707
+ timeout,
57708
+ receivedAfter,
57709
+ expectedEmailCount,
57710
+ });
57711
+ }
57448
57712
  if (!this.accountId) {
57449
57713
  await this.fastmailApi.authorizeAndSetAccountId();
57450
57714
  }
@@ -57453,6 +57717,9 @@ class MailerUtils {
57453
57717
  };
57454
57718
  this.generateRandomEmail = () => faker.internet.email({ provider: process.env.FASTMAIL_DOMAIN_NAME });
57455
57719
  this.getEmailAttachment = async (attachmentName, messageSearchCriteria = {}, { timeout = 10000, receivedAfter = dateTimeOneHourAgo(), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
57720
+ if (IS_DEV_ENV) {
57721
+ return this.railsEmailUtils.getEmailAttachment(attachmentName, messageSearchCriteria, { receivedAfter, expectedEmailCount }, shouldThrowErrorOnTimeout);
57722
+ }
57456
57723
  const { blobId, attachments: attachmentNameAndTypes } = await this.findMessage(messageSearchCriteria, { expectedEmailCount, receivedAfter, timeout }, shouldThrowErrorOnTimeout);
57457
57724
  const attachment = attachmentNameAndTypes.find(attachment => attachment.name.includes(attachmentName));
57458
57725
  if (!attachment)
@@ -57464,6 +57731,7 @@ class MailerUtils {
57464
57731
  return attachments.find(attachment => attachment.filename.includes(attachmentName));
57465
57732
  };
57466
57733
  this.fastmailApi = new FastmailApi(neetoPlaywrightUtilities);
57734
+ this.railsEmailUtils = new RailsEmailUtils(neetoPlaywrightUtilities);
57467
57735
  }
57468
57736
  matchesCriteria(email, criteria) {
57469
57737
  const { to, from, subject, body } = criteria;
@@ -124815,9 +125083,6 @@ const definePlaywrightConfig = (overrides) => {
124815
125083
  timezoneId: "Asia/Calcutta",
124816
125084
  geolocation: { latitude: 18.553187, longitude: 73.948313 }, // BB Pune office
124817
125085
  permissions: ["geolocation"],
124818
- launchOptions: {
124819
- args: ["--js-flags=--max-old-space-size=6144"],
124820
- },
124821
125086
  ...useOverrides,
124822
125087
  },
124823
125088
  projects: useCustomProjects
@@ -124833,6 +125098,9 @@ const definePlaywrightConfig = (overrides) => {
124833
125098
  use: {
124834
125099
  ...devices["Desktop Chrome"],
124835
125100
  storageState: STORAGE_STATE,
125101
+ launchOptions: {
125102
+ args: ["--js-flags=--max-old-space-size=6144"],
125103
+ },
124836
125104
  },
124837
125105
  dependencies: ["setup"],
124838
125106
  },
@@ -124857,5 +125125,5 @@ const definePlaywrightConfig = (overrides) => {
124857
125125
  });
124858
125126
  };
124859
125127
 
124860
- export { ACTIONS, ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_SELECTORS, AdminPanelPage, ApiKeysApi, ApiKeysPage, AuditLogsPage, BASE_URL, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, CustomCommands, CustomDomainApi, CustomDomainPage, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmbedBase, FILE_FORMATS, FONT_SIZE_SELECTORS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_DEV_ENV, IS_STAGING_ENV, ImageUploader, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RoleApis, RolesPage, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_WEB_TEXTS, ZapierPage, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, fillCredentialsAndSubmit, filterUtils, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, headerUtils, hexToRGB, hexToRGBA, hyphenize, i18nFixture, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, joinHyphenCase, joinString, login, loginWithoutSSO, networkConditions, networkThrottlingUsingCDP, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, writeDataToFile };
125128
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_SELECTORS, AdminPanelPage, ApiKeysApi, ApiKeysPage, AuditLogsPage, BASE_URL, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, CustomCommands, CustomDomainApi, CustomDomainPage, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmbedBase, FILE_FORMATS, FONT_SIZE_SELECTORS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_DEV_ENV, IS_STAGING_ENV, ImageUploader, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailRakeClient, RailsEmailUtils, RoleApis, RolesPage, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_WEB_TEXTS, ZapierPage, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, fillCredentialsAndSubmit, filterUtils, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, headerUtils, hexToRGB, hexToRGBA, hyphenize, i18nFixture, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, joinHyphenCase, joinString, login, loginWithoutSSO, networkConditions, networkThrottlingUsingCDP, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, writeDataToFile };
124861
125129
  //# sourceMappingURL=index.js.map