@etohq/connector-engine 1.5.1-alpha.4
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/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/engine/clean-connector-engine.d.ts +81 -0
- package/dist/engine/clean-connector-engine.d.ts.map +1 -0
- package/dist/engine/clean-connector-engine.js +350 -0
- package/dist/engine/clean-connector-engine.js.map +1 -0
- package/dist/engine/connector-engine-impl.d.ts +73 -0
- package/dist/engine/connector-engine-impl.d.ts.map +1 -0
- package/dist/engine/connector-engine-impl.js +332 -0
- package/dist/engine/connector-engine-impl.js.map +1 -0
- package/dist/engine/connector-engine.d.ts +54 -0
- package/dist/engine/connector-engine.d.ts.map +1 -0
- package/dist/engine/connector-engine.js +694 -0
- package/dist/engine/connector-engine.js.map +1 -0
- package/dist/engine/index.d.ts +7 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +10 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/routing-engine.d.ts +26 -0
- package/dist/engine/routing-engine.d.ts.map +1 -0
- package/dist/engine/routing-engine.js +329 -0
- package/dist/engine/routing-engine.js.map +1 -0
- package/dist/examples/booking-connector-example.d.ts +7 -0
- package/dist/examples/booking-connector-example.d.ts.map +1 -0
- package/dist/examples/booking-connector-example.js +221 -0
- package/dist/examples/booking-connector-example.js.map +1 -0
- package/dist/examples/dynamic-methods-example.d.ts +7 -0
- package/dist/examples/dynamic-methods-example.d.ts.map +1 -0
- package/dist/examples/dynamic-methods-example.js +163 -0
- package/dist/examples/dynamic-methods-example.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/types/base-plugin.d.ts +170 -0
- package/dist/types/base-plugin.d.ts.map +1 -0
- package/dist/types/base-plugin.js +68 -0
- package/dist/types/base-plugin.js.map +1 -0
- package/dist/types/connector-plugin.d.ts +22 -0
- package/dist/types/connector-plugin.d.ts.map +1 -0
- package/dist/types/connector-plugin.js +11 -0
- package/dist/types/connector-plugin.js.map +1 -0
- package/dist/types/engine.d.ts +223 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/types/engine.js +7 -0
- package/dist/types/engine.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/operation-groups.d.ts +78 -0
- package/dist/types/operation-groups.d.ts.map +1 -0
- package/dist/types/operation-groups.js +60 -0
- package/dist/types/operation-groups.js.map +1 -0
- package/dist/types/routing-config.d.ts +116 -0
- package/dist/types/routing-config.d.ts.map +1 -0
- package/dist/types/routing-config.js +6 -0
- package/dist/types/routing-config.js.map +1 -0
- package/dist/utils/create-connector-engine.d.ts +31 -0
- package/dist/utils/create-connector-engine.d.ts.map +1 -0
- package/dist/utils/create-connector-engine.js +30 -0
- package/dist/utils/create-connector-engine.js.map +1 -0
- package/examples/booking-example.ts +168 -0
- package/examples/booking-test.ts +231 -0
- package/hyperswitch-example.ts +263 -0
- package/jest.config.js +2 -0
- package/package.json +54 -0
- package/src/engine/clean-connector-engine.ts +726 -0
- package/src/engine/index.ts +13 -0
- package/src/engine/routing-engine.ts +394 -0
- package/src/index.ts +32 -0
- package/src/types/connector-plugin.ts +34 -0
- package/src/types/index.ts +5 -0
- package/src/types/routing-config.ts +196 -0
- package/tsconfig.json +3 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Booking Connector Engine Example
|
|
4
|
+
* @description Example usage of the type-safe connector engine for booking operations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.demonstrateConnectorEngine = demonstrateConnectorEngine;
|
|
8
|
+
exports.demonstrateTypeSafety = demonstrateTypeSafety;
|
|
9
|
+
const index_1 = require("../index");
|
|
10
|
+
// Calendar Plugin
|
|
11
|
+
class GoogleCalendarPlugin extends index_1.AbstractConnectorPlugin {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.operationTypes = {
|
|
15
|
+
createEvent: {
|
|
16
|
+
inputSchema: {},
|
|
17
|
+
outputSchema: {},
|
|
18
|
+
description: 'Create calendar event',
|
|
19
|
+
timeout: 30000
|
|
20
|
+
},
|
|
21
|
+
updateEvent: {
|
|
22
|
+
inputSchema: {},
|
|
23
|
+
outputSchema: {},
|
|
24
|
+
description: 'Update calendar event',
|
|
25
|
+
timeout: 30000
|
|
26
|
+
},
|
|
27
|
+
deleteEvent: {
|
|
28
|
+
inputSchema: {},
|
|
29
|
+
outputSchema: {},
|
|
30
|
+
description: 'Delete calendar event',
|
|
31
|
+
timeout: 15000
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
getName() {
|
|
36
|
+
return 'google-calendar';
|
|
37
|
+
}
|
|
38
|
+
getVersion() {
|
|
39
|
+
return '1.0.0';
|
|
40
|
+
}
|
|
41
|
+
getCapabilities() {
|
|
42
|
+
return {
|
|
43
|
+
health_check: true,
|
|
44
|
+
webhook_handling: true,
|
|
45
|
+
calendar_events: true,
|
|
46
|
+
meeting_links: true
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async createEvent(config, data, context) {
|
|
50
|
+
// Mock implementation
|
|
51
|
+
return {
|
|
52
|
+
eventId: `gcal_${Date.now()}`,
|
|
53
|
+
eventUrl: `https://calendar.google.com/event/${Date.now()}`,
|
|
54
|
+
meetingUrl: `https://meet.google.com/${Math.random().toString(36).substr(2, 9)}`,
|
|
55
|
+
status: 'created'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async updateEvent(config, input, context) {
|
|
59
|
+
return {
|
|
60
|
+
eventId: input.eventId,
|
|
61
|
+
eventUrl: `https://calendar.google.com/event/${input.eventId}`,
|
|
62
|
+
status: 'created'
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async deleteEvent(config, input, context) {
|
|
66
|
+
return { success: true };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Email Plugin
|
|
70
|
+
class SendGridEmailPlugin extends index_1.AbstractConnectorPlugin {
|
|
71
|
+
constructor() {
|
|
72
|
+
super(...arguments);
|
|
73
|
+
this.operationTypes = {
|
|
74
|
+
sendEmail: {
|
|
75
|
+
inputSchema: {},
|
|
76
|
+
outputSchema: {},
|
|
77
|
+
description: 'Send email notification',
|
|
78
|
+
timeout: 15000
|
|
79
|
+
},
|
|
80
|
+
sendBulkEmail: {
|
|
81
|
+
inputSchema: {},
|
|
82
|
+
outputSchema: {},
|
|
83
|
+
description: 'Send bulk email notifications',
|
|
84
|
+
timeout: 60000
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
getName() {
|
|
89
|
+
return 'sendgrid-email';
|
|
90
|
+
}
|
|
91
|
+
getVersion() {
|
|
92
|
+
return '1.0.0';
|
|
93
|
+
}
|
|
94
|
+
getCapabilities() {
|
|
95
|
+
return {
|
|
96
|
+
health_check: true,
|
|
97
|
+
webhook_handling: true,
|
|
98
|
+
email_notifications: true,
|
|
99
|
+
bulk_email: true,
|
|
100
|
+
templates: true
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async sendEmail(config, data, context) {
|
|
104
|
+
// Mock implementation
|
|
105
|
+
return {
|
|
106
|
+
messageId: `sg_${Date.now()}`,
|
|
107
|
+
status: 'sent',
|
|
108
|
+
deliveredAt: new Date()
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async sendBulkEmail(config, input, context) {
|
|
112
|
+
return {
|
|
113
|
+
batchId: `batch_${Date.now()}`,
|
|
114
|
+
totalSent: input.recipients.length
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ===== CONNECTOR ENGINE SETUP =====
|
|
119
|
+
// Define plugins
|
|
120
|
+
const plugins = {
|
|
121
|
+
calendar: new GoogleCalendarPlugin(),
|
|
122
|
+
notification: new SendGridEmailPlugin()
|
|
123
|
+
};
|
|
124
|
+
// Define operation groups
|
|
125
|
+
const operationGroups = (0, index_1.createOperationGroupBuilder)()
|
|
126
|
+
.addGroup('booking', {
|
|
127
|
+
domains: ['calendar', 'notification'],
|
|
128
|
+
operations: ['createEvent', 'sendEmail'],
|
|
129
|
+
options: {
|
|
130
|
+
behavior: 'execute_all',
|
|
131
|
+
timeout: 45000,
|
|
132
|
+
retries: 2
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
.addGroup('calendar', {
|
|
136
|
+
domains: ['calendar'],
|
|
137
|
+
operations: ['createEvent', 'updateEvent', 'deleteEvent'],
|
|
138
|
+
options: {
|
|
139
|
+
behavior: 'route_by_domain',
|
|
140
|
+
connectorId: 'calendar',
|
|
141
|
+
timeout: 30000
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
.build();
|
|
145
|
+
// ===== USAGE EXAMPLE =====
|
|
146
|
+
async function demonstrateConnectorEngine() {
|
|
147
|
+
// Validate configuration
|
|
148
|
+
const validation = (0, index_1.validateConnectorEngineConfig)(plugins, operationGroups);
|
|
149
|
+
if (!validation.valid) {
|
|
150
|
+
console.error('Configuration validation failed:', validation.errors);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (validation.warnings.length > 0) {
|
|
154
|
+
console.warn('Configuration warnings:', validation.warnings);
|
|
155
|
+
}
|
|
156
|
+
// Create connector engine
|
|
157
|
+
const engine = (0, index_1.createConnectorEngine)(plugins, operationGroups);
|
|
158
|
+
// Initialize plugins
|
|
159
|
+
const calendarConfig = {
|
|
160
|
+
connector_id: 'google-calendar-1',
|
|
161
|
+
provider: 'google',
|
|
162
|
+
name: 'Google Calendar',
|
|
163
|
+
config: { apiKey: 'mock-api-key' },
|
|
164
|
+
capabilities: plugins.calendar.getCapabilities(),
|
|
165
|
+
enabled: true
|
|
166
|
+
};
|
|
167
|
+
const emailConfig = {
|
|
168
|
+
connector_id: 'sendgrid-1',
|
|
169
|
+
provider: 'sendgrid',
|
|
170
|
+
name: 'SendGrid Email',
|
|
171
|
+
config: { apiKey: 'mock-sendgrid-key' },
|
|
172
|
+
capabilities: plugins.notification.getCapabilities(),
|
|
173
|
+
enabled: true
|
|
174
|
+
};
|
|
175
|
+
await plugins.calendar.initialize(calendarConfig);
|
|
176
|
+
await plugins.notification.initialize(emailConfig);
|
|
177
|
+
// Example 1: Execute booking operation group (creates event + sends notification)
|
|
178
|
+
console.log('=== Booking Operation Group Example ===');
|
|
179
|
+
// This would be generated as: executeBookingCreateEvent and executeBookingSendEmail
|
|
180
|
+
// But since we're using 'execute_all' behavior, it executes both operations
|
|
181
|
+
// Example 2: Execute single calendar operation
|
|
182
|
+
console.log('=== Single Calendar Operation Example ===');
|
|
183
|
+
try {
|
|
184
|
+
// Get available domains and operations
|
|
185
|
+
console.log('Available domains:', engine.getAvailableDomains());
|
|
186
|
+
console.log('Calendar operations:', engine.getAvailableOperations('calendar'));
|
|
187
|
+
console.log('Notification operations:', engine.getAvailableOperations('notification'));
|
|
188
|
+
// Check system health
|
|
189
|
+
const health = await engine.getSystemHealth();
|
|
190
|
+
console.log('System health:', health);
|
|
191
|
+
console.log('Connector engine demonstration completed successfully!');
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error('Error during demonstration:', error);
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
// Clean up
|
|
198
|
+
await plugins.calendar.destroy();
|
|
199
|
+
await plugins.notification.destroy();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ===== TYPE SAFETY DEMONSTRATION =====
|
|
203
|
+
function demonstrateTypeSafety() {
|
|
204
|
+
// The connector engine provides full type safety:
|
|
205
|
+
// 1. Plugin operations are type-checked
|
|
206
|
+
const calendarPlugin = new GoogleCalendarPlugin();
|
|
207
|
+
// ✅ This is type-safe - TypeScript knows the expected input/output types
|
|
208
|
+
// calendarPlugin.createEvent(config, eventData, context) -> Promise<CalendarEventResult>
|
|
209
|
+
// 2. Operation groups are validated at compile time
|
|
210
|
+
// ✅ TypeScript ensures domains and operations exist
|
|
211
|
+
// 3. No 'any' types - everything is properly typed
|
|
212
|
+
// ✅ Full IntelliSense support and compile-time error checking
|
|
213
|
+
console.log('Type safety demonstration - check TypeScript compilation for errors!');
|
|
214
|
+
}
|
|
215
|
+
// Run demonstration if this file is executed directly
|
|
216
|
+
if (require.main === module) {
|
|
217
|
+
demonstrateConnectorEngine()
|
|
218
|
+
.then(() => demonstrateTypeSafety())
|
|
219
|
+
.catch(console.error);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=booking-connector-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-connector-example.js","sourceRoot":"","sources":["../../src/examples/booking-connector-example.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAmNH,gEAiEC;AAID,sDAgBC;AAtSD,oCAQkB;AAkClB,kBAAkB;AAClB,MAAM,oBAAqB,SAAQ,+BAAuB;IAA1D;;QACE,mBAAc,GAAG;YACf,WAAW,EAAE;gBACX,WAAW,EAAE,EAAuB;gBACpC,YAAY,EAAE,EAAyB;gBACvC,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,KAAK;aACf;YACD,WAAW,EAAE;gBACX,WAAW,EAAE,EAA8D;gBAC3E,YAAY,EAAE,EAAyB;gBACvC,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,KAAK;aACf;YACD,WAAW,EAAE;gBACX,WAAW,EAAE,EAAyB;gBACtC,YAAY,EAAE,EAA0B;gBACxC,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,KAAK;aACf;SACF,CAAC;IAoDJ,CAAC;IAlDC,OAAO;QACL,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,eAAe;QACb,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAuB,EACvB,IAAuB,EACvB,OAAoC;QAEpC,sBAAsB;QACtB,OAAO;YACL,OAAO,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;YAC7B,QAAQ,EAAE,qCAAqC,IAAI,CAAC,GAAG,EAAE,EAAE;YAC3D,UAAU,EAAE,2BAA2B,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAChF,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAuB,EACvB,KAA+D,EAC/D,OAAoC;QAEpC,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,qCAAqC,KAAK,CAAC,OAAO,EAAE;YAC9D,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAuB,EACvB,KAA0B,EAC1B,OAAoC;QAEpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF;AAED,eAAe;AACf,MAAM,mBAAoB,SAAQ,+BAAuB;IAAzD;;QACE,mBAAc,GAAG;YACf,SAAS,EAAE;gBACT,WAAW,EAAE,EAAsB;gBACnC,YAAY,EAAE,EAAwB;gBACtC,WAAW,EAAE,yBAAyB;gBACtC,OAAO,EAAE,KAAK;aACf;YACD,aAAa,EAAE;gBACb,WAAW,EAAE,EAA0D;gBACvE,YAAY,EAAE,EAA4C;gBAC1D,WAAW,EAAE,+BAA+B;gBAC5C,OAAO,EAAE,KAAK;aACf;SACF,CAAC;IA2CJ,CAAC;IAzCC,OAAO;QACL,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,UAAU;QACR,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,eAAe;QACb,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,IAAI;YACzB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,MAAuB,EACvB,IAAsB,EACtB,OAAoC;QAEpC,sBAAsB;QACtB,OAAO;YACL,SAAS,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAAuB,EACvB,KAA2D,EAC3D,OAAoC;QAEpC,OAAO;YACL,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;YAC9B,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;SACnC,CAAC;IACJ,CAAC;CACF;AAED,qCAAqC;AAErC,iBAAiB;AACjB,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,IAAI,oBAAoB,EAAE;IACpC,YAAY,EAAE,IAAI,mBAAmB,EAAE;CACxC,CAAC;AAEF,0BAA0B;AAC1B,MAAM,eAAe,GAAG,IAAA,mCAA2B,GAAE;KAClD,QAAQ,CAAC,SAAS,EAAE;IACnB,OAAO,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;IACrC,UAAU,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;IACxC,OAAO,EAAE;QACP,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,CAAC;KACX;CACF,CAAC;KACD,QAAQ,CAAC,UAAU,EAAE;IACpB,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,UAAU,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;IACzD,OAAO,EAAE;QACP,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,KAAK;KACf;CACF,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,4BAA4B;AAErB,KAAK,UAAU,0BAA0B;IAC9C,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAA,qCAA6B,EAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAE3E,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAA,6BAAqB,EAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAE/D,qBAAqB;IACrB,MAAM,cAAc,GAAoB;QACtC,YAAY,EAAE,mBAAmB;QACjC,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;QAClC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;QAChD,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,WAAW,GAAoB;QACnC,YAAY,EAAE,YAAY;QAC1B,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;QACvC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE;QACpD,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEnD,kFAAkF;IAClF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,oFAAoF;IACpF,4EAA4E;IAE5E,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC;QAEvF,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,WAAW;QACX,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED,wCAAwC;AAExC,SAAgB,qBAAqB;IACnC,kDAAkD;IAElD,wCAAwC;IACxC,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAElD,yEAAyE;IACzE,yFAAyF;IAEzF,oDAAoD;IACpD,oDAAoD;IAEpD,mDAAmD;IACnD,8DAA8D;IAE9D,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;AACtF,CAAC;AAED,sDAAsD;AACtD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,0BAA0B,EAAE;SACzB,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;SACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dynamic Methods Example
|
|
3
|
+
* @description Example showing execute<Domain><Operation> and execute<GroupName><Operation> patterns
|
|
4
|
+
*/
|
|
5
|
+
export declare function demonstrateDynamicMethods(): Promise<void>;
|
|
6
|
+
export declare function demonstrateTypeSafety(): void;
|
|
7
|
+
//# sourceMappingURL=dynamic-methods-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-methods-example.d.ts","sourceRoot":"","sources":["../../src/examples/dynamic-methods-example.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2IH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD/D;AAID,wBAAgB,qBAAqB,IAAI,IAAI,CAkB5C"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Dynamic Methods Example
|
|
4
|
+
* @description Example showing execute<Domain><Operation> and execute<GroupName><Operation> patterns
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.demonstrateDynamicMethods = demonstrateDynamicMethods;
|
|
8
|
+
exports.demonstrateTypeSafety = demonstrateTypeSafety;
|
|
9
|
+
const index_1 = require("../index");
|
|
10
|
+
// ✅ Simple Calendar Plugin - methods can return values directly
|
|
11
|
+
class CalendarPlugin extends index_1.AbstractConnectorPlugin {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.operationTypes = {
|
|
15
|
+
createEvent: {
|
|
16
|
+
inputSchema: {},
|
|
17
|
+
outputSchema: {}
|
|
18
|
+
},
|
|
19
|
+
updateEvent: {
|
|
20
|
+
inputSchema: {},
|
|
21
|
+
outputSchema: {}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
getName() { return 'calendar'; }
|
|
26
|
+
getVersion() { return '1.0.0'; }
|
|
27
|
+
getCapabilities() {
|
|
28
|
+
return { health_check: true, webhook_handling: false, calendar_events: true };
|
|
29
|
+
}
|
|
30
|
+
// ✅ Simple method - just return the result
|
|
31
|
+
async createEvent(config, data, context) {
|
|
32
|
+
return {
|
|
33
|
+
eventId: `cal_${Date.now()}`,
|
|
34
|
+
eventUrl: `https://calendar.example.com/event/${Date.now()}`,
|
|
35
|
+
status: 'created'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ✅ Simple method - just return the result
|
|
39
|
+
async updateEvent(config, input, context) {
|
|
40
|
+
return {
|
|
41
|
+
eventId: input.eventId,
|
|
42
|
+
eventUrl: `https://calendar.example.com/event/${input.eventId}`,
|
|
43
|
+
status: 'created'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ✅ Simple Email Plugin
|
|
48
|
+
class EmailPlugin extends index_1.AbstractConnectorPlugin {
|
|
49
|
+
constructor() {
|
|
50
|
+
super(...arguments);
|
|
51
|
+
this.operationTypes = {
|
|
52
|
+
sendEmail: {
|
|
53
|
+
inputSchema: {},
|
|
54
|
+
outputSchema: {}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
getName() { return 'email'; }
|
|
59
|
+
getVersion() { return '1.0.0'; }
|
|
60
|
+
getCapabilities() {
|
|
61
|
+
return { health_check: true, webhook_handling: false, email_notifications: true };
|
|
62
|
+
}
|
|
63
|
+
// ✅ Simple method - just return the result
|
|
64
|
+
async sendEmail(config, data, context) {
|
|
65
|
+
return {
|
|
66
|
+
messageId: `email_${Date.now()}`,
|
|
67
|
+
status: 'sent'
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ===== CONNECTOR ENGINE SETUP =====
|
|
72
|
+
const plugins = {
|
|
73
|
+
calendar: new CalendarPlugin(),
|
|
74
|
+
email: new EmailPlugin()
|
|
75
|
+
};
|
|
76
|
+
const operationGroups = {
|
|
77
|
+
booking: {
|
|
78
|
+
domains: ['calendar', 'email'],
|
|
79
|
+
operations: ['createEvent', 'sendEmail'],
|
|
80
|
+
options: {
|
|
81
|
+
behavior: 'execute_all', // Execute both calendar and email operations
|
|
82
|
+
timeout: 30000
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
notification: {
|
|
86
|
+
domains: ['email'],
|
|
87
|
+
operations: ['sendEmail'],
|
|
88
|
+
options: {
|
|
89
|
+
behavior: 'route_by_domain', // Route to email domain
|
|
90
|
+
timeout: 15000
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
// ===== USAGE EXAMPLE =====
|
|
95
|
+
async function demonstrateDynamicMethods() {
|
|
96
|
+
console.log('=== Dynamic Methods Example ===');
|
|
97
|
+
// Create connector engine
|
|
98
|
+
const engine = (0, index_1.createConnectorEngine)(plugins, operationGroups);
|
|
99
|
+
// Show generated methods
|
|
100
|
+
const methods = engine.getGeneratedMethods();
|
|
101
|
+
console.log('Generated domain methods:', methods.domainMethods);
|
|
102
|
+
console.log('Generated group methods:', methods.groupMethods);
|
|
103
|
+
// ✅ DOMAIN METHODS: execute<Domain><Operation>
|
|
104
|
+
console.log('\n=== Domain Methods ===');
|
|
105
|
+
// executeCalendarCreateEvent - calls calendar.createEvent directly
|
|
106
|
+
const calendarResult = await engine.executeCalendarCreateEvent({
|
|
107
|
+
title: 'Team Meeting',
|
|
108
|
+
startTime: new Date(),
|
|
109
|
+
endTime: new Date(Date.now() + 60 * 60 * 1000),
|
|
110
|
+
attendees: ['user@example.com']
|
|
111
|
+
});
|
|
112
|
+
console.log('Calendar result:', calendarResult);
|
|
113
|
+
// executeEmailSendEmail - calls email.sendEmail directly
|
|
114
|
+
const emailResult = await engine.executeEmailSendEmail({
|
|
115
|
+
to: 'user@example.com',
|
|
116
|
+
subject: 'Meeting Invitation',
|
|
117
|
+
body: 'You have been invited to a meeting'
|
|
118
|
+
});
|
|
119
|
+
console.log('Email result:', emailResult);
|
|
120
|
+
// ✅ GROUP METHODS: execute<GroupName><Operation>
|
|
121
|
+
console.log('\n=== Group Methods ===');
|
|
122
|
+
// executeBookingCreateEvent - executes calendar.createEvent AND email.sendEmail (execute_all)
|
|
123
|
+
const bookingResult = await engine.executeBookingCreateEvent({
|
|
124
|
+
title: 'Team Meeting',
|
|
125
|
+
startTime: new Date(),
|
|
126
|
+
endTime: new Date(Date.now() + 60 * 60 * 1000),
|
|
127
|
+
attendees: ['user@example.com']
|
|
128
|
+
});
|
|
129
|
+
console.log('Booking result (execute_all):', bookingResult);
|
|
130
|
+
// executeNotificationSendEmail - routes to email.sendEmail (route_by_domain)
|
|
131
|
+
const notificationResult = await engine.executeNotificationSendEmail({
|
|
132
|
+
to: 'user@example.com',
|
|
133
|
+
subject: 'Notification',
|
|
134
|
+
body: 'This is a notification'
|
|
135
|
+
});
|
|
136
|
+
console.log('Notification result (route_by_domain):', notificationResult);
|
|
137
|
+
console.log('\n=== Type Safety Demo ===');
|
|
138
|
+
console.log('All methods are fully typed with IntelliSense support!');
|
|
139
|
+
console.log('Try typing engine.execute... in your IDE to see auto-completion');
|
|
140
|
+
}
|
|
141
|
+
// ===== TYPE SAFETY DEMONSTRATION =====
|
|
142
|
+
function demonstrateTypeSafety() {
|
|
143
|
+
const engine = (0, index_1.createConnectorEngine)(plugins, operationGroups);
|
|
144
|
+
// ✅ These methods are generated dynamically with full type safety:
|
|
145
|
+
// Domain methods (direct plugin calls):
|
|
146
|
+
// - engine.executeCalendarCreateEvent(data) -> Promise<CalendarEventResult>
|
|
147
|
+
// - engine.executeCalendarUpdateEvent(data) -> Promise<CalendarEventResult>
|
|
148
|
+
// - engine.executeEmailSendEmail(data) -> Promise<EmailResult>
|
|
149
|
+
// Group methods (based on operation group behavior):
|
|
150
|
+
// - engine.executeBookingCreateEvent(data) -> Promise<OperationGroupResult<CalendarEventResult>>
|
|
151
|
+
// - engine.executeBookingSendEmail(data) -> Promise<OperationGroupResult<EmailResult>>
|
|
152
|
+
// - engine.executeNotificationSendEmail(data) -> Promise<OperationGroupResult<EmailResult>>
|
|
153
|
+
console.log('Type safety: All methods have proper TypeScript types!');
|
|
154
|
+
console.log('IntelliSense: Auto-completion works for all generated methods!');
|
|
155
|
+
console.log('Compile-time errors: Invalid inputs are caught at build time!');
|
|
156
|
+
}
|
|
157
|
+
// Run demonstration if this file is executed directly
|
|
158
|
+
if (require.main === module) {
|
|
159
|
+
demonstrateDynamicMethods()
|
|
160
|
+
.then(() => demonstrateTypeSafety())
|
|
161
|
+
.catch(console.error);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=dynamic-methods-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-methods-example.js","sourceRoot":"","sources":["../../src/examples/dynamic-methods-example.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ETO Framework Connector Engine
|
|
3
|
+
* @description Clean plugin-first connector engine with Hyperswitch-style routing
|
|
4
|
+
*/
|
|
5
|
+
export { ConnectorEngine } from "./engine/clean-connector-engine";
|
|
6
|
+
export type { ConnectorRegistry, OperationGroup, OperationGroups, EngineConfig, GroupResult } from "./engine/clean-connector-engine";
|
|
7
|
+
export { type ConnectorPlugin, type OperationType, AbstractConnectorPlugin } from "./types/connector-plugin";
|
|
8
|
+
export type { RoutingConfig, RoutingContext, RoutingDecision, ConnectorMetrics, RoutingRule, ConnectorChoice, RoutingAlgorithm } from "./types/routing-config";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,WAAW,EACZ,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,gBAAgB,EACjB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview ETO Framework Connector Engine
|
|
4
|
+
* @description Clean plugin-first connector engine with Hyperswitch-style routing
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AbstractConnectorPlugin = exports.ConnectorEngine = void 0;
|
|
8
|
+
// ===== CORE ENGINE =====
|
|
9
|
+
var clean_connector_engine_1 = require("./engine/clean-connector-engine");
|
|
10
|
+
Object.defineProperty(exports, "ConnectorEngine", { enumerable: true, get: function () { return clean_connector_engine_1.ConnectorEngine; } });
|
|
11
|
+
// ===== PLUGIN TYPES =====
|
|
12
|
+
var connector_plugin_1 = require("./types/connector-plugin");
|
|
13
|
+
Object.defineProperty(exports, "AbstractConnectorPlugin", { enumerable: true, get: function () { return connector_plugin_1.AbstractConnectorPlugin; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,0BAA0B;AAC1B,0EAAkE;AAAzD,yHAAA,eAAe,OAAA;AASxB,2BAA2B;AAC3B,6DAIkC;AADhC,2HAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Base Plugin Interface
|
|
3
|
+
* @description Enhanced base interface with operation types and container context
|
|
4
|
+
*/
|
|
5
|
+
import { ConnectorConfig, ConnectorCapabilities, PluginHealthStatus } from "./engine";
|
|
6
|
+
import { EtoContainer } from "@etohq/types";
|
|
7
|
+
export interface StepDefinition<TInput = unknown, TOutput = unknown> {
|
|
8
|
+
stepId: string;
|
|
9
|
+
run(input: TInput, context: {
|
|
10
|
+
container: EtoContainer;
|
|
11
|
+
}): Promise<TOutput>;
|
|
12
|
+
}
|
|
13
|
+
export interface OperationDefinition<TInput = unknown, TOutput = unknown> {
|
|
14
|
+
inputSchema: TInput;
|
|
15
|
+
outputSchema: TOutput;
|
|
16
|
+
description?: string;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
retries?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface BaseConnectorPlugin {
|
|
21
|
+
getName(): string;
|
|
22
|
+
getVersion(): string;
|
|
23
|
+
getCapabilities(): ConnectorCapabilities;
|
|
24
|
+
initialize(config: ConnectorConfig): Promise<void>;
|
|
25
|
+
destroy(): Promise<void>;
|
|
26
|
+
healthCheck(): Promise<PluginHealthStatus>;
|
|
27
|
+
operationTypes?: Record<string, OperationDefinition>;
|
|
28
|
+
parseWebhook?(config: ConnectorConfig, payload: unknown, headers: Record<string, string>): Promise<WebhookEvent>;
|
|
29
|
+
validateWebhook?(config: ConnectorConfig, payload: unknown, signature: string): boolean;
|
|
30
|
+
[operationName: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface UniversalConnectorPlugin extends BaseConnectorPlugin {
|
|
33
|
+
[operationName: string]: ((config: ConnectorConfig, input: unknown, context: {
|
|
34
|
+
container: EtoContainer;
|
|
35
|
+
}) => StepDefinition | Promise<unknown>) | unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface TypedConnectorPlugin<TOperations extends Record<string, OperationDefinition> = Record<string, OperationDefinition>> extends BaseConnectorPlugin {
|
|
38
|
+
operationTypes: TOperations;
|
|
39
|
+
getSupportedOperations(): TOperations;
|
|
40
|
+
executeOperation<K extends keyof TOperations>(config: ConnectorConfig, operationName: K, input: TOperations[K] extends {
|
|
41
|
+
inputSchema: infer I;
|
|
42
|
+
} ? I : unknown, context: {
|
|
43
|
+
container: EtoContainer;
|
|
44
|
+
}): StepDefinition | Promise<TOperations[K] extends {
|
|
45
|
+
outputSchema: infer O;
|
|
46
|
+
} ? O : unknown>;
|
|
47
|
+
}
|
|
48
|
+
export interface WebhookEvent {
|
|
49
|
+
id: string;
|
|
50
|
+
type: string;
|
|
51
|
+
source: string;
|
|
52
|
+
timestamp: Date;
|
|
53
|
+
data: unknown;
|
|
54
|
+
metadata?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
export interface ConnectorPluginFactory<TPlugin extends BaseConnectorPlugin = BaseConnectorPlugin> {
|
|
57
|
+
create(config: ConnectorConfig): Promise<TPlugin>;
|
|
58
|
+
validate(config: ConnectorConfig): boolean;
|
|
59
|
+
getRequiredConfig(): string[];
|
|
60
|
+
getOptionalConfig(): string[];
|
|
61
|
+
}
|
|
62
|
+
export interface PluginRegistry {
|
|
63
|
+
register(name: string, plugin: BaseConnectorPlugin): void;
|
|
64
|
+
unregister(name: string): void;
|
|
65
|
+
get(name: string): BaseConnectorPlugin | undefined;
|
|
66
|
+
list(): string[];
|
|
67
|
+
has(name: string): boolean;
|
|
68
|
+
validate(plugin: BaseConnectorPlugin): boolean;
|
|
69
|
+
getOperations(pluginName: string): string[];
|
|
70
|
+
getPluginInfo(name: string): {
|
|
71
|
+
name: string;
|
|
72
|
+
version: string;
|
|
73
|
+
capabilities: ConnectorCapabilities;
|
|
74
|
+
operations: string[];
|
|
75
|
+
} | undefined;
|
|
76
|
+
}
|
|
77
|
+
export declare enum PluginType {
|
|
78
|
+
PAYMENT = "payment",
|
|
79
|
+
NOTIFICATION = "notification",
|
|
80
|
+
CALENDAR = "calendar",
|
|
81
|
+
VIDEO = "video",
|
|
82
|
+
STORAGE = "storage",
|
|
83
|
+
ANALYTICS = "analytics",
|
|
84
|
+
RESOURCE = "resource",
|
|
85
|
+
CUSTOM = "custom"
|
|
86
|
+
}
|
|
87
|
+
export interface PluginMetadata {
|
|
88
|
+
name: string;
|
|
89
|
+
version: string;
|
|
90
|
+
type: PluginType;
|
|
91
|
+
description?: string;
|
|
92
|
+
author?: string;
|
|
93
|
+
homepage?: string;
|
|
94
|
+
repository?: string;
|
|
95
|
+
license?: string;
|
|
96
|
+
keywords?: string[];
|
|
97
|
+
dependencies?: Record<string, string>;
|
|
98
|
+
peerDependencies?: Record<string, string>;
|
|
99
|
+
}
|
|
100
|
+
export interface PluginConfigSchema {
|
|
101
|
+
type: 'object';
|
|
102
|
+
properties: Record<string, {
|
|
103
|
+
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
104
|
+
description?: string;
|
|
105
|
+
required?: boolean;
|
|
106
|
+
default?: unknown;
|
|
107
|
+
enum?: unknown[];
|
|
108
|
+
pattern?: string;
|
|
109
|
+
minimum?: number;
|
|
110
|
+
maximum?: number;
|
|
111
|
+
}>;
|
|
112
|
+
required?: string[];
|
|
113
|
+
additionalProperties?: boolean;
|
|
114
|
+
}
|
|
115
|
+
export declare abstract class AbstractConnectorPlugin implements BaseConnectorPlugin {
|
|
116
|
+
protected config: ConnectorConfig | null;
|
|
117
|
+
protected initialized: boolean;
|
|
118
|
+
abstract getName(): string;
|
|
119
|
+
abstract getVersion(): string;
|
|
120
|
+
abstract getCapabilities(): ConnectorCapabilities;
|
|
121
|
+
initialize(config: ConnectorConfig): Promise<void>;
|
|
122
|
+
destroy(): Promise<void>;
|
|
123
|
+
healthCheck(): Promise<PluginHealthStatus>;
|
|
124
|
+
protected ensureInitialized(): void;
|
|
125
|
+
protected getConfig(): ConnectorConfig;
|
|
126
|
+
}
|
|
127
|
+
export interface PluginRegistry {
|
|
128
|
+
registerPlugin<TPlugin extends BaseConnectorPlugin>(pluginType: string, provider: string, factory: ConnectorPluginFactory<TPlugin>): void;
|
|
129
|
+
getPlugin(pluginType: string, provider: string): ConnectorPluginFactory | null;
|
|
130
|
+
listPlugins(pluginType?: string): Array<{
|
|
131
|
+
pluginType: string;
|
|
132
|
+
provider: string;
|
|
133
|
+
factory: ConnectorPluginFactory;
|
|
134
|
+
}>;
|
|
135
|
+
}
|
|
136
|
+
export interface OperationDefinition {
|
|
137
|
+
name: string;
|
|
138
|
+
inputSchema: any;
|
|
139
|
+
outputSchema: any;
|
|
140
|
+
description?: string;
|
|
141
|
+
requiredCapabilities?: string[];
|
|
142
|
+
}
|
|
143
|
+
export interface TypedConnectorPlugin<TOperations extends Record<string, OperationDefinition> = Record<string, OperationDefinition>> extends BaseConnectorPlugin {
|
|
144
|
+
getSupportedOperations(): TOperations;
|
|
145
|
+
executeOperation<K extends keyof TOperations>(config: ConnectorConfig, operationName: K, input: TOperations[K] extends {
|
|
146
|
+
inputSchema: infer I;
|
|
147
|
+
} ? I : any): Promise<ConnectorResponse<TOperations[K] extends {
|
|
148
|
+
outputSchema: infer O;
|
|
149
|
+
} ? O : any>>;
|
|
150
|
+
}
|
|
151
|
+
export declare enum PluginType {
|
|
152
|
+
PAYMENT = "payment",
|
|
153
|
+
NOTIFICATION = "notification",
|
|
154
|
+
CALENDAR = "calendar",
|
|
155
|
+
VIDEO = "video",
|
|
156
|
+
STORAGE = "storage",
|
|
157
|
+
RESOURCE = "resource",
|
|
158
|
+
BOOKING = "booking"
|
|
159
|
+
}
|
|
160
|
+
export interface ProviderInfo {
|
|
161
|
+
name: string;
|
|
162
|
+
displayName: string;
|
|
163
|
+
description?: string;
|
|
164
|
+
logoUrl?: string;
|
|
165
|
+
websiteUrl?: string;
|
|
166
|
+
supportedRegions?: string[];
|
|
167
|
+
requiredCredentials: string[];
|
|
168
|
+
optionalCredentials?: string[];
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=base-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-plugin.d.ts","sourceRoot":"","sources":["../../src/types/base-plugin.ts"],"names":[],"mappings":"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"}
|