@datacamp/learn-vm-scripts 1.8.7 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.cjs +47 -18
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -366765,14 +366765,7 @@ async function loginToAWS({
366765
366765
  querySelector: 'input[name="password"]',
366766
366766
  value: password
366767
366767
  });
366768
- try {
366769
- const closeFeedbackPopupButton = 'button[title="Close feedback dialog"]';
366770
- await page.waitForSelector(closeFeedbackPopupButton, { timeout: 2e3 });
366771
- await page.click(closeFeedbackPopupButton);
366772
- } catch {
366773
- log("Feedback popup not found or not clickable");
366774
- }
366775
- const signInButton = 'button[type="submit"]';
366768
+ const signInButton = 'button[id="signin_button"]';
366776
366769
  await page.waitForSelector(signInButton);
366777
366770
  await page.click(signInButton);
366778
366771
  log("Logged in to AWS successfully");
@@ -366842,30 +366835,34 @@ var resetChrome = async ({ userDataDir }) => {
366842
366835
  };
366843
366836
 
366844
366837
  // src/snowflakeLogin.ts
366838
+ var USERNAME_SELECTOR = 'input[autocomplete="username"]';
366839
+ var PASSWORD_SELECTOR = 'input[autocomplete="current-password"]';
366840
+ var OTP_SELECTOR = 'input[autocomplete="one-time-code"]';
366845
366841
  async function loginToSnowflake({
366846
366842
  url,
366847
366843
  username,
366848
366844
  page,
366849
- password
366845
+ password,
366846
+ otp
366850
366847
  }) {
366851
366848
  log("Navigating to Snowflake login page...");
366852
366849
  await page.goto(ensureHttps(url));
366853
- await page.waitForSelector('input[autocomplete="username"]');
366854
- const usernameField = await page.$('input[autocomplete="username"]');
366850
+ await page.waitForSelector(USERNAME_SELECTOR);
366851
+ const usernameField = await page.$(USERNAME_SELECTOR);
366855
366852
  if (!usernameField) {
366856
366853
  throw new Error("Username field not found");
366857
366854
  }
366858
366855
  await usernameField.click({ clickCount: 3 });
366859
366856
  await page.keyboard.press("Backspace");
366860
- await page.type('input[autocomplete="username"]', username);
366861
- await page.waitForSelector('input[autocomplete="current-password"]');
366862
- const passwordField = await page.$('input[autocomplete="current-password"]');
366857
+ await page.type(USERNAME_SELECTOR, username);
366858
+ await page.waitForSelector(PASSWORD_SELECTOR);
366859
+ const passwordField = await page.$(PASSWORD_SELECTOR);
366863
366860
  if (!passwordField) {
366864
366861
  throw new Error("Password field not found");
366865
366862
  }
366866
366863
  await passwordField.click({ clickCount: 3 });
366867
366864
  await page.keyboard.press("Backspace");
366868
- await page.type('input[autocomplete="current-password"]', password);
366865
+ await page.type(PASSWORD_SELECTOR, password);
366869
366866
  await page.waitForSelector("button:not([disabled])");
366870
366867
  const buttons = await page.$$("button:not([disabled])");
366871
366868
  let signInButtonHandle;
@@ -366883,7 +366880,37 @@ async function loginToSnowflake({
366883
366880
  throw new Error("Could not find an enabled Sign in button on the page.");
366884
366881
  }
366885
366882
  await signInButtonHandle.click();
366886
- log("Logged in to Snowflake!");
366883
+ if (otp != null) {
366884
+ log("Handling Snowflake OTP challenge...");
366885
+ await page.waitForSelector(OTP_SELECTOR, {
366886
+ timeout: 15e3
366887
+ });
366888
+ const otpField = await page.$(OTP_SELECTOR);
366889
+ if (!otpField) {
366890
+ throw new Error("OTP field not found");
366891
+ }
366892
+ await otpField.click({ clickCount: 3 });
366893
+ await page.keyboard.press("Backspace");
366894
+ await page.type(OTP_SELECTOR, otp);
366895
+ const enabledButtons = await page.$$("button:not([disabled])");
366896
+ let continueButtonHandle;
366897
+ for (const btn of enabledButtons) {
366898
+ const textContent = await page.evaluate(
366899
+ (el) => el.textContent?.trim(),
366900
+ btn
366901
+ );
366902
+ if (textContent === "Continue") {
366903
+ continueButtonHandle = btn;
366904
+ break;
366905
+ }
366906
+ }
366907
+ if (!continueButtonHandle) {
366908
+ throw new Error("Could not find an enabled Continue button on the page.");
366909
+ }
366910
+ await continueButtonHandle.click();
366911
+ log("Snowflake OTP challenge completed");
366912
+ }
366913
+ log("Logged in to Snowflake");
366887
366914
  }
366888
366915
 
366889
366916
  // src/fabricLogin.ts
@@ -366996,7 +367023,8 @@ var LoggedInProvidersSchema = objectType({
366996
367023
  cloudProvider: enumType(["aws", "azure", "snowflake", "n8n"]),
366997
367024
  username: stringType(),
366998
367025
  password: stringType(),
366999
- url: stringType()
367026
+ url: stringType(),
367027
+ otp: stringType().min(1).optional()
367000
367028
  });
367001
367029
  var Input = discriminatedUnionType("cloudProvider", [
367002
367030
  LoggedOutProvidersSchema,
@@ -367052,7 +367080,8 @@ var handleInput = async ({ line, page }) => {
367052
367080
  url: input.url,
367053
367081
  username: input.username,
367054
367082
  page,
367055
- password: input.password
367083
+ password: input.password,
367084
+ otp: input.otp
367056
367085
  });
367057
367086
  break;
367058
367087
  case "perplexity":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datacamp/learn-vm-scripts",
3
- "version": "1.8.7",
3
+ "version": "1.9.0",
4
4
  "repository": "git@github.com:datacamp-engineering/learn-vm-scripts.git",
5
5
  "description": "Scripts used by VMs in learn.",
6
6
  "main": "./dist/index.cjs",