conductor-node 8.2.0 → 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/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Execute _any_ read or write [QuickBooks Desktop API](https://developer.intuit.com/app/developer/qbdesktop/docs/api-reference/qbdesktop) through async TypeScript and receive a fully-typed response.
|
|
4
4
|
|
|
5
|
+
<img src="https://user-images.githubusercontent.com/170023/213273732-83dd6881-0b36-4787-820b-bd55cdc8444f.jpg" alt="qbd" width="600"/>
|
|
6
|
+
|
|
5
7
|
## Requirements
|
|
6
8
|
|
|
7
9
|
1. A Conductor API key from Danny.
|
package/dist/package.json
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
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(
|
|
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
|
|
38
|
+
const responseLog = {
|
|
38
39
|
duration: getDurationString(startTime),
|
|
39
|
-
...
|
|
40
|
+
...graphqlLog,
|
|
40
41
|
};
|
|
41
|
-
const responseString = node_util_1.default.inspect(
|
|
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
|
|
48
|
+
const conductorError = generateConductorError(error);
|
|
48
49
|
if (verbose) {
|
|
49
|
-
const
|
|
50
|
+
const errorLog = {
|
|
50
51
|
duration: getDurationString(startTime),
|
|
51
|
-
error: String(
|
|
52
|
-
...
|
|
52
|
+
error: String(conductorError),
|
|
53
|
+
...graphqlLog,
|
|
53
54
|
};
|
|
54
|
-
const errorString = node_util_1.default.inspect(
|
|
55
|
+
const errorString = node_util_1.default.inspect(errorLog, { depth: undefined });
|
|
55
56
|
console.log(`Conductor error: ${errorString}`);
|
|
56
57
|
}
|
|
57
|
-
throw
|
|
58
|
+
throw conductorError;
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
exports.graphqlOperationWrapper = graphqlOperationWrapper;
|
|
61
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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