conductor-node 8.2.1 → 8.2.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-node",
3
- "version": "8.2.1",
3
+ "version": "8.2.3",
4
4
  "description": "Easily integrate with the entire QuickBooks Desktop API with fully-typed async TypeScript",
5
5
  "author": "Danny Nemer <hi@DannyNemer.com>",
6
6
  "license": "MIT",
@@ -0,0 +1,18 @@
1
+ export declare const DEFAULT_ERROR_CODE = "CONDUCTOR__INTERNAL_SERVER_ERROR";
2
+ export declare const DEFAULT_END_USER_MESSAGE = "An internal server error occurred. Please try again later.";
3
+ interface ConductorRawError {
4
+ readonly type: string;
5
+ readonly code: string;
6
+ readonly developerMessage: string;
7
+ readonly endUserMessage?: string;
8
+ readonly statusCode?: number;
9
+ }
10
+ export declare class ConductorError extends Error {
11
+ readonly type: string;
12
+ readonly code: string;
13
+ readonly developerMessage: string;
14
+ readonly endUserMessage: string;
15
+ readonly statusCode: number | undefined;
16
+ constructor(raw: ConductorRawError);
17
+ }
18
+ export {};
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConductorError = exports.DEFAULT_END_USER_MESSAGE = exports.DEFAULT_ERROR_CODE = void 0;
4
+ exports.DEFAULT_ERROR_CODE = "CONDUCTOR__INTERNAL_SERVER_ERROR";
5
+ exports.DEFAULT_END_USER_MESSAGE = "An internal server error occurred. Please try again later.";
6
+ class ConductorError extends Error {
7
+ type;
8
+ code;
9
+ developerMessage;
10
+ endUserMessage;
11
+ statusCode;
12
+ constructor(raw) {
13
+ super(raw.developerMessage);
14
+ this.name = "ConductorError";
15
+ this.type = raw.type;
16
+ this.code = raw.code;
17
+ this.developerMessage = raw.developerMessage;
18
+ this.endUserMessage = raw.endUserMessage ?? exports.DEFAULT_END_USER_MESSAGE;
19
+ this.statusCode = raw.statusCode;
20
+ }
21
+ }
22
+ exports.ConductorError = ConductorError;
@@ -1,6 +1,7 @@
1
+ import { ConductorError } from "../error";
1
2
  import type { getSdk } from "../graphql/__generated__/operationTypes";
2
3
  export declare function wrapGraphqlOperations<T extends ReturnType<typeof getSdk>>(graphqlOperations: T, verbose: boolean): T;
3
4
  export declare function graphqlOperationWrapper<V extends {
4
5
  [key: string]: unknown;
5
6
  }, R>(operationName: string, variables: V | undefined, operation: (variables: V | undefined) => Promise<R>, verbose: boolean): Promise<R>;
6
- export declare function formatError(error: Error): Error;
7
+ export declare function generateConductorError(error: Error): ConductorError;
@@ -3,8 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.formatError = exports.graphqlOperationWrapper = exports.wrapGraphqlOperations = void 0;
6
+ exports.generateConductorError = exports.graphqlOperationWrapper = exports.wrapGraphqlOperations = void 0;
7
7
  const package_json_1 = __importDefault(require("../../package.json"));
8
+ const error_1 = require("../error");
8
9
  const graphql_request_1 = require("graphql-request");
9
10
  const node_util_1 = __importDefault(require("node:util"));
10
11
  function wrapGraphqlOperations(graphqlOperations, verbose) {
@@ -17,7 +18,7 @@ function wrapGraphqlOperations(graphqlOperations, verbose) {
17
18
  }
18
19
  exports.wrapGraphqlOperations = wrapGraphqlOperations;
19
20
  async function graphqlOperationWrapper(operationName, variables, operation, verbose) {
20
- const graphqlInfo = {
21
+ const graphqlLog = {
21
22
  operationName,
22
23
  input: variables
23
24
  ? Object.keys(variables).length === 1 && "input" in variables
@@ -26,7 +27,7 @@ async function graphqlOperationWrapper(operationName, variables, operation, verb
26
27
  : {},
27
28
  };
28
29
  if (verbose) {
29
- console.log(`Conductor request start: ${node_util_1.default.inspect(graphqlInfo, {
30
+ console.log(`Conductor request start: ${node_util_1.default.inspect(graphqlLog, {
30
31
  depth: undefined,
31
32
  })}`);
32
33
  }
@@ -34,52 +35,72 @@ async function graphqlOperationWrapper(operationName, variables, operation, verb
34
35
  try {
35
36
  const result = await operation(variables);
36
37
  if (verbose) {
37
- const responseInfo = {
38
+ const responseLog = {
38
39
  duration: getDurationString(startTime),
39
- ...graphqlInfo,
40
+ ...graphqlLog,
40
41
  };
41
- const responseString = node_util_1.default.inspect(responseInfo, { depth: undefined });
42
+ const responseString = node_util_1.default.inspect(responseLog, { depth: undefined });
42
43
  console.log(`Conductor request complete: ${responseString}`);
43
44
  }
44
45
  return result;
45
46
  }
46
47
  catch (error) {
47
- const formattedError = formatError(error);
48
+ const conductorError = generateConductorError(error);
48
49
  if (verbose) {
49
- const errorInfo = {
50
+ const errorLog = {
50
51
  duration: getDurationString(startTime),
51
- error: String(formattedError),
52
- ...graphqlInfo,
52
+ error: String(conductorError),
53
+ ...graphqlLog,
53
54
  };
54
- const errorString = node_util_1.default.inspect(errorInfo, { depth: undefined });
55
+ const errorString = node_util_1.default.inspect(errorLog, { depth: undefined });
55
56
  console.log(`Conductor error: ${errorString}`);
56
57
  }
57
- throw formattedError;
58
+ throw conductorError;
58
59
  }
59
60
  }
60
61
  exports.graphqlOperationWrapper = graphqlOperationWrapper;
61
- function formatError(error) {
62
+ function generateConductorError(error) {
62
63
  if (error instanceof graphql_request_1.ClientError) {
63
64
  const { response } = error;
64
65
  if ([404, 502, 503].includes(response.status)) {
65
- return new Error(`The Conductor server returned a ${response.status} error, which may indicate that the server is down. Please alert the Conductor team if this error persists.`);
66
+ return new error_1.ConductorError({
67
+ type: "connection_error",
68
+ code: error_1.DEFAULT_ERROR_CODE,
69
+ developerMessage: `The Conductor server returned a ${response.status} error, which may indicate that the server is down. Please alert the Conductor team if this error persists.`,
70
+ statusCode: response.status,
71
+ });
66
72
  }
67
73
  const nestedError = response.errors?.[0];
68
74
  if (nestedError?.extensions["code"] === "GRAPHQL_VALIDATION_FAILED") {
69
- return new Error(`The Conductor server is no longer compatible with your version of "${package_json_1.default.name}". Please run "yarn upgrade ${package_json_1.default.name}@latest --latest" to update.`);
75
+ return new error_1.ConductorError({
76
+ type: "temp",
77
+ code: error_1.DEFAULT_ERROR_CODE,
78
+ developerMessage: `The Conductor server is no longer compatible with your version of "${package_json_1.default.name}". Please run "yarn upgrade ${package_json_1.default.name}@latest --latest" to update.`,
79
+ statusCode: response.status,
80
+ });
70
81
  }
82
+ // TODO: Integrate with new error attributes.
71
83
  const errorMessage = nestedError?.message ??
72
84
  // Though `ClientError.response.error` is *not* defined in the type
73
85
  // definition, we've seen it occur (e.g., attempting to access the
74
86
  // `development` environment when `ngrok` is not running locally).
75
87
  response["error"];
76
88
  if (errorMessage !== undefined) {
77
- return new Error(errorMessage);
89
+ return new error_1.ConductorError({
90
+ type: "temp",
91
+ code: error_1.DEFAULT_ERROR_CODE,
92
+ developerMessage: errorMessage,
93
+ statusCode: response.status,
94
+ });
78
95
  }
79
96
  }
80
- return error;
97
+ return new error_1.ConductorError({
98
+ type: "temp",
99
+ code: error_1.DEFAULT_ERROR_CODE,
100
+ developerMessage: "Invalid JSON received from the Conductor API.",
101
+ });
81
102
  }
82
- exports.formatError = formatError;
103
+ exports.generateConductorError = generateConductorError;
83
104
  function getDurationString(startTime) {
84
105
  const duration = Date.now() - startTime;
85
106
  return `${Math.round(duration / 10) / 100}s`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-node",
3
- "version": "8.2.1",
3
+ "version": "8.2.3",
4
4
  "description": "Easily integrate with the entire QuickBooks Desktop API with fully-typed async TypeScript",
5
5
  "author": "Danny Nemer <hi@DannyNemer.com>",
6
6
  "license": "MIT",