@nesalia/cli 1.0.2 → 1.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAgB1C,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAyB1C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { log } from "@clack/prompts";
2
2
  import { saveCredentials, startDeviceFlow } from "../../lib/auth/index.js";
3
+ import { AuthFlowError } from "../../lib/auth/device-flow/errors.js";
3
4
  export const login = async () => {
4
5
  try {
5
6
  const result = await startDeviceFlow();
@@ -12,7 +13,18 @@ export const login = async () => {
12
13
  log.success("Successfully logged in!");
13
14
  }
14
15
  catch (error) {
15
- log.error(error instanceof Error ? error.message : "Unknown error");
16
+ if (error instanceof AuthFlowError) {
17
+ if (error.isNetwork) {
18
+ log.error(`Network error: ${error.message}`);
19
+ log.step("Make sure the auth server is running and accessible.");
20
+ }
21
+ else {
22
+ log.error(`Auth error: ${error.message}`);
23
+ }
24
+ }
25
+ else {
26
+ log.error(error instanceof Error ? error.message : "Unknown error");
27
+ }
16
28
  process.exit(1);
17
29
  }
18
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,eAAe,EAA0B,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnG,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAsB;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;SAC7D,CAAC;QAEF,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,eAAe,EAA0B,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAsB;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;SAC7D,CAAC;QAEF,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7C,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
3
  import { login, status, logout } from "./commands/index.js";
4
+ // Commander v13 uses -V for --version; intercept -v before parse
5
+ const args = process.argv.includes("-v")
6
+ ? process.argv.map((a) => (a === "-v" ? "-V" : a))
7
+ : process.argv;
4
8
  const program = new Command();
5
9
  program
6
10
  .name("nesalia")
7
- .version("1.0.2")
11
+ .version("1.0.4")
8
12
  .description("@nesalia/cli — Manage your account authentication");
9
13
  program
10
14
  .command("auth", { isDefault: false })
@@ -18,5 +22,5 @@ program
18
22
  .addCommand(new Command("logout")
19
23
  .description("Logout and clear credentials")
20
24
  .action(logout));
21
- program.parse(process.argv);
25
+ program.parse(args);
22
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC,CAAC;AAEpE,OAAO;KACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;KACrC,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CACT,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,CAAC,CACjB;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,MAAM,CAAC,CAClB;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,MAAM,CAAC,CAClB,CAAC;AAEJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE5D,iEAAiE;AACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAEjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC,CAAC;AAEpE,OAAO;KACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;KACrC,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CACT,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,CAAC,CACjB;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,MAAM,CAAC,CAClB;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,MAAM,CAAC,CAClB,CAAC;AAEJ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/device-flow/device-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,GAAU,QAAQ,UAAU,KAAG,OAAO,CAAC,gBAAgB,CAmBpF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAI3D,CAAC"}
1
+ {"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/device-flow/device-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,GAAU,QAAQ,UAAU,KAAG,OAAO,CAAC,gBAAgB,CA0CpF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAI3D,CAAC"}
@@ -1,16 +1,32 @@
1
1
  import { log } from "@clack/prompts";
2
2
  import open from "open";
3
3
  import { CLIENT_ID, SCOPE } from "./config.js";
4
- import { AuthFlowError } from "./errors.js";
4
+ import { AuthFlowError, isTransientError } from "./errors.js";
5
5
  export const requestDeviceCode = async (client) => {
6
6
  log.info("Requesting device authorization...");
7
- const { data, error } = await client.device.code({
8
- client_id: CLIENT_ID,
9
- scope: SCOPE,
10
- });
11
- if (error || !data) {
12
- const msg = error?.error_description ?? "Failed to get device code";
13
- throw new AuthFlowError(msg);
7
+ let data;
8
+ let error;
9
+ try {
10
+ const result = await client.device.code({
11
+ client_id: CLIENT_ID,
12
+ scope: SCOPE,
13
+ });
14
+ data = result.data;
15
+ error = result.error;
16
+ }
17
+ catch (err) {
18
+ if (isTransientError(err)) {
19
+ throw AuthFlowError.network(`Cannot reach the auth server. Check your internet connection or the server may be down.`);
20
+ }
21
+ throw AuthFlowError.network(`Network error while requesting device code: ${err.message}`);
22
+ }
23
+ if (error) {
24
+ const code = error.error ?? "unknown_error";
25
+ const desc = error.error_description ?? "No description provided";
26
+ throw new AuthFlowError(`[${code}] ${desc}`);
27
+ }
28
+ if (!data) {
29
+ throw new AuthFlowError("Empty response from server. The auth server may be misconfigured.");
14
30
  }
15
31
  return {
16
32
  deviceCode: data.device_code,
@@ -1 +1 @@
1
- {"version":3,"file":"device-code.js","sourceRoot":"","sources":["../../../../src/lib/auth/device-flow/device-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAAkB,EAA6B,EAAE;IACvF,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAE/C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/C,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,EAAE,iBAAiB,IAAI,2BAA2B,CAAC;QACpE,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,eAAe,EAAE,IAAI,CAAC,yBAAyB;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;IAC9D,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACzB,kEAAkE;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"device-code.js","sourceRoot":"","sources":["../../../../src/lib/auth/device-flow/device-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAAkB,EAA6B,EAAE;IACvF,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAE/C,IAAI,IAA+D,CAAC;IACpE,IAAI,KAAiE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACnB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,aAAa,CAAC,OAAO,CACzB,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,CAAC,OAAO,CACzB,+CAAgD,GAAa,CAAC,OAAO,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,IAAI,yBAAyB,CAAC;QAClE,MAAM,IAAI,aAAa,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CACrB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,eAAe,EAAE,IAAI,CAAC,yBAAyB;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;IAC9D,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACzB,kEAAkE;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nesalia/cli",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "description": "Nesalia CLI — Manage your account and organizations",
6
6
  "license": "MIT",
@@ -1,5 +1,6 @@
1
1
  import { log } from "@clack/prompts";
2
2
  import { saveCredentials, type StoredCredentials, startDeviceFlow } from "../../lib/auth/index.js";
3
+ import { AuthFlowError } from "../../lib/auth/device-flow/errors.js";
3
4
 
4
5
  export const login = async (): Promise<void> => {
5
6
  try {
@@ -14,7 +15,16 @@ export const login = async (): Promise<void> => {
14
15
  saveCredentials(credentials);
15
16
  log.success("Successfully logged in!");
16
17
  } catch (error) {
17
- log.error(error instanceof Error ? error.message : "Unknown error");
18
+ if (error instanceof AuthFlowError) {
19
+ if (error.isNetwork) {
20
+ log.error(`Network error: ${error.message}`);
21
+ log.step("Make sure the auth server is running and accessible.");
22
+ } else {
23
+ log.error(`Auth error: ${error.message}`);
24
+ }
25
+ } else {
26
+ log.error(error instanceof Error ? error.message : "Unknown error");
27
+ }
18
28
  process.exit(1);
19
29
  }
20
30
  };
package/src/index.ts CHANGED
@@ -3,11 +3,16 @@
3
3
  import { Command } from "commander";
4
4
  import { login, status, logout } from "./commands/index.js";
5
5
 
6
+ // Commander v13 uses -V for --version; intercept -v before parse
7
+ const args = process.argv.includes("-v")
8
+ ? process.argv.map((a) => (a === "-v" ? "-V" : a))
9
+ : process.argv;
10
+
6
11
  const program = new Command();
7
12
 
8
13
  program
9
14
  .name("nesalia")
10
- .version("1.0.2")
15
+ .version("1.0.4")
11
16
  .description("@nesalia/cli — Manage your account authentication");
12
17
 
13
18
  program
@@ -29,4 +34,4 @@ program
29
34
  .action(logout),
30
35
  );
31
36
 
32
- program.parse(process.argv);
37
+ program.parse(args);
@@ -2,7 +2,7 @@ import { log } from "@clack/prompts";
2
2
  import open from "open";
3
3
  import type { AuthClient } from "../client.js";
4
4
  import { CLIENT_ID, SCOPE } from "./config.js";
5
- import { AuthFlowError } from "./errors.js";
5
+ import { AuthFlowError, isTransientError } from "./errors.js";
6
6
 
7
7
  export interface DeviceCodeResult {
8
8
  deviceCode: string;
@@ -14,14 +14,37 @@ export interface DeviceCodeResult {
14
14
  export const requestDeviceCode = async (client: AuthClient): Promise<DeviceCodeResult> => {
15
15
  log.info("Requesting device authorization...");
16
16
 
17
- const { data, error } = await client.device.code({
18
- client_id: CLIENT_ID,
19
- scope: SCOPE,
20
- });
17
+ let data: Awaited<ReturnType<AuthClient["device"]["code"]>>["data"];
18
+ let error: Awaited<ReturnType<AuthClient["device"]["code"]>>["error"];
19
+
20
+ try {
21
+ const result = await client.device.code({
22
+ client_id: CLIENT_ID,
23
+ scope: SCOPE,
24
+ });
25
+ data = result.data;
26
+ error = result.error;
27
+ } catch (err) {
28
+ if (isTransientError(err)) {
29
+ throw AuthFlowError.network(
30
+ `Cannot reach the auth server. Check your internet connection or the server may be down.`,
31
+ );
32
+ }
33
+ throw AuthFlowError.network(
34
+ `Network error while requesting device code: ${(err as Error).message}`,
35
+ );
36
+ }
37
+
38
+ if (error) {
39
+ const code = error.error ?? "unknown_error";
40
+ const desc = error.error_description ?? "No description provided";
41
+ throw new AuthFlowError(`[${code}] ${desc}`);
42
+ }
21
43
 
22
- if (error || !data) {
23
- const msg = error?.error_description ?? "Failed to get device code";
24
- throw new AuthFlowError(msg);
44
+ if (!data) {
45
+ throw new AuthFlowError(
46
+ "Empty response from server. The auth server may be misconfigured.",
47
+ );
25
48
  }
26
49
 
27
50
  return {