runline 0.2.1 → 0.3.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.
Files changed (203) hide show
  1. package/dist/commands/auth.d.ts +7 -0
  2. package/dist/commands/auth.js +96 -0
  3. package/dist/config/loader.d.ts +11 -0
  4. package/dist/config/loader.js +46 -0
  5. package/dist/core/engine.js +7 -1
  6. package/dist/core/oauth.d.ts +46 -0
  7. package/dist/core/oauth.js +145 -0
  8. package/dist/index.d.ts +4 -2
  9. package/dist/index.js +2 -1
  10. package/dist/main.js +28 -0
  11. package/dist/plugin/api.d.ts +7 -1
  12. package/dist/plugin/api.js +7 -0
  13. package/dist/plugin/types.d.ts +47 -0
  14. package/dist/plugins/actionNetwork/src/index.js +118 -25
  15. package/dist/plugins/activeCampaign/src/index.js +184 -38
  16. package/dist/plugins/adalo/src/index.js +40 -8
  17. package/dist/plugins/affinity/src/index.js +100 -20
  18. package/dist/plugins/agileCrm/src/index.js +115 -27
  19. package/dist/plugins/airtable/src/index.js +94 -19
  20. package/dist/plugins/airtop/src/index.js +266 -62
  21. package/dist/plugins/apiTemplateIo/src/index.js +25 -5
  22. package/dist/plugins/asana/src/index.js +195 -41
  23. package/dist/plugins/autopilot/src/index.js +39 -8
  24. package/dist/plugins/bambooHr/src/index.js +109 -22
  25. package/dist/plugins/bannerbear/src/index.js +36 -8
  26. package/dist/plugins/baserow/src/index.js +35 -7
  27. package/dist/plugins/beeminder/src/index.js +198 -40
  28. package/dist/plugins/bitly/src/index.js +46 -10
  29. package/dist/plugins/bitwarden/src/index.js +167 -36
  30. package/dist/plugins/box/src/index.js +172 -37
  31. package/dist/plugins/brandfetch/src/index.js +5 -1
  32. package/dist/plugins/brevo/src/index.js +136 -29
  33. package/dist/plugins/bubble/src/index.js +76 -17
  34. package/dist/plugins/chargebee/src/index.js +35 -7
  35. package/dist/plugins/circleci/src/index.js +50 -10
  36. package/dist/plugins/ciscoWebex/src/index.js +131 -27
  37. package/dist/plugins/clearbit/src/index.js +76 -17
  38. package/dist/plugins/clickup/src/index.js +500 -107
  39. package/dist/plugins/clockify/src/index.js +229 -47
  40. package/dist/plugins/cloudflare/src/index.js +28 -6
  41. package/dist/plugins/cockpit/src/index.js +54 -12
  42. package/dist/plugins/coda/src/index.js +81 -19
  43. package/dist/plugins/coingecko/src/index.js +157 -33
  44. package/dist/plugins/contentful/src/index.js +85 -17
  45. package/dist/plugins/convertkit/src/index.js +74 -18
  46. package/dist/plugins/copper/src/index.js +59 -11
  47. package/dist/plugins/cortex/src/index.js +55 -13
  48. package/dist/plugins/currents/src/index.js +310 -71
  49. package/dist/plugins/customerIo/src/index.js +112 -23
  50. package/dist/plugins/databricks/src/index.js +549 -115
  51. package/dist/plugins/deepl/src/index.js +26 -6
  52. package/dist/plugins/demio/src/index.js +56 -11
  53. package/dist/plugins/dhl/src/index.js +16 -3
  54. package/dist/plugins/discord/src/index.js +141 -31
  55. package/dist/plugins/discourse/src/index.js +136 -31
  56. package/dist/plugins/disqus/src/index.js +96 -20
  57. package/dist/plugins/docker/src/index.js +20 -4
  58. package/dist/plugins/drift/src/index.js +19 -5
  59. package/dist/plugins/dropbox/src/index.js +139 -30
  60. package/dist/plugins/dropcontact/src/index.js +21 -4
  61. package/dist/plugins/egoi/src/index.js +61 -15
  62. package/dist/plugins/elasticsearch/src/index.js +59 -13
  63. package/dist/plugins/emelia/src/index.js +95 -19
  64. package/dist/plugins/erpnext/src/index.js +74 -15
  65. package/dist/plugins/facebookGraph/src/index.js +52 -11
  66. package/dist/plugins/freshdesk/src/index.js +220 -48
  67. package/dist/plugins/freshservice/src/index.js +39 -9
  68. package/dist/plugins/freshworksCrm/src/index.js +58 -12
  69. package/dist/plugins/getresponse/src/index.js +87 -18
  70. package/dist/plugins/ghost/src/index.js +114 -26
  71. package/dist/plugins/github/src/index.js +483 -109
  72. package/dist/plugins/gitlab/src/index.js +193 -45
  73. package/dist/plugins/gmail/src/index.js +1075 -0
  74. package/dist/plugins/gong/src/index.js +68 -14
  75. package/dist/plugins/gotify/src/index.js +43 -9
  76. package/dist/plugins/gotowebinar/src/index.js +233 -47
  77. package/dist/plugins/grafana/src/index.js +92 -21
  78. package/dist/plugins/graphql/src/index.js +38 -8
  79. package/dist/plugins/grist/src/index.js +52 -10
  80. package/dist/plugins/hackernews/src/index.js +32 -6
  81. package/dist/plugins/halopsa/src/index.js +131 -26
  82. package/dist/plugins/harvest/src/index.js +182 -42
  83. package/dist/plugins/helpscout/src/index.js +153 -31
  84. package/dist/plugins/highlevel/src/index.js +291 -58
  85. package/dist/plugins/homeAssistant/src/index.js +124 -26
  86. package/dist/plugins/hubspot/src/index.js +163 -29
  87. package/dist/plugins/humanticAi/src/index.js +54 -5
  88. package/dist/plugins/hunter/src/index.js +21 -4
  89. package/dist/plugins/intercom/src/index.js +95 -20
  90. package/dist/plugins/iterable/src/index.js +96 -20
  91. package/dist/plugins/jenkins/src/index.js +75 -17
  92. package/dist/plugins/jira/src/index.js +193 -43
  93. package/dist/plugins/keap/src/index.js +222 -56
  94. package/dist/plugins/kobotoolbox/src/index.js +113 -25
  95. package/dist/plugins/lemlist/src/index.js +79 -18
  96. package/dist/plugins/linear/src/index.js +86 -19
  97. package/dist/plugins/lingvanex/src/index.js +38 -8
  98. package/dist/plugins/linkedin/src/index.js +37 -8
  99. package/dist/plugins/lonescale/src/index.js +41 -9
  100. package/dist/plugins/magento/src/index.js +98 -27
  101. package/dist/plugins/mailcheck/src/index.js +11 -2
  102. package/dist/plugins/mailchimp/src/index.js +193 -42
  103. package/dist/plugins/mailerlite/src/index.js +61 -12
  104. package/dist/plugins/mailgun/src/index.js +39 -7
  105. package/dist/plugins/mailjet/src/index.js +141 -30
  106. package/dist/plugins/mandrill/src/index.js +67 -14
  107. package/dist/plugins/marketstack/src/index.js +56 -10
  108. package/dist/plugins/matrix/src/index.js +97 -20
  109. package/dist/plugins/mattermost/src/index.js +124 -26
  110. package/dist/plugins/mautic/src/index.js +129 -26
  111. package/dist/plugins/medium/src/index.js +64 -13
  112. package/dist/plugins/messagebird/src/index.js +80 -15
  113. package/dist/plugins/metabase/src/index.js +57 -12
  114. package/dist/plugins/misp/src/index.js +135 -33
  115. package/dist/plugins/mocean/src/index.js +33 -7
  116. package/dist/plugins/monday/src/index.js +97 -23
  117. package/dist/plugins/monicaCrm/src/index.js +112 -23
  118. package/dist/plugins/msg91/src/index.js +11 -2
  119. package/dist/plugins/nasa/src/index.js +108 -21
  120. package/dist/plugins/netlify/src/index.js +28 -6
  121. package/dist/plugins/netscalerAdc/src/index.js +144 -29
  122. package/dist/plugins/nextcloud/src/index.js +103 -20
  123. package/dist/plugins/nocodb/src/index.js +57 -11
  124. package/dist/plugins/notion/src/index.js +148 -37
  125. package/dist/plugins/npm/src/index.js +59 -12
  126. package/dist/plugins/odoo/src/index.js +102 -20
  127. package/dist/plugins/okta/src/index.js +50 -10
  128. package/dist/plugins/oneSimpleApi/src/index.js +84 -17
  129. package/dist/plugins/onfleet/src/index.js +139 -32
  130. package/dist/plugins/openThesaurus/src/index.js +46 -9
  131. package/dist/plugins/openweathermap/src/index.js +31 -6
  132. package/dist/plugins/oura/src/index.js +36 -7
  133. package/dist/plugins/paddle/src/index.js +80 -17
  134. package/dist/plugins/pagerduty/src/index.js +53 -12
  135. package/dist/plugins/paypal/src/index.js +51 -11
  136. package/dist/plugins/peekalink/src/index.js +12 -3
  137. package/dist/plugins/phantombuster/src/index.js +39 -8
  138. package/dist/plugins/philipsHue/src/index.js +64 -13
  139. package/dist/plugins/pipedrive/src/index.js +167 -45
  140. package/dist/plugins/plivo/src/index.js +43 -8
  141. package/dist/plugins/postbin/src/index.js +9 -2
  142. package/dist/plugins/posthog/src/index.js +50 -13
  143. package/dist/plugins/profitwell/src/index.js +24 -5
  144. package/dist/plugins/pushbullet/src/index.js +45 -9
  145. package/dist/plugins/pushcut/src/index.js +31 -6
  146. package/dist/plugins/pushover/src/index.js +51 -10
  147. package/dist/plugins/quickbase/src/index.js +66 -13
  148. package/dist/plugins/quickbooks/src/index.js +86 -19
  149. package/dist/plugins/quickchart/src/index.js +35 -7
  150. package/dist/plugins/raindrop/src/index.js +54 -13
  151. package/dist/plugins/reddit/src/index.js +73 -18
  152. package/dist/plugins/rocketchat/src/index.js +47 -9
  153. package/dist/plugins/rundeck/src/index.js +26 -5
  154. package/dist/plugins/salesforce/src/index.js +161 -31
  155. package/dist/plugins/salesmate/src/index.js +75 -16
  156. package/dist/plugins/securityScorecard/src/index.js +73 -15
  157. package/dist/plugins/segment/src/index.js +21 -4
  158. package/dist/plugins/sendgrid/src/index.js +102 -24
  159. package/dist/plugins/sendy/src/index.js +54 -11
  160. package/dist/plugins/sentry/src/index.js +174 -34
  161. package/dist/plugins/servicenow/src/index.js +120 -27
  162. package/dist/plugins/shopify/src/index.js +53 -12
  163. package/dist/plugins/signl4/src/index.js +16 -3
  164. package/dist/plugins/slack/src/index.js +407 -105
  165. package/dist/plugins/sms77/src/index.js +26 -5
  166. package/dist/plugins/splunk/src/index.js +186 -45
  167. package/dist/plugins/spotify/src/index.js +265 -66
  168. package/dist/plugins/stackby/src/index.js +18 -6
  169. package/dist/plugins/storyblok/src/index.js +57 -11
  170. package/dist/plugins/strapi/src/index.js +63 -12
  171. package/dist/plugins/strava/src/index.js +58 -13
  172. package/dist/plugins/stripe/src/index.js +143 -30
  173. package/dist/plugins/supabase/src/index.js +49 -10
  174. package/dist/plugins/syncromsp/src/index.js +245 -67
  175. package/dist/plugins/tapfiliate/src/index.js +57 -14
  176. package/dist/plugins/telegram/src/index.js +202 -39
  177. package/dist/plugins/thehive/src/index.js +271 -66
  178. package/dist/plugins/thehiveProject/src/index.js +457 -89
  179. package/dist/plugins/todoist/src/index.js +326 -77
  180. package/dist/plugins/travisci/src/index.js +35 -8
  181. package/dist/plugins/trello/src/index.js +204 -46
  182. package/dist/plugins/twake/src/index.js +10 -2
  183. package/dist/plugins/twilio/src/index.js +56 -11
  184. package/dist/plugins/twist/src/index.js +241 -48
  185. package/dist/plugins/twitter/src/index.js +128 -30
  186. package/dist/plugins/unleashedSoftware/src/index.js +30 -6
  187. package/dist/plugins/uplead/src/index.js +9 -2
  188. package/dist/plugins/uproc/src/index.js +31 -6
  189. package/dist/plugins/uptimerobot/src/index.js +119 -25
  190. package/dist/plugins/urlscanio/src/index.js +25 -6
  191. package/dist/plugins/vero/src/index.js +68 -13
  192. package/dist/plugins/vonage/src/index.js +32 -6
  193. package/dist/plugins/wekan/src/index.js +297 -52
  194. package/dist/plugins/woocommerce/src/index.js +57 -12
  195. package/dist/plugins/wordpress/src/index.js +94 -18
  196. package/dist/plugins/xero/src/index.js +79 -13
  197. package/dist/plugins/yourls/src/index.js +33 -6
  198. package/dist/plugins/zammad/src/index.js +139 -36
  199. package/dist/plugins/zendesk/src/index.js +201 -48
  200. package/dist/plugins/zoho/src/index.js +88 -21
  201. package/dist/plugins/zoom/src/index.js +41 -7
  202. package/dist/plugins/zulip/src/index.js +101 -20
  203. package/package.json +3 -1
@@ -7,7 +7,13 @@ async function apiRequest(apiKey, method, endpoint, body, qs) {
7
7
  url.searchParams.set(k, String(v));
8
8
  }
9
9
  }
10
- const init = { method, headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" } };
10
+ const init = {
11
+ method,
12
+ headers: {
13
+ Authorization: `Bearer ${apiKey}`,
14
+ "Content-Type": "application/json",
15
+ },
16
+ };
11
17
  if (body !== undefined)
12
18
  init.body = JSON.stringify(body);
13
19
  const res = await fetch(url.toString(), init);
@@ -15,35 +21,68 @@ async function apiRequest(apiKey, method, endpoint, body, qs) {
15
21
  throw new Error(`SendGrid error ${res.status}: ${await res.text()}`);
16
22
  const text = await res.text();
17
23
  const headers = {};
18
- res.headers.forEach((v, k) => { headers[k] = v; });
24
+ res.headers.forEach((v, k) => {
25
+ headers[k] = v;
26
+ });
19
27
  return { data: text ? JSON.parse(text) : {}, headers };
20
28
  }
21
29
  export default function sendgrid(rl) {
22
30
  rl.setName("sendgrid");
23
31
  rl.setVersion("0.1.0");
24
32
  rl.setConnectionSchema({
25
- apiKey: { type: "string", required: true, description: "SendGrid API key", env: "SENDGRID_API_KEY" },
33
+ apiKey: {
34
+ type: "string",
35
+ required: true,
36
+ description: "SendGrid API key",
37
+ env: "SENDGRID_API_KEY",
38
+ },
26
39
  });
27
40
  const key = (ctx) => ctx.connection.config.apiKey;
28
41
  // ── Mail ────────────────────────────────────────────
29
42
  rl.registerAction("mail.send", {
30
43
  description: "Send an email via SendGrid",
31
44
  inputSchema: {
32
- to: { type: "string", required: true, description: "Recipient email(s), comma-separated" },
45
+ to: {
46
+ type: "string",
47
+ required: true,
48
+ description: "Recipient email(s), comma-separated",
49
+ },
33
50
  from: { type: "string", required: true, description: "Sender email" },
34
51
  fromName: { type: "string", required: false },
35
52
  subject: { type: "string", required: true },
36
- contentType: { type: "string", required: false, description: "text/plain or text/html (default text/plain)" },
53
+ contentType: {
54
+ type: "string",
55
+ required: false,
56
+ description: "text/plain or text/html (default text/plain)",
57
+ },
37
58
  content: { type: "string", required: true, description: "Email body" },
38
- cc: { type: "string", required: false, description: "CC emails, comma-separated" },
39
- bcc: { type: "string", required: false, description: "BCC emails, comma-separated" },
59
+ cc: {
60
+ type: "string",
61
+ required: false,
62
+ description: "CC emails, comma-separated",
63
+ },
64
+ bcc: {
65
+ type: "string",
66
+ required: false,
67
+ description: "BCC emails, comma-separated",
68
+ },
40
69
  replyTo: { type: "string", required: false },
41
- templateId: { type: "string", required: false, description: "Dynamic template ID (overrides subject/content)" },
42
- dynamicTemplateData: { type: "object", required: false, description: "Template variables" },
70
+ templateId: {
71
+ type: "string",
72
+ required: false,
73
+ description: "Dynamic template ID (overrides subject/content)",
74
+ },
75
+ dynamicTemplateData: {
76
+ type: "object",
77
+ required: false,
78
+ description: "Template variables",
79
+ },
43
80
  },
44
81
  async execute(input, ctx) {
45
82
  const p = input;
46
- const toList = p.to.split(",").map(e => ({ email: e.trim() }));
83
+ const toList = p.to
84
+ .split(",")
85
+ .map((e) => ({ email: e.trim() }));
47
86
  const personalization = { to: toList };
48
87
  const body = {
49
88
  personalizations: [personalization],
@@ -56,14 +95,22 @@ export default function sendgrid(rl) {
56
95
  }
57
96
  else {
58
97
  personalization.subject = p.subject;
59
- body.content = [{ type: p.contentType ?? "text/plain", value: p.content }];
98
+ body.content = [
99
+ { type: p.contentType ?? "text/plain", value: p.content },
100
+ ];
60
101
  }
61
102
  if (p.cc)
62
- personalization.cc = p.cc.split(",").map(e => ({ email: e.trim() }));
103
+ personalization.cc = p.cc
104
+ .split(",")
105
+ .map((e) => ({ email: e.trim() }));
63
106
  if (p.bcc)
64
- personalization.bcc = p.bcc.split(",").map(e => ({ email: e.trim() }));
107
+ personalization.bcc = p.bcc
108
+ .split(",")
109
+ .map((e) => ({ email: e.trim() }));
65
110
  if (p.replyTo)
66
- body.reply_to_list = p.replyTo.split(",").map(e => ({ email: e.trim() }));
111
+ body.reply_to_list = p.replyTo
112
+ .split(",")
113
+ .map((e) => ({ email: e.trim() }));
67
114
  const { headers } = await apiRequest(key(ctx), "POST", "/mail/send", body);
68
115
  return { messageId: headers["x-message-id"] ?? null };
69
116
  },
@@ -73,7 +120,11 @@ export default function sendgrid(rl) {
73
120
  description: "Get a contact by ID or email",
74
121
  inputSchema: {
75
122
  contactId: { type: "string", required: false },
76
- email: { type: "string", required: false, description: "Email (searches if no contactId)" },
123
+ email: {
124
+ type: "string",
125
+ required: false,
126
+ description: "Email (searches if no contactId)",
127
+ },
77
128
  },
78
129
  async execute(input, ctx) {
79
130
  const p = input;
@@ -89,7 +140,11 @@ export default function sendgrid(rl) {
89
140
  rl.registerAction("contact.list", {
90
141
  description: "List contacts (optionally with SGQL query)",
91
142
  inputSchema: {
92
- query: { type: "string", required: false, description: "SGQL query filter" },
143
+ query: {
144
+ type: "string",
145
+ required: false,
146
+ description: "SGQL query filter",
147
+ },
93
148
  limit: { type: "number", required: false },
94
149
  },
95
150
  async execute(input, ctx) {
@@ -103,7 +158,8 @@ export default function sendgrid(rl) {
103
158
  body.query = p.query;
104
159
  }
105
160
  const { data } = await apiRequest(key(ctx), method, endpoint, Object.keys(body).length ? body : undefined);
106
- let result = (data.result ?? []);
161
+ let result = (data.result ??
162
+ []);
107
163
  if (p.limit)
108
164
  result = result.slice(0, p.limit);
109
165
  return result;
@@ -112,8 +168,16 @@ export default function sendgrid(rl) {
112
168
  rl.registerAction("contact.upsert", {
113
169
  description: "Create or update contacts",
114
170
  inputSchema: {
115
- contacts: { type: "object", required: true, description: "Array of contact objects [{email, first_name?, last_name?, ...}]" },
116
- listIds: { type: "object", required: false, description: "Array of list IDs to add contacts to" },
171
+ contacts: {
172
+ type: "object",
173
+ required: true,
174
+ description: "Array of contact objects [{email, first_name?, last_name?, ...}]",
175
+ },
176
+ listIds: {
177
+ type: "object",
178
+ required: false,
179
+ description: "Array of list IDs to add contacts to",
180
+ },
117
181
  },
118
182
  async execute(input, ctx) {
119
183
  const p = input;
@@ -127,7 +191,11 @@ export default function sendgrid(rl) {
127
191
  rl.registerAction("contact.delete", {
128
192
  description: "Delete contacts by IDs",
129
193
  inputSchema: {
130
- ids: { type: "string", required: true, description: "Comma-separated contact IDs" },
194
+ ids: {
195
+ type: "string",
196
+ required: true,
197
+ description: "Comma-separated contact IDs",
198
+ },
131
199
  },
132
200
  async execute(input, ctx) {
133
201
  const { ids } = input;
@@ -140,7 +208,9 @@ export default function sendgrid(rl) {
140
208
  description: "Create a contact list",
141
209
  inputSchema: { name: { type: "string", required: true } },
142
210
  async execute(input, ctx) {
143
- const { data } = await apiRequest(key(ctx), "POST", "/marketing/lists", { name: input.name });
211
+ const { data } = await apiRequest(key(ctx), "POST", "/marketing/lists", {
212
+ name: input.name,
213
+ });
144
214
  return data;
145
215
  },
146
216
  });
@@ -157,7 +227,8 @@ export default function sendgrid(rl) {
157
227
  inputSchema: { limit: { type: "number", required: false } },
158
228
  async execute(input, ctx) {
159
229
  const { data } = await apiRequest(key(ctx), "GET", "/marketing/lists");
160
- let result = (data.result ?? []);
230
+ let result = (data.result ??
231
+ []);
161
232
  if (input?.limit)
162
233
  result = result.slice(0, input.limit);
163
234
  return result;
@@ -165,7 +236,10 @@ export default function sendgrid(rl) {
165
236
  });
166
237
  rl.registerAction("list.update", {
167
238
  description: "Update a list name",
168
- inputSchema: { listId: { type: "string", required: true }, name: { type: "string", required: true } },
239
+ inputSchema: {
240
+ listId: { type: "string", required: true },
241
+ name: { type: "string", required: true },
242
+ },
169
243
  async execute(input, ctx) {
170
244
  const p = input;
171
245
  const { data } = await apiRequest(key(ctx), "PATCH", `/marketing/lists/${p.listId}`, { name: p.name });
@@ -176,7 +250,11 @@ export default function sendgrid(rl) {
176
250
  description: "Delete a list",
177
251
  inputSchema: {
178
252
  listId: { type: "string", required: true },
179
- deleteContacts: { type: "boolean", required: false, description: "Also delete contacts in list" },
253
+ deleteContacts: {
254
+ type: "boolean",
255
+ required: false,
256
+ description: "Also delete contacts in list",
257
+ },
180
258
  },
181
259
  async execute(input, ctx) {
182
260
  const p = input;
@@ -1,6 +1,9 @@
1
1
  function getConn(ctx) {
2
2
  const c = ctx.connection.config;
3
- return { url: c.url.replace(/\/$/, ""), apiKey: c.apiKey };
3
+ return {
4
+ url: c.url.replace(/\/$/, ""),
5
+ apiKey: c.apiKey,
6
+ };
4
7
  }
5
8
  async function apiRequest(conn, endpoint, body) {
6
9
  body.api_key = conn.apiKey;
@@ -21,8 +24,18 @@ export default function sendy(rl) {
21
24
  rl.setName("sendy");
22
25
  rl.setVersion("0.1.0");
23
26
  rl.setConnectionSchema({
24
- url: { type: "string", required: true, description: "Sendy installation URL", env: "SENDY_URL" },
25
- apiKey: { type: "string", required: true, description: "Sendy API key", env: "SENDY_API_KEY" },
27
+ url: {
28
+ type: "string",
29
+ required: true,
30
+ description: "Sendy installation URL",
31
+ env: "SENDY_URL",
32
+ },
33
+ apiKey: {
34
+ type: "string",
35
+ required: true,
36
+ description: "Sendy API key",
37
+ env: "SENDY_API_KEY",
38
+ },
26
39
  });
27
40
  rl.registerAction("campaign.create", {
28
41
  description: "Create (and optionally send) an email campaign",
@@ -32,10 +45,26 @@ export default function sendy(rl) {
32
45
  replyTo: { type: "string", required: true },
33
46
  title: { type: "string", required: true },
34
47
  subject: { type: "string", required: true },
35
- htmlText: { type: "string", required: true, description: "HTML content of the email" },
36
- sendCampaign: { type: "boolean", required: false, description: "Send immediately (default false)" },
37
- brandId: { type: "string", required: false, description: "Brand ID (required if not sending)" },
38
- listIds: { type: "string", required: false, description: "Comma-separated list IDs" },
48
+ htmlText: {
49
+ type: "string",
50
+ required: true,
51
+ description: "HTML content of the email",
52
+ },
53
+ sendCampaign: {
54
+ type: "boolean",
55
+ required: false,
56
+ description: "Send immediately (default false)",
57
+ },
58
+ brandId: {
59
+ type: "string",
60
+ required: false,
61
+ description: "Brand ID (required if not sending)",
62
+ },
63
+ listIds: {
64
+ type: "string",
65
+ required: false,
66
+ description: "Comma-separated list IDs",
67
+ },
39
68
  plainText: { type: "string", required: false },
40
69
  trackOpens: { type: "boolean", required: false },
41
70
  trackClicks: { type: "boolean", required: false },
@@ -43,8 +72,12 @@ export default function sendy(rl) {
43
72
  async execute(input, ctx) {
44
73
  const p = input;
45
74
  const body = {
46
- from_name: p.fromName, from_email: p.fromEmail, reply_to: p.replyTo,
47
- title: p.title, subject: p.subject, html_text: p.htmlText,
75
+ from_name: p.fromName,
76
+ from_email: p.fromEmail,
77
+ reply_to: p.replyTo,
78
+ title: p.title,
79
+ subject: p.subject,
80
+ html_text: p.htmlText,
48
81
  send_campaign: p.sendCampaign ? 1 : 0,
49
82
  };
50
83
  if (p.brandId)
@@ -114,7 +147,10 @@ export default function sendy(rl) {
114
147
  },
115
148
  async execute(input, ctx) {
116
149
  const { email, listId } = input;
117
- const resp = await apiRequest(getConn(ctx), "/unsubscribe", { email, list: listId });
150
+ const resp = await apiRequest(getConn(ctx), "/unsubscribe", {
151
+ email,
152
+ list: listId,
153
+ });
118
154
  if (resp === "1")
119
155
  return { success: true };
120
156
  throw new Error(`Sendy unsubscribe error: ${resp}`);
@@ -129,7 +165,14 @@ export default function sendy(rl) {
129
165
  async execute(input, ctx) {
130
166
  const { email, listId } = input;
131
167
  const resp = await apiRequest(getConn(ctx), "/api/subscribers/subscription-status.php", { email, list_id: listId });
132
- const valid = ["Subscribed", "Unsubscribed", "Unconfirmed", "Bounced", "Soft bounced", "Complained"];
168
+ const valid = [
169
+ "Subscribed",
170
+ "Unsubscribed",
171
+ "Unconfirmed",
172
+ "Bounced",
173
+ "Soft bounced",
174
+ "Complained",
175
+ ];
133
176
  if (valid.includes(resp))
134
177
  return { status: resp };
135
178
  throw new Error(`Sendy status error: ${resp}`);