n8n-nodes-zernio-messaging 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/README.md +67 -0
- package/dist/credentials/ZernioApi.credentials.d.ts +16 -0
- package/dist/credentials/ZernioApi.credentials.js +39 -0
- package/dist/credentials/ZernioApi.credentials.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/ZernioMessaging.node.d.ts +5 -0
- package/dist/nodes/ZernioMessaging.node.js +151 -0
- package/dist/nodes/ZernioMessaging.node.js.map +1 -0
- package/dist/nodes/ZernioTrigger.node.d.ts +5 -0
- package/dist/nodes/ZernioTrigger.node.js +40 -0
- package/dist/nodes/ZernioTrigger.node.js.map +1 -0
- package/dist/nodes/zernio.svg +1 -0
- package/dist/utils/api.d.ts +13 -0
- package/dist/utils/api.js +171 -0
- package/dist/utils/api.js.map +1 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# n8n-nodes-zernio-messaging
|
|
2
|
+
|
|
3
|
+
حزمة Community Node مخصصة لـ **Zernio Unified Inbox**. تعتمد على العقد الرسمي الحالي `v1` ولا ترسل أي طلبات إلى عناوين يحددها المستخدم خارج Base URL الموجود في الاعتماد.
|
|
4
|
+
|
|
5
|
+
## ما تم تنفيذه
|
|
6
|
+
|
|
7
|
+
- **Zernio Messaging:** رفع Binary مباشر حتى 25MB عبر `/v1/media/upload-direct`، ثم إرسال نص، رابط مرفق، WhatsApp/Generic Template، WhatsApp Interactive، Location، Contact، وRaw JSON مضبوط.
|
|
8
|
+
- عمليات المحادثات والرسائل: بدء محادثة، قائمة/بحث/قراءة المحادثات، قائمة الرسائل، تعديل وحذف الرسائل، reactions، typing، وmark read.
|
|
9
|
+
- **Zernio Trigger:** استقبال Webhooks والتحقق من `X-Zernio-Signature` أو legacy `X-Late-Signature` بـ HMAC-SHA256، مع فلتر أحداث ومنع Event IDs المكررة خلال دورة العمل.
|
|
10
|
+
- حماية الأسرار: API key داخل Credential فقط ولا يدخل في `json` أو رسائل الخطأ.
|
|
11
|
+
- `Idempotency-Key` اختياري للإرسال؛ Zernio يحتفظ بالمفاتيح الناجحة 24 ساعة. لا توجد إعادة محاولات صامتة.
|
|
12
|
+
- `continueOnFail` يعيد عنصر خطأ مرتبطًا بالعنصر الأصلي.
|
|
13
|
+
|
|
14
|
+
## التثبيت
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install
|
|
18
|
+
npm run build
|
|
19
|
+
npm pack
|
|
20
|
+
# ثبّت ملف tgz الناتج داخل n8n أو انسخ الحزمة إلى مجلد community-nodes
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
أضف Credential باسم **Zernio API**، أدخل API Key، واترك Base URL الافتراضي `https://zernio.com/api`.
|
|
24
|
+
|
|
25
|
+
## إرسال رسالة
|
|
26
|
+
|
|
27
|
+
اختر `Send Message`، أدخل `Account ID` و`Conversation ID`، ثم نوع الرسالة. جميع الحقول تدعم Expressions مثل:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
{{$json.accountId}}
|
|
31
|
+
{{$json.conversationId}}
|
|
32
|
+
{{$json.message}}
|
|
33
|
+
{{$json.orderId + ":" + $json.attempt}}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
للمرفقات عبر رابط يجب أن يكون الرابط عامًا. لرفع Binary، استخدم `Upload Binary Media`، واختر اسم خاصية Binary؛ يرجع Zernio رابطًا عامًا يمكن تمريره إلى `Send Message`. الحد الرسمي 25MB والتخزين المؤقت يحذف بعد 7 أيام.
|
|
37
|
+
|
|
38
|
+
## WhatsApp
|
|
39
|
+
|
|
40
|
+
القوالب المعتمدة تستخدم `template.elements[0].name/language/components`. Interactive يدعم الأنواع التي يعلنها OpenAPI الحالي. الرسائل التفاعلية رسائل session داخل نافذة 24 ساعة. `category: utility` لا يجتمع مع template أو attachment أو location أو contacts، و`quickReplies` لا يجتمع مع `buttons`. يبقى رفض المنصة هو المرجع النهائي للقيود الخاصة بالحساب والقالب.
|
|
41
|
+
|
|
42
|
+
## Webhook Trigger
|
|
43
|
+
|
|
44
|
+
أنشئ subscription في Zernio Dashboard → Webhooks بنفس URL الذي يعرضه n8n، واضبط secret نفسه في Trigger. Zernio يرسل Event ID ثابتًا في `X-Zernio-Event-Id` ويمكن فلترة `message.received` مثلًا. يفضل تشغيل HTTPS وعدم تعطيل التوقيع.
|
|
45
|
+
|
|
46
|
+
## أمثلة Workflow
|
|
47
|
+
|
|
48
|
+
1. Webhook/AI Agent → Zernio Messaging، مع `{{$json.conversationId}}` و`{{$json.output}}`.
|
|
49
|
+
2. Google Sheets/CRM → Split in Batches → Zernio Messaging، مع مفتاح `{{$json.customerId + ":" + $execution.id}}` إذا كان مناسبًا لسياسة التكرار.
|
|
50
|
+
3. Zernio Trigger (`message.received`) → IF/Router → Template أو Interactive reply.
|
|
51
|
+
|
|
52
|
+
## الاختبارات
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npm run build
|
|
56
|
+
npm test
|
|
57
|
+
npm run lint
|
|
58
|
+
npm run pack:check
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
لا توجد اختبارات Live في الحزمة؛ لا يتم الادعاء بإرسال حقيقي دون API key وتجربة صريحة من المستخدم. أخطاء `429` و`5xx` لا تعاد تلقائيًا لأن فشل الاستجابة قد يحدث بعد قبول الرسالة من المنصة؛ استخدم reconciliation وIdempotency وفق توثيق Zernio.
|
|
62
|
+
|
|
63
|
+
## مصادر العقد
|
|
64
|
+
|
|
65
|
+
- [Zernio OpenAPI](https://zernio.com/openapi.yaml)
|
|
66
|
+
- [Zernio API Docs](https://docs.zernio.com/)
|
|
67
|
+
- [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class ZernioApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
documentationUrl: string;
|
|
6
|
+
properties: INodeProperties[];
|
|
7
|
+
authenticate: {
|
|
8
|
+
type: "generic";
|
|
9
|
+
properties: {
|
|
10
|
+
headers: {
|
|
11
|
+
Authorization: string;
|
|
12
|
+
Accept: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZernioApi = void 0;
|
|
4
|
+
class ZernioApi {
|
|
5
|
+
name = 'zernioApi';
|
|
6
|
+
displayName = 'Zernio API';
|
|
7
|
+
documentationUrl = 'https://docs.zernio.com/';
|
|
8
|
+
properties = [
|
|
9
|
+
{
|
|
10
|
+
displayName: 'API Key',
|
|
11
|
+
name: 'apiKey',
|
|
12
|
+
type: 'string',
|
|
13
|
+
typeOptions: { password: true },
|
|
14
|
+
default: '',
|
|
15
|
+
required: true,
|
|
16
|
+
description: 'Bearer API key created in the Zernio dashboard. It is never included in node output.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
displayName: 'Base URL',
|
|
20
|
+
name: 'baseUrl',
|
|
21
|
+
type: 'string',
|
|
22
|
+
default: 'https://zernio.com/api',
|
|
23
|
+
required: true,
|
|
24
|
+
description: 'Keep the production default unless you operate a compatible API endpoint.',
|
|
25
|
+
placeholder: 'https://zernio.com/api',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
authenticate = {
|
|
29
|
+
type: 'generic',
|
|
30
|
+
properties: {
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: '=Bearer {{$credentials.apiKey}}',
|
|
33
|
+
Accept: 'application/json',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
exports.ZernioApi = ZernioApi;
|
|
39
|
+
//# sourceMappingURL=ZernioApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZernioApi.credentials.js","sourceRoot":"","sources":["../../credentials/ZernioApi.credentials.ts"],"names":[],"mappings":";;;AAEA,MAAa,SAAS;IACpB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,YAAY,CAAC;IAC3B,gBAAgB,GAAG,0BAA0B,CAAC;IAC9C,UAAU,GAAsB;QAC9B;YACE,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/B,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,sFAAsF;SACpG;QACD;YACE,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,wBAAwB;YACjC,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,2EAA2E;YACxF,WAAW,EAAE,wBAAwB;SACtC;KACF,CAAC;IACF,YAAY,GAAG;QACb,IAAI,EAAE,SAAkB;QACxB,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,aAAa,EAAE,iCAAiC;gBAChD,MAAM,EAAE,kBAAkB;aAC3B;SACF;KACF,CAAC;CACH;AAjCD,8BAiCC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZernioApi = exports.ZernioTrigger = exports.ZernioMessaging = void 0;
|
|
4
|
+
var ZernioMessaging_node_1 = require("./nodes/ZernioMessaging.node");
|
|
5
|
+
Object.defineProperty(exports, "ZernioMessaging", { enumerable: true, get: function () { return ZernioMessaging_node_1.ZernioMessaging; } });
|
|
6
|
+
var ZernioTrigger_node_1 = require("./nodes/ZernioTrigger.node");
|
|
7
|
+
Object.defineProperty(exports, "ZernioTrigger", { enumerable: true, get: function () { return ZernioTrigger_node_1.ZernioTrigger; } });
|
|
8
|
+
var ZernioApi_credentials_1 = require("./credentials/ZernioApi.credentials");
|
|
9
|
+
Object.defineProperty(exports, "ZernioApi", { enumerable: true, get: function () { return ZernioApi_credentials_1.ZernioApi; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,qEAA+D;AAAtD,uHAAA,eAAe,OAAA;AACxB,iEAA2D;AAAlD,mHAAA,aAAa,OAAA;AACtB,6EAAgE;AAAvD,kHAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class ZernioMessaging implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZernioMessaging = void 0;
|
|
4
|
+
const api_1 = require("../utils/api");
|
|
5
|
+
const operations = {
|
|
6
|
+
displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, default: 'sendMessage',
|
|
7
|
+
options: [
|
|
8
|
+
{ name: 'Send Message', value: 'sendMessage', description: 'Send text, media, template, interactive, location, or contact message' },
|
|
9
|
+
{ name: 'Upload Binary Media', value: 'uploadMedia' },
|
|
10
|
+
{ name: 'Start Conversation', value: 'startConversation', description: 'Create a new inbox conversation' },
|
|
11
|
+
{ name: 'List Conversations', value: 'listConversations' }, { name: 'Search Conversations', value: 'searchConversations' },
|
|
12
|
+
{ name: 'List Connected Accounts', value: 'listAccounts' },
|
|
13
|
+
{ name: 'Get Conversation', value: 'getConversation' }, { name: 'List Messages', value: 'listMessages' },
|
|
14
|
+
{ name: 'Edit Message', value: 'editMessage' }, { name: 'Delete Message', value: 'deleteMessage' },
|
|
15
|
+
{ name: 'Add Reaction', value: 'addReaction' }, { name: 'Remove Reaction', value: 'removeReaction' },
|
|
16
|
+
{ name: 'Send Typing Indicator', value: 'typing' }, { name: 'Mark Conversation Read', value: 'markRead' },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
const common = [
|
|
20
|
+
{ displayName: 'Account ID', name: 'accountId', type: 'string', required: true, default: '', description: 'Connected Zernio account ID.', displayOptions: { hide: { operation: ['uploadMedia', 'listAccounts'] } } },
|
|
21
|
+
{ displayName: 'Conversation ID', name: 'conversationId', type: 'string', required: true, default: '', displayOptions: { hide: { operation: ['startConversation', 'listConversations', 'searchConversations', 'uploadMedia', 'listAccounts'] } } },
|
|
22
|
+
{ displayName: 'Message ID', name: 'messageId', type: 'string', required: true, default: '', displayOptions: { show: { operation: ['editMessage', 'deleteMessage', 'addReaction', 'removeReaction'] } } },
|
|
23
|
+
{ displayName: 'Idempotency Key', name: 'idempotencyKey', type: 'string', default: '', description: 'Optional stable key. Zernio retains successful sends for 24 hours; do not reuse it for a different body.', displayOptions: { show: { operation: ['sendMessage', 'startConversation'] } } },
|
|
24
|
+
];
|
|
25
|
+
const sendFields = [
|
|
26
|
+
{ displayName: 'Message Type', name: 'messageType', type: 'options', default: 'text', options: [
|
|
27
|
+
{ name: 'Text', value: 'text' }, { name: 'Attachment URL', value: 'attachment' }, { name: 'WhatsApp Template / Generic Template', value: 'template' },
|
|
28
|
+
{ name: 'WhatsApp Interactive', value: 'interactive' }, { name: 'Location', value: 'location' }, { name: 'Contact', value: 'contact' }, { name: 'Advanced Raw JSON', value: 'raw' },
|
|
29
|
+
], displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
30
|
+
{ displayName: 'Message', name: 'message', type: 'string', typeOptions: { rows: 4 }, default: '', displayOptions: { show: { operation: ['sendMessage'], messageType: ['text'] } } },
|
|
31
|
+
{ displayName: 'Attachment URL', name: 'attachmentUrl', type: 'string', default: '', placeholder: 'https://example.com/file.pdf', displayOptions: { show: { operation: ['sendMessage'], messageType: ['attachment'] } } },
|
|
32
|
+
{ displayName: 'Attachment Type', name: 'attachmentType', type: 'options', default: 'file', options: [{ name: 'Image', value: 'image' }, { name: 'Video', value: 'video' }, { name: 'Audio', value: 'audio' }, { name: 'File', value: 'file' }], displayOptions: { show: { operation: ['sendMessage'], messageType: ['attachment'] } } },
|
|
33
|
+
{ displayName: 'Attachment Name', name: 'attachmentName', type: 'string', default: '', displayOptions: { show: { operation: ['sendMessage'], messageType: ['attachment'] } } },
|
|
34
|
+
{ displayName: 'Voice Note', name: 'voiceNote', type: 'boolean', default: false, description: 'WhatsApp audio only; must be OGG/Opus mono.', displayOptions: { show: { operation: ['sendMessage'], messageType: ['attachment'] } } },
|
|
35
|
+
{ displayName: 'Caption', name: 'caption', type: 'string', typeOptions: { rows: 3 }, default: '', displayOptions: { show: { operation: ['sendMessage'], messageType: ['attachment'] } } },
|
|
36
|
+
{ displayName: 'Template JSON', name: 'template', type: 'json', default: '{\n "elements": [{ "name": "order_update", "language": "en_US", "components": [] }]\n}', displayOptions: { show: { operation: ['sendMessage'], messageType: ['template'] } } },
|
|
37
|
+
{ displayName: 'Interactive JSON', name: 'interactive', type: 'json', default: '{\n "type": "list",\n "body": { "text": "Choose an option" },\n "action": { "button": "Open", "sections": [] }\n}', displayOptions: { show: { operation: ['sendMessage'], messageType: ['interactive'] } } },
|
|
38
|
+
{ displayName: 'Latitude', name: 'latitude', type: 'number', default: 0, displayOptions: { show: { operation: ['sendMessage'], messageType: ['location'] } } },
|
|
39
|
+
{ displayName: 'Longitude', name: 'longitude', type: 'number', default: 0, displayOptions: { show: { operation: ['sendMessage'], messageType: ['location'] } } },
|
|
40
|
+
{ displayName: 'Location Name', name: 'locationName', type: 'string', default: '', displayOptions: { show: { operation: ['sendMessage'], messageType: ['location'] } } },
|
|
41
|
+
{ displayName: 'Address', name: 'address', type: 'string', default: '', displayOptions: { show: { operation: ['sendMessage'], messageType: ['location'] } } },
|
|
42
|
+
{ displayName: 'Contacts JSON', name: 'contacts', type: 'json', default: '{\n "contacts": []\n}', displayOptions: { show: { operation: ['sendMessage'], messageType: ['contact'] } } },
|
|
43
|
+
{ displayName: 'Raw Payload', name: 'rawPayload', type: 'json', default: '{}', description: 'Merged only into the controlled send endpoint. Authentication and URL cannot be overridden.', displayOptions: { show: { operation: ['sendMessage'], messageType: ['raw'] } } },
|
|
44
|
+
{ displayName: 'Quick Replies JSON', name: 'quickReplies', type: 'json', default: '', displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
45
|
+
{ displayName: 'Buttons JSON', name: 'buttons', type: 'json', default: '', displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
46
|
+
{ displayName: 'Reply To', name: 'replyTo', type: 'string', default: '', displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
47
|
+
{ displayName: 'Link Preview', name: 'linkPreview', type: 'boolean', default: true, displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
48
|
+
{ displayName: 'WhatsApp Category', name: 'category', type: 'options', default: '', options: [{ name: 'Utility', value: 'utility' }], displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
49
|
+
{ displayName: 'Facebook Message Tag', name: 'messageTag', type: 'string', default: '', displayOptions: { show: { operation: ['sendMessage'] } } },
|
|
50
|
+
];
|
|
51
|
+
const misc = [
|
|
52
|
+
{ displayName: 'Binary Property', name: 'binaryPropertyName', type: 'string', default: 'data', required: true, description: 'Input binary property to upload. Maximum 25 MB per the official endpoint.', displayOptions: { show: { operation: ['uploadMedia'] } } },
|
|
53
|
+
{ displayName: 'Content Type Override', name: 'contentType', type: 'string', default: '', placeholder: 'image/jpeg', displayOptions: { show: { operation: ['uploadMedia'] } } },
|
|
54
|
+
{ displayName: 'Start Conversation Payload', name: 'startPayload', type: 'json', default: '{\n "accountId": "",\n "recipient": {}\n}', displayOptions: { show: { operation: ['startConversation'] } } },
|
|
55
|
+
{ displayName: 'Query', name: 'query', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['searchConversations'] } } },
|
|
56
|
+
{ displayName: 'Reaction', name: 'reaction', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['addReaction', 'removeReaction'] } } },
|
|
57
|
+
{ displayName: 'Edit Message Text', name: 'editMessageText', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['editMessage'] } } },
|
|
58
|
+
];
|
|
59
|
+
class ZernioMessaging {
|
|
60
|
+
description = {
|
|
61
|
+
displayName: 'Zernio Messaging', name: 'zernioMessaging', icon: 'file:zernio.svg', group: ['transform'], version: 1,
|
|
62
|
+
description: 'Unified Inbox messaging and conversation operations using the current Zernio API.', defaults: { name: 'Zernio Messaging' },
|
|
63
|
+
inputs: ['main'], outputs: ['main'], credentials: [{ name: 'zernioApi', required: true }], properties: [operations, ...common, ...sendFields, ...misc],
|
|
64
|
+
};
|
|
65
|
+
async execute() {
|
|
66
|
+
const items = this.getInputData();
|
|
67
|
+
const result = [];
|
|
68
|
+
for (let i = 0; i < items.length; i++) {
|
|
69
|
+
const p = (name) => this.getNodeParameter(name, i);
|
|
70
|
+
const op = p('operation');
|
|
71
|
+
let data;
|
|
72
|
+
let path = '';
|
|
73
|
+
let method = 'GET';
|
|
74
|
+
let body;
|
|
75
|
+
try {
|
|
76
|
+
if (op === 'uploadMedia') {
|
|
77
|
+
data = await (0, api_1.uploadBinary)(this, i, (0, api_1.nonEmpty)(p('binaryPropertyName'), 'Binary Property'), p('contentType') || undefined);
|
|
78
|
+
result.push((0, api_1.output)(data, i, { operation: op }));
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (op === 'listAccounts') {
|
|
82
|
+
data = await (0, api_1.request)(this, 'GET', '/v1/accounts');
|
|
83
|
+
result.push((0, api_1.output)(data, i, { operation: op }));
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const conversationId = encodeURIComponent((0, api_1.nonEmpty)(p('conversationId'), 'Conversation ID'));
|
|
87
|
+
if (op === 'sendMessage') {
|
|
88
|
+
method = 'POST';
|
|
89
|
+
path = `/v1/inbox/conversations/${conversationId}/messages`;
|
|
90
|
+
body = (0, api_1.buildSendPayload)({ ...Object.fromEntries(['accountId', 'messageType', 'message', 'attachmentUrl', 'attachmentType', 'attachmentName', 'voiceNote', 'caption', 'template', 'interactive', 'latitude', 'longitude', 'locationName', 'address', 'contacts', 'rawPayload', 'quickReplies', 'buttons', 'replyTo', 'linkPreview', 'category', 'messageTag'].map(k => [k, p(k)])) });
|
|
91
|
+
}
|
|
92
|
+
else if (op === 'startConversation') {
|
|
93
|
+
method = 'POST';
|
|
94
|
+
path = '/v1/inbox/conversations';
|
|
95
|
+
body = (0, api_1.parseJsonObject)(p('startPayload'), 'Start Conversation Payload');
|
|
96
|
+
if (!body.accountId)
|
|
97
|
+
body.accountId = p('accountId');
|
|
98
|
+
}
|
|
99
|
+
else if (op === 'listConversations') {
|
|
100
|
+
path = '/v1/inbox/conversations';
|
|
101
|
+
}
|
|
102
|
+
else if (op === 'searchConversations') {
|
|
103
|
+
path = `/v1/inbox/conversations/search?query=${encodeURIComponent((0, api_1.nonEmpty)(p('query'), 'Query'))}`;
|
|
104
|
+
}
|
|
105
|
+
else if (op === 'getConversation') {
|
|
106
|
+
path = `/v1/inbox/conversations/${conversationId}`;
|
|
107
|
+
}
|
|
108
|
+
else if (op === 'listMessages') {
|
|
109
|
+
path = `/v1/inbox/conversations/${conversationId}/messages`;
|
|
110
|
+
}
|
|
111
|
+
else if (op === 'editMessage') {
|
|
112
|
+
method = 'PATCH';
|
|
113
|
+
path = `/v1/inbox/conversations/${conversationId}/messages/${encodeURIComponent((0, api_1.nonEmpty)(p('messageId'), 'Message ID'))}`;
|
|
114
|
+
body = { message: (0, api_1.nonEmpty)(p('editMessageText'), 'Edit Message Text') };
|
|
115
|
+
}
|
|
116
|
+
else if (op === 'deleteMessage') {
|
|
117
|
+
method = 'DELETE';
|
|
118
|
+
path = `/v1/inbox/conversations/${conversationId}/messages/${encodeURIComponent((0, api_1.nonEmpty)(p('messageId'), 'Message ID'))}`;
|
|
119
|
+
}
|
|
120
|
+
else if (op === 'addReaction' || op === 'removeReaction') {
|
|
121
|
+
method = op === 'addReaction' ? 'POST' : 'DELETE';
|
|
122
|
+
path = `/v1/inbox/conversations/${conversationId}/messages/${encodeURIComponent((0, api_1.nonEmpty)(p('messageId'), 'Message ID'))}/reactions`;
|
|
123
|
+
body = { reaction: (0, api_1.nonEmpty)(p('reaction'), 'Reaction') };
|
|
124
|
+
}
|
|
125
|
+
else if (op === 'typing') {
|
|
126
|
+
method = 'POST';
|
|
127
|
+
path = `/v1/inbox/conversations/${conversationId}/typing`;
|
|
128
|
+
}
|
|
129
|
+
else if (op === 'markRead') {
|
|
130
|
+
method = 'POST';
|
|
131
|
+
path = `/v1/inbox/conversations/${conversationId}/read`;
|
|
132
|
+
}
|
|
133
|
+
else
|
|
134
|
+
throw new Error(`Unsupported operation: ${op}`);
|
|
135
|
+
const key = (0, api_1.validateKey)(p('idempotencyKey'));
|
|
136
|
+
const headers = key ? { 'Idempotency-Key': key } : {};
|
|
137
|
+
data = await (0, api_1.request)(this, method, path, body, headers);
|
|
138
|
+
result.push((0, api_1.output)(data, i, { operation: op, accountId: p('accountId'), ...(p('conversationId') ? { conversationId: p('conversationId') } : {}), idempotencyKeyUsed: Boolean(key) }));
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (this.continueOnFail())
|
|
142
|
+
result.push({ json: { success: false, operation: op, error: { message: error.message } }, pairedItem: { item: i } });
|
|
143
|
+
else
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return [result];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.ZernioMessaging = ZernioMessaging;
|
|
151
|
+
//# sourceMappingURL=ZernioMessaging.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZernioMessaging.node.js","sourceRoot":"","sources":["../../nodes/ZernioMessaging.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
|
|
2
|
+
export declare class ZernioTrigger implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZernioTrigger = void 0;
|
|
4
|
+
const api_1 = require("../utils/api");
|
|
5
|
+
class ZernioTrigger {
|
|
6
|
+
description = {
|
|
7
|
+
displayName: 'Zernio Trigger', name: 'zernioTrigger', icon: 'file:zernio.svg', group: ['trigger'], version: 1,
|
|
8
|
+
description: 'Receive and verify Zernio webhook events. Configure the subscription in Zernio Dashboard → Webhooks.',
|
|
9
|
+
defaults: { name: 'Zernio Trigger' }, inputs: [], outputs: ['main'], credentials: [],
|
|
10
|
+
properties: [
|
|
11
|
+
{ displayName: 'Webhook Secret', name: 'webhookSecret', type: 'string', typeOptions: { password: true }, default: '', required: true, description: 'The secret configured on the Zernio webhook subscription.' },
|
|
12
|
+
{ displayName: 'Event Filter', name: 'eventFilter', type: 'string', default: '', description: 'Optional event name, for example message.received. Leave empty to accept every signed event.' },
|
|
13
|
+
{ displayName: 'Reject Duplicate Event IDs', name: 'rejectDuplicates', type: 'boolean', default: true, description: 'Uses X-Zernio-Event-Id to reject replayed deliveries during the active process.' },
|
|
14
|
+
],
|
|
15
|
+
webhooks: [{ name: 'default', httpMethod: 'POST', responseMode: 'onReceived', path: 'zernio' }],
|
|
16
|
+
};
|
|
17
|
+
async webhook() {
|
|
18
|
+
const secret = String(this.getNodeParameter('webhookSecret'));
|
|
19
|
+
const headers = this.getHeaderData();
|
|
20
|
+
const rawBody = typeof this.getBodyData === 'function' ? String(this.getBodyData()) : JSON.stringify(this.getBodyData());
|
|
21
|
+
const signature = String(headers['x-zernio-signature'] || headers['x-late-signature'] || '');
|
|
22
|
+
if (!signature || !(0, api_1.verifyHmac)(rawBody, signature, secret))
|
|
23
|
+
return { webhookResponse: { status: 401, body: { error: 'Invalid webhook signature' } } };
|
|
24
|
+
const body = this.getBodyData();
|
|
25
|
+
const event = String(headers['x-zernio-event'] || headers['x-late-event'] || body.event || '');
|
|
26
|
+
const eventId = String(headers['x-zernio-event-id'] || headers['x-late-event-id'] || body.id || '');
|
|
27
|
+
const filter = String(this.getNodeParameter('eventFilter') || '');
|
|
28
|
+
if (filter && filter !== event)
|
|
29
|
+
return { webhookResponse: { status: 204 } };
|
|
30
|
+
const staticData = this.getWorkflowStaticData('node');
|
|
31
|
+
const seen = Array.isArray(staticData.zernioEventIds) ? staticData.zernioEventIds : [];
|
|
32
|
+
if (this.getNodeParameter('rejectDuplicates') && eventId && seen.includes(eventId))
|
|
33
|
+
return { webhookResponse: { status: 409, body: { error: 'Duplicate event rejected', eventId } } };
|
|
34
|
+
if (eventId)
|
|
35
|
+
staticData.zernioEventIds = [...seen.slice(-999), eventId];
|
|
36
|
+
return { webhookResponse: { status: 200, body: { received: true } }, workflowData: [[{ json: { ...body, _zernio: { event, eventId, verified: true } } }]] };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.ZernioTrigger = ZernioTrigger;
|
|
40
|
+
//# sourceMappingURL=ZernioTrigger.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZernioTrigger.node.js","sourceRoot":"","sources":["../../nodes/ZernioTrigger.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#111827"/><path d="M17 20h30v8H25v8h18v8H25v8h22v8H17z" fill="#fff"/><circle cx="49" cy="20" r="5" fill="#22c55e"/></svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
|
|
2
|
+
export type JsonObject = Record<string, unknown>;
|
|
3
|
+
export declare function parseJsonObject(value: unknown, field: string): JsonObject;
|
|
4
|
+
export declare function parseJsonArray(value: unknown, field: string): unknown[];
|
|
5
|
+
export declare function httpUrl(value: unknown, field: string): string;
|
|
6
|
+
export declare function nonEmpty(value: unknown, field: string): string;
|
|
7
|
+
export declare function buildSendPayload(params: Record<string, unknown>): JsonObject;
|
|
8
|
+
export declare function validateKey(value: unknown): string | undefined;
|
|
9
|
+
export declare function errorMessage(error: any, operation: string): Error;
|
|
10
|
+
export declare function request(ctx: IExecuteFunctions, method: string, path: string, body?: JsonObject, headers?: Record<string, string>): Promise<unknown>;
|
|
11
|
+
export declare function uploadBinary(ctx: IExecuteFunctions, itemIndex: number, propertyName: string, contentType?: string): Promise<unknown>;
|
|
12
|
+
export declare function output(data: unknown, itemIndex: number, meta: JsonObject): INodeExecutionData;
|
|
13
|
+
export declare function verifyHmac(raw: string, signature: string, secret: string): boolean;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseJsonObject = parseJsonObject;
|
|
7
|
+
exports.parseJsonArray = parseJsonArray;
|
|
8
|
+
exports.httpUrl = httpUrl;
|
|
9
|
+
exports.nonEmpty = nonEmpty;
|
|
10
|
+
exports.buildSendPayload = buildSendPayload;
|
|
11
|
+
exports.validateKey = validateKey;
|
|
12
|
+
exports.errorMessage = errorMessage;
|
|
13
|
+
exports.request = request;
|
|
14
|
+
exports.uploadBinary = uploadBinary;
|
|
15
|
+
exports.output = output;
|
|
16
|
+
exports.verifyHmac = verifyHmac;
|
|
17
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
18
|
+
function parseJsonObject(value, field) {
|
|
19
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
20
|
+
throw new Error(`${field} must contain a JSON object.`);
|
|
21
|
+
let parsed;
|
|
22
|
+
try {
|
|
23
|
+
parsed = JSON.parse(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new Error(`${field} contains invalid JSON.`);
|
|
27
|
+
}
|
|
28
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
29
|
+
throw new Error(`${field} must be a JSON object.`);
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
function parseJsonArray(value, field) {
|
|
33
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
34
|
+
throw new Error(`${field} must contain a JSON array.`);
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(value);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error(`${field} contains invalid JSON.`);
|
|
41
|
+
}
|
|
42
|
+
if (!Array.isArray(parsed))
|
|
43
|
+
throw new Error(`${field} must be a JSON array.`);
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
function httpUrl(value, field) {
|
|
47
|
+
if (typeof value !== 'string' || !/^https?:\/\/[^\s]+$/i.test(value))
|
|
48
|
+
throw new Error(`${field} must be a valid HTTP(S) URL.`);
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function nonEmpty(value, field) {
|
|
52
|
+
const result = String(value ?? '').trim();
|
|
53
|
+
if (!result)
|
|
54
|
+
throw new Error(`${field} is required.`);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
function buildSendPayload(params) {
|
|
58
|
+
const payload = { accountId: nonEmpty(params.accountId, 'Account ID') };
|
|
59
|
+
const type = String(params.messageType ?? 'text');
|
|
60
|
+
const message = typeof params.message === 'string' ? params.message : '';
|
|
61
|
+
if (['text', 'attachment', 'template', 'interactive', 'location', 'contact', 'raw'].includes(type) === false)
|
|
62
|
+
throw new Error(`Unsupported message type: ${type}`);
|
|
63
|
+
if (type === 'raw')
|
|
64
|
+
Object.assign(payload, parseJsonObject(params.rawPayload, 'Raw Payload'));
|
|
65
|
+
else if (type === 'text')
|
|
66
|
+
payload.message = nonEmpty(message, 'Message');
|
|
67
|
+
else if (type === 'attachment') {
|
|
68
|
+
payload.attachmentUrl = httpUrl(params.attachmentUrl, 'Attachment URL');
|
|
69
|
+
payload.attachmentType = params.attachmentType || 'file';
|
|
70
|
+
if (params.attachmentName)
|
|
71
|
+
payload.attachmentName = String(params.attachmentName);
|
|
72
|
+
if (params.voiceNote !== undefined)
|
|
73
|
+
payload.voiceNote = Boolean(params.voiceNote);
|
|
74
|
+
if (params.caption)
|
|
75
|
+
payload.message = String(params.caption);
|
|
76
|
+
}
|
|
77
|
+
else if (type === 'template')
|
|
78
|
+
payload.template = parseJsonObject(params.template, 'Template');
|
|
79
|
+
else if (type === 'interactive')
|
|
80
|
+
payload.interactive = parseJsonObject(params.interactive, 'Interactive');
|
|
81
|
+
else if (type === 'location') {
|
|
82
|
+
const latitude = Number(params.latitude), longitude = Number(params.longitude);
|
|
83
|
+
if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90)
|
|
84
|
+
throw new Error('Latitude must be between -90 and 90.');
|
|
85
|
+
if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180)
|
|
86
|
+
throw new Error('Longitude must be between -180 and 180.');
|
|
87
|
+
payload.location = { latitude, longitude, ...(params.locationName ? { name: String(params.locationName) } : {}), ...(params.address ? { address: String(params.address) } : {}) };
|
|
88
|
+
}
|
|
89
|
+
else if (type === 'contact') {
|
|
90
|
+
const contacts = parseJsonObject(params.contacts, 'Contacts');
|
|
91
|
+
payload.contacts = Array.isArray(contacts.contacts) ? contacts.contacts : contacts;
|
|
92
|
+
}
|
|
93
|
+
if (params.quickReplies)
|
|
94
|
+
payload.quickReplies = parseJsonArray(params.quickReplies, 'Quick Replies');
|
|
95
|
+
if (params.buttons)
|
|
96
|
+
payload.buttons = parseJsonArray(params.buttons, 'Buttons');
|
|
97
|
+
if (params.replyTo)
|
|
98
|
+
payload.replyTo = String(params.replyTo);
|
|
99
|
+
if (params.linkPreview !== undefined)
|
|
100
|
+
payload.linkPreview = Boolean(params.linkPreview);
|
|
101
|
+
if (params.category)
|
|
102
|
+
payload.category = String(params.category);
|
|
103
|
+
if (params.messageTag)
|
|
104
|
+
payload.messageTag = String(params.messageTag);
|
|
105
|
+
if (payload.quickReplies && payload.buttons)
|
|
106
|
+
throw new Error('Quick Replies and Buttons are mutually exclusive.');
|
|
107
|
+
if (payload.category && payload.template)
|
|
108
|
+
throw new Error('Category cannot be combined with Template.');
|
|
109
|
+
if (payload.category && (payload.attachmentUrl || payload.location || payload.contacts))
|
|
110
|
+
throw new Error('WhatsApp Utility category cannot be combined with attachments, location, or contacts.');
|
|
111
|
+
return payload;
|
|
112
|
+
}
|
|
113
|
+
function validateKey(value) {
|
|
114
|
+
if (value === undefined || value === null || String(value).trim() === '')
|
|
115
|
+
return undefined;
|
|
116
|
+
const key = String(value);
|
|
117
|
+
if (key.length > 255)
|
|
118
|
+
throw new Error('Idempotency Key cannot exceed 255 characters.');
|
|
119
|
+
return key;
|
|
120
|
+
}
|
|
121
|
+
function errorMessage(error, operation) {
|
|
122
|
+
const status = error?.statusCode ?? error?.httpCode ?? error?.response?.status;
|
|
123
|
+
const body = error?.response?.body ?? error?.body ?? error?.response?.data;
|
|
124
|
+
const data = body && typeof body === 'object' ? body : {};
|
|
125
|
+
const code = data.code ? ` [${data.code}]` : '';
|
|
126
|
+
const retry = status === 429 || status >= 500 ? ' This may be retryable; for sends, reconcile first because duplicate delivery is possible.' : '';
|
|
127
|
+
const message = data.error || data.message || error?.message || 'Unknown API error';
|
|
128
|
+
return new Error(`Zernio ${operation} failed${status ? ` (HTTP ${status})` : ''}${code}: ${message}.${retry}`);
|
|
129
|
+
}
|
|
130
|
+
async function request(ctx, method, path, body, headers = {}) {
|
|
131
|
+
try {
|
|
132
|
+
const credentials = await ctx.getCredentials('zernioApi');
|
|
133
|
+
const baseUrl = String(credentials.baseUrl || 'https://zernio.com/api').replace(/\/$/, '');
|
|
134
|
+
return await ctx.helpers.httpRequestWithAuthentication.call(ctx, 'zernioApi', {
|
|
135
|
+
method, url: `${baseUrl}${path}`, json: true, ...(body === undefined ? {} : { body }), headers,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw errorMessage(error, `${method} ${path}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function uploadBinary(ctx, itemIndex, propertyName, contentType) {
|
|
143
|
+
try {
|
|
144
|
+
const credentials = await ctx.getCredentials('zernioApi');
|
|
145
|
+
const baseUrl = String(credentials.baseUrl || 'https://zernio.com/api').replace(/\/$/, '');
|
|
146
|
+
const binary = await ctx.helpers.getBinaryDataBuffer(itemIndex, propertyName);
|
|
147
|
+
const item = ctx.getInputData()[itemIndex];
|
|
148
|
+
const metadata = item.binary?.[propertyName];
|
|
149
|
+
const filename = metadata?.fileName || propertyName;
|
|
150
|
+
const mime = contentType || metadata?.mimeType || 'application/octet-stream';
|
|
151
|
+
return await ctx.helpers.httpRequestWithAuthentication.call(ctx, 'zernioApi', {
|
|
152
|
+
method: 'POST', url: `${baseUrl}/v1/media/upload-direct`, formData: {
|
|
153
|
+
file: { value: binary, options: { filename, contentType: mime } }, contentType: mime,
|
|
154
|
+
}, json: true,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
throw errorMessage(error, 'POST /v1/media/upload-direct');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function output(data, itemIndex, meta) {
|
|
162
|
+
return { json: { success: true, data: data, meta }, pairedItem: { item: itemIndex } };
|
|
163
|
+
}
|
|
164
|
+
function verifyHmac(raw, signature, secret) {
|
|
165
|
+
const expected = node_crypto_1.default.createHmac('sha256', secret).update(raw, 'utf8').digest('hex');
|
|
166
|
+
const supplied = signature.replace(/^sha256=/i, '').trim();
|
|
167
|
+
if (!/^[a-f0-9]+$/i.test(supplied) || supplied.length !== expected.length)
|
|
168
|
+
return false;
|
|
169
|
+
return node_crypto_1.default.timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(supplied, 'hex'));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../utils/api.ts"],"names":[],"mappings":";;;;;AAKA,0CAMC;AAED,wCAMC;AAED,0BAGC;AAED,4BAIC;AAED,4CAkCC;AAED,kCAKC;AAED,oCAQC;AAED,0BAQC;AAED,oCAeC;AAED,wBAEC;AAED,gCAKC;AAzHD,8DAAiC;AAKjC,SAAgB,eAAe,CAAC,KAAc,EAAE,KAAa;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC9G,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;IAAC,CAAC;IACjG,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;IACvH,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED,SAAgB,cAAc,CAAC,KAAc,EAAE,KAAa;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAC7G,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;IAAC,CAAC;IACjG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,OAAO,CAAC,KAAc,EAAE,KAAa;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IAC/H,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAc,EAAE,KAAa;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAA+B;IAC9D,MAAM,OAAO,GAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACnK,IAAI,IAAI,KAAK,KAAK;QAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;SACzF,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;SACpE,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACxE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC;QACzD,IAAI,MAAM,CAAC,cAAc;YAAE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;SAC3F,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;SACrG,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,IAAI,QAAQ,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC3H,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,SAAS,GAAG,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACnI,OAAO,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACpL,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrG,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxF,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAClH,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACxG,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAClM,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC3F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACvF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,YAAY,CAAC,KAAU,EAAE,SAAiB;IACxD,MAAM,MAAM,GAAG,KAAK,EAAE,UAAU,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC/E,MAAM,IAAI,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,4FAA4F,CAAC,CAAC,CAAC,EAAE,CAAC;IAClJ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,mBAAmB,CAAC;IACpF,OAAO,IAAI,KAAK,CAAC,UAAU,SAAS,UAAU,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;AACjH,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,GAAsB,EAAE,MAAc,EAAE,IAAY,EAAE,IAAiB,EAAE,UAAkC,EAAE;IACzI,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3F,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;YAC5E,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO;SACxF,CAAC,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,YAAY,CAAC,KAAK,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;AACrE,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,GAAsB,EAAE,SAAiB,EAAE,YAAoB,EAAE,WAAoB;IACtH,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,YAAY,CAAC;QACpD,MAAM,IAAI,GAAG,WAAW,IAAI,QAAQ,EAAE,QAAQ,IAAI,0BAA0B,CAAC;QAC7E,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;YAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,yBAAyB,EAAE,QAAQ,EAAE;gBAClE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI;aACrF,EAAE,IAAI,EAAE,IAAI;SACP,CAAC,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,YAAY,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;IAAC,CAAC;AAChF,CAAC;AAED,SAAgB,MAAM,CAAC,IAAa,EAAE,SAAiB,EAAE,IAAgB;IACvE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAmB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;AACvG,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW,EAAE,SAAiB,EAAE,MAAc;IACvE,MAAM,QAAQ,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxF,OAAO,qBAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5F,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-zernio-messaging",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Production-oriented n8n nodes for Zernio Inbox messaging API",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": ["n8n-community-node-package", "zernio", "messaging", "inbox"],
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"files": ["dist", "index.js", "README.md", "LICENSE"],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc -p tsconfig.json && node scripts/copy-assets.cjs",
|
|
11
|
+
"lint": "eslint --ext .ts credentials nodes utils index.ts",
|
|
12
|
+
"test": "npm run build && node --test tests/*.test.cjs",
|
|
13
|
+
"format:check": "prettier --check \"**/*.{ts,json,md}\"",
|
|
14
|
+
"pack:check": "npm run build && npm pack --dry-run"
|
|
15
|
+
},
|
|
16
|
+
"n8n": {
|
|
17
|
+
"n8nNodesApiVersion": 1,
|
|
18
|
+
"credentials": ["dist/credentials/ZernioApi.credentials.js"],
|
|
19
|
+
"nodes": ["dist/nodes/ZernioMessaging.node.js", "dist/nodes/ZernioTrigger.node.js"]
|
|
20
|
+
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"n8n-workflow": ">=1.70.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.10.0",
|
|
26
|
+
"@typescript-eslint/eslint-plugin": "^8.18.0",
|
|
27
|
+
"@typescript-eslint/parser": "^8.18.0",
|
|
28
|
+
"eslint": "^9.17.0",
|
|
29
|
+
"n8n-workflow": ">=1.70.0",
|
|
30
|
+
"prettier": "^3.4.2",
|
|
31
|
+
"typescript": "^5.7.2"
|
|
32
|
+
}
|
|
33
|
+
}
|