erpnext-queue-client 1.0.2
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/client.d.ts +25 -0
- package/dist/client.js +141 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.js +26 -0
- package/dist/erpnext/decryptFromErpNext.server.d.ts +2 -0
- package/dist/erpnext/decryptFromErpNext.server.js +17 -0
- package/dist/erpnext/decryptFromErpNext.server.test.d.ts +1 -0
- package/dist/erpnext/decryptFromErpNext.server.test.js +30 -0
- package/dist/erpnext/erpnextRequestWrapper.d.ts +5 -0
- package/dist/erpnext/erpnextRequestWrapper.js +91 -0
- package/dist/erpnext/erpnextRequests.d.ts +1786 -0
- package/dist/erpnext/erpnextRequests.js +339 -0
- package/dist/erpnext/model/Address.d.ts +349 -0
- package/dist/erpnext/model/Address.js +99 -0
- package/dist/erpnext/model/Contact.d.ts +546 -0
- package/dist/erpnext/model/Contact.js +118 -0
- package/dist/erpnext/model/Country.d.ts +78 -0
- package/dist/erpnext/model/Country.js +30 -0
- package/dist/erpnext/model/Customer.d.ts +99 -0
- package/dist/erpnext/model/Customer.js +42 -0
- package/dist/erpnext/model/DateSchema.d.ts +2 -0
- package/dist/erpnext/model/DateSchema.js +8 -0
- package/dist/erpnext/model/DeliveryNote.d.ts +1648 -0
- package/dist/erpnext/model/DeliveryNote.js +219 -0
- package/dist/erpnext/model/DispatchRun.d.ts +688 -0
- package/dist/erpnext/model/DispatchRun.js +167 -0
- package/dist/erpnext/model/DispatcherPreset.d.ts +159 -0
- package/dist/erpnext/model/DispatcherPreset.js +43 -0
- package/dist/erpnext/model/ERPNextQueue.d.ts +48 -0
- package/dist/erpnext/model/ERPNextQueue.js +5 -0
- package/dist/erpnext/model/ERPNextRequest.d.ts +29 -0
- package/dist/erpnext/model/ERPNextRequest.js +2 -0
- package/dist/erpnext/model/ERPNextResponse.d.ts +17 -0
- package/dist/erpnext/model/ERPNextResponse.js +18 -0
- package/dist/erpnext/model/File.d.ts +146 -0
- package/dist/erpnext/model/File.js +36 -0
- package/dist/erpnext/model/Fulfiller.d.ts +175 -0
- package/dist/erpnext/model/Fulfiller.js +79 -0
- package/dist/erpnext/model/FulfillerSettings.d.ts +130 -0
- package/dist/erpnext/model/FulfillerSettings.js +34 -0
- package/dist/erpnext/model/FulfillmentStation.d.ts +9 -0
- package/dist/erpnext/model/FulfillmentStation.js +9 -0
- package/dist/erpnext/model/Item.d.ts +1710 -0
- package/dist/erpnext/model/Item.js +239 -0
- package/dist/erpnext/model/ProjectedQuantityReport.d.ts +281 -0
- package/dist/erpnext/model/ProjectedQuantityReport.js +72 -0
- package/dist/erpnext/model/PurchaseOrder.d.ts +906 -0
- package/dist/erpnext/model/PurchaseOrder.js +248 -0
- package/dist/erpnext/model/Receipt.d.ts +790 -0
- package/dist/erpnext/model/Receipt.js +212 -0
- package/dist/erpnext/model/ReceiptDraft.d.ts +541 -0
- package/dist/erpnext/model/ReceiptDraft.js +149 -0
- package/dist/erpnext/model/Shipment.d.ts +1139 -0
- package/dist/erpnext/model/Shipment.js +191 -0
- package/dist/erpnext/model/ShippingProvider.d.ts +434 -0
- package/dist/erpnext/model/ShippingProvider.js +204 -0
- package/dist/erpnext/model/StockDict.d.ts +3 -0
- package/dist/erpnext/model/StockDict.js +7 -0
- package/dist/erpnext/model/WarehouseCategory.d.ts +20 -0
- package/dist/erpnext/model/WarehouseCategory.js +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +18 -0
- package/dist/utils/fernet.server.d.ts +150 -0
- package/dist/utils/fernet.server.js +344 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/request.d.ts +28 -0
- package/dist/utils/request.js +107 -0
- package/dist/utils/utils.d.ts +4 -0
- package/dist/utils/utils.js +23 -0
- package/dist/utils/zodUtils.d.ts +2 -0
- package/dist/utils/zodUtils.js +17 -0
- package/package.json +32 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TypeOf, ZodTypeAny } from "zod";
|
|
2
|
+
import { ERPNextQueueClientContructorOptions, ERPNextQueueType } from "./erpnext/model/ERPNextQueue";
|
|
3
|
+
import { ERPNextRequestOptions } from "./erpnext/model/ERPNextRequest";
|
|
4
|
+
import { erpnextRequests } from "./erpnext/erpnextRequests";
|
|
5
|
+
/**
|
|
6
|
+
* @description Provide either a temporal client or connection details to create a new client
|
|
7
|
+
*/
|
|
8
|
+
export declare class ERPNextClient {
|
|
9
|
+
private client;
|
|
10
|
+
private credentials;
|
|
11
|
+
erpnext: ReturnType<typeof erpnextRequests>;
|
|
12
|
+
constructor(options: ERPNextQueueClientContructorOptions);
|
|
13
|
+
private tryConnect;
|
|
14
|
+
private createClient;
|
|
15
|
+
private getClient;
|
|
16
|
+
/**
|
|
17
|
+
* @description Execute an ERPNext request workflow, 0 is the highest priority, 5 is default
|
|
18
|
+
*/
|
|
19
|
+
executeERPNextRequest<T extends ZodTypeAny, K extends ZodTypeAny>(requestName: string, options: ERPNextRequestOptions<T, K>, queue: ERPNextQueueType, priority?: number): Promise<TypeOf<T>>;
|
|
20
|
+
utils: {
|
|
21
|
+
decryptFromErpNext: (encryptedPassword: string) => string;
|
|
22
|
+
executeERPNextRequestWithoutTemporalQueue: <T extends ZodTypeAny, K extends ZodTypeAny>(options: ERPNextRequestOptions<T, K>) => Promise<TypeOf<T>>;
|
|
23
|
+
executeERPNextRequestDownloadFile: <T extends ZodTypeAny, K extends ZodTypeAny>(url: string) => Promise<Buffer<ArrayBufferLike>>;
|
|
24
|
+
};
|
|
25
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.ERPNextClient = void 0;
|
|
24
|
+
const client_1 = require("@temporalio/client");
|
|
25
|
+
const logger_1 = require("./utils/logger");
|
|
26
|
+
const zodUtils_1 = require("./utils/zodUtils");
|
|
27
|
+
const nanoid_1 = require("nanoid");
|
|
28
|
+
const erpnextRequestWrapper_1 = require("./erpnext/erpnextRequestWrapper");
|
|
29
|
+
const erpnextRequests_1 = require("./erpnext/erpnextRequests");
|
|
30
|
+
const decryptFromErpNext_server_1 = require("./erpnext/decryptFromErpNext.server");
|
|
31
|
+
const nanoid = (0, nanoid_1.customAlphabet)("1234567890", 4);
|
|
32
|
+
/**
|
|
33
|
+
* @description Provide either a temporal client or connection details to create a new client
|
|
34
|
+
*/
|
|
35
|
+
class ERPNextClient {
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this.utils = {
|
|
38
|
+
decryptFromErpNext: (encryptedPassword) => {
|
|
39
|
+
return (0, decryptFromErpNext_server_1.decryptFromErpNext)(this.credentials, encryptedPassword);
|
|
40
|
+
},
|
|
41
|
+
executeERPNextRequestWithoutTemporalQueue: (options) => __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
if (!this.credentials)
|
|
43
|
+
throw new Error("Direct API connection not possible. Please provide ERPNext API credentials.");
|
|
44
|
+
return yield (0, erpnextRequestWrapper_1.erpnextRequest)(this.credentials, options);
|
|
45
|
+
}),
|
|
46
|
+
executeERPNextRequestDownloadFile: (url) => __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
if (!this.credentials)
|
|
48
|
+
throw new Error("File download not possible. Please provide ERPNext API credentials.");
|
|
49
|
+
return yield (0, erpnextRequestWrapper_1.erpNextDownloadFile)(this.credentials, url);
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
const { client, erpnextCredentials, temporalCredentials } = options;
|
|
53
|
+
// Optional: initialize with ERPNext credentials for direct ERPNext connection
|
|
54
|
+
if (erpnextCredentials)
|
|
55
|
+
this.credentials = erpnextCredentials;
|
|
56
|
+
// Use existing client or create a new one
|
|
57
|
+
if (client)
|
|
58
|
+
this.client = client;
|
|
59
|
+
else if (temporalCredentials.temporalHost)
|
|
60
|
+
this.createClient(temporalCredentials);
|
|
61
|
+
else
|
|
62
|
+
throw new Error("No client or connection details provided");
|
|
63
|
+
this.erpnext = (0, erpnextRequests_1.erpnextRequests)(this);
|
|
64
|
+
}
|
|
65
|
+
tryConnect(temporalHost, temporalCert, temporalKey) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
try {
|
|
68
|
+
return yield client_1.Connection.connect({
|
|
69
|
+
address: temporalHost,
|
|
70
|
+
tls: {
|
|
71
|
+
clientCertPair: {
|
|
72
|
+
crt: Buffer.from(temporalCert, "base64"),
|
|
73
|
+
key: Buffer.from(temporalKey, "base64"),
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
createClient(options) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
const connection = yield this.tryConnect(options.temporalHost, options.temporalCert, options.temporalKey);
|
|
86
|
+
this.client = new client_1.Client(Object.assign({ connection }, { namespace: options.temporalNamespace || "default" }));
|
|
87
|
+
return this.client;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
getClient(options) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
if (!this.client && !options)
|
|
93
|
+
throw new Error("No client or connection details provided");
|
|
94
|
+
return this.client || (yield this.createClient(options));
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @description Execute an ERPNext request workflow, 0 is the highest priority, 5 is default
|
|
99
|
+
*/
|
|
100
|
+
executeERPNextRequest(requestName_1, options_1, queue_1) {
|
|
101
|
+
return __awaiter(this, arguments, void 0, function* (requestName, options, queue, priority = 5) {
|
|
102
|
+
if (process.env.NODE_ENV === "test")
|
|
103
|
+
return;
|
|
104
|
+
const runId = `${requestName}-${nanoid(4)}`;
|
|
105
|
+
const client = yield this.getClient();
|
|
106
|
+
console.log(`Enqueue to ERPNext Queue: ${options.uri || options.url}`);
|
|
107
|
+
const { inputValidationModel, responseValidationModel } = options, optionsWithoutValidation = __rest(options, ["inputValidationModel", "responseValidationModel"]);
|
|
108
|
+
if (options.body && inputValidationModel)
|
|
109
|
+
(0, zodUtils_1.validateData)(options.body, inputValidationModel);
|
|
110
|
+
const data = yield client.workflow
|
|
111
|
+
.execute("erpnextRequestWorkflow", {
|
|
112
|
+
args: [optionsWithoutValidation, priority],
|
|
113
|
+
taskQueue: priority < 5 ? `${queue}_priority` : queue, // add to priority queue if priority is 0-5
|
|
114
|
+
workflowId: runId,
|
|
115
|
+
})
|
|
116
|
+
.catch((err) => {
|
|
117
|
+
var _a, _b, _c;
|
|
118
|
+
// Try parsing the temporal error format
|
|
119
|
+
if ((_c = (_b = (_a = err === null || err === void 0 ? void 0 : err.cause) === null || _a === void 0 ? void 0 : _a.cause) === null || _b === void 0 ? void 0 : _b.failure) === null || _c === void 0 ? void 0 : _c.message) {
|
|
120
|
+
const errorMessage = err.cause.cause.failure.message;
|
|
121
|
+
let errorObject;
|
|
122
|
+
try {
|
|
123
|
+
errorObject = JSON.parse(errorMessage);
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
throw new Error(errorMessage);
|
|
127
|
+
}
|
|
128
|
+
if (errorObject)
|
|
129
|
+
throw errorObject;
|
|
130
|
+
}
|
|
131
|
+
throw err;
|
|
132
|
+
});
|
|
133
|
+
const validatedData = responseValidationModel
|
|
134
|
+
? (0, zodUtils_1.validateData)(data, responseValidationModel)
|
|
135
|
+
: data;
|
|
136
|
+
logger_1.lg.info(`Started workflow ${runId}`);
|
|
137
|
+
return validatedData;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.ERPNextClient = ERPNextClient;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* -------------------------------------------------------------------------- */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.constants = exports.getEnvVar = void 0;
|
|
5
|
+
const getEnvVar = (varName) => {
|
|
6
|
+
const envVar = process.env[varName];
|
|
7
|
+
if (!envVar && !optionalConstants.includes(varName)) {
|
|
8
|
+
throw new Error(`ENV Var "${varName}" is not defined.`);
|
|
9
|
+
}
|
|
10
|
+
return envVar;
|
|
11
|
+
};
|
|
12
|
+
exports.getEnvVar = getEnvVar;
|
|
13
|
+
class ConstantsManager {
|
|
14
|
+
constructor(constantNames) {
|
|
15
|
+
this.constants = {};
|
|
16
|
+
constantNames.forEach((c) => {
|
|
17
|
+
(0, exports.getEnvVar)(c);
|
|
18
|
+
Object.defineProperty(this.constants, c, {
|
|
19
|
+
get: () => (0, exports.getEnvVar)(c),
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
Object.freeze(this.constants);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const optionalConstants = ["DEBUG_MODE"];
|
|
26
|
+
exports.constants = new ConstantsManager(["DEBUG_MODE"]).constants;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decryptFromErpNext = decryptFromErpNext;
|
|
4
|
+
const fernet_server_1 = require("../utils/fernet.server");
|
|
5
|
+
function decryptFromErpNext(credentials, encryptedPassword) {
|
|
6
|
+
if (!credentials.erpnextEncryptionKey)
|
|
7
|
+
throw new Error("ERPNext encryption key is not defined. Please specify it to use the decryptFromErpNext() function.");
|
|
8
|
+
const encyptionKey = credentials.erpnextEncryptionKey;
|
|
9
|
+
const encodedEncyptionKey = new fernet_server_1.Secret(encyptionKey);
|
|
10
|
+
var token = new fernet_server_1.Token({
|
|
11
|
+
secret: encodedEncyptionKey,
|
|
12
|
+
token: encryptedPassword,
|
|
13
|
+
ttl: 0,
|
|
14
|
+
});
|
|
15
|
+
const str = token.decode();
|
|
16
|
+
return str.toString();
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const client_1 = require("../client");
|
|
13
|
+
describe("decryptFromErpNext", () => {
|
|
14
|
+
test("should decrypt password", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
const { utils: { decryptFromErpNext }, } = new client_1.ERPNextClient({
|
|
16
|
+
temporalCredentials: {
|
|
17
|
+
temporalHost: "temporalHost",
|
|
18
|
+
},
|
|
19
|
+
erpnextCredentials: {
|
|
20
|
+
erpnextApiKey: "erpnext",
|
|
21
|
+
erpnextApiSecret: "erpnextSecret",
|
|
22
|
+
erpnextUrl: "erpnextUrl",
|
|
23
|
+
erpnextEncryptionKey: "V4mf_rM7NX-0SW7OG5nCaAsFIkiBwcfE6-JQBoFxKZw", // Key for testing
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const encryptedPassword = "gAAAAABjW77Rn3UP_3CZISSag2bsrq0huYiN5kavTd_2fUJUkcQd3tsrbsIbLk82TkqFKbwC1BnEP9iXKMQ-DrlIlLyIvZiwag==";
|
|
27
|
+
const decryptedPassword = decryptFromErpNext(encryptedPassword);
|
|
28
|
+
expect(decryptedPassword).toBe("12345");
|
|
29
|
+
}));
|
|
30
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type z } from "zod";
|
|
2
|
+
import { ERPNextCredentials } from "./model/ERPNextQueue";
|
|
3
|
+
import { ERPNextRequestOptions } from "./model/ERPNextRequest";
|
|
4
|
+
export declare function erpnextRequest<T extends z.ZodTypeAny, K extends z.ZodTypeAny>(credentials: ERPNextCredentials, options: ERPNextRequestOptions<T, K>): Promise<z.TypeOf<T>>;
|
|
5
|
+
export declare function erpNextDownloadFile(credentials: ERPNextCredentials, url: string): Promise<Buffer>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.erpnextRequest = erpnextRequest;
|
|
13
|
+
exports.erpNextDownloadFile = erpNextDownloadFile;
|
|
14
|
+
const request_1 = require("../utils/request");
|
|
15
|
+
const zodUtils_1 = require("../utils/zodUtils");
|
|
16
|
+
const ERPNextResponse_1 = require("./model/ERPNextResponse");
|
|
17
|
+
function getHeaders(credentials) {
|
|
18
|
+
return Object.assign({
|
|
19
|
+
Authorization: `token ${credentials.erpnextApiKey}:${credentials.erpnextApiSecret}`,
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
}, (credentials.cloudflareAccessClientId &&
|
|
22
|
+
credentials.cloudflareAccessClientSecret
|
|
23
|
+
? {
|
|
24
|
+
"CF-Access-Client-Id": credentials.cloudflareAccessClientId,
|
|
25
|
+
"CF-Access-Client-Secret": credentials.cloudflareAccessClientSecret,
|
|
26
|
+
}
|
|
27
|
+
: {}));
|
|
28
|
+
}
|
|
29
|
+
function erpnextRequest(credentials, options) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
const baseUrl = options.methodName
|
|
32
|
+
? `${credentials.erpnextUrl}/api/method/${options.methodName}`
|
|
33
|
+
: options.resourceName
|
|
34
|
+
? `${credentials.erpnextUrl}/api/resource/${options.resourceName}`
|
|
35
|
+
: options.url;
|
|
36
|
+
if (!baseUrl)
|
|
37
|
+
throw new Error("No resource or method name provided");
|
|
38
|
+
const inputUrl = `${baseUrl.startsWith("/api/method") ? `${credentials.erpnextUrl}` : ""}${baseUrl}${options.resourceId ? `/${options.resourceId}` : ""}${options.params ? `${options.params}` : ""}`;
|
|
39
|
+
const url = options.resourceName && options.requestMethod === "GET"
|
|
40
|
+
? inputUrl.includes("?")
|
|
41
|
+
? `${inputUrl}&limit=0`
|
|
42
|
+
: !options.resourceId
|
|
43
|
+
? `${inputUrl}?limit=0`
|
|
44
|
+
: inputUrl
|
|
45
|
+
: inputUrl;
|
|
46
|
+
const combinedHeaders = Object.assign(Object.assign({}, getHeaders(credentials)), (options.headers ? options.headers : {}));
|
|
47
|
+
// lgTemporal.info(`Temp url request check ${url}`);
|
|
48
|
+
const unvalidatedResult = yield (0, request_1.request)(Object.assign({ headers: combinedHeaders, url, method: options.requestMethod, inputValidationModel: options.inputValidationModel || false, responseValidationModel: false }, (options.body ? { body: options.body } : {}))).catch((err) => {
|
|
49
|
+
throw err.status
|
|
50
|
+
? new Error(`Error ${err.status}: ${err.response &&
|
|
51
|
+
typeof err.response === "object" &&
|
|
52
|
+
"_server_messages" in err.response &&
|
|
53
|
+
typeof err.response._server_messages === "string"
|
|
54
|
+
? JSON.parse(err.response._server_messages)
|
|
55
|
+
: JSON.stringify(err.response)}`)
|
|
56
|
+
: err;
|
|
57
|
+
});
|
|
58
|
+
if (options.responseValidationModel === false)
|
|
59
|
+
return unvalidatedResult;
|
|
60
|
+
let returnValue;
|
|
61
|
+
if (options.methodName) {
|
|
62
|
+
const validatedResult = (0, zodUtils_1.validateData)(unvalidatedResult, ERPNextResponse_1.ERPNextMethodResponse);
|
|
63
|
+
returnValue = (0, zodUtils_1.validateData)(validatedResult.message, options.responseValidationModel);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const validatedResult = (0, zodUtils_1.validateData)(unvalidatedResult, ERPNextResponse_1.ERPNextResourceResponse);
|
|
67
|
+
returnValue = (0, zodUtils_1.validateData)(validatedResult.data, options.responseValidationModel);
|
|
68
|
+
}
|
|
69
|
+
return returnValue;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function erpNextDownloadFile(credentials, url) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const isErpNextPrivateUrl = url.includes("/api/method");
|
|
75
|
+
const inputUrl = `${url.startsWith("/api/method") ? `${credentials.erpnextUrl}` : ""}${url}`;
|
|
76
|
+
let response = yield fetch(inputUrl, {
|
|
77
|
+
headers: isErpNextPrivateUrl ? getHeaders(credentials) : undefined,
|
|
78
|
+
redirect: isErpNextPrivateUrl ? "manual" : "follow",
|
|
79
|
+
});
|
|
80
|
+
if ((response === null || response === void 0 ? void 0 : response.status) === 302) {
|
|
81
|
+
const redirectUrl = response.headers.get("location");
|
|
82
|
+
if (!redirectUrl)
|
|
83
|
+
throw new Error("No redirect url");
|
|
84
|
+
response = yield fetch(redirectUrl);
|
|
85
|
+
}
|
|
86
|
+
if (!response.body)
|
|
87
|
+
throw new Error("No response body");
|
|
88
|
+
const buffer = yield response.arrayBuffer();
|
|
89
|
+
return Buffer.from(buffer);
|
|
90
|
+
});
|
|
91
|
+
}
|