From 625b83cc3e29cd71ce341493cb5225334bb86382 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 14:21:59 -0500 Subject: [PATCH 01/21] Move login function to new crate with all dependencies --- .vscode/settings.json | 5 +- Cargo.lock | 19 +++ crates/turborepo-auth/Cargo.toml | 19 +++ crates/turborepo-auth/src/lib.rs | 145 +++++++++++++++++++++ crates/turborepo-lib/Cargo.toml | 1 + crates/turborepo-lib/src/commands/login.rs | 105 +-------------- crates/turborepo-lib/src/config/mod.rs | 1 + 7 files changed, 192 insertions(+), 103 deletions(-) create mode 100644 crates/turborepo-auth/Cargo.toml create mode 100644 crates/turborepo-auth/src/lib.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 7bc6aa4332866..91dc8f59ecca4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,5 +21,8 @@ }, "search.exclude": { "crates/turbopack-tests/tests/snapshot/**": true - } + }, + "rust-analyzer.linkedProjects": [ + "./crates/turborepo-auth-manual/Cargo.toml" + ] } diff --git a/Cargo.lock b/Cargo.lock index 966713b0005de..cbb82c269271c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9949,6 +9949,24 @@ dependencies = [ "url", ] +[[package]] +name = "turborepo-auth" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "axum-server", + "config", + "hostname", + "reqwest", + "serde", + "thiserror", + "tokio", + "tracing", + "turborepo-ui", + "webbrowser", +] + [[package]] name = "turborepo-cache" version = "0.1.0" @@ -10140,6 +10158,7 @@ dependencies = [ "turbo-updater", "turbopath", "turborepo-api-client", + "turborepo-auth", "turborepo-cache", "turborepo-ci", "turborepo-env", diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml new file mode 100644 index 0000000000000..1121f4eed1dc0 --- /dev/null +++ b/crates/turborepo-auth/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "turborepo-auth" +version = "0.1.0" +edition = "2021" + + +[dependencies] +anyhow.workspace = true +axum-server = { workspace = true } +axum.workspace = true +config = "0.13" +hostname = "0.3.1" +reqwest.workspace = true +serde.workspace = true +thiserror = "1.0.38" +tokio.workspace = true +tracing.workspace = true +turborepo-ui.workspace = true +webbrowser = { workspace = true } diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs new file mode 100644 index 0000000000000..ef8a5f66a4133 --- /dev/null +++ b/crates/turborepo-auth/src/lib.rs @@ -0,0 +1,145 @@ +#[cfg(not(test))] +use std::net::SocketAddr; +use std::sync::Arc; + +use anyhow::{anyhow, Result}; +#[cfg(not(test))] +use axum::{extract::Query, response::Redirect, routing::get, Router}; +use reqwest::Url; +use serde::Deserialize; +use tokio::sync::OnceCell; +#[cfg(not(test))] +use tracing::warn; +use turborepo_ui::{start_spinner, BOLD, CYAN}; + +// TODO: fix these imports not to use turborepo-lib +use crate::commands::CommandBase; + +const DEFAULT_HOST_NAME: &str = "127.0.0.1"; +const DEFAULT_PORT: u16 = 9789; +const DEFAULT_SSO_PROVIDER: &str = "SAML/OIDC Single Sign-On"; + +use thiserror::Error; +#[derive(Debug, Error)] +pub enum Error { + #[error( + "loginUrl is configured to \"{value}\", but cannot be a base URL. This happens in \ + situations like using a `data:` URL." + )] + LoginUrlCannotBeABase { value: String }, +} + +pub async fn login(base: &mut CommandBase) -> Result<()> { + let repo_config = base.repo_config()?; + let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); + let login_url_configuration = repo_config.login_url(); + let mut login_url = Url::parse(login_url_configuration)?; + + login_url + .path_segments_mut() + .map_err(|_: ()| Error::LoginUrlCannotBeABase { + value: login_url_configuration.to_string(), + })? + .extend(["turborepo", "token"]); + + login_url + .query_pairs_mut() + .append_pair("redirect_uri", &redirect_url); + + println!(">>> Opening browser to {login_url}"); + let spinner = start_spinner("Waiting for your authorization..."); + direct_user_to_url(login_url.as_str()); + + let token_cell = Arc::new(OnceCell::new()); + run_login_one_shot_server( + DEFAULT_PORT, + repo_config.login_url().to_string(), + token_cell.clone(), + ) + .await?; + + spinner.finish_and_clear(); + + let token = token_cell + .get() + .ok_or_else(|| anyhow!("Failed to get token"))?; + + base.user_config_mut()?.set_token(Some(token.to_string()))?; + + let client = base.api_client()?; + let user_response = client.get_user(token.as_str()).await?; + + let ui = &base.ui; + + println!( + " +{} Turborepo CLI authorized for {} + +{} + +{} + +", + ui.rainbow(">>> Success!"), + user_response.user.email, + ui.apply( + CYAN.apply_to("To connect to your Remote Cache, run the following in any turborepo:") + ), + ui.apply(BOLD.apply_to(" npx turbo link")) + ); + Ok(()) +} + +// TODO: Duplicated +#[cfg(test)] +fn direct_user_to_url(_: &str) {} +#[cfg(not(test))] +fn direct_user_to_url(url: &str) { + if webbrowser::open(url).is_err() { + warn!("Failed to open browser. Please visit {url} in your browser."); + } +} + +#[derive(Debug, Clone, Deserialize)] +struct LoginPayload { + #[cfg(not(test))] + token: String, +} + +#[cfg(test)] +async fn run_login_one_shot_server( + _: u16, + _: String, + login_token: Arc>, +) -> Result<()> { + login_token + .set(turborepo_vercel_api_mock::EXPECTED_TOKEN.to_string()) + .unwrap(); + Ok(()) +} + +#[cfg(not(test))] +async fn run_login_one_shot_server( + port: u16, + login_url_base: String, + login_token: Arc>, +) -> Result<()> { + let handle = axum_server::Handle::new(); + let route_handle = handle.clone(); + let app = Router::new() + // `GET /` goes to `root` + .route( + "/", + get(|login_payload: Query| async move { + let _ = login_token.set(login_payload.0.token); + route_handle.shutdown(); + Redirect::to(&format!("{login_url_base}/turborepo/success")) + }), + ); + let addr = SocketAddr::from(([127, 0, 0, 1], port)); + + Ok(axum_server::bind(addr) + .handle(handle) + .serve(app.into_make_service()) + .await?) +} diff --git a/crates/turborepo-lib/Cargo.toml b/crates/turborepo-lib/Cargo.toml index d4fb538fa2546..0a23d523d1129 100644 --- a/crates/turborepo-lib/Cargo.toml +++ b/crates/turborepo-lib/Cargo.toml @@ -81,6 +81,7 @@ tokio-util = { version = "0.7.7", features = ["compat"] } tonic = { version = "0.8.3", features = ["transport"] } tonic-reflection = { version = "0.6.0", optional = true } tower = "0.4.13" +turborepo-auth = { path = "../turborepo-auth" } turborepo-fs = { path = "../turborepo-fs" } turborepo-vercel-api = { path = "../turborepo-vercel-api" } uds_windows = "1.0.2" diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index c81bbb0dadf99..409955806a79c 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -18,6 +18,8 @@ const DEFAULT_HOST_NAME: &str = "127.0.0.1"; const DEFAULT_PORT: u16 = 9789; const DEFAULT_SSO_PROVIDER: &str = "SAML/OIDC Single Sign-On"; +use turborepo_auth::login; + pub async fn sso_login(base: &mut CommandBase, sso_team: &str) -> Result<()> { let repo_config = base.repo_config()?; let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); @@ -92,64 +94,7 @@ fn make_token_name() -> Result { } pub async fn login(base: &mut CommandBase) -> Result<()> { - let repo_config = base.repo_config()?; - let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); - let login_url_configuration = repo_config.login_url(); - let mut login_url = Url::parse(login_url_configuration)?; - - login_url - .path_segments_mut() - .map_err(|_: ()| Error::LoginUrlCannotBeABase { - value: login_url_configuration.to_string(), - })? - .extend(["turborepo", "token"]); - - login_url - .query_pairs_mut() - .append_pair("redirect_uri", &redirect_url); - - println!(">>> Opening browser to {login_url}"); - let spinner = start_spinner("Waiting for your authorization..."); - direct_user_to_url(login_url.as_str()); - - let token_cell = Arc::new(OnceCell::new()); - run_login_one_shot_server( - DEFAULT_PORT, - repo_config.login_url().to_string(), - token_cell.clone(), - ) - .await?; - - spinner.finish_and_clear(); - - let token = token_cell - .get() - .ok_or_else(|| anyhow!("Failed to get token"))?; - - base.user_config_mut()?.set_token(Some(token.to_string()))?; - - let client = base.api_client()?; - let user_response = client.get_user(token.as_str()).await?; - - let ui = &base.ui; - - println!( - " -{} Turborepo CLI authorized for {} - -{} - -{} - -", - ui.rainbow(">>> Success!"), - user_response.user.email, - ui.apply( - CYAN.apply_to("To connect to your Remote Cache, run the following in any turborepo:") - ), - ui.apply(BOLD.apply_to(" npx turbo link")) - ); - Ok(()) + return login(base); } #[cfg(test)] @@ -161,53 +106,9 @@ fn direct_user_to_url(url: &str) { } } -#[derive(Debug, Clone, Deserialize)] -struct LoginPayload { - #[cfg(not(test))] - token: String, -} - #[cfg(test)] const EXPECTED_VERIFICATION_TOKEN: &str = "expected_verification_token"; -#[cfg(test)] -async fn run_login_one_shot_server( - _: u16, - _: String, - login_token: Arc>, -) -> Result<()> { - login_token - .set(turborepo_vercel_api_mock::EXPECTED_TOKEN.to_string()) - .unwrap(); - Ok(()) -} - -#[cfg(not(test))] -async fn run_login_one_shot_server( - port: u16, - login_url_base: String, - login_token: Arc>, -) -> Result<()> { - let handle = axum_server::Handle::new(); - let route_handle = handle.clone(); - let app = Router::new() - // `GET /` goes to `root` - .route( - "/", - get(|login_payload: Query| async move { - let _ = login_token.set(login_payload.0.token); - route_handle.shutdown(); - Redirect::to(&format!("{login_url_base}/turborepo/success")) - }), - ); - let addr = SocketAddr::from(([127, 0, 0, 1], port)); - - Ok(axum_server::bind(addr) - .handle(handle) - .serve(app.into_make_service()) - .await?) -} - #[derive(Debug, Default, Clone, Deserialize)] #[allow(dead_code)] struct SsoPayload { diff --git a/crates/turborepo-lib/src/config/mod.rs b/crates/turborepo-lib/src/config/mod.rs index 6c9bf603014da..00ec4f6e860a5 100644 --- a/crates/turborepo-lib/src/config/mod.rs +++ b/crates/turborepo-lib/src/config/mod.rs @@ -37,6 +37,7 @@ pub enum Error { one" )] NoTurboJSON, + // TODO: remove LoginUrlCannotBeABase once sso_login is moved out to turborepo-auth crate #[error( "loginUrl is configured to \"{value}\", but cannot be a base URL. This happens in \ situations like using a `data:` URL." From f8e3a33c6f1b796e2b901e49c6f5284bb6908a43 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 22:37:42 -0500 Subject: [PATCH 02/21] Hardcode login URL instead of using command base --- crates/turborepo-auth/src/lib.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index ef8a5f66a4133..e2da785a66391 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -29,16 +29,17 @@ pub enum Error { LoginUrlCannotBeABase { value: String }, } +// TODO: make this configurable +const LOGIN_URL: &str = "https://vercel.com/api"; + pub async fn login(base: &mut CommandBase) -> Result<()> { - let repo_config = base.repo_config()?; let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); - let login_url_configuration = repo_config.login_url(); - let mut login_url = Url::parse(login_url_configuration)?; + let mut login_url = Url::parse(LOGIN_URL)?; login_url .path_segments_mut() .map_err(|_: ()| Error::LoginUrlCannotBeABase { - value: login_url_configuration.to_string(), + value: LOGIN_URL.to_string(), })? .extend(["turborepo", "token"]); @@ -51,12 +52,7 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { direct_user_to_url(login_url.as_str()); let token_cell = Arc::new(OnceCell::new()); - run_login_one_shot_server( - DEFAULT_PORT, - repo_config.login_url().to_string(), - token_cell.clone(), - ) - .await?; + run_login_one_shot_server(DEFAULT_PORT, LOGIN_URL.to_string(), token_cell.clone()).await?; spinner.finish_and_clear(); From c71289cce4265d7827abb91a865e943b66335a23 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:11:24 -0500 Subject: [PATCH 03/21] Pass api client and ui into login instead of off base --- Cargo.lock | 1 + crates/turborepo-auth/Cargo.toml | 1 + crates/turborepo-auth/src/lib.rs | 11 +++++------ crates/turborepo-lib/src/commands/login.rs | 4 +++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cbb82c269271c..ee5aad4dc7974 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9963,6 +9963,7 @@ dependencies = [ "thiserror", "tokio", "tracing", + "turborepo-api-client", "turborepo-ui", "webbrowser", ] diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml index 1121f4eed1dc0..22fd651ab39ef 100644 --- a/crates/turborepo-auth/Cargo.toml +++ b/crates/turborepo-auth/Cargo.toml @@ -15,5 +15,6 @@ serde.workspace = true thiserror = "1.0.38" tokio.workspace = true tracing.workspace = true +turborepo-api-client = { workspace = true } turborepo-ui.workspace = true webbrowser = { workspace = true } diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index e2da785a66391..a5f27e62a2561 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -10,7 +10,8 @@ use serde::Deserialize; use tokio::sync::OnceCell; #[cfg(not(test))] use tracing::warn; -use turborepo_ui::{start_spinner, BOLD, CYAN}; +use turborepo_api_client::APIClient; +use turborepo_ui::{start_spinner, BOLD, CYAN, UI}; // TODO: fix these imports not to use turborepo-lib use crate::commands::CommandBase; @@ -32,7 +33,7 @@ pub enum Error { // TODO: make this configurable const LOGIN_URL: &str = "https://vercel.com/api"; -pub async fn login(base: &mut CommandBase) -> Result<()> { +pub async fn login(base: &mut CommandBase, api_client: APIClient, ui: UI) -> Result<()> { let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(LOGIN_URL)?; @@ -62,10 +63,8 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { base.user_config_mut()?.set_token(Some(token.to_string()))?; - let client = base.api_client()?; - let user_response = client.get_user(token.as_str()).await?; - - let ui = &base.ui; + // TODO: make this a request to /teams endpoint instead? + let user_response = api_client.get_user(token.as_str()).await?; println!( " diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 409955806a79c..fd9e15252013d 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -94,7 +94,9 @@ fn make_token_name() -> Result { } pub async fn login(base: &mut CommandBase) -> Result<()> { - return login(base); + const api_client: APIClient = base.api_client()?; + const ui: UI = &base.ui; + return login(base, api_client, ui); } #[cfg(test)] From 1e2bbfa611d288252f24c8e3262beb0d4e86b7e3 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:18:34 -0500 Subject: [PATCH 04/21] Pass a closure to set the token instead of doing it in the auth crate --- crates/turborepo-auth/src/lib.rs | 12 ++++++++++-- crates/turborepo-lib/src/commands/login.rs | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index a5f27e62a2561..d11f0a13c127b 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -33,7 +33,12 @@ pub enum Error { // TODO: make this configurable const LOGIN_URL: &str = "https://vercel.com/api"; -pub async fn login(base: &mut CommandBase, api_client: APIClient, ui: UI) -> Result<()> { +pub async fn login( + base: &mut CommandBase, + api_client: APIClient, + ui: UI, + set_token: fn(&str) -> (), +) -> Result<()> { let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(LOGIN_URL)?; @@ -61,7 +66,10 @@ pub async fn login(base: &mut CommandBase, api_client: APIClient, ui: UI) -> Res .get() .ok_or_else(|| anyhow!("Failed to get token"))?; - base.user_config_mut()?.set_token(Some(token.to_string()))?; + // This function is passed in from turborepo-lib + // TODO: inline this here and only pass in the location to write the token as an + // optional arg. + set_token(token); // TODO: make this a request to /teams endpoint instead? let user_response = api_client.get_user(token.as_str()).await?; diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index fd9e15252013d..6a3e3ffbdeaa3 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -96,7 +96,12 @@ fn make_token_name() -> Result { pub async fn login(base: &mut CommandBase) -> Result<()> { const api_client: APIClient = base.api_client()?; const ui: UI = &base.ui; - return login(base, api_client, ui); + + let set_token = |token: &str| -> () { + base.user_config_mut()?.set_token(Some(token.to_string()))?; + }; + + return login(base, api_client, ui, set_token); } #[cfg(test)] From efd2273c8bb639b29106fc9ebcb313fba9af971f Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:20:06 -0500 Subject: [PATCH 05/21] Remove CommandBase arg to login function --- crates/turborepo-auth/src/lib.rs | 10 +--------- crates/turborepo-lib/src/commands/login.rs | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index d11f0a13c127b..e56694f81d89d 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -13,9 +13,6 @@ use tracing::warn; use turborepo_api_client::APIClient; use turborepo_ui::{start_spinner, BOLD, CYAN, UI}; -// TODO: fix these imports not to use turborepo-lib -use crate::commands::CommandBase; - const DEFAULT_HOST_NAME: &str = "127.0.0.1"; const DEFAULT_PORT: u16 = 9789; const DEFAULT_SSO_PROVIDER: &str = "SAML/OIDC Single Sign-On"; @@ -33,12 +30,7 @@ pub enum Error { // TODO: make this configurable const LOGIN_URL: &str = "https://vercel.com/api"; -pub async fn login( - base: &mut CommandBase, - api_client: APIClient, - ui: UI, - set_token: fn(&str) -> (), -) -> Result<()> { +pub async fn login(api_client: APIClient, ui: UI, set_token: fn(&str) -> ()) -> Result<()> { let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(LOGIN_URL)?; diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 6a3e3ffbdeaa3..3855c4c88a34b 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -101,7 +101,7 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { base.user_config_mut()?.set_token(Some(token.to_string()))?; }; - return login(base, api_client, ui, set_token); + return login(api_client, ui, set_token); } #[cfg(test)] From 03da5fc957406a1167982efca170317029f70208 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:21:47 -0500 Subject: [PATCH 06/21] Remove unused constant --- crates/turborepo-auth/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index e56694f81d89d..302cc89aef084 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -15,7 +15,6 @@ use turborepo_ui::{start_spinner, BOLD, CYAN, UI}; const DEFAULT_HOST_NAME: &str = "127.0.0.1"; const DEFAULT_PORT: u16 = 9789; -const DEFAULT_SSO_PROVIDER: &str = "SAML/OIDC Single Sign-On"; use thiserror::Error; #[derive(Debug, Error)] From d03d982f220c6c7787cf2868189c8bc9d306670e Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:41:37 -0500 Subject: [PATCH 07/21] Fix some compiler errors --- .vscode/settings.json | 3 ++- crates/turborepo-auth/src/lib.rs | 7 +++++-- crates/turborepo-lib/src/commands/login.rs | 21 ++++++++++++++------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 91dc8f59ecca4..4236c0e152473 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,5 +24,6 @@ }, "rust-analyzer.linkedProjects": [ "./crates/turborepo-auth-manual/Cargo.toml" - ] + ], + "cSpell.enabled": false } diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index 302cc89aef084..91a468ea0fa32 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -29,7 +29,10 @@ pub enum Error { // TODO: make this configurable const LOGIN_URL: &str = "https://vercel.com/api"; -pub async fn login(api_client: APIClient, ui: UI, set_token: fn(&str) -> ()) -> Result<()> { +pub async fn login(api_client: APIClient, ui: &UI, set_token: F) -> Result<()> +where + F: Fn(&str) -> Result<()>, +{ let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(LOGIN_URL)?; @@ -60,7 +63,7 @@ pub async fn login(api_client: APIClient, ui: UI, set_token: fn(&str) -> ()) -> // This function is passed in from turborepo-lib // TODO: inline this here and only pass in the location to write the token as an // optional arg. - set_token(token); + let _ = set_token(token); // TODO: make this a request to /teams endpoint instead? let user_response = api_client.get_user(token.as_str()).await?; diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 3855c4c88a34b..7202ce9bb4f77 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -10,7 +10,8 @@ use serde::Deserialize; use tokio::sync::OnceCell; #[cfg(not(test))] use tracing::warn; -use turborepo_ui::{start_spinner, BOLD, CYAN}; +use turborepo_api_client::APIClient; +use turborepo_ui::{start_spinner, BOLD, CYAN, UI}; use crate::{commands::CommandBase, config::Error}; @@ -18,7 +19,7 @@ const DEFAULT_HOST_NAME: &str = "127.0.0.1"; const DEFAULT_PORT: u16 = 9789; const DEFAULT_SSO_PROVIDER: &str = "SAML/OIDC Single Sign-On"; -use turborepo_auth::login; +use turborepo_auth::login as auth_login; pub async fn sso_login(base: &mut CommandBase, sso_team: &str) -> Result<()> { let repo_config = base.repo_config()?; @@ -94,14 +95,20 @@ fn make_token_name() -> Result { } pub async fn login(base: &mut CommandBase) -> Result<()> { - const api_client: APIClient = base.api_client()?; - const ui: UI = &base.ui; + let api_client: APIClient = base.api_client()?; + let ui: &UI = &base.ui; - let set_token = |token: &str| -> () { - base.user_config_mut()?.set_token(Some(token.to_string()))?; + // let set_token = |token: &str| -> () { + // base.user_config_mut()?.set_token(Some(token.to_string())); + // return (); + // }; + + let set_token = |token: &str| -> Result<(), _> { + base.user_config_mut()?.set_token(Some(token.to_string())); + Ok(()) }; - return login(api_client, ui, set_token); + return auth_login(api_client, ui, set_token); } #[cfg(test)] From 7f35c934f6a0494377d02f2242b348bb9c81484d Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 25 Sep 2023 23:43:49 -0500 Subject: [PATCH 08/21] Fixup --- crates/turborepo-auth/src/lib.rs | 4 ++-- crates/turborepo-lib/src/commands/login.rs | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index 91a468ea0fa32..3803f76f367b2 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -29,9 +29,9 @@ pub enum Error { // TODO: make this configurable const LOGIN_URL: &str = "https://vercel.com/api"; -pub async fn login(api_client: APIClient, ui: &UI, set_token: F) -> Result<()> +pub async fn login(api_client: APIClient, ui: &UI, mut set_token: F) -> Result<()> where - F: Fn(&str) -> Result<()>, + F: FnMut(&str) -> Result<()>, { let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(LOGIN_URL)?; diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 7202ce9bb4f77..77c3d95af291d 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -98,17 +98,12 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; let ui: &UI = &base.ui; - // let set_token = |token: &str| -> () { - // base.user_config_mut()?.set_token(Some(token.to_string())); - // return (); - // }; - let set_token = |token: &str| -> Result<(), _> { base.user_config_mut()?.set_token(Some(token.to_string())); Ok(()) }; - return auth_login(api_client, ui, set_token); + return auth_login(api_client, ui, set_token).await; } #[cfg(test)] From 99b3d21c6c44cc155168cb0aa9ce0c14c4a07eb9 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 00:02:26 -0500 Subject: [PATCH 09/21] reset workspace settings --- .vscode/settings.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4236c0e152473..7bc6aa4332866 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,9 +21,5 @@ }, "search.exclude": { "crates/turbopack-tests/tests/snapshot/**": true - }, - "rust-analyzer.linkedProjects": [ - "./crates/turborepo-auth-manual/Cargo.toml" - ], - "cSpell.enabled": false + } } From a81fe999f6217cd170a7ec10f677fa6093f6d4ba Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 09:51:51 -0500 Subject: [PATCH 10/21] Fix set_token closure types --- crates/turborepo-lib/src/commands/login.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 77c3d95af291d..d568c6d5d3289 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -11,7 +11,7 @@ use tokio::sync::OnceCell; #[cfg(not(test))] use tracing::warn; use turborepo_api_client::APIClient; -use turborepo_ui::{start_spinner, BOLD, CYAN, UI}; +use turborepo_ui::{start_spinner, BOLD, CYAN}; use crate::{commands::CommandBase, config::Error}; @@ -96,14 +96,13 @@ fn make_token_name() -> Result { pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; - let ui: &UI = &base.ui; + let ui = base.ui.clone(); - let set_token = |token: &str| -> Result<(), _> { - base.user_config_mut()?.set_token(Some(token.to_string())); - Ok(()) + let set_token = |token: &str| -> Result<(), anyhow::Error> { + Ok(base.user_config_mut()?.set_token(Some(token.to_string()))?) }; - return auth_login(api_client, ui, set_token).await; + return auth_login(api_client, &ui, set_token).await; } #[cfg(test)] From 8fa432fde41d69e36d6a6ef9dc97b9855b82c369 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 09:54:05 -0500 Subject: [PATCH 11/21] comment --- crates/turborepo-lib/src/commands/login.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index d568c6d5d3289..f903ca2ebdffc 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -98,6 +98,8 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; let ui = base.ui.clone(); + // We are passing a closure here, but it would be cleaner if we made a + // turborepo-config crate and imported that into turborepo-auth. let set_token = |token: &str| -> Result<(), anyhow::Error> { Ok(base.user_config_mut()?.set_token(Some(token.to_string()))?) }; From 3d6bb062bef0b7991696ea3802192b988d48a7a3 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 09:55:08 -0500 Subject: [PATCH 12/21] dont ignore error --- crates/turborepo-auth/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index 3803f76f367b2..e60ca096bd8f1 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -63,7 +63,7 @@ where // This function is passed in from turborepo-lib // TODO: inline this here and only pass in the location to write the token as an // optional arg. - let _ = set_token(token); + set_token(token)?; // TODO: make this a request to /teams endpoint instead? let user_response = api_client.get_user(token.as_str()).await?; From 46007ffce94f187c9593bf96c1a4c1e6989cce64 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 09:57:46 -0500 Subject: [PATCH 13/21] add missing test crate --- Cargo.lock | 1 + crates/turborepo-auth/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ee5aad4dc7974..020adf3704c3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9965,6 +9965,7 @@ dependencies = [ "tracing", "turborepo-api-client", "turborepo-ui", + "turborepo-vercel-api-mock", "webbrowser", ] diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml index 22fd651ab39ef..1084919877f55 100644 --- a/crates/turborepo-auth/Cargo.toml +++ b/crates/turborepo-auth/Cargo.toml @@ -17,4 +17,5 @@ tokio.workspace = true tracing.workspace = true turborepo-api-client = { workspace = true } turborepo-ui.workspace = true +turborepo-vercel-api-mock = { workspace = true } webbrowser = { workspace = true } From 64d0a87904d6d17c9b810266b94997fe5613dec7 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 10:02:04 -0500 Subject: [PATCH 14/21] Remove unused deps --- Cargo.lock | 2 -- crates/turborepo-auth/Cargo.toml | 2 -- 2 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 020adf3704c3a..afad2a02027bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9956,8 +9956,6 @@ dependencies = [ "anyhow", "axum", "axum-server", - "config", - "hostname", "reqwest", "serde", "thiserror", diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml index 1084919877f55..cb024a0d4afc4 100644 --- a/crates/turborepo-auth/Cargo.toml +++ b/crates/turborepo-auth/Cargo.toml @@ -8,8 +8,6 @@ edition = "2021" anyhow.workspace = true axum-server = { workspace = true } axum.workspace = true -config = "0.13" -hostname = "0.3.1" reqwest.workspace = true serde.workspace = true thiserror = "1.0.38" From c58119addbf05ee3628ea47a42d5b03891b3ba12 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 10:22:38 -0500 Subject: [PATCH 15/21] Fix login URL --- crates/turborepo-auth/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index e60ca096bd8f1..b8c64c8401aba 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -27,7 +27,7 @@ pub enum Error { } // TODO: make this configurable -const LOGIN_URL: &str = "https://vercel.com/api"; +const LOGIN_URL: &str = "https://vercel.com"; pub async fn login(api_client: APIClient, ui: &UI, mut set_token: F) -> Result<()> where From 2b9fe0b94cc88322959c9952bee3c744b28e2ccc Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 10:41:41 -0500 Subject: [PATCH 16/21] Pass in login_url_config so it comes from config --- crates/turborepo-auth/src/lib.rs | 21 ++++++++++++++------- crates/turborepo-lib/src/commands/login.rs | 3 ++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index b8c64c8401aba..58035548f94b0 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -26,20 +26,22 @@ pub enum Error { LoginUrlCannotBeABase { value: String }, } -// TODO: make this configurable -const LOGIN_URL: &str = "https://vercel.com"; - -pub async fn login(api_client: APIClient, ui: &UI, mut set_token: F) -> Result<()> +pub async fn login( + api_client: APIClient, + ui: &UI, + mut set_token: F, + login_url_configuration: &str, +) -> Result<()> where F: FnMut(&str) -> Result<()>, { let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); - let mut login_url = Url::parse(LOGIN_URL)?; + let mut login_url = Url::parse(login_url_configuration)?; login_url .path_segments_mut() .map_err(|_: ()| Error::LoginUrlCannotBeABase { - value: LOGIN_URL.to_string(), + value: login_url_configuration.to_string(), })? .extend(["turborepo", "token"]); @@ -52,7 +54,12 @@ where direct_user_to_url(login_url.as_str()); let token_cell = Arc::new(OnceCell::new()); - run_login_one_shot_server(DEFAULT_PORT, LOGIN_URL.to_string(), token_cell.clone()).await?; + run_login_one_shot_server( + DEFAULT_PORT, + login_url_configuration.to_string(), + token_cell.clone(), + ) + .await?; spinner.finish_and_clear(); diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index f903ca2ebdffc..060fcd5405041 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -96,6 +96,7 @@ fn make_token_name() -> Result { pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; + let repo_config = base.repo_config()?; let ui = base.ui.clone(); // We are passing a closure here, but it would be cleaner if we made a @@ -104,7 +105,7 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { Ok(base.user_config_mut()?.set_token(Some(token.to_string()))?) }; - return auth_login(api_client, &ui, set_token).await; + return auth_login(api_client, &ui, set_token, repo_config.login_url()).await; } #[cfg(test)] From 903f4a0c0c60cc623a776ab7773d0f999eac85eb Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 11:03:36 -0500 Subject: [PATCH 17/21] Fix compiler error with borrowing --- crates/turborepo-lib/src/commands/login.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 060fcd5405041..b830ae92d3668 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -96,8 +96,8 @@ fn make_token_name() -> Result { pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; - let repo_config = base.repo_config()?; let ui = base.ui.clone(); + let login_url_config = base.repo_config()?.login_url().to_string(); // We are passing a closure here, but it would be cleaner if we made a // turborepo-config crate and imported that into turborepo-auth. @@ -105,7 +105,7 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { Ok(base.user_config_mut()?.set_token(Some(token.to_string()))?) }; - return auth_login(api_client, &ui, set_token, repo_config.login_url()).await; + return auth_login(api_client, &ui, set_token, &login_url_config).await; } #[cfg(test)] From ed9afa4e001bb14b5df976e1c580975f377cd9de Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 11:11:11 -0500 Subject: [PATCH 18/21] add license into new crate --- crates/turborepo-auth/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml index cb024a0d4afc4..159daa70164ea 100644 --- a/crates/turborepo-auth/Cargo.toml +++ b/crates/turborepo-auth/Cargo.toml @@ -2,7 +2,7 @@ name = "turborepo-auth" version = "0.1.0" edition = "2021" - +license = "MPL-2.0" [dependencies] anyhow.workspace = true From db03e16f0059992a66a59430056ad4894fecf4e8 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 12:13:58 -0500 Subject: [PATCH 19/21] add clippy suggestions --- crates/turborepo-lib/src/commands/login.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index b830ae92d3668..8e1c2b2819bfa 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -96,7 +96,7 @@ fn make_token_name() -> Result { pub async fn login(base: &mut CommandBase) -> Result<()> { let api_client: APIClient = base.api_client()?; - let ui = base.ui.clone(); + let ui = base.ui; let login_url_config = base.repo_config()?.login_url().to_string(); // We are passing a closure here, but it would be cleaner if we made a @@ -105,7 +105,7 @@ pub async fn login(base: &mut CommandBase) -> Result<()> { Ok(base.user_config_mut()?.set_token(Some(token.to_string()))?) }; - return auth_login(api_client, &ui, set_token, &login_url_config).await; + auth_login(api_client, &ui, set_token, &login_url_config).await } #[cfg(test)] From 138c2850543456161336c1fa726df527eb63ad10 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 15:47:10 -0500 Subject: [PATCH 20/21] Move test over to new crate --- Cargo.lock | 1 + crates/turborepo-auth/Cargo.toml | 3 ++ crates/turborepo-auth/src/lib.rs | 37 +++++++++++++++++ crates/turborepo-lib/src/commands/login.rs | 47 ---------------------- 4 files changed, 41 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index afad2a02027bb..f854abd434b14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9956,6 +9956,7 @@ dependencies = [ "anyhow", "axum", "axum-server", + "port_scanner", "reqwest", "serde", "thiserror", diff --git a/crates/turborepo-auth/Cargo.toml b/crates/turborepo-auth/Cargo.toml index 159daa70164ea..a2909f6547f1f 100644 --- a/crates/turborepo-auth/Cargo.toml +++ b/crates/turborepo-auth/Cargo.toml @@ -17,3 +17,6 @@ turborepo-api-client = { workspace = true } turborepo-ui.workspace = true turborepo-vercel-api-mock = { workspace = true } webbrowser = { workspace = true } + +[dev-dependencies] +port_scanner = { workspace = true } diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index 58035548f94b0..fdc9e61ec77cb 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -35,6 +35,7 @@ pub async fn login( where F: FnMut(&str) -> Result<()>, { + println!("WHAT"); let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(login_url_configuration)?; @@ -147,3 +148,39 @@ async fn run_login_one_shot_server( .serve(app.into_make_service()) .await?) } + +#[cfg(test)] +mod test { + use port_scanner; + use tokio; + use turborepo_ui::UI; + use turborepo_vercel_api_mock::start_test_server; + + use crate::login; + + #[tokio::test] + async fn test_login() { + let port = port_scanner::request_open_port().unwrap(); + let api_server = tokio::spawn(start_test_server(port)); + + let ui = UI::new(false); + + let url = format!("http://localhost:{port}"); + + let api_client = + turborepo_api_client::APIClient::new(url.clone(), 1000, "1", false).unwrap(); + + // closure that will check that the token is sent correctly + let mut got_token = String::new(); + let set_token = |t: &str| -> Result<(), anyhow::Error> { + got_token = t.to_string(); + Ok(()) + }; + + login(api_client, &ui, set_token, &url).await.unwrap(); + + api_server.abort(); + println!("got_token: {}", got_token); + assert_eq!(got_token, turborepo_vercel_api_mock::EXPECTED_TOKEN); + } +} diff --git a/crates/turborepo-lib/src/commands/login.rs b/crates/turborepo-lib/src/commands/login.rs index 8e1c2b2819bfa..bdff5fdcfc6a8 100644 --- a/crates/turborepo-lib/src/commands/login.rs +++ b/crates/turborepo-lib/src/commands/login.rs @@ -221,53 +221,6 @@ mod test { Args, }; - #[tokio::test] - async fn test_login() { - let port = port_scanner::request_open_port().unwrap(); - let handle = tokio::spawn(start_test_server(port)); - - let user_config_file = NamedTempFile::new().unwrap(); - fs::write(user_config_file.path(), r#"{ "token": "hello" }"#).unwrap(); - let repo_config_file = NamedTempFile::new().unwrap(); - let repo_config_path = AbsoluteSystemPathBuf::try_from(repo_config_file.path()).unwrap(); - // Explicitly pass the wrong port to confirm that we're reading it from the - // manual override - fs::write( - repo_config_file.path(), - format!("{{ \"apiurl\": \"http://localhost:{}\" }}", port + 1), - ) - .unwrap(); - let root_dir = tempdir().unwrap(); - - let mut base = CommandBase { - repo_root: AbsoluteSystemPathBuf::new(root_dir.path().to_string_lossy()).unwrap(), - ui: UI::new(false), - client_config: OnceCell::from(ClientConfigLoader::new().load().unwrap()), - user_config: OnceCell::from( - UserConfigLoader::new(user_config_file.path().to_str().unwrap()) - .load() - .unwrap(), - ), - repo_config: OnceCell::from( - RepoConfigLoader::new(repo_config_path) - .with_api(Some(format!("http://localhost:{}", port))) - .load() - .unwrap(), - ), - args: Args::default(), - version: "", - }; - - login::login(&mut base).await.unwrap(); - - handle.abort(); - - assert_eq!( - base.user_config().unwrap().token().unwrap(), - turborepo_vercel_api_mock::EXPECTED_TOKEN - ); - } - #[derive(Debug, Clone, Deserialize)] struct TokenRequest { #[cfg(not(test))] From 3f13806475c96cf88c5c68e3c051cfc3c96be8e6 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 26 Sep 2023 15:50:10 -0500 Subject: [PATCH 21/21] rm debug --- crates/turborepo-auth/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/turborepo-auth/src/lib.rs b/crates/turborepo-auth/src/lib.rs index fdc9e61ec77cb..3793cb2bb9f29 100644 --- a/crates/turborepo-auth/src/lib.rs +++ b/crates/turborepo-auth/src/lib.rs @@ -35,7 +35,6 @@ pub async fn login( where F: FnMut(&str) -> Result<()>, { - println!("WHAT"); let redirect_url = format!("http://{DEFAULT_HOST_NAME}:{DEFAULT_PORT}"); let mut login_url = Url::parse(login_url_configuration)?; @@ -180,7 +179,6 @@ mod test { login(api_client, &ui, set_token, &url).await.unwrap(); api_server.abort(); - println!("got_token: {}", got_token); assert_eq!(got_token, turborepo_vercel_api_mock::EXPECTED_TOKEN); } }