@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.
- package/dist/index.cjs +47 -18
- 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
|
-
|
|
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(
|
|
366854
|
-
const usernameField = await page.$(
|
|
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(
|
|
366861
|
-
await page.waitForSelector(
|
|
366862
|
-
const passwordField = await page.$(
|
|
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(
|
|
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
|
-
|
|
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