From 441c184a2131095638b23cc5b51426e492a617f4 Mon Sep 17 00:00:00 2001 From: saroy Date: Tue, 8 Jul 2025 11:56:06 +0530 Subject: [PATCH 01/16] FLEXY-0000: add some logs --- .../src/utils/pages/view/twilio-console.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index a1b5a0899..93cccf04d 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -41,17 +41,17 @@ export class TwilioConsole extends Base { const path = `console/flex/service-login/${accountSid}/?path=/${flexPath}&referer=${redirectUrl}`; await this.goto({ baseUrl: this._baseUrl, path }); + logger.info("Before firstload") if (firstLoad) { await this.elementVisible(TwilioConsole._loginForm, `Twilio Console's Login form`); const csrfToken = await this.page.evaluate(async () => { - const response = await fetch('https://www.twilio.com/api/csrf', { - credentials: 'include', - }); + const response = await fetch('https://www.twilio.com/api/csrf'); const data = await response.json(); return data.csrf; }); if (csrfToken) { + logger.info('CSRF token fetched successfully, proceeding with login'); const loginURL = `${this._baseUrl}/userauth/submitLoginPassword`; await this.page.evaluate( // eslint-disable-next-line @typescript-eslint/promise-function-async @@ -81,6 +81,7 @@ export class TwilioConsole extends Base { logger.info('Logging in Flex via service login on first load'); await this.goto({ baseUrl: this._baseUrl, path }); } else { + logger.error("Unable to fetch CSRF token for Twilio Console login"); throw new Error('Unable to fetch CSRF token to login to Twilio Console'); } } From 6d82c3f03e64f7eb42fa768a5658cfb05d4e27cf Mon Sep 17 00:00:00 2001 From: saroy Date: Tue, 8 Jul 2025 21:50:25 +0530 Subject: [PATCH 02/16] FLEXY-0000: add some more logs --- .../src/utils/pages/view/twilio-console.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 93cccf04d..da9f40d64 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -44,15 +44,17 @@ export class TwilioConsole extends Base { logger.info("Before firstload") if (firstLoad) { await this.elementVisible(TwilioConsole._loginForm, `Twilio Console's Login form`); + logger.info("Login form is visible, proceeding with login"); const csrfToken = await this.page.evaluate(async () => { const response = await fetch('https://www.twilio.com/api/csrf'); const data = await response.json(); return data.csrf; }); + logger.info("CSRF token fetched, proceeding with login", csrfToken); if (csrfToken) { - logger.info('CSRF token fetched successfully, proceeding with login'); const loginURL = `${this._baseUrl}/userauth/submitLoginPassword`; + logger.info('loginURL', loginURL); await this.page.evaluate( // eslint-disable-next-line @typescript-eslint/promise-function-async (data: Record) => { From a7751512ea6cf086eb16fdb04b9b6fe51c815057 Mon Sep 17 00:00:00 2001 From: saroy Date: Wed, 9 Jul 2025 12:25:37 +0530 Subject: [PATCH 03/16] FLEXY-0000: remove this from evaluate --- .../src/utils/pages/view/twilio-console.ts | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index da9f40d64..fea987a8d 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -55,33 +55,35 @@ export class TwilioConsole extends Base { if (csrfToken) { const loginURL = `${this._baseUrl}/userauth/submitLoginPassword`; logger.info('loginURL', loginURL); + + const loginData = { + url: loginURL, + email: testParams.secrets.console.email, + password: testParams.secrets.console.password, + csrfToken, + }; + await this.page.evaluate( - // eslint-disable-next-line @typescript-eslint/promise-function-async - (data: Record) => { - return fetch(data.url, { - headers: { - 'x-twilio-csrf': data.csrfToken, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - email: data.email, - password: data.password, - }), - method: 'POST', - credentials: 'include', - }); - }, - { - url: loginURL, - email: testParams.secrets.console.email, - password: testParams.secrets.console.password, - csrfToken, - }, + async (data) => { + await fetch(data.url, { + headers: { + 'x-twilio-csrf': data.csrfToken, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + email: data.email, + password: data.password, + }), + method: 'POST', + credentials: 'include', + }); + }, + loginData ); - // Log in Flex via service login logger.info('Logging in Flex via service login on first load'); await this.goto({ baseUrl: this._baseUrl, path }); + } else { logger.error("Unable to fetch CSRF token for Twilio Console login"); throw new Error('Unable to fetch CSRF token to login to Twilio Console'); From 0883c2ee096b938fe3849873836120fb1d8073ba Mon Sep 17 00:00:00 2001 From: saroy Date: Wed, 9 Jul 2025 13:37:01 +0530 Subject: [PATCH 04/16] FLEXY-0000: add try catch --- .../src/utils/pages/view/twilio-console.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index fea987a8d..e0e56d8a0 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -46,9 +46,16 @@ export class TwilioConsole extends Base { await this.elementVisible(TwilioConsole._loginForm, `Twilio Console's Login form`); logger.info("Login form is visible, proceeding with login"); const csrfToken = await this.page.evaluate(async () => { - const response = await fetch('https://www.twilio.com/api/csrf'); - const data = await response.json(); - return data.csrf; + try { + const response = await fetch('https://www.twilio.com/api/csrf'); + console.log('Fetched CSRF response:', response.status); + const data = await response.json(); + console.log('CSRF response JSON:', data); + return data.csrf; + } catch (e) { + console.error('CSRF fetch failed:', e); + return null; + } }); logger.info("CSRF token fetched, proceeding with login", csrfToken); From 43aba5e3b7bc02c2f9e5ae54f8bdad40c0e82d9f Mon Sep 17 00:00:00 2001 From: saroy Date: Wed, 9 Jul 2025 20:42:36 +0530 Subject: [PATCH 05/16] FLEXY-0000: add try catch --- .../src/utils/pages/view/twilio-console.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index e0e56d8a0..197651393 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -48,12 +48,12 @@ export class TwilioConsole extends Base { const csrfToken = await this.page.evaluate(async () => { try { const response = await fetch('https://www.twilio.com/api/csrf'); - console.log('Fetched CSRF response:', response.status); + logger.info('Fetched CSRF response:', response.status); const data = await response.json(); - console.log('CSRF response JSON:', data); + logger.info('CSRF response JSON:', data); return data.csrf; } catch (e) { - console.error('CSRF fetch failed:', e); + logger.info('CSRF fetch failed:', e); return null; } }); From 864a4d17f90443ce56a289a9b853e214c8e6c5fb Mon Sep 17 00:00:00 2001 From: saroy Date: Thu, 10 Jul 2025 16:59:20 +0530 Subject: [PATCH 06/16] FLEXY-0000: remove page --- .../src/utils/pages/view/twilio-console.ts | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 197651393..82fd46d5a 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -45,18 +45,16 @@ export class TwilioConsole extends Base { if (firstLoad) { await this.elementVisible(TwilioConsole._loginForm, `Twilio Console's Login form`); logger.info("Login form is visible, proceeding with login"); - const csrfToken = await this.page.evaluate(async () => { - try { - const response = await fetch('https://www.twilio.com/api/csrf'); - logger.info('Fetched CSRF response:', response.status); - const data = await response.json(); - logger.info('CSRF response JSON:', data); - return data.csrf; - } catch (e) { - logger.info('CSRF fetch failed:', e); - return null; - } - }); + let csrfToken = null; + try { + const response = await fetch('https://www.twilio.com/api/csrf'); + logger.info('Fetched CSRF response:', response.status); + const data = await response.json(); + logger.info('CSRF response JSON:', data); + csrfToken = data.csrf; + } catch (e) { + logger.info('CSRF fetch failed:', e); + } logger.info("CSRF token fetched, proceeding with login", csrfToken); if (csrfToken) { From 05f28c298cb69032861d97f05e2cf88fff5e1a3a Mon Sep 17 00:00:00 2001 From: saroy Date: Thu, 10 Jul 2025 21:34:05 +0530 Subject: [PATCH 07/16] FLEXY-0000: remove this --- .../src/utils/pages/view/twilio-console.ts | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 82fd46d5a..f47c0d863 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -68,23 +68,20 @@ export class TwilioConsole extends Base { csrfToken, }; - await this.page.evaluate( - async (data) => { - await fetch(data.url, { - headers: { - 'x-twilio-csrf': data.csrfToken, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - email: data.email, - password: data.password, - }), - method: 'POST', - credentials: 'include', - }); + await this.page.evaluate((data) => { + return fetch(data.url, { + headers: { + 'x-twilio-csrf': data.csrfToken, + 'Content-Type': 'application/json', }, - loginData - ); + body: JSON.stringify({ + email: data.email, + password: data.password, + }), + method: 'POST', + credentials: 'include', + }); + }, loginData); logger.info('Logging in Flex via service login on first load'); await this.goto({ baseUrl: this._baseUrl, path }); From b9dbacef70791eca4767a8f52f3f5170b8e11fea Mon Sep 17 00:00:00 2001 From: saroy Date: Fri, 11 Jul 2025 13:53:26 +0530 Subject: [PATCH 08/16] FLEXY-0000: change to caps --- .../src/utils/pages/view/twilio-console.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index f47c0d863..4be9e1a7d 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -71,7 +71,7 @@ export class TwilioConsole extends Base { await this.page.evaluate((data) => { return fetch(data.url, { headers: { - 'x-twilio-csrf': data.csrfToken, + 'X-Twilio-Csrf': data.csrfToken, 'Content-Type': 'application/json', }, body: JSON.stringify({ From b2d55f8334dd6967ac144b775e850783495f70db Mon Sep 17 00:00:00 2001 From: saroy Date: Fri, 11 Jul 2025 14:02:07 +0530 Subject: [PATCH 09/16] FLEXY-0000: add logs --- .../src/utils/pages/view/twilio-console.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 4be9e1a7d..e549190f1 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -80,9 +80,27 @@ export class TwilioConsole extends Base { }), method: 'POST', credentials: 'include', - }); + }) + .then(response => { + logger.info('Response status:', response.status); + + const headers = {}; + response.headers.forEach((value, key) => { + headers[key] = value; + }); + logger.info('Response headers:', headers); + + return response.text(); + }) + .then(body => { + logger.info('Response body:', body); + }) + .catch(err => { + logger.error('Fetch error:', err); + }); }, loginData); + logger.info('Logging in Flex via service login on first load'); await this.goto({ baseUrl: this._baseUrl, path }); From 9a4bb9950e78da4c7c8619720b2d879fe4325738 Mon Sep 17 00:00:00 2001 From: saroy Date: Fri, 11 Jul 2025 14:42:32 +0530 Subject: [PATCH 10/16] FLEXY-0000: more logs --- .../src/utils/pages/view/twilio-console.ts | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index e549190f1..db26162af 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -68,7 +68,7 @@ export class TwilioConsole extends Base { csrfToken, }; - await this.page.evaluate((data) => { + const result = await this.page.evaluate((data) => { return fetch(data.url, { headers: { 'X-Twilio-Csrf': data.csrfToken, @@ -82,24 +82,25 @@ export class TwilioConsole extends Base { credentials: 'include', }) .then(response => { - logger.info('Response status:', response.status); - - const headers = {}; - response.headers.forEach((value, key) => { - headers[key] = value; - }); - logger.info('Response headers:', headers); - - return response.text(); - }) - .then(body => { - logger.info('Response body:', body); + return { + status: response.status, + headers: (() => { + const headersObj = {}; + response.headers.forEach((value, key) => { + headersObj[key] = value; + }); + return headersObj; + })(), + }; }) .catch(err => { - logger.error('Fetch error:', err); + return { + error: err.message || 'Unknown error during fetch', + }; }); }, loginData); + logger.info('Fetch result from browser:', result); logger.info('Logging in Flex via service login on first load'); await this.goto({ baseUrl: this._baseUrl, path }); From 07aef30574a0a5d4835d4240c912130cf4cbf047 Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 11:17:08 +0530 Subject: [PATCH 11/16] FLEXY-0000: disable cross site --- packages/flex-plugin-e2e-tests/src/utils/browser.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/browser.ts b/packages/flex-plugin-e2e-tests/src/utils/browser.ts index 1c23cecf3..acb8f2fe7 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/browser.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/browser.ts @@ -20,7 +20,13 @@ export class Browser { this._browser = await Puppeteer.launch({ headless: true, protocolTimeout: 300000, - args: ['--use-fake-ui-for-media-stream'], + args: [ + '--use-fake-ui-for-media-stream', + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-web-security', + '--disable-features=IsolateOrigins,site-per-process', + ], }); this._page = await this._browser.newPage(); await this._page.setRequestInterception(true); From 6a0e32ae9e05c17249ed2006d63692472944022a Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 12:28:17 +0530 Subject: [PATCH 12/16] FLEXY-0000: move code from browser to node --- .../src/utils/pages/view/twilio-console.ts | 94 +++++++++---------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index db26162af..78f33531c 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -45,6 +45,7 @@ export class TwilioConsole extends Base { if (firstLoad) { await this.elementVisible(TwilioConsole._loginForm, `Twilio Console's Login form`); logger.info("Login form is visible, proceeding with login"); + let csrfToken = null; try { const response = await fetch('https://www.twilio.com/api/csrf'); @@ -53,61 +54,52 @@ export class TwilioConsole extends Base { logger.info('CSRF response JSON:', data); csrfToken = data.csrf; } catch (e) { - logger.info('CSRF fetch failed:', e); + logger.error('CSRF fetch failed:', e); + throw new Error('CSRF token is null'); + } + + if (!csrfToken) { + logger.error("Unable to fetch CSRF token for Twilio Console login"); + throw new Error('CSRF token is null'); } logger.info("CSRF token fetched, proceeding with login", csrfToken); - if (csrfToken) { - const loginURL = `${this._baseUrl}/userauth/submitLoginPassword`; - logger.info('loginURL', loginURL); - - const loginData = { - url: loginURL, - email: testParams.secrets.console.email, - password: testParams.secrets.console.password, - csrfToken, - }; - - const result = await this.page.evaluate((data) => { - return fetch(data.url, { - headers: { - 'X-Twilio-Csrf': data.csrfToken, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - email: data.email, - password: data.password, - }), - method: 'POST', - credentials: 'include', - }) - .then(response => { - return { - status: response.status, - headers: (() => { - const headersObj = {}; - response.headers.forEach((value, key) => { - headersObj[key] = value; - }); - return headersObj; - })(), - }; - }) - .catch(err => { - return { - error: err.message || 'Unknown error during fetch', - }; - }); - }, loginData); - - logger.info('Fetch result from browser:', result); - - logger.info('Logging in Flex via service login on first load'); - await this.goto({ baseUrl: this._baseUrl, path }); + const loginURL = `${this._baseUrl}/userauth/submitLoginPassword`; + logger.info('loginURL', loginURL); - } else { - logger.error("Unable to fetch CSRF token for Twilio Console login"); - throw new Error('Unable to fetch CSRF token to login to Twilio Console'); + try { + const response = await fetch(loginURL, { + method: 'POST', + headers: { + 'x-twilio-csrf': csrfToken, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + email: testParams.secrets.console.email, + password: testParams.secrets.console.password, + }), + credentials: 'include', // not needed in node-fetch, but okay + }); + + const responseBody = await response.text(); + + logger.info('Login response status:', response.status); + const headersObj: Record = {}; + response.headers.forEach((value, key) => { + headersObj[key] = value; + }); + logger.info('Login response headers:', headersObj); + logger.info('Login response body:', responseBody); + + if (response.status !== 200) { + throw new Error(`Login failed with status ${response.status}`); + } + + logger.info('Login successful, proceeding to Flex'); + await this.goto({ baseUrl: this._baseUrl, path }); + } catch (e) { + logger.error('Login request failed:', e); + throw e; } } From 90a68bc0800efd2b359ef72db5f3ec14546e824a Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 13:12:09 +0530 Subject: [PATCH 13/16] FLEXY-0000: preserver cookie with node call --- package-lock.json | 134 +++++++++++++++++- packages/flex-plugin-e2e-tests/package.json | 5 +- .../src/utils/pages/view/twilio-console.ts | 40 +++++- 3 files changed, 170 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffbee4a1e..da934630e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22907,6 +22907,29 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fetch-cookie": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", @@ -23312,6 +23335,18 @@ "node": ">=0.4.x" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -32557,6 +32592,26 @@ "dev": true, "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -38988,6 +39043,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/set-getter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", @@ -40938,6 +40999,24 @@ "dev": true, "license": "MIT" }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -42781,7 +42860,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -45441,11 +45519,14 @@ "@twilio/flex-dev-utils": "7.1.2", "@twilio/flex-plugins-api-client": "7.1.2", "axios": "^0.24.0", + "fetch-cookie": "^3.1.0", "lodash": "4.17.21", + "node-fetch": "^3.3.2", "package-json": "^7.0.0", "puppeteer": "^21.3.7", "replace-in-file": "^6.3.2", - "semver": "^7.3.5" + "semver": "^7.3.5", + "tough-cookie": "^5.1.2" }, "devDependencies": { "@types/lodash": "4.14.177", @@ -45510,6 +45591,15 @@ "node": ">=8" } }, + "packages/flex-plugin-e2e-tests/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "packages/flex-plugin-e2e-tests/node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -45532,6 +45622,16 @@ "node": ">=10" } }, + "packages/flex-plugin-e2e-tests/node_modules/fetch-cookie": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.1.0.tgz", + "integrity": "sha512-s/XhhreJpqH0ftkGVcQt8JE9bqk+zRn4jF5mPJXWZeQMCI5odV9K+wEWYbnzFPHgQZlvPSMjS4n4yawWE8RINw==", + "license": "Unlicense", + "dependencies": { + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^5.0.0" + } + }, "packages/flex-plugin-e2e-tests/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -45602,6 +45702,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/flex-plugin-e2e-tests/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "packages/flex-plugin-e2e-tests/node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -45660,6 +45778,18 @@ "node": ">=10" } }, + "packages/flex-plugin-e2e-tests/node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, "packages/flex-plugin-scripts": { "name": "@twilio/flex-plugin-scripts", "version": "7.1.2", diff --git a/packages/flex-plugin-e2e-tests/package.json b/packages/flex-plugin-e2e-tests/package.json index 045c6a413..4777a9470 100644 --- a/packages/flex-plugin-e2e-tests/package.json +++ b/packages/flex-plugin-e2e-tests/package.json @@ -37,11 +37,14 @@ "@twilio/flex-dev-utils": "7.1.2", "@twilio/flex-plugins-api-client": "7.1.2", "axios": "^0.24.0", + "fetch-cookie": "^3.1.0", "lodash": "4.17.21", + "node-fetch": "^3.3.2", "package-json": "^7.0.0", "puppeteer": "^21.3.7", "replace-in-file": "^6.3.2", - "semver": "^7.3.5" + "semver": "^7.3.5", + "tough-cookie": "^5.1.2" }, "devDependencies": { "@types/lodash": "4.14.177", diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 78f33531c..442ba556a 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -4,6 +4,9 @@ import { logger } from '@twilio/flex-dev-utils'; import { testParams } from '../../../core'; import { Base } from './base'; import { sleep } from '../../timers'; +import fetch, { Response, RequestInit } from 'node-fetch'; +import fetchCookie from 'fetch-cookie'; +import {CookieJar} from 'tough-cookie'; export class TwilioConsole extends Base { private static _loginForm = '#email'; @@ -26,6 +29,23 @@ export class TwilioConsole extends Base { */ private static _createLocalhostUrl = (port: number) => `http://localhost:${port}&localPort=${port}`; + private async fetchWithCookies(url: string, options: RequestInit = {}): Promise { + const cookies = await this.page.cookies(); + const cookieHeader = cookies.map(c => `${c.name}=${c.value}`).join('; '); + + const headers = { + ...(options.headers || {}), + 'Cookie': cookieHeader, + }; + + logger.info("headers", headers); + + return fetch(url, { + ...options, + headers, + }); + } + /** * Logs user in through service-login * @param cookies @@ -34,6 +54,9 @@ export class TwilioConsole extends Base { * @param accountSid */ async login(flexPath: string, accountSid: string, localhostPort: number, firstLoad: boolean = true): Promise { + const cookieJar = new CookieJar(); + const fetchWithCookies = fetchCookie(fetch, cookieJar); + logger.info('firstload', firstLoad); const redirectUrl = this._flexBaseUrl.includes('localhost') ? TwilioConsole._createLocalhostUrl(localhostPort) @@ -48,11 +71,17 @@ export class TwilioConsole extends Base { let csrfToken = null; try { - const response = await fetch('https://www.twilio.com/api/csrf'); - logger.info('Fetched CSRF response:', response.status); - const data = await response.json(); + const csrfResponse = await fetchWithCookies('https://www.twilio.com/api/csrf', { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + }); + logger.info('Fetched CSRF response:', csrfResponse.status); + const data = await csrfResponse.json(); + // @ts-ignore + csrfToken = data.csrf; logger.info('CSRF response JSON:', data); - csrfToken = data.csrf; } catch (e) { logger.error('CSRF fetch failed:', e); throw new Error('CSRF token is null'); @@ -68,7 +97,7 @@ export class TwilioConsole extends Base { logger.info('loginURL', loginURL); try { - const response = await fetch(loginURL, { + const response = await this.fetchWithCookies(loginURL, { method: 'POST', headers: { 'x-twilio-csrf': csrfToken, @@ -78,7 +107,6 @@ export class TwilioConsole extends Base { email: testParams.secrets.console.email, password: testParams.secrets.console.password, }), - credentials: 'include', // not needed in node-fetch, but okay }); const responseBody = await response.text(); From 91a1b354336d31b7f57fb11bc329a1631fd3a347 Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 13:39:37 +0530 Subject: [PATCH 14/16] FLEXY-0000: use ts 4.5.0 --- package-lock.json | 9 ++++---- package.json | 2 +- .../src/utils/pages/view/twilio-console.ts | 21 ++----------------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index da934630e..369bf7d1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "npm-force-resolutions": "^0.0.10", "nyc": "^15.1.0", "ts-jest": "^27.0.0", - "typescript": "4.3.5", + "typescript": "^4.5.0", "ultra-runner": "^3.10.5" } }, @@ -41689,10 +41689,11 @@ } }, "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index 383665aae..77a2e3b2a 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "npm-force-resolutions": "^0.0.10", "nyc": "^15.1.0", "ts-jest": "^27.0.0", - "typescript": "4.3.5", + "typescript": "^4.5.0", "ultra-runner": "^3.10.5" } } diff --git a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts index 442ba556a..4bdf79e67 100644 --- a/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts +++ b/packages/flex-plugin-e2e-tests/src/utils/pages/view/twilio-console.ts @@ -4,7 +4,7 @@ import { logger } from '@twilio/flex-dev-utils'; import { testParams } from '../../../core'; import { Base } from './base'; import { sleep } from '../../timers'; -import fetch, { Response, RequestInit } from 'node-fetch'; +import fetch from 'node-fetch'; import fetchCookie from 'fetch-cookie'; import {CookieJar} from 'tough-cookie'; @@ -29,23 +29,6 @@ export class TwilioConsole extends Base { */ private static _createLocalhostUrl = (port: number) => `http://localhost:${port}&localPort=${port}`; - private async fetchWithCookies(url: string, options: RequestInit = {}): Promise { - const cookies = await this.page.cookies(); - const cookieHeader = cookies.map(c => `${c.name}=${c.value}`).join('; '); - - const headers = { - ...(options.headers || {}), - 'Cookie': cookieHeader, - }; - - logger.info("headers", headers); - - return fetch(url, { - ...options, - headers, - }); - } - /** * Logs user in through service-login * @param cookies @@ -97,7 +80,7 @@ export class TwilioConsole extends Base { logger.info('loginURL', loginURL); try { - const response = await this.fetchWithCookies(loginURL, { + const response = await fetchWithCookies(loginURL, { method: 'POST', headers: { 'x-twilio-csrf': csrfToken, From 54c5429149d592cbaa9d97a572f7069b9ee70d52 Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 14:01:31 +0530 Subject: [PATCH 15/16] FLEXY-0000: ignore --- packages/flex-dev-utils/src/progress/lib/progress.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/flex-dev-utils/src/progress/lib/progress.ts b/packages/flex-dev-utils/src/progress/lib/progress.ts index c60eabcc7..b30e86f97 100644 --- a/packages/flex-dev-utils/src/progress/lib/progress.ts +++ b/packages/flex-dev-utils/src/progress/lib/progress.ts @@ -75,6 +75,7 @@ export const progress = async (title: string, action: Callback, disabled = return response; } catch (e) { + // @ts-ignore spinner.fail(e.message); throw e; From 615de0a4592a54b26db1d3a7455aa2b35adf6231 Mon Sep 17 00:00:00 2001 From: saroy Date: Sat, 12 Jul 2025 14:10:09 +0530 Subject: [PATCH 16/16] FLEXY-0000: ignore --- package-lock.json | 60 +++++++++++++++---- package.json | 2 +- .../src/progress/lib/progress.ts | 1 - packages/flex-plugin-e2e-tests/package.json | 2 +- 4 files changed, 49 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 369bf7d1a..bb2aee0d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "npm-force-resolutions": "^0.0.10", "nyc": "^15.1.0", "ts-jest": "^27.0.0", - "typescript": "^4.5.0", + "typescript": "4.3.5", "ultra-runner": "^3.10.5" } }, @@ -36561,6 +36561,12 @@ } } }, + "node_modules/puppeteer/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/puppeteer/node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -36587,6 +36593,33 @@ } } }, + "node_modules/puppeteer/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/puppeteer/node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/pvtsutils": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", @@ -41119,23 +41152,24 @@ "license": "MIT" }, "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -41689,10 +41723,10 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "devOptional": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -45527,7 +45561,7 @@ "puppeteer": "^21.3.7", "replace-in-file": "^6.3.2", "semver": "^7.3.5", - "tough-cookie": "^5.1.2" + "tough-cookie": "4" }, "devDependencies": { "@types/lodash": "4.14.177", diff --git a/package.json b/package.json index 77a2e3b2a..383665aae 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "npm-force-resolutions": "^0.0.10", "nyc": "^15.1.0", "ts-jest": "^27.0.0", - "typescript": "^4.5.0", + "typescript": "4.3.5", "ultra-runner": "^3.10.5" } } diff --git a/packages/flex-dev-utils/src/progress/lib/progress.ts b/packages/flex-dev-utils/src/progress/lib/progress.ts index b30e86f97..c60eabcc7 100644 --- a/packages/flex-dev-utils/src/progress/lib/progress.ts +++ b/packages/flex-dev-utils/src/progress/lib/progress.ts @@ -75,7 +75,6 @@ export const progress = async (title: string, action: Callback, disabled = return response; } catch (e) { - // @ts-ignore spinner.fail(e.message); throw e; diff --git a/packages/flex-plugin-e2e-tests/package.json b/packages/flex-plugin-e2e-tests/package.json index 4777a9470..3c20da388 100644 --- a/packages/flex-plugin-e2e-tests/package.json +++ b/packages/flex-plugin-e2e-tests/package.json @@ -44,7 +44,7 @@ "puppeteer": "^21.3.7", "replace-in-file": "^6.3.2", "semver": "^7.3.5", - "tough-cookie": "^5.1.2" + "tough-cookie": "4.1.4" }, "devDependencies": { "@types/lodash": "4.14.177",