@datacamp/learn-vm-scripts 1.8.8 → 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 +46 -10
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -366835,30 +366835,34 @@ var resetChrome = async ({ userDataDir }) => {
366835
366835
  };
366836
366836
 
366837
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"]';
366838
366841
  async function loginToSnowflake({
366839
366842
  url,
366840
366843
  username,
366841
366844
  page,
366842
- password
366845
+ password,
366846
+ otp
366843
366847
  }) {
366844
366848
  log("Navigating to Snowflake login page...");
366845
366849
  await page.goto(ensureHttps(url));
366846
- await page.waitForSelector('input[autocomplete="username"]');
366847
- const usernameField = await page.$('input[autocomplete="username"]');
366850
+ await page.waitForSelector(USERNAME_SELECTOR);
366851
+ const usernameField = await page.$(USERNAME_SELECTOR);
366848
366852
  if (!usernameField) {
366849
366853
  throw new Error("Username field not found");
366850
366854
  }
366851
366855
  await usernameField.click({ clickCount: 3 });
366852
366856
  await page.keyboard.press("Backspace");
366853
- await page.type('input[autocomplete="username"]', username);
366854
- await page.waitForSelector('input[autocomplete="current-password"]');
366855
- 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);
366856
366860
  if (!passwordField) {
366857
366861
  throw new Error("Password field not found");
366858
366862
  }
366859
366863
  await passwordField.click({ clickCount: 3 });
366860
366864
  await page.keyboard.press("Backspace");
366861
- await page.type('input[autocomplete="current-password"]', password);
366865
+ await page.type(PASSWORD_SELECTOR, password);
366862
366866
  await page.waitForSelector("button:not([disabled])");
366863
366867
  const buttons = await page.$$("button:not([disabled])");
366864
366868
  let signInButtonHandle;
@@ -366876,7 +366880,37 @@ async function loginToSnowflake({
366876
366880
  throw new Error("Could not find an enabled Sign in button on the page.");
366877
366881
  }
366878
366882
  await signInButtonHandle.click();
366879
- 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");
366880
366914
  }
366881
366915
 
366882
366916
  // src/fabricLogin.ts
@@ -366989,7 +367023,8 @@ var LoggedInProvidersSchema = objectType({
366989
367023
  cloudProvider: enumType(["aws", "azure", "snowflake", "n8n"]),
366990
367024
  username: stringType(),
366991
367025
  password: stringType(),
366992
- url: stringType()
367026
+ url: stringType(),
367027
+ otp: stringType().min(1).optional()
366993
367028
  });
366994
367029
  var Input = discriminatedUnionType("cloudProvider", [
366995
367030
  LoggedOutProvidersSchema,
@@ -367045,7 +367080,8 @@ var handleInput = async ({ line, page }) => {
367045
367080
  url: input.url,
367046
367081
  username: input.username,
367047
367082
  page,
367048
- password: input.password
367083
+ password: input.password,
367084
+ otp: input.otp
367049
367085
  });
367050
367086
  break;
367051
367087
  case "perplexity":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datacamp/learn-vm-scripts",
3
- "version": "1.8.8",
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",