@bigbinary/neeto-playwright-commons 2.1.5 → 2.2.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.
package/index.js CHANGED
@@ -1,31 +1,32 @@
1
1
  import { spawn, execSync } from 'child_process';
2
2
  import { keysToSnakeCase, hyphenate, isNotPresent, humanize, isPresent, dynamicArray, findBy, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
3
3
  import { faker } from '@faker-js/faker';
4
- import * as require$$0$3 from 'fs';
5
- import require$$0__default, { readFileSync, promises, existsSync, writeFileSync, unlinkSync } from 'fs';
6
- import require$$0$5 from 'os';
4
+ import * as fs$4 from 'fs';
5
+ import fs__default, { readFileSync, promises, existsSync, writeFileSync, unlinkSync } from 'fs';
6
+ import require$$0$4 from 'os';
7
7
  import * as path$1 from 'path';
8
8
  import path__default from 'path';
9
9
  import test, { expect, test as test$1, chromium as chromium$1, defineConfig, devices } from '@playwright/test';
10
10
  import { getI18nInstance, initI18n } from 'playwright-i18next-fixture';
11
- import require$$0$4 from 'util';
11
+ import require$$0$3 from 'util';
12
12
  import { curry, isNotNil, not, isEmpty, pluck, mergeAll, isNil, mergeDeepLeft } from 'ramda';
13
13
  import dayjs from 'dayjs';
14
- import require$$0$8 from 'stream';
15
- import require$$0$7 from 'node:buffer';
16
- import require$$0$6 from 'buffer';
14
+ import require$$0$7 from 'stream';
15
+ import require$$0$6 from 'node:buffer';
16
+ import require$$0$5 from 'buffer';
17
17
  import require$$1$2 from 'string_decoder';
18
18
  import require$$1$3 from 'node:stream';
19
- import require$$0$9 from 'crypto';
19
+ import require$$0$8 from 'crypto';
20
20
  import require$$1$4 from 'zlib';
21
- import require$$0$a from 'assert';
22
- import require$$0$b from 'tty';
21
+ import require$$0$9 from 'assert';
22
+ import require$$0$a from 'tty';
23
23
  import stealth$1 from 'puppeteer-extra-plugin-stealth';
24
24
  import require$$1$5 from 'events';
25
25
  import customParseFormat from 'dayjs/plugin/customParseFormat';
26
26
  import timezone from 'dayjs/plugin/timezone';
27
27
  import utc from 'dayjs/plugin/utc';
28
28
  import https from 'https';
29
+ import * as http from 'http';
29
30
 
30
31
  const BASE_URL = "/api/v1";
31
32
  const NEETO_AUTH_BASE_URL = (subdomain = "app") => `https://${subdomain}.neetoauth.net`;
@@ -668,7 +669,7 @@ var hasRequiredUtil_inspect;
668
669
  function requireUtil_inspect () {
669
670
  if (hasRequiredUtil_inspect) return util_inspect;
670
671
  hasRequiredUtil_inspect = 1;
671
- util_inspect = require$$0$4.inspect;
672
+ util_inspect = require$$0$3.inspect;
672
673
  return util_inspect;
673
674
  }
674
675
 
@@ -5074,7 +5075,7 @@ const joinString = (string1, string2, string3 = "", separator = " ") => {
5074
5075
  };
5075
5076
  const readFileSyncIfExists = (path = STORAGE_STATE) => {
5076
5077
  try {
5077
- return JSON.parse(require$$0$3.readFileSync(path, "utf8"));
5078
+ return JSON.parse(fs$4.readFileSync(path, "utf8"));
5078
5079
  }
5079
5080
  catch {
5080
5081
  return {};
@@ -5083,7 +5084,7 @@ const readFileSyncIfExists = (path = STORAGE_STATE) => {
5083
5084
  const getGlobalUserState = () => readFileSyncIfExists()?.user;
5084
5085
  const writeDataToFile = data => {
5085
5086
  try {
5086
- require$$0$3.writeFileSync(STORAGE_STATE, data, "utf8");
5087
+ fs$4.writeFileSync(STORAGE_STATE, data, "utf8");
5087
5088
  }
5088
5089
  catch (error) {
5089
5090
  console.log(error);
@@ -5096,7 +5097,7 @@ const updateCredentials = ({ key, value }) => {
5096
5097
  return writeDataToFile(JSON.stringify(data));
5097
5098
  };
5098
5099
  const removeCredentialFile = () => {
5099
- require$$0$3.unlink(STORAGE_STATE, error => {
5100
+ fs$4.unlink(STORAGE_STATE, error => {
5100
5101
  if (!error)
5101
5102
  return;
5102
5103
  console.log(error);
@@ -6246,7 +6247,7 @@ class CustomCommands {
6246
6247
  await expect(locator).toBeChecked({ checked: shouldBeChecked });
6247
6248
  }).toPass({ timeout: 15_000 });
6248
6249
  moveCursorAtBottom = async () => {
6249
- const isMacOS = require$$0$5.platform() === "darwin";
6250
+ const isMacOS = require$$0$4.platform() === "darwin";
6250
6251
  const rightArrowKey = isMacOS ? "Meta+ArrowRight" : "End";
6251
6252
  const downArrowKey = isMacOS ? "Meta+ArrowDown" : "PageDown";
6252
6253
  await this.page.keyboard.press(rightArrowKey);
@@ -8887,7 +8888,7 @@ function requireSafer () {
8887
8888
  if (hasRequiredSafer) return safer_1;
8888
8889
  hasRequiredSafer = 1;
8889
8890
 
8890
- var buffer = require$$0$6;
8891
+ var buffer = require$$0$5;
8891
8892
  var Buffer = buffer.Buffer;
8892
8893
 
8893
8894
  var safer = {};
@@ -26582,7 +26583,7 @@ function requireCharset () {
26582
26583
  if (hasRequiredCharset) return charset.exports;
26583
26584
  hasRequiredCharset = 1;
26584
26585
 
26585
- const { Buffer } = require$$0$7;
26586
+ const { Buffer } = require$$0$6;
26586
26587
  const iconv = requireLib$b();
26587
26588
  const encodingJapanese = requireSrc$2();
26588
26589
  const charsets = requireCharsets();
@@ -26708,7 +26709,7 @@ function requireLibbase64 () {
26708
26709
  if (hasRequiredLibbase64) return libbase64;
26709
26710
  hasRequiredLibbase64 = 1;
26710
26711
 
26711
- const { Buffer } = require$$0$7;
26712
+ const { Buffer } = require$$0$6;
26712
26713
  const stream = require$$1$3;
26713
26714
  const Transform = stream.Transform;
26714
26715
 
@@ -26969,7 +26970,7 @@ function requireLibqp () {
26969
26970
  if (hasRequiredLibqp) return libqp;
26970
26971
  hasRequiredLibqp = 1;
26971
26972
 
26972
- const { Buffer } = require$$0$7;
26973
+ const { Buffer } = require$$0$6;
26973
26974
  const stream = require$$1$3;
26974
26975
  const Transform = stream.Transform;
26975
26976
 
@@ -29344,7 +29345,7 @@ function requireLibmime () {
29344
29345
  if (hasRequiredLibmime) return libmime.exports;
29345
29346
  hasRequiredLibmime = 1;
29346
29347
 
29347
- const { Buffer } = require$$0$7;
29348
+ const { Buffer } = require$$0$6;
29348
29349
  const libcharset = requireCharset();
29349
29350
  const libbase64 = requireLibbase64();
29350
29351
  const libqp = requireLibqp();
@@ -30525,7 +30526,7 @@ function requireMimeNode () {
30525
30526
  const libmime = requireLibmime();
30526
30527
  const libqp = requireLibqp();
30527
30528
  const libbase64 = requireLibbase64();
30528
- const PassThrough = require$$0$8.PassThrough;
30529
+ const PassThrough = require$$0$7.PassThrough;
30529
30530
  const pathlib = path__default;
30530
30531
 
30531
30532
  class MimeNode {
@@ -30794,7 +30795,7 @@ function requireMessageSplitter () {
30794
30795
  if (hasRequiredMessageSplitter) return messageSplitter;
30795
30796
  hasRequiredMessageSplitter = 1;
30796
30797
 
30797
- const Transform = require$$0$8.Transform;
30798
+ const Transform = require$$0$7.Transform;
30798
30799
  const MimeNode = requireMimeNode();
30799
30800
 
30800
30801
  const MAX_HEAD_SIZE = 1 * 1024 * 1024;
@@ -31224,7 +31225,7 @@ function requireMessageJoiner () {
31224
31225
  if (hasRequiredMessageJoiner) return messageJoiner;
31225
31226
  hasRequiredMessageJoiner = 1;
31226
31227
 
31227
- const Transform = require$$0$8.Transform;
31228
+ const Transform = require$$0$7.Transform;
31228
31229
 
31229
31230
  class MessageJoiner extends Transform {
31230
31231
  constructor() {
@@ -31264,7 +31265,7 @@ function requireFlowedDecoder () {
31264
31265
 
31265
31266
  // Helper class to rewrite nodes with specific mime type
31266
31267
 
31267
- const Transform = require$$0$8.Transform;
31268
+ const Transform = require$$0$7.Transform;
31268
31269
  const libmime = requireLibmime();
31269
31270
 
31270
31271
  /**
@@ -31327,7 +31328,7 @@ function requireNodeRewriter () {
31327
31328
 
31328
31329
  // Helper class to rewrite nodes with specific mime type
31329
31330
 
31330
- const Transform = require$$0$8.Transform;
31331
+ const Transform = require$$0$7.Transform;
31331
31332
  const FlowedDecoder = requireFlowedDecoder();
31332
31333
 
31333
31334
  /**
@@ -31529,7 +31530,7 @@ function requireNodeStreamer () {
31529
31530
 
31530
31531
  // Helper class to rewrite nodes with specific mime type
31531
31532
 
31532
- const Transform = require$$0$8.Transform;
31533
+ const Transform = require$$0$7.Transform;
31533
31534
  const FlowedDecoder = requireFlowedDecoder();
31534
31535
 
31535
31536
  /**
@@ -31656,7 +31657,7 @@ function requireChunkedPassthrough () {
31656
31657
  if (hasRequiredChunkedPassthrough) return chunkedPassthrough;
31657
31658
  hasRequiredChunkedPassthrough = 1;
31658
31659
 
31659
- const { Transform } = require$$0$8;
31660
+ const { Transform } = require$$0$7;
31660
31661
 
31661
31662
  class ChunkedPassthrough extends Transform {
31662
31663
  constructor(options = {}) {
@@ -32582,8 +32583,8 @@ function requireStreamHash () {
32582
32583
  if (hasRequiredStreamHash) return streamHash;
32583
32584
  hasRequiredStreamHash = 1;
32584
32585
 
32585
- const crypto = require$$0$9;
32586
- const Transform = require$$0$8.Transform;
32586
+ const crypto = require$$0$8;
32587
+ const Transform = require$$0$7.Transform;
32587
32588
 
32588
32589
  class StreamHash extends Transform {
32589
32590
  constructor(attachment, algo) {
@@ -54966,7 +54967,7 @@ function requireMailParser () {
54966
54967
  const mailsplit = requireMailsplit();
54967
54968
  const libmime = requireLibmime();
54968
54969
  const addressparser = requireAddressparser();
54969
- const Transform = require$$0$8.Transform;
54970
+ const Transform = require$$0$7.Transform;
54970
54971
  const Splitter = mailsplit.Splitter;
54971
54972
  const ChunkedPassthrough = mailsplit.ChunkedPassthrough;
54972
54973
  const punycode = require$$4$2;
@@ -60600,9 +60601,7 @@ class MailerUtils {
60600
60601
  const { html: { codes }, } = await this.findMessage({ to: email, subject: subjectSubstring }, { timeout, receivedAfter, expectedEmailCount });
60601
60602
  return codes?.[0];
60602
60603
  };
60603
- generateRandomEmail = (shouldUseBypassEmail = false) => shouldUseBypassEmail
60604
- ? generateRandomBypassEmail()
60605
- : faker.internet.email({ provider: process.env.FASTMAIL_DOMAIN_NAME });
60604
+ generateRandomEmail = () => faker.internet.email({ provider: process.env.FASTMAIL_DOMAIN_NAME });
60606
60605
  getEmailAttachment = async (attachmentName, messageSearchCriteria = {}, { timeout = 10_000, receivedAfter = dateTimeOneHourAgo(), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
60607
60606
  if (IS_DEV_ENV) {
60608
60607
  return this.railsEmailUtils.getEmailAttachment(attachmentName, messageSearchCriteria, { receivedAfter, expectedEmailCount, timeout: timeout / 3 }, shouldThrowErrorOnTimeout);
@@ -66986,7 +66985,7 @@ function requireGifutil () {
66986
66985
 
66987
66986
  /** @namespace GifUtil */
66988
66987
 
66989
- const fs = require$$0__default;
66988
+ const fs = fs__default;
66990
66989
  const ImageQ = requireImageQ();
66991
66990
 
66992
66991
  const BitmapImage = requireBitmapimage();
@@ -69802,8 +69801,8 @@ function requireChunkstream () {
69802
69801
  if (hasRequiredChunkstream) return chunkstream.exports;
69803
69802
  hasRequiredChunkstream = 1;
69804
69803
 
69805
- let util = require$$0$4;
69806
- let Stream = require$$0$8;
69804
+ let util = require$$0$3;
69805
+ let Stream = require$$0$7;
69807
69806
 
69808
69807
  let ChunkStream = (chunkstream.exports = function () {
69809
69808
  Stream.call(this);
@@ -70314,7 +70313,7 @@ function requireFilterParseAsync () {
70314
70313
  if (hasRequiredFilterParseAsync) return filterParseAsync.exports;
70315
70314
  hasRequiredFilterParseAsync = 1;
70316
70315
 
70317
- let util = require$$0$4;
70316
+ let util = require$$0$3;
70318
70317
  let ChunkStream = requireChunkstream();
70319
70318
  let Filter = requireFilterParse();
70320
70319
 
@@ -71110,7 +71109,7 @@ function requireParserAsync () {
71110
71109
  if (hasRequiredParserAsync) return parserAsync.exports;
71111
71110
  hasRequiredParserAsync = 1;
71112
71111
 
71113
- let util = require$$0$4;
71112
+ let util = require$$0$3;
71114
71113
  let zlib = require$$1$4;
71115
71114
  let ChunkStream = requireChunkstream();
71116
71115
  let FilterAsync = requireFilterParseAsync();
@@ -71771,8 +71770,8 @@ function requirePackerAsync () {
71771
71770
  if (hasRequiredPackerAsync) return packerAsync.exports;
71772
71771
  hasRequiredPackerAsync = 1;
71773
71772
 
71774
- let util = require$$0$4;
71775
- let Stream = require$$0$8;
71773
+ let util = require$$0$3;
71774
+ let Stream = require$$0$7;
71776
71775
  let constants = requireConstants$4();
71777
71776
  let Packer = requirePacker();
71778
71777
 
@@ -71833,11 +71832,11 @@ function requireSyncInflate () {
71833
71832
  hasRequiredSyncInflate = 1;
71834
71833
  (function (module, exports$1) {
71835
71834
 
71836
- let assert = require$$0$a.ok;
71835
+ let assert = require$$0$9.ok;
71837
71836
  let zlib = require$$1$4;
71838
- let util = require$$0$4;
71837
+ let util = require$$0$3;
71839
71838
 
71840
- let kMaxLength = require$$0$6.kMaxLength;
71839
+ let kMaxLength = require$$0$5.kMaxLength;
71841
71840
 
71842
71841
  function Inflate(opts) {
71843
71842
  if (!(this instanceof Inflate)) {
@@ -72293,8 +72292,8 @@ function requirePng () {
72293
72292
  if (hasRequiredPng) return png$1;
72294
72293
  hasRequiredPng = 1;
72295
72294
 
72296
- let util = require$$0$4;
72297
- let Stream = require$$0$8;
72295
+ let util = require$$0$3;
72296
+ let Stream = require$$0$7;
72298
72297
  let Parser = requireParserAsync();
72299
72298
  let Packer = requirePackerAsync();
72300
72299
  let PNGSync = requirePngSync();
@@ -108021,7 +108020,7 @@ var hasRequiredSupportsColor;
108021
108020
  function requireSupportsColor () {
108022
108021
  if (hasRequiredSupportsColor) return supportsColor_1;
108023
108022
  hasRequiredSupportsColor = 1;
108024
- const os = require$$0$5;
108023
+ const os = require$$0$4;
108025
108024
  const hasFlag = requireHasFlag();
108026
108025
 
108027
108026
  const env = process.env;
@@ -108164,8 +108163,8 @@ function requireNode () {
108164
108163
  if (hasRequiredNode) return node.exports;
108165
108164
  hasRequiredNode = 1;
108166
108165
  (function (module, exports$1) {
108167
- const tty = require$$0$b;
108168
- const util = require$$0$4;
108166
+ const tty = require$$0$a;
108167
+ const util = require$$0$3;
108169
108168
 
108170
108169
  /**
108171
108170
  * This is the Node.js implementation of `debug()`.
@@ -109491,7 +109490,7 @@ function requirePath () {
109491
109490
  hasRequiredPath = 1;
109492
109491
  Object.defineProperty(path, "__esModule", { value: true });
109493
109492
  path.convertPosixPathToPattern = path.convertWindowsPathToPattern = path.convertPathToPattern = path.escapePosixPath = path.escapeWindowsPath = path.escape = path.removeLeadingDotSegment = path.makeAbsolute = path.unixify = void 0;
109494
- const os = require$$0$5;
109493
+ const os = require$$0$4;
109495
109494
  const path$1 = path__default;
109496
109495
  const IS_WINDOWS_PLATFORM = os.platform() === 'win32';
109497
109496
  const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\
@@ -109758,7 +109757,7 @@ function requireGlobParent () {
109758
109757
 
109759
109758
  var isGlob = requireIsGlob();
109760
109759
  var pathPosixDirname = path__default.posix.dirname;
109761
- var isWin32 = require$$0$5.platform() === 'win32';
109760
+ var isWin32 = require$$0$4.platform() === 'win32';
109762
109761
 
109763
109762
  var slash = '/';
109764
109763
  var backslash = /\\/g;
@@ -110307,7 +110306,7 @@ function requireFillRange () {
110307
110306
  if (hasRequiredFillRange) return fillRange;
110308
110307
  hasRequiredFillRange = 1;
110309
110308
 
110310
- const util = require$$0$4;
110309
+ const util = require$$0$3;
110311
110310
  const toRegexRange = requireToRegexRange();
110312
110311
 
110313
110312
  const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
@@ -113448,7 +113447,7 @@ function requireMicromatch () {
113448
113447
  if (hasRequiredMicromatch) return micromatch_1;
113449
113448
  hasRequiredMicromatch = 1;
113450
113449
 
113451
- const util = require$$0$4;
113450
+ const util = require$$0$3;
113452
113451
  const braces = requireBraces();
113453
113452
  const picomatch = requirePicomatch();
113454
113453
  const utils = requireUtils$2();
@@ -114151,7 +114150,7 @@ function requireMerge2 () {
114151
114150
  * Copyright (c) 2014-2020 Teambition
114152
114151
  * Licensed under the MIT license.
114153
114152
  */
114154
- const Stream = require$$0$8;
114153
+ const Stream = require$$0$7;
114155
114154
  const PassThrough = Stream.PassThrough;
114156
114155
  const slice = Array.prototype.slice;
114157
114156
 
@@ -114580,7 +114579,7 @@ function requireFs$2 () {
114580
114579
  (function (exports$1) {
114581
114580
  Object.defineProperty(exports$1, "__esModule", { value: true });
114582
114581
  exports$1.createFileSystemAdapter = exports$1.FILE_SYSTEM_ADAPTER = void 0;
114583
- const fs = require$$0__default;
114582
+ const fs = fs__default;
114584
114583
  exports$1.FILE_SYSTEM_ADAPTER = {
114585
114584
  lstat: fs.lstat,
114586
114585
  stat: fs.stat,
@@ -115010,7 +115009,7 @@ function requireFs () {
115010
115009
  (function (exports$1) {
115011
115010
  Object.defineProperty(exports$1, "__esModule", { value: true });
115012
115011
  exports$1.createFileSystemAdapter = exports$1.FILE_SYSTEM_ADAPTER = void 0;
115013
- const fs = require$$0__default;
115012
+ const fs = fs__default;
115014
115013
  exports$1.FILE_SYSTEM_ADAPTER = {
115015
115014
  lstat: fs.lstat,
115016
115015
  stat: fs.stat,
@@ -115643,7 +115642,7 @@ function requireStream$2 () {
115643
115642
  if (hasRequiredStream$2) return stream$2;
115644
115643
  hasRequiredStream$2 = 1;
115645
115644
  Object.defineProperty(stream$2, "__esModule", { value: true });
115646
- const stream_1 = require$$0$8;
115645
+ const stream_1 = require$$0$7;
115647
115646
  const async_1 = requireAsync$3();
115648
115647
  class StreamProvider {
115649
115648
  constructor(_root, _settings) {
@@ -115895,7 +115894,7 @@ function requireStream$1 () {
115895
115894
  if (hasRequiredStream$1) return stream$1;
115896
115895
  hasRequiredStream$1 = 1;
115897
115896
  Object.defineProperty(stream$1, "__esModule", { value: true });
115898
- const stream_1 = require$$0$8;
115897
+ const stream_1 = require$$0$7;
115899
115898
  const fsStat = requireOut$3();
115900
115899
  const fsWalk = requireOut$1();
115901
115900
  const reader_1 = requireReader();
@@ -116413,7 +116412,7 @@ function requireStream () {
116413
116412
  if (hasRequiredStream) return stream;
116414
116413
  hasRequiredStream = 1;
116415
116414
  Object.defineProperty(stream, "__esModule", { value: true });
116416
- const stream_1 = require$$0$8;
116415
+ const stream_1 = require$$0$7;
116417
116416
  const stream_2 = requireStream$1();
116418
116417
  const provider_1 = requireProvider();
116419
116418
  class ProviderStream extends provider_1.default {
@@ -116539,8 +116538,8 @@ function requireSettings () {
116539
116538
  (function (exports$1) {
116540
116539
  Object.defineProperty(exports$1, "__esModule", { value: true });
116541
116540
  exports$1.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
116542
- const fs = require$$0__default;
116543
- const os = require$$0$5;
116541
+ const fs = fs__default;
116542
+ const os = require$$0$4;
116544
116543
  /**
116545
116544
  * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.
116546
116545
  * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107
@@ -120010,7 +120009,7 @@ class EditorPage {
120010
120009
  }).toPass({ timeout: 30_000 });
120011
120010
  focusText = (textLocator) => expect(async () => {
120012
120011
  await textLocator.click();
120013
- await this.page.keyboard.press(require$$0$5.platform() === "darwin" ? "Meta+ArrowRight" : "End");
120012
+ await this.page.keyboard.press(require$$0$4.platform() === "darwin" ? "Meta+ArrowRight" : "End");
120014
120013
  await expect(textLocator.locator("..")).toHaveClass(/has-focus/, {
120015
120014
  timeout: 5_000,
120016
120015
  });
@@ -124950,6 +124949,160 @@ const generatePhoneNumberDetails = () => {
124950
124949
  return { flag: country.flag, name: country.name, code: country.code, number };
124951
124950
  };
124952
124951
 
124952
+ const CONFIG = {
124953
+ DIR: "/tmp/neeto-auth-web",
124954
+ LOG: "/tmp/neeto-auth-server.log",
124955
+ PORT: 9000,
124956
+ MAX_WAIT_MS: 120_000,
124957
+ EMAIL_INIT: "/tmp/neeto-auth-web/config/initializers/playwright_email_capture.rb",
124958
+ };
124959
+ const SCRIPTS_DIR = path$1.join(__dirname, "scripts", "neeto-auth");
124960
+ const escapeRubyString = (value) => value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
124961
+ const buildEmailCaptureInitializer = (targetApp) => {
124962
+ const template = fs$4.readFileSync(path$1.join(SCRIPTS_DIR, "playwright_email_capture.rb.template"), "utf-8");
124963
+ return template.replace("{{TARGET_APP}}", escapeRubyString(targetApp));
124964
+ };
124965
+ const log = (msg) => console.log(`[NeetoAuth] ${msg}`);
124966
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
124967
+ const httpCheck = (port, timeout = 3000) => new Promise(resolve => {
124968
+ const req = http.get(`http://localhost:${port}/`, () => resolve(true));
124969
+ req.on("error", () => resolve(false));
124970
+ req.setTimeout(timeout, () => {
124971
+ req.destroy();
124972
+ resolve(false);
124973
+ });
124974
+ });
124975
+ class NeetoAuthServer {
124976
+ process = null;
124977
+ targetApp;
124978
+ constructor(appName) {
124979
+ this.targetApp = STATUS_TEXTS.appName(appName);
124980
+ }
124981
+ get serverEnv() {
124982
+ return {
124983
+ ...process.env,
124984
+ BUNDLE_PATH: undefined,
124985
+ RAILS_ENV: "development",
124986
+ POSTGRES_USER: process.env.POSTGRES_USER ?? process.env.USER ?? "postgres",
124987
+ };
124988
+ }
124989
+ waitForProcessExit = async (pid) => {
124990
+ const deadline = Date.now() + 10_000;
124991
+ while (Date.now() < deadline) {
124992
+ try {
124993
+ process.kill(pid, 0);
124994
+ await sleep(500);
124995
+ }
124996
+ catch {
124997
+ return;
124998
+ }
124999
+ }
125000
+ };
125001
+ killServerOnPort = async () => {
125002
+ try {
125003
+ execSync(`lsof -ti tcp:${CONFIG.PORT} | xargs kill -9`, {
125004
+ stdio: "ignore",
125005
+ });
125006
+ await sleep(1000);
125007
+ }
125008
+ catch {
125009
+ // No process on that port — nothing to kill.
125010
+ }
125011
+ };
125012
+ ensureSetup = () => {
125013
+ if (fs$4.existsSync(`${CONFIG.DIR}/Gemfile`)) {
125014
+ log("Already set up, skipping.");
125015
+ return;
125016
+ }
125017
+ if (!process.env.GITHUB_TOKEN) {
125018
+ throw new Error("[NeetoAuth] GITHUB_TOKEN is not set. Cannot clone neeto-auth-web.");
125019
+ }
125020
+ log("Running first-time setup...");
125021
+ const setupScript = path$1.join(SCRIPTS_DIR, "setup.sh");
125022
+ try {
125023
+ execSync(`bash "${setupScript}" "${CONFIG.DIR}"`, {
125024
+ stdio: "inherit",
125025
+ env: this.serverEnv,
125026
+ });
125027
+ }
125028
+ catch {
125029
+ throw new Error("[NeetoAuth] First-time setup failed. Check the output above for details.");
125030
+ }
125031
+ log("Setup complete.");
125032
+ };
125033
+ waitForServer = async (timeoutMs = CONFIG.MAX_WAIT_MS) => {
125034
+ const startTime = Date.now();
125035
+ while (Date.now() - startTime < timeoutMs) {
125036
+ if (this.process !== null && this.process.exitCode !== null) {
125037
+ const logContent = fs$4.existsSync(CONFIG.LOG)
125038
+ ? fs$4.readFileSync(CONFIG.LOG, "utf-8")
125039
+ : "<no log file>";
125040
+ throw new Error(`[NeetoAuth] Server process exited unexpectedly with code ${this.process.exitCode}.\nLog:\n${logContent}`);
125041
+ }
125042
+ if (await httpCheck(CONFIG.PORT))
125043
+ return;
125044
+ await sleep(3000);
125045
+ }
125046
+ const logContent = fs$4.existsSync(CONFIG.LOG)
125047
+ ? fs$4.readFileSync(CONFIG.LOG, "utf-8")
125048
+ : "<no log file>";
125049
+ throw new Error(`[NeetoAuth] Server did not start within ${timeoutMs / 1000}s.\nLog:\n${logContent}`);
125050
+ };
125051
+ injectEmailCaptureInitializer = () => {
125052
+ fs$4.writeFileSync(CONFIG.EMAIL_INIT, buildEmailCaptureInitializer(this.targetApp));
125053
+ };
125054
+ isRunningForCurrentApp = () => {
125055
+ if (!fs$4.existsSync(CONFIG.EMAIL_INIT))
125056
+ return false;
125057
+ const currentContent = fs$4.readFileSync(CONFIG.EMAIL_INIT, "utf-8");
125058
+ return currentContent === buildEmailCaptureInitializer(this.targetApp);
125059
+ };
125060
+ start = async () => {
125061
+ if (IS_STAGING_ENV)
125062
+ return;
125063
+ if (await httpCheck(CONFIG.PORT)) {
125064
+ if (this.isRunningForCurrentApp()) {
125065
+ log("Server already running for this app.");
125066
+ return;
125067
+ }
125068
+ log("Server running for a different app — restarting...");
125069
+ await this.killServerOnPort();
125070
+ }
125071
+ this.ensureSetup();
125072
+ this.injectEmailCaptureInitializer();
125073
+ log("Starting server...");
125074
+ const logStream = fs$4.createWriteStream(CONFIG.LOG);
125075
+ this.process = spawn("bundle", [
125076
+ "exec",
125077
+ "rails",
125078
+ "server",
125079
+ "-p",
125080
+ CONFIG.PORT.toString(),
125081
+ "-b",
125082
+ "0.0.0.0",
125083
+ ], {
125084
+ cwd: CONFIG.DIR,
125085
+ stdio: ["ignore", "pipe", "pipe"],
125086
+ env: this.serverEnv,
125087
+ });
125088
+ this.process.stdout?.pipe(logStream);
125089
+ this.process.stderr?.pipe(logStream);
125090
+ await this.waitForServer();
125091
+ log("Server ready.");
125092
+ };
125093
+ stop = async () => {
125094
+ if (IS_STAGING_ENV || !this.process)
125095
+ return;
125096
+ const pid = this.process.pid;
125097
+ log("Stopping server...");
125098
+ this.process.kill("SIGTERM");
125099
+ this.process = null;
125100
+ if (pid) {
125101
+ await this.waitForProcessExit(pid);
125102
+ }
125103
+ };
125104
+ }
125105
+
124953
125106
  var main$1 = {exports: {}};
124954
125107
 
124955
125108
  var version = "17.3.1";
@@ -124961,10 +125114,10 @@ var hasRequiredMain$1;
124961
125114
  function requireMain$1 () {
124962
125115
  if (hasRequiredMain$1) return main$1.exports;
124963
125116
  hasRequiredMain$1 = 1;
124964
- const fs = require$$0__default;
125117
+ const fs = fs__default;
124965
125118
  const path = path__default;
124966
- const os = require$$0$5;
124967
- const crypto = require$$0$9;
125119
+ const os = require$$0$4;
125120
+ const crypto = require$$0$8;
124968
125121
  const packageJson = require$$4;
124969
125122
 
124970
125123
  const version = packageJson.version;
@@ -125515,7 +125668,7 @@ const envLocalPath = `${envBasePath}.local`;
125515
125668
  const reporterPackageName = "@bigbinary/neeto-playwright-reporter";
125516
125669
  process.env.TEST_ENV = process.env.TEST_ENV ?? ENVIRONMENT.development;
125517
125670
  loadEnv(`${envBasePath}.${process.env.TEST_ENV}`);
125518
- require$$0$3.existsSync(envLocalPath) && loadEnv(envLocalPath);
125671
+ fs$4.existsSync(envLocalPath) && loadEnv(envLocalPath);
125519
125672
  const playdashStagingConfig = {
125520
125673
  apiKey: process.env.PLAYDASH_STAGING_API_KEY,
125521
125674
  ciBuildId: process.env.NEETO_CI_JOB_ID,
@@ -125711,5 +125864,5 @@ const definePlaywrightConfig = (overrides) => {
125711
125864
  });
125712
125865
  };
125713
125866
 
125714
- export { ACTIONS, ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, AuditLogsPage, BASE_URL, CALENDAR_LABELS, 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_FORMATS, 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_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_DEV_ENV, IS_STAGING_ENV, ImageUploader, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, 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, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, 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, hexToRGB, hexToRGBA, i18nFixture, imageRegex, 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 };
125867
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, AuditLogsPage, BASE_URL, CALENDAR_LABELS, 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_FORMATS, 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_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_DEV_ENV, IS_STAGING_ENV, ImageUploader, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, 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, NeetoAuthServer, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, 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, hexToRGB, hexToRGBA, i18nFixture, imageRegex, 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 };
125715
125868
  //# sourceMappingURL=index.js.map