@arathron/n8n-nodes-zoho-books 1.0.0
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/LICENSE.md +21 -0
- package/README.md +199 -0
- package/dist/credentials/ZohoBooksOAuth2.credentials.d.ts +8 -0
- package/dist/credentials/ZohoBooksOAuth2.credentials.js +75 -0
- package/dist/credentials/ZohoBooksOAuth2.credentials.js.map +1 -0
- package/dist/nodes/ZohoBooks.node.d.ts +5 -0
- package/dist/nodes/ZohoBooks.node.js +260 -0
- package/dist/nodes/ZohoBooks.node.js.map +1 -0
- package/dist/nodes/resources/BaseResource.d.ts +16 -0
- package/dist/nodes/resources/BaseResource.js +44 -0
- package/dist/nodes/resources/BaseResource.js.map +1 -0
- package/dist/nodes/resources/CreditNote.resource.d.ts +14 -0
- package/dist/nodes/resources/CreditNote.resource.js +291 -0
- package/dist/nodes/resources/CreditNote.resource.js.map +1 -0
- package/dist/nodes/resources/Invoice.resource.d.ts +14 -0
- package/dist/nodes/resources/Invoice.resource.js +251 -0
- package/dist/nodes/resources/Invoice.resource.js.map +1 -0
- package/dist/nodes/resources/Item.resource.d.ts +14 -0
- package/dist/nodes/resources/Item.resource.js +312 -0
- package/dist/nodes/resources/Item.resource.js.map +1 -0
- package/dist/nodes/resources/Payment.resource.d.ts +14 -0
- package/dist/nodes/resources/Payment.resource.js +341 -0
- package/dist/nodes/resources/Payment.resource.js.map +1 -0
- package/dist/nodes/resources/SalesOrder.resource.d.ts +14 -0
- package/dist/nodes/resources/SalesOrder.resource.js +211 -0
- package/dist/nodes/resources/SalesOrder.resource.js.map +1 -0
- package/dist/nodes/resources/Vendor.resource.d.ts +14 -0
- package/dist/nodes/resources/Vendor.resource.js +415 -0
- package/dist/nodes/resources/Vendor.resource.js.map +1 -0
- package/dist/utils/GenericFunctions.d.ts +6 -0
- package/dist/utils/GenericFunctions.js +154 -0
- package/dist/utils/GenericFunctions.js.map +1 -0
- package/dist/utils/RateLimiter.d.ts +20 -0
- package/dist/utils/RateLimiter.js +82 -0
- package/dist/utils/RateLimiter.js.map +1 -0
- package/dist/utils/Schemas.d.ts +7 -0
- package/dist/utils/Schemas.js +207 -0
- package/dist/utils/Schemas.js.map +1 -0
- package/index.js +4 -0
- package/package.json +69 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Vendor.resource.js","sourceRoot":"","sources":["../../../nodes/resources/Vendor.resource.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { IExecuteFunctions, ILoadOptionsFunctions, IHookFunctions, IWebhookFunctions } from 'n8n-workflow';
|
2
|
+
import { IDataObject, IHttpRequestMethods } from 'n8n-workflow';
|
3
|
+
export declare function makeApiRequest(this: IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions | IWebhookFunctions, method: IHttpRequestMethods, endpoint: string, body?: IDataObject, qs?: IDataObject, options?: IDataObject): Promise<any>;
|
4
|
+
export declare function makeApiRequestWithPagination(this: IExecuteFunctions, method: IHttpRequestMethods, endpoint: string, body?: IDataObject, qs?: IDataObject, options?: IDataObject): Promise<any[]>;
|
5
|
+
export declare function validateOrganizationId(organizationId: string): boolean;
|
6
|
+
export declare function getResourceEndpoint(resource: string): string;
|
@@ -0,0 +1,154 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.makeApiRequest = makeApiRequest;
|
4
|
+
exports.makeApiRequestWithPagination = makeApiRequestWithPagination;
|
5
|
+
exports.validateOrganizationId = validateOrganizationId;
|
6
|
+
exports.getResourceEndpoint = getResourceEndpoint;
|
7
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
8
|
+
let requestCount = 0;
|
9
|
+
let windowStart = Date.now();
|
10
|
+
let dailyRequestCount = 0;
|
11
|
+
let dailyWindowStart = Date.now();
|
12
|
+
const DEFAULT_RATE_LIMIT = {
|
13
|
+
maxRequests: 100,
|
14
|
+
windowMs: 60000, // 1 minute
|
15
|
+
dailyCap: 10000, // 10k per day
|
16
|
+
};
|
17
|
+
async function sleep(ms) {
|
18
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
19
|
+
}
|
20
|
+
async function handleRateLimit(config = DEFAULT_RATE_LIMIT) {
|
21
|
+
const now = Date.now();
|
22
|
+
// Reset daily counter if new day
|
23
|
+
if (now - dailyWindowStart > 24 * 60 * 60 * 1000) {
|
24
|
+
dailyWindowStart = now;
|
25
|
+
dailyRequestCount = 0;
|
26
|
+
}
|
27
|
+
// Check daily cap
|
28
|
+
if (config.dailyCap && dailyRequestCount >= config.dailyCap) {
|
29
|
+
const waitTime = 24 * 60 * 60 * 1000 - (now - dailyWindowStart);
|
30
|
+
throw new n8n_workflow_1.NodeOperationError({}, `Daily rate limit of ${config.dailyCap} requests exceeded. Wait ${Math.ceil(waitTime / 1000 / 60)} minutes.`);
|
31
|
+
}
|
32
|
+
// Reset minute counter if new window
|
33
|
+
if (now - windowStart > config.windowMs) {
|
34
|
+
windowStart = now;
|
35
|
+
requestCount = 0;
|
36
|
+
}
|
37
|
+
// Check minute rate limit
|
38
|
+
if (requestCount >= config.maxRequests) {
|
39
|
+
const waitTime = config.windowMs - (now - windowStart);
|
40
|
+
await sleep(waitTime);
|
41
|
+
windowStart = Date.now();
|
42
|
+
requestCount = 0;
|
43
|
+
}
|
44
|
+
requestCount++;
|
45
|
+
dailyRequestCount++;
|
46
|
+
}
|
47
|
+
async function makeApiRequest(method, endpoint, body = {}, qs = {}, options = {}) {
|
48
|
+
const credentials = await this.getCredentials('zohoBooksOAuth2');
|
49
|
+
const dataCentre = credentials.dataCentre;
|
50
|
+
const organizationId = credentials.organizationId;
|
51
|
+
// Apply rate limiting
|
52
|
+
const rateLimitConfig = options.rateLimitConfig;
|
53
|
+
await handleRateLimit(rateLimitConfig);
|
54
|
+
const baseUrl = dataCentre === 'CN'
|
55
|
+
? 'https://books.zoho.com.cn/api/v3'
|
56
|
+
: `https://books.zoho.${dataCentre === 'US' ? 'com' : dataCentre.toLowerCase()}/api/v3`;
|
57
|
+
const requestOptions = {
|
58
|
+
method,
|
59
|
+
url: `${baseUrl}${endpoint}`,
|
60
|
+
qs: {
|
61
|
+
organization_id: organizationId,
|
62
|
+
...qs,
|
63
|
+
},
|
64
|
+
json: true,
|
65
|
+
};
|
66
|
+
if (method !== 'GET' && method !== 'DELETE') {
|
67
|
+
requestOptions.body = body;
|
68
|
+
}
|
69
|
+
// Add custom headers if needed
|
70
|
+
if (organizationId) {
|
71
|
+
requestOptions.headers = {
|
72
|
+
'X-com-zoho-books-organizationid': organizationId,
|
73
|
+
};
|
74
|
+
}
|
75
|
+
let attempt = 0;
|
76
|
+
const maxRetries = 5;
|
77
|
+
let lastError;
|
78
|
+
while (attempt < maxRetries) {
|
79
|
+
try {
|
80
|
+
const response = await this.helpers.requestOAuth2.call(this, 'zohoBooksOAuth2', requestOptions);
|
81
|
+
// Check if Zoho returned an error in the response
|
82
|
+
if (response.code && response.code !== 0) {
|
83
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), {
|
84
|
+
message: response.message || 'Zoho Books API Error',
|
85
|
+
description: response.message,
|
86
|
+
httpCode: response.code,
|
87
|
+
});
|
88
|
+
}
|
89
|
+
return response;
|
90
|
+
}
|
91
|
+
catch (error) {
|
92
|
+
lastError = error;
|
93
|
+
// Handle rate limiting (429)
|
94
|
+
if (error.httpCode === 429 || error.statusCode === 429) {
|
95
|
+
attempt++;
|
96
|
+
if (attempt < maxRetries) {
|
97
|
+
const backoffTime = Math.min(250 * Math.pow(2, attempt - 1), 16000); // Exponential backoff
|
98
|
+
await sleep(backoffTime);
|
99
|
+
continue;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
// Handle server errors (5xx)
|
103
|
+
if (error.httpCode >= 500 && error.httpCode < 600 && attempt < 3) {
|
104
|
+
attempt++;
|
105
|
+
const backoffTime = 1000 * attempt;
|
106
|
+
await sleep(backoffTime);
|
107
|
+
continue;
|
108
|
+
}
|
109
|
+
// For other errors, throw immediately
|
110
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), error);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), lastError);
|
114
|
+
}
|
115
|
+
async function makeApiRequestWithPagination(method, endpoint, body = {}, qs = {}, options = {}) {
|
116
|
+
const returnData = [];
|
117
|
+
let page = 1;
|
118
|
+
let hasMorePages = true;
|
119
|
+
while (hasMorePages) {
|
120
|
+
const response = await makeApiRequest.call(this, method, endpoint, body, {
|
121
|
+
...qs,
|
122
|
+
page,
|
123
|
+
per_page: 200, // Max allowed by Zoho
|
124
|
+
}, options);
|
125
|
+
// Extract data from response (the key varies by endpoint)
|
126
|
+
const responseKeys = Object.keys(response).filter((key) => key !== 'code' &&
|
127
|
+
key !== 'message' &&
|
128
|
+
key !== 'page_context' &&
|
129
|
+
Array.isArray(response[key]));
|
130
|
+
if (responseKeys.length > 0) {
|
131
|
+
const data = response[responseKeys[0]];
|
132
|
+
returnData.push(...data);
|
133
|
+
}
|
134
|
+
hasMorePages = response.page_context?.has_more_page || false;
|
135
|
+
page++;
|
136
|
+
}
|
137
|
+
return returnData;
|
138
|
+
}
|
139
|
+
function validateOrganizationId(organizationId) {
|
140
|
+
// Zoho organization IDs are typically numeric strings
|
141
|
+
return /^\d+$/.test(organizationId);
|
142
|
+
}
|
143
|
+
function getResourceEndpoint(resource) {
|
144
|
+
const endpoints = {
|
145
|
+
salesOrder: '/salesorders',
|
146
|
+
invoice: '/invoices',
|
147
|
+
item: '/items',
|
148
|
+
vendor: '/contacts',
|
149
|
+
creditNote: '/creditnotes',
|
150
|
+
payment: '/customerpayments',
|
151
|
+
};
|
152
|
+
return endpoints[resource] || '';
|
153
|
+
}
|
154
|
+
//# sourceMappingURL=GenericFunctions.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../utils/GenericFunctions.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
export declare class RateLimiter {
|
2
|
+
private queue;
|
3
|
+
private processing;
|
4
|
+
private requestsInWindow;
|
5
|
+
private windowStart;
|
6
|
+
private readonly maxRequests;
|
7
|
+
private readonly windowMs;
|
8
|
+
private dailyRequestCount;
|
9
|
+
private dailyWindowStart;
|
10
|
+
private readonly dailyCap;
|
11
|
+
constructor(maxRequests?: number, windowMs?: number, dailyCap?: number);
|
12
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
13
|
+
private process;
|
14
|
+
reset(): void;
|
15
|
+
getStats(): {
|
16
|
+
requestsInWindow: number;
|
17
|
+
dailyRequestCount: number;
|
18
|
+
queueLength: number;
|
19
|
+
};
|
20
|
+
}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.RateLimiter = void 0;
|
4
|
+
class RateLimiter {
|
5
|
+
constructor(maxRequests = 100, windowMs = 60000, dailyCap = 10000) {
|
6
|
+
this.queue = [];
|
7
|
+
this.processing = false;
|
8
|
+
this.requestsInWindow = 0;
|
9
|
+
this.windowStart = Date.now();
|
10
|
+
this.dailyRequestCount = 0;
|
11
|
+
this.dailyWindowStart = Date.now();
|
12
|
+
this.maxRequests = maxRequests;
|
13
|
+
this.windowMs = windowMs;
|
14
|
+
this.dailyCap = dailyCap;
|
15
|
+
}
|
16
|
+
async execute(fn) {
|
17
|
+
return new Promise((resolve, reject) => {
|
18
|
+
this.queue.push(async () => {
|
19
|
+
try {
|
20
|
+
const result = await fn();
|
21
|
+
resolve(result);
|
22
|
+
}
|
23
|
+
catch (error) {
|
24
|
+
reject(error);
|
25
|
+
}
|
26
|
+
});
|
27
|
+
if (!this.processing) {
|
28
|
+
this.process();
|
29
|
+
}
|
30
|
+
});
|
31
|
+
}
|
32
|
+
async process() {
|
33
|
+
this.processing = true;
|
34
|
+
while (this.queue.length > 0) {
|
35
|
+
const now = Date.now();
|
36
|
+
// Reset daily counter if new day
|
37
|
+
if (now - this.dailyWindowStart > 24 * 60 * 60 * 1000) {
|
38
|
+
this.dailyWindowStart = now;
|
39
|
+
this.dailyRequestCount = 0;
|
40
|
+
}
|
41
|
+
// Check daily cap
|
42
|
+
if (this.dailyRequestCount >= this.dailyCap) {
|
43
|
+
const waitTime = 24 * 60 * 60 * 1000 - (now - this.dailyWindowStart);
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
45
|
+
continue;
|
46
|
+
}
|
47
|
+
// Reset window counter if needed
|
48
|
+
if (now - this.windowStart > this.windowMs) {
|
49
|
+
this.windowStart = now;
|
50
|
+
this.requestsInWindow = 0;
|
51
|
+
}
|
52
|
+
// Check rate limit
|
53
|
+
if (this.requestsInWindow >= this.maxRequests) {
|
54
|
+
const waitTime = this.windowMs - (now - this.windowStart);
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
56
|
+
continue;
|
57
|
+
}
|
58
|
+
const fn = this.queue.shift();
|
59
|
+
if (fn) {
|
60
|
+
this.requestsInWindow++;
|
61
|
+
this.dailyRequestCount++;
|
62
|
+
await fn();
|
63
|
+
}
|
64
|
+
}
|
65
|
+
this.processing = false;
|
66
|
+
}
|
67
|
+
reset() {
|
68
|
+
this.requestsInWindow = 0;
|
69
|
+
this.windowStart = Date.now();
|
70
|
+
this.dailyRequestCount = 0;
|
71
|
+
this.dailyWindowStart = Date.now();
|
72
|
+
}
|
73
|
+
getStats() {
|
74
|
+
return {
|
75
|
+
requestsInWindow: this.requestsInWindow,
|
76
|
+
dailyRequestCount: this.dailyRequestCount,
|
77
|
+
queueLength: this.queue.length,
|
78
|
+
};
|
79
|
+
}
|
80
|
+
}
|
81
|
+
exports.RateLimiter = RateLimiter;
|
82
|
+
//# sourceMappingURL=RateLimiter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../utils/RateLimiter.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { INodeProperties } from 'n8n-workflow';
|
2
|
+
export declare const commonFields: INodeProperties[];
|
3
|
+
export declare const additionalFieldsCollection: INodeProperties;
|
4
|
+
export declare const filtersCollection: INodeProperties;
|
5
|
+
export declare const lineItemsField: INodeProperties;
|
6
|
+
export declare const customFieldsField: INodeProperties;
|
7
|
+
export declare function formatDateForZoho(date: string | Date): string;
|
@@ -0,0 +1,207 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.customFieldsField = exports.lineItemsField = exports.filtersCollection = exports.additionalFieldsCollection = exports.commonFields = void 0;
|
4
|
+
exports.formatDateForZoho = formatDateForZoho;
|
5
|
+
exports.commonFields = [
|
6
|
+
{
|
7
|
+
displayName: 'Return All',
|
8
|
+
name: 'returnAll',
|
9
|
+
type: 'boolean',
|
10
|
+
default: false,
|
11
|
+
description: 'Whether to return all results or only up to a given limit',
|
12
|
+
displayOptions: {
|
13
|
+
show: {
|
14
|
+
operation: ['getAll'],
|
15
|
+
},
|
16
|
+
},
|
17
|
+
},
|
18
|
+
{
|
19
|
+
displayName: 'Limit',
|
20
|
+
name: 'limit',
|
21
|
+
type: 'number',
|
22
|
+
displayOptions: {
|
23
|
+
show: {
|
24
|
+
operation: ['getAll'],
|
25
|
+
returnAll: [false],
|
26
|
+
},
|
27
|
+
},
|
28
|
+
typeOptions: {
|
29
|
+
minValue: 1,
|
30
|
+
maxValue: 200,
|
31
|
+
},
|
32
|
+
default: 50,
|
33
|
+
description: 'Max number of results to return',
|
34
|
+
},
|
35
|
+
];
|
36
|
+
exports.additionalFieldsCollection = {
|
37
|
+
displayName: 'Additional Fields',
|
38
|
+
name: 'additionalFields',
|
39
|
+
type: 'collection',
|
40
|
+
placeholder: 'Add Field',
|
41
|
+
default: {},
|
42
|
+
options: [],
|
43
|
+
};
|
44
|
+
exports.filtersCollection = {
|
45
|
+
displayName: 'Filters',
|
46
|
+
name: 'filters',
|
47
|
+
type: 'collection',
|
48
|
+
placeholder: 'Add Filter',
|
49
|
+
default: {},
|
50
|
+
options: [
|
51
|
+
{
|
52
|
+
displayName: 'Status',
|
53
|
+
name: 'status',
|
54
|
+
type: 'options',
|
55
|
+
options: [
|
56
|
+
{ name: 'All', value: 'all' },
|
57
|
+
{ name: 'Draft', value: 'draft' },
|
58
|
+
{ name: 'Confirmed', value: 'confirmed' },
|
59
|
+
{ name: 'Void', value: 'void' },
|
60
|
+
],
|
61
|
+
default: 'all',
|
62
|
+
description: 'Filter by status',
|
63
|
+
},
|
64
|
+
{
|
65
|
+
displayName: 'Date From',
|
66
|
+
name: 'date_from',
|
67
|
+
type: 'dateTime',
|
68
|
+
default: '',
|
69
|
+
description: 'Filter by date from',
|
70
|
+
},
|
71
|
+
{
|
72
|
+
displayName: 'Date To',
|
73
|
+
name: 'date_to',
|
74
|
+
type: 'dateTime',
|
75
|
+
default: '',
|
76
|
+
description: 'Filter by date to',
|
77
|
+
},
|
78
|
+
{
|
79
|
+
displayName: 'Sort Column',
|
80
|
+
name: 'sort_column',
|
81
|
+
type: 'string',
|
82
|
+
default: '',
|
83
|
+
description: 'Column to sort by',
|
84
|
+
},
|
85
|
+
{
|
86
|
+
displayName: 'Sort Order',
|
87
|
+
name: 'sort_order',
|
88
|
+
type: 'options',
|
89
|
+
options: [
|
90
|
+
{ name: 'Ascending', value: 'A' },
|
91
|
+
{ name: 'Descending', value: 'D' },
|
92
|
+
],
|
93
|
+
default: 'A',
|
94
|
+
description: 'Sort order',
|
95
|
+
},
|
96
|
+
],
|
97
|
+
};
|
98
|
+
exports.lineItemsField = {
|
99
|
+
displayName: 'Line Items',
|
100
|
+
name: 'line_items',
|
101
|
+
type: 'fixedCollection',
|
102
|
+
typeOptions: {
|
103
|
+
multipleValues: true,
|
104
|
+
},
|
105
|
+
placeholder: 'Add Line Item',
|
106
|
+
default: {},
|
107
|
+
options: [
|
108
|
+
{
|
109
|
+
name: 'item',
|
110
|
+
displayName: 'Item',
|
111
|
+
values: [
|
112
|
+
{
|
113
|
+
displayName: 'Item ID',
|
114
|
+
name: 'item_id',
|
115
|
+
type: 'string',
|
116
|
+
default: '',
|
117
|
+
required: true,
|
118
|
+
description: 'The ID of the item',
|
119
|
+
},
|
120
|
+
{
|
121
|
+
displayName: 'Quantity',
|
122
|
+
name: 'quantity',
|
123
|
+
type: 'number',
|
124
|
+
default: 1,
|
125
|
+
required: true,
|
126
|
+
typeOptions: {
|
127
|
+
minValue: 0.01,
|
128
|
+
},
|
129
|
+
description: 'The quantity of the item',
|
130
|
+
},
|
131
|
+
{
|
132
|
+
displayName: 'Rate',
|
133
|
+
name: 'rate',
|
134
|
+
type: 'number',
|
135
|
+
default: 0,
|
136
|
+
typeOptions: {
|
137
|
+
minValue: 0,
|
138
|
+
},
|
139
|
+
description: 'The rate of the item',
|
140
|
+
},
|
141
|
+
{
|
142
|
+
displayName: 'Description',
|
143
|
+
name: 'description',
|
144
|
+
type: 'string',
|
145
|
+
default: '',
|
146
|
+
description: 'Description of the line item',
|
147
|
+
},
|
148
|
+
{
|
149
|
+
displayName: 'Discount',
|
150
|
+
name: 'discount',
|
151
|
+
type: 'number',
|
152
|
+
default: 0,
|
153
|
+
description: 'Discount percentage',
|
154
|
+
},
|
155
|
+
{
|
156
|
+
displayName: 'Tax ID',
|
157
|
+
name: 'tax_id',
|
158
|
+
type: 'string',
|
159
|
+
default: '',
|
160
|
+
description: 'Tax ID to apply',
|
161
|
+
},
|
162
|
+
],
|
163
|
+
},
|
164
|
+
],
|
165
|
+
};
|
166
|
+
exports.customFieldsField = {
|
167
|
+
displayName: 'Custom Fields',
|
168
|
+
name: 'custom_fields',
|
169
|
+
type: 'fixedCollection',
|
170
|
+
typeOptions: {
|
171
|
+
multipleValues: true,
|
172
|
+
},
|
173
|
+
placeholder: 'Add Custom Field',
|
174
|
+
default: {},
|
175
|
+
options: [
|
176
|
+
{
|
177
|
+
name: 'customField',
|
178
|
+
displayName: 'Custom Field',
|
179
|
+
values: [
|
180
|
+
{
|
181
|
+
displayName: 'Label',
|
182
|
+
name: 'label',
|
183
|
+
type: 'string',
|
184
|
+
default: '',
|
185
|
+
description: 'The label of the custom field',
|
186
|
+
},
|
187
|
+
{
|
188
|
+
displayName: 'Value',
|
189
|
+
name: 'value',
|
190
|
+
type: 'string',
|
191
|
+
default: '',
|
192
|
+
description: 'The value of the custom field',
|
193
|
+
},
|
194
|
+
],
|
195
|
+
},
|
196
|
+
],
|
197
|
+
};
|
198
|
+
function formatDateForZoho(date) {
|
199
|
+
if (!date)
|
200
|
+
return '';
|
201
|
+
const d = new Date(date);
|
202
|
+
const year = d.getFullYear();
|
203
|
+
const month = String(d.getMonth() + 1).padStart(2, '0');
|
204
|
+
const day = String(d.getDate()).padStart(2, '0');
|
205
|
+
return `${year}-${month}-${day}`;
|
206
|
+
}
|
207
|
+
//# sourceMappingURL=Schemas.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Schemas.js","sourceRoot":"","sources":["../../utils/Schemas.ts"],"names":[],"mappings":"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"}
|
package/index.js
ADDED
package/package.json
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
{
|
2
|
+
"name": "@arathron/n8n-nodes-zoho-books",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "n8n node for Zoho Books API integration",
|
5
|
+
"main": "index.js",
|
6
|
+
"scripts": {
|
7
|
+
"build": "tsc",
|
8
|
+
"dev": "tsc --watch",
|
9
|
+
"lint": "eslint . --ext .ts",
|
10
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
11
|
+
"format": "prettier --write \"**/*.{ts,json,md}\"",
|
12
|
+
"test": "jest",
|
13
|
+
"test:coverage": "jest --coverage",
|
14
|
+
"test:integration": "jest --testPathPattern=integration",
|
15
|
+
"prepublishOnly": "npm run build && npm run lint && npm test"
|
16
|
+
},
|
17
|
+
"n8n": {
|
18
|
+
"n8nNodesApiVersion": 1,
|
19
|
+
"credentials": [
|
20
|
+
"dist/credentials/ZohoBooksOAuth2.credentials.js"
|
21
|
+
],
|
22
|
+
"nodes": [
|
23
|
+
"dist/nodes/ZohoBooks.node.js"
|
24
|
+
]
|
25
|
+
},
|
26
|
+
"keywords": [
|
27
|
+
"n8n",
|
28
|
+
"node",
|
29
|
+
"zoho",
|
30
|
+
"books",
|
31
|
+
"accounting",
|
32
|
+
"workflow",
|
33
|
+
"automation"
|
34
|
+
],
|
35
|
+
"author": "n8n Community <info@n8n.io>",
|
36
|
+
"license": "MIT",
|
37
|
+
"repository": {
|
38
|
+
"type": "git",
|
39
|
+
"url": "git+https://github.com/n8n-io/n8n-nodes-zoho-books.git"
|
40
|
+
},
|
41
|
+
"devDependencies": {
|
42
|
+
"@types/jest": "^29.5.0",
|
43
|
+
"@types/node": "^20.0.0",
|
44
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
45
|
+
"@typescript-eslint/parser": "^6.0.0",
|
46
|
+
"eslint": "^8.50.0",
|
47
|
+
"eslint-config-prettier": "^9.0.0",
|
48
|
+
"jest": "^29.5.0",
|
49
|
+
"nock": "^13.3.0",
|
50
|
+
"prettier": "^3.0.0",
|
51
|
+
"ts-jest": "^29.1.0",
|
52
|
+
"typescript": "^5.2.0"
|
53
|
+
},
|
54
|
+
"dependencies": {
|
55
|
+
"n8n-core": "^1.0.0",
|
56
|
+
"n8n-workflow": "^1.0.0"
|
57
|
+
},
|
58
|
+
"files": [
|
59
|
+
"dist"
|
60
|
+
],
|
61
|
+
"bugs": {
|
62
|
+
"url": "https://github.com/n8n-io/n8n-nodes-zoho-books/issues"
|
63
|
+
},
|
64
|
+
"homepage": "https://github.com/n8n-io/n8n-nodes-zoho-books#readme",
|
65
|
+
"directories": {
|
66
|
+
"doc": "docs",
|
67
|
+
"test": "test"
|
68
|
+
}
|
69
|
+
}
|