@oomol-lab/open-connector 1.7.0 → 1.8.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 (288) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +916 -76
  4. package/assets/open-connector/catalog/apps/cal.json +24 -6
  5. package/assets/open-connector/catalog/apps/discordbot.json +2 -2
  6. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  7. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  8. package/assets/open-connector/catalog/apps/github.json +275 -0
  9. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  10. package/assets/open-connector/catalog/apps/gmail.json +151 -0
  11. package/assets/open-connector/catalog/apps/googlecalendar.json +206 -0
  12. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  13. package/assets/open-connector/catalog/apps/googlesheets.json +144 -0
  14. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  15. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  16. package/assets/open-connector/catalog/apps/linear.json +116 -0
  17. package/assets/open-connector/catalog/apps/notion.json +142 -0
  18. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  19. package/assets/open-connector/catalog/apps/outlook.json +182 -0
  20. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  21. package/assets/open-connector/catalog/apps/slack.json +182 -0
  22. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  23. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  24. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  25. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  26. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  27. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  28. package/assets/open-connector/catalog/apps/zerotier.json +9 -9
  29. package/assets/open-connector/catalog/apps-index.json +1 -1
  30. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  31. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  32. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  33. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  34. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  35. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  36. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  37. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  38. package/package.json +2 -2
  39. package/src/connection-service.d.ts +40 -7
  40. package/src/connection-service.js +60 -18
  41. package/src/core/action-policy.d.ts +8 -1
  42. package/src/core/action-policy.js +51 -0
  43. package/src/core/cast.d.ts +3 -0
  44. package/src/core/cast.js +4 -1
  45. package/src/core/guarded-fetch.d.ts +5 -0
  46. package/src/core/guarded-fetch.js +13 -4
  47. package/src/core/remote-http.d.ts +33 -0
  48. package/src/core/remote-http.js +104 -0
  49. package/src/core/request.d.ts +1 -0
  50. package/src/core/request.js +7 -0
  51. package/src/core/types.d.ts +4 -0
  52. package/src/marketplace/marketplace-service.d.ts +0 -1
  53. package/src/marketplace/marketplace-service.js +80 -92
  54. package/src/mcp.js +19 -5
  55. package/src/oauth/oauth-flow-service.d.ts +8 -1
  56. package/src/oauth/oauth-flow-service.js +10 -4
  57. package/src/providers/action-contracts.generated.d.ts +4 -2
  58. package/src/providers/airtable/executors.d.ts +3 -0
  59. package/src/providers/airtable/executors.js +2 -0
  60. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  61. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  62. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  63. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  64. package/src/providers/aisa/executors.js +196 -22
  65. package/src/providers/cal/actions.js +5 -1
  66. package/src/providers/enormail/executors.d.ts +4 -0
  67. package/src/providers/enormail/executors.js +97 -0
  68. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  69. package/src/providers/feishu_app_bot/executors.js +2 -0
  70. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  71. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  72. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  73. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  74. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  75. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  76. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  77. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  78. package/src/providers/github/executors.d.ts +3 -0
  79. package/src/providers/github/executors.js +6 -0
  80. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  81. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  82. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  83. package/src/providers/github/trigger-on-repo-event.js +168 -0
  84. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  85. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  86. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  87. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  88. package/src/providers/gitlab/executors.d.ts +3 -0
  89. package/src/providers/gitlab/executors.js +2 -0
  90. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  91. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  92. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  93. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  94. package/src/providers/gmail/executors.d.ts +3 -0
  95. package/src/providers/gmail/executors.js +2 -0
  96. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  97. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  98. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  99. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  100. package/src/providers/googlecalendar/executors.d.ts +3 -0
  101. package/src/providers/googlecalendar/executors.js +2 -0
  102. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  103. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  104. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  105. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  106. package/src/providers/googledrive/executors.d.ts +3 -0
  107. package/src/providers/googledrive/executors.js +7 -0
  108. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  109. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  110. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  111. package/src/providers/googledrive/trigger-changes.js +452 -0
  112. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  113. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  114. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  115. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  116. package/src/providers/googlesheets/executors.d.ts +3 -0
  117. package/src/providers/googlesheets/executors.js +2 -0
  118. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  119. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  120. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  121. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  122. package/src/providers/hithink_finance/runtime.js +1 -1
  123. package/src/providers/indexed/executors.d.ts +4 -0
  124. package/src/providers/indexed/executors.js +16 -0
  125. package/src/providers/indexed/runtime.d.ts +26 -0
  126. package/src/providers/indexed/runtime.js +129 -0
  127. package/src/providers/linear/executors.d.ts +3 -0
  128. package/src/providers/linear/executors.js +2 -0
  129. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  130. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  131. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  132. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  133. package/src/providers/notion/executors.d.ts +3 -0
  134. package/src/providers/notion/executors.js +2 -0
  135. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  136. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  137. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  138. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  139. package/src/providers/one_drive/executors.d.ts +3 -0
  140. package/src/providers/one_drive/executors.js +2 -0
  141. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  142. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  143. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  144. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  145. package/src/providers/outlook/executors.d.ts +3 -0
  146. package/src/providers/outlook/executors.js +2 -0
  147. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  148. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  149. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  150. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  151. package/src/providers/outlook_calendar/executors.js +6 -0
  152. package/src/providers/provider-loader.d.ts +5 -0
  153. package/src/providers/provider-loader.js +4 -0
  154. package/src/providers/registry.generated.js +2 -0
  155. package/src/providers/shopify/executors.d.ts +3 -0
  156. package/src/providers/shopify/executors.js +2 -0
  157. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  158. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  159. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  160. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  161. package/src/providers/slack/executors.d.ts +3 -0
  162. package/src/providers/slack/executors.js +2 -0
  163. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  164. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  165. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  166. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  167. package/src/providers/spotify/runtime.js +15 -4
  168. package/src/providers/stripe/executors.d.ts +3 -0
  169. package/src/providers/stripe/executors.js +2 -0
  170. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  171. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  172. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  173. package/src/providers/stripe/trigger-on-event.js +212 -0
  174. package/src/providers/telegram/executors.d.ts +3 -0
  175. package/src/providers/telegram/executors.js +2 -0
  176. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  177. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  178. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  179. package/src/providers/telegram/trigger-on-update.js +141 -0
  180. package/src/providers/weixin_store/access-token.d.ts +2 -1
  181. package/src/providers/weixin_store/access-token.js +15 -4
  182. package/src/providers/weixin_store/executors.js +97 -12
  183. package/src/providers/woocommerce/executors.d.ts +3 -0
  184. package/src/providers/woocommerce/executors.js +2 -0
  185. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  186. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  187. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  188. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  189. package/src/providers/zendesk/executors.d.ts +3 -0
  190. package/src/providers/zendesk/executors.js +2 -0
  191. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  192. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  193. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  194. package/src/providers/zendesk/trigger-on-event.js +188 -0
  195. package/src/saas/saas-cleanup-service.d.ts +26 -0
  196. package/src/saas/saas-cleanup-service.js +124 -0
  197. package/src/saas/saas-client.d.ts +86 -0
  198. package/src/saas/saas-client.js +369 -0
  199. package/src/saas/saas-execution-service.d.ts +15 -0
  200. package/src/saas/saas-execution-service.js +21 -0
  201. package/src/saas/saas-oauth-service.d.ts +25 -0
  202. package/src/saas/saas-oauth-service.js +197 -0
  203. package/src/saas/saas-project-service.d.ts +61 -0
  204. package/src/saas/saas-project-service.js +211 -0
  205. package/src/server/actions/action-idempotency.d.ts +1 -0
  206. package/src/server/actions/action-idempotency.js +1 -0
  207. package/src/server/actions/action-runner.d.ts +7 -0
  208. package/src/server/actions/action-runner.js +43 -7
  209. package/src/server/actions/run-log-summary.js +9 -0
  210. package/src/server/api/auth.d.ts +1 -0
  211. package/src/server/api/auth.js +13 -2
  212. package/src/server/api/cache-policy.js +4 -1
  213. package/src/server/api/connection-input.d.ts +7 -1
  214. package/src/server/api/connection-input.js +7 -1
  215. package/src/server/api/connection-routes.d.ts +3 -1
  216. package/src/server/api/connection-routes.js +21 -3
  217. package/src/server/api/http-utils.d.ts +4 -3
  218. package/src/server/api/oauth-completion-page.d.ts +124 -0
  219. package/src/server/api/oauth-completion-page.js +113 -18
  220. package/src/server/api/openapi.js +112 -14
  221. package/src/server/api/policy-input.js +6 -0
  222. package/src/server/api/runtime-api.d.ts +10 -2
  223. package/src/server/api/runtime-api.js +17 -4
  224. package/src/server/api/saas-completion-page.d.ts +2 -0
  225. package/src/server/api/saas-completion-page.js +103 -0
  226. package/src/server/connect-app.d.ts +5 -0
  227. package/src/server/connect-app.js +50 -0
  228. package/src/server/connect-server.d.ts +12 -0
  229. package/src/server/connect-server.js +147 -13
  230. package/src/server/connector-runtime.d.ts +3 -1
  231. package/src/server/connector-runtime.js +5 -2
  232. package/src/server/files/transit-files.js +16 -7
  233. package/src/server/proxy/proxy-runner.d.ts +5 -1
  234. package/src/server/proxy/proxy-runner.js +72 -26
  235. package/src/server/storage/connection-request-store.d.ts +41 -1
  236. package/src/server/storage/connection-request-store.js +245 -20
  237. package/src/server/storage/connection-store.d.ts +16 -0
  238. package/src/server/storage/connection-store.js +119 -0
  239. package/src/server/storage/node-runtime-database.js +3 -3
  240. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  241. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  242. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  243. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  244. package/src/server/storage/runtime-database.d.ts +4 -0
  245. package/src/server/storage/runtime-sql.d.ts +1 -1
  246. package/src/server/storage/runtime-sql.js +2 -1
  247. package/src/server/storage/runtime-store.d.ts +1 -0
  248. package/src/server/storage/runtime-token-service.d.ts +2 -0
  249. package/src/server/storage/runtime-token-service.js +3 -0
  250. package/src/server/storage/saas-project-store.d.ts +77 -0
  251. package/src/server/storage/saas-project-store.js +273 -0
  252. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  253. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  254. package/src/server/storage/trigger-store.d.ts +16 -0
  255. package/src/server/storage/trigger-store.js +96 -0
  256. package/src/triggers/common/config.d.ts +2 -0
  257. package/src/triggers/common/config.js +17 -0
  258. package/src/triggers/common/configOptions.d.ts +13 -0
  259. package/src/triggers/common/configOptions.js +1 -0
  260. package/src/triggers/common/encoding.d.ts +3 -0
  261. package/src/triggers/common/encoding.js +19 -0
  262. package/src/triggers/common/integration.d.ts +115 -0
  263. package/src/triggers/common/integration.js +31 -0
  264. package/src/triggers/common/json.d.ts +6 -0
  265. package/src/triggers/common/json.js +91 -0
  266. package/src/triggers/common/poll.d.ts +41 -0
  267. package/src/triggers/common/poll.js +15 -0
  268. package/src/triggers/common/proxy.d.ts +14 -0
  269. package/src/triggers/common/proxy.js +1 -0
  270. package/src/triggers/common/types.d.ts +42 -0
  271. package/src/triggers/common/types.js +1 -0
  272. package/src/triggers/maintenance.d.ts +40 -0
  273. package/src/triggers/maintenance.js +120 -0
  274. package/src/triggers/metadata.d.ts +8 -0
  275. package/src/triggers/metadata.js +1 -0
  276. package/src/triggers/request.d.ts +33 -0
  277. package/src/triggers/request.js +52 -0
  278. package/src/triggers/resources.d.ts +12 -0
  279. package/src/triggers/resources.js +121 -0
  280. package/src/triggers/signature.d.ts +4 -0
  281. package/src/triggers/signature.js +48 -0
  282. package/src/triggers/store.d.ts +29 -0
  283. package/src/triggers/store.js +1 -0
  284. package/src/triggers/subscriptions.d.ts +22 -0
  285. package/src/triggers/subscriptions.js +220 -0
  286. package/src/triggers/trigger-runner.d.ts +34 -0
  287. package/src/triggers/trigger-runner.js +169 -0
  288. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
@@ -1,4 +1,4 @@
1
- import { compactObject, objectArray, optionalBoolean, optionalInteger, optionalString } from "../../core/cast.js";
1
+ import { compactObject, objectArray, optionalBoolean, optionalInteger, optionalRecord, optionalString, positiveInteger, } from "../../core/cast.js";
2
2
  import { createProviderFetch, defineProviderExecutors, providerInputError, providerUserAgent, readTransitFileInput, requireCustomCredential, requiredInputString, runProviderRequest, } from "../provider-runtime.js";
3
3
  import { getWechatAccessToken, isWechatTokenError, normalizeWechatApiError, parseWechatJson, readWechatErrcode, readWeixinStoreCredential, } from "./access-token.js";
4
4
  const service = "weixin_store";
@@ -35,6 +35,20 @@ const deliveryProductFieldMap = {
35
35
  productCnt: "product_cnt",
36
36
  };
37
37
  const weixinStoreActionHandlers = {
38
+ async upload_qualification_image(input, context) {
39
+ const file = await readTransitFileInput(input.file, context);
40
+ if (file.sizeBytes > 2 * 1024 * 1024) {
41
+ throw providerInputError("file must be at most 2 MB");
42
+ }
43
+ const formData = new FormData();
44
+ formData.set("media", file.file, file.name);
45
+ return callWechatApi(context, {
46
+ method: "POST",
47
+ path: "/shop/ec/basics/qualification/upload",
48
+ body: formData,
49
+ timeoutMs: wechatImageUploadTimeoutMs,
50
+ });
51
+ },
38
52
  upload_image(input, context) {
39
53
  const imageUrl = optionalString(input.imageUrl);
40
54
  if ((imageUrl === undefined) === (input.file === undefined)) {
@@ -61,7 +75,53 @@ const weixinStoreActionHandlers = {
61
75
  return callWechatApi(context, {
62
76
  method: "POST",
63
77
  path: "/shop/ec/category/detail",
64
- body: { cat_id: readPositiveInteger(input.catId, "catId") },
78
+ body: { cat_id: positiveInteger(input.catId, "catId", providerInputError) },
79
+ });
80
+ },
81
+ apply_category(input, context) {
82
+ const categoryInfo = optionalRecord(input.categoryInfo);
83
+ if (!categoryInfo) {
84
+ throw providerInputError("categoryInfo must be an object");
85
+ }
86
+ return callWechatApi(context, {
87
+ method: "POST",
88
+ path: "/channels/ec/category/add",
89
+ body: { category_info: mapCategoryApplication(categoryInfo) },
90
+ });
91
+ },
92
+ get_category_application(input, context) {
93
+ return callWechatApi(context, {
94
+ method: "POST",
95
+ path: "/shop/ec/category/getbizcatflowdetail",
96
+ body: { audit_id: positiveInteger(input.auditId, "auditId", providerInputError) },
97
+ });
98
+ },
99
+ list_category_permissions(input, context) {
100
+ const status = optionalInteger(input.status);
101
+ return callWechatApi(context, {
102
+ method: "POST",
103
+ path: "/shop/ec/category/get_category_relation_list",
104
+ body: compactObject({ is_filter_status: status !== undefined, status }),
105
+ });
106
+ },
107
+ precheck_product_category(input, context) {
108
+ return callWechatApi(context, {
109
+ method: "POST",
110
+ path: "/channels/ec/product/categoryprecheck",
111
+ body: compactObject({
112
+ cat_id: input.catId === undefined ? undefined : positiveInteger(input.catId, "catId", providerInputError),
113
+ }),
114
+ });
115
+ },
116
+ get_category_product_rule(input, context) {
117
+ return callWechatApi(context, {
118
+ method: "POST",
119
+ path: "/shop/ec/category/getcategoryproductrule",
120
+ body: compactObject({
121
+ cat_id: positiveInteger(input.catId, "catId", providerInputError),
122
+ release_mode: optionalInteger(input.releaseMode),
123
+ brand_id: input.brandId === undefined ? undefined : positiveInteger(input.brandId, "brandId", providerInputError),
124
+ }),
65
125
  });
66
126
  },
67
127
  list_valid_brands(input, context) {
@@ -260,7 +320,7 @@ const weixinStoreActionHandlers = {
260
320
  path: "/channels/ec/aftersale/rejectapply",
261
321
  body: compactObject({
262
322
  after_sale_order_id: requiredInputString(input.afterSaleOrderId, "afterSaleOrderId"),
263
- reject_reason_type: readPositiveInteger(input.rejectReasonType, "rejectReasonType"),
323
+ reject_reason_type: positiveInteger(input.rejectReasonType, "rejectReasonType", providerInputError),
264
324
  reject_reason: optionalString(input.rejectReason),
265
325
  }),
266
326
  });
@@ -299,8 +359,8 @@ export const credentialValidators = {
299
359
  };
300
360
  /** Upload a local transit file as a store image, which WeChat sizes from the required pixel dimensions. */
301
361
  async function uploadImageFile(context, input) {
302
- const width = readPositiveInteger(input.width, "width");
303
- const height = readPositiveInteger(input.height, "height");
362
+ const width = positiveInteger(input.width, "width", providerInputError);
363
+ const height = positiveInteger(input.height, "height", providerInputError);
304
364
  const file = await readTransitFileInput(input.file, context);
305
365
  const formData = new FormData();
306
366
  formData.set("media", file.file, file.name);
@@ -362,6 +422,38 @@ async function executeWechatJsonRequest(context, request, accessToken) {
362
422
  return { status: response.status, record: parseWechatJson(rawText), rawText };
363
423
  });
364
424
  }
425
+ /**
426
+ * Build the category_info of a category application: force the certificate-group
427
+ * protocol and send every id as the number WeChat documents, since callers often
428
+ * copy them from responses that carry numeric ids as strings.
429
+ */
430
+ function mapCategoryApplication(categoryInfo) {
431
+ return {
432
+ ...categoryInfo,
433
+ cats_v2: objectArray(categoryInfo.cats_v2, "categoryInfo.cats_v2", providerInputError).map((cat) => ({
434
+ ...cat,
435
+ cat_id: positiveInteger(cat.cat_id, "categoryInfo.cats_v2[].cat_id", providerInputError),
436
+ })),
437
+ license_group_list: objectArray(categoryInfo.license_group_list, "categoryInfo.license_group_list", providerInputError).map((group) => {
438
+ const license = optionalRecord(group.license) ?? {};
439
+ return {
440
+ ...group,
441
+ license_group_id: positiveInteger(group.license_group_id, "categoryInfo.license_group_list[].license_group_id", providerInputError),
442
+ license: {
443
+ ...license,
444
+ license_id: positiveInteger(license.license_id, "categoryInfo.license_group_list[].license.license_id", providerInputError),
445
+ },
446
+ };
447
+ }),
448
+ brand_list: categoryInfo.brand_list === undefined
449
+ ? undefined
450
+ : objectArray(categoryInfo.brand_list, "categoryInfo.brand_list", providerInputError).map((brand) => ({
451
+ ...brand,
452
+ brand_id: positiveInteger(brand.brand_id, "categoryInfo.brand_list[].brand_id", providerInputError),
453
+ })),
454
+ is_new_apply_cat: true,
455
+ };
456
+ }
365
457
  /** WeChat only reads deliver_acct_type when deliver_method is 3, and then it is required. */
366
458
  function checkProductPayload(input) {
367
459
  if (optionalInteger(input.deliverMethod) === 3 && input.deliverAcctType === undefined) {
@@ -447,13 +539,6 @@ function readOffsetLimit(input) {
447
539
  function readPageSize(input, max, defaultValue) {
448
540
  return readBoundedInteger(input.pageSize, "pageSize", 1, max) ?? defaultValue;
449
541
  }
450
- function readPositiveInteger(value, fieldName) {
451
- const parsed = optionalInteger(value);
452
- if (parsed === undefined || parsed < 1) {
453
- throw providerInputError(`${fieldName} must be a positive integer`);
454
- }
455
- return parsed;
456
- }
457
542
  /** Read a WeChat id that the docs type inconsistently as string or number; numbers are sent in string form. */
458
543
  function readIdString(value, fieldName) {
459
544
  const stringId = optionalString(value);
@@ -1,4 +1,7 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  export declare const executors: ProviderExecutors;
3
5
  export declare const proxy: ProviderProxyExecutor;
4
6
  export declare const credentialValidators: CredentialValidators;
7
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
@@ -1,6 +1,7 @@
1
1
  import { isPrivateNetworkAccessAllowed } from "../../core/request.js";
2
2
  import { basicAuthorizationHeader, createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireCustomCredential, toProviderProxyError, } from "../provider-runtime.js";
3
3
  import { resolveWooCommerceCredentialContext, validateWooCommerceCredential, woocommerceActionHandlers, } from "./runtime.js";
4
+ import { wooCommerceStoreEvent } from "./trigger-on-store-event.js";
4
5
  const service = "woocommerce";
5
6
  const proxyFetch = createProviderFetch({ allowPrivateNetwork: isPrivateNetworkAccessAllowed });
6
7
  export const executors = defineProviderExecutors({
@@ -49,3 +50,4 @@ export const credentialValidators = {
49
50
  return validateWooCommerceCredential(input.values, guardedFetcher, signal);
50
51
  },
51
52
  };
53
+ export const triggers = [wooCommerceStoreEvent];
@@ -0,0 +1,2 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ export declare const wooCommerceStoreEvent: IntegrationDefinition;
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
@@ -0,0 +1,55 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const topics = [
3
+ "coupon.created",
4
+ "coupon.updated",
5
+ "coupon.deleted",
6
+ "coupon.restored",
7
+ "customer.created",
8
+ "customer.updated",
9
+ "customer.deleted",
10
+ "order.created",
11
+ "order.updated",
12
+ "order.deleted",
13
+ "order.restored",
14
+ "product.created",
15
+ "product.updated",
16
+ "product.deleted",
17
+ "product.restored",
18
+ "product.published",
19
+ ];
20
+ export const snapshot = {
21
+ configInputs: [
22
+ {
23
+ handle: "events",
24
+ jsonSchema: s.array(s.stringEnum(topics), { maxItems: 16, minItems: 1, uniqueItems: true }),
25
+ nullable: false,
26
+ },
27
+ {
28
+ handle: "webhookName",
29
+ jsonSchema: s.string({ maxLength: 120, minLength: 1 }),
30
+ nullable: false,
31
+ value: "OOMOL Trigger",
32
+ },
33
+ ],
34
+ definitionVersion: 2,
35
+ description: "Triggers when selected WooCommerce store events occur.",
36
+ displayName: "Store Event",
37
+ endpoint: {
38
+ body: { allowArray: false, allowEmpty: false, formats: ["json"] },
39
+ methods: ["POST"],
40
+ successStatus: 202,
41
+ },
42
+ key: "woocommerce.on_store_event",
43
+ name: "on_store_event",
44
+ outputs: [
45
+ { handle: "body", jsonSchema: { type: "object" }, nullable: false },
46
+ { handle: "deliveryId", jsonSchema: s.string(), nullable: false },
47
+ { handle: "event", jsonSchema: s.string(), nullable: false },
48
+ { handle: "resource", jsonSchema: s.string(), nullable: false },
49
+ { handle: "source", jsonSchema: s.string(), nullable: false },
50
+ { handle: "topic", jsonSchema: s.string(), nullable: false },
51
+ { handle: "webhookId", jsonSchema: s.string(), nullable: false },
52
+ ],
53
+ provider: "woocommerce",
54
+ type: "integration",
55
+ };
@@ -0,0 +1,179 @@
1
+ import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
2
+ import { verifyBase64Hmac } from "../../triggers/signature.js";
3
+ import { snapshot } from "./trigger-on-store-event.definition.js";
4
+ export const wooCommerceStoreEvent = {
5
+ initialState: { checkpoint: null, subscription: {} },
6
+ snapshot,
7
+ async receive(context) {
8
+ if (!(await verifyBase64Hmac(context.callbackSecret, [context.rawBody], context.header("x-wc-webhook-signature")))) {
9
+ return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
10
+ }
11
+ const topic = context.header("x-wc-webhook-topic")?.trim();
12
+ if (!topic)
13
+ return { outcome: "ignored", reason: "WooCommerce topic header is missing." };
14
+ if (!resolveConfig(context.config).events.includes(topic))
15
+ return { outcome: "ignored", reason: "WooCommerce topic is not subscribed." };
16
+ const deliveryId = context.header("x-wc-webhook-delivery-id") ?? "";
17
+ return {
18
+ dedupeKey: deliveryId.length == 0 ? undefined : deliveryId,
19
+ outcome: "event",
20
+ outputs: {
21
+ body: context.payload,
22
+ deliveryId,
23
+ event: context.header("x-wc-webhook-event") ?? "",
24
+ resource: context.header("x-wc-webhook-resource") ?? "",
25
+ source: context.header("x-wc-webhook-source") ?? "",
26
+ topic,
27
+ webhookId: context.header("x-wc-webhook-id") ?? "",
28
+ },
29
+ };
30
+ },
31
+ async reconcile(context) {
32
+ const state = requireState(context.state);
33
+ const config = resolveConfig(context.config);
34
+ const listed = await list(context);
35
+ if (!context.active) {
36
+ for (const value of listed)
37
+ await remove(context, value.id);
38
+ await state.saveSubscription({}, later(context.now));
39
+ return { outcome: "ready" };
40
+ }
41
+ const adopted = new Map();
42
+ for (const value of listed)
43
+ if (config.events.includes(value.topic) && !adopted.has(value.topic))
44
+ adopted.set(value.topic, value.id);
45
+ const kept = new Set(adopted.values());
46
+ for (const value of listed)
47
+ if (!kept.has(value.id))
48
+ await remove(context, value.id);
49
+ const ids = [];
50
+ for (const topic of config.events) {
51
+ const existing = adopted.get(topic);
52
+ ids.push(existing == null ? await create(context, config, topic) : await align(context, existing, topic));
53
+ }
54
+ await state.saveSubscription({ webhookIds: ids }, later(context.now));
55
+ return { outcome: "ready" };
56
+ },
57
+ };
58
+ function resolveConfig(value) {
59
+ return {
60
+ events: [...new Set(value.events)],
61
+ webhookName: value.webhookName,
62
+ };
63
+ }
64
+ async function create(context, config, topic) {
65
+ const result = await request(context, `webhook create (${topic})`, {
66
+ body: {
67
+ delivery_url: context.endpointUrl,
68
+ name: `${config.webhookName} - ${topic}`,
69
+ secret: context.callbackSecret,
70
+ topic,
71
+ },
72
+ endpoint: "/webhooks",
73
+ method: "POST",
74
+ });
75
+ success(result, `webhook create (${topic})`);
76
+ return readId(result.data);
77
+ }
78
+ async function align(context, webhookId, topic) {
79
+ const result = await request(context, `webhook update (${topic})`, {
80
+ body: {
81
+ delivery_url: context.endpointUrl,
82
+ secret: context.callbackSecret,
83
+ status: "active",
84
+ topic,
85
+ },
86
+ endpoint: `/webhooks/${webhookId}`,
87
+ method: "PUT",
88
+ });
89
+ if (invalidId(result))
90
+ return create(context, resolveConfig(context.config), topic);
91
+ success(result, `webhook update (${topic})`);
92
+ return webhookId;
93
+ }
94
+ async function list(context) {
95
+ const matches = [];
96
+ for (let page = 1; page <= 10; page += 1) {
97
+ const result = await request(context, "webhook list", {
98
+ endpoint: "/webhooks",
99
+ method: "GET",
100
+ query: { context: "view", page, per_page: 100, status: "all" },
101
+ });
102
+ success(result, "webhook list");
103
+ const hooks = Array.isArray(result.data) ? result.data : [];
104
+ for (const hook of hooks) {
105
+ const value = record(hook);
106
+ if (value?.delivery_url !== context.endpointUrl || typeof value.topic != "string")
107
+ continue;
108
+ const webhookId = normalizeId(value.id);
109
+ if (webhookId != null)
110
+ matches.push({ id: webhookId, topic: value.topic });
111
+ }
112
+ if (hooks.length < 100)
113
+ return matches;
114
+ }
115
+ throw new TransientIntegrationError("WooCommerce webhook list did not finish within ten pages.");
116
+ }
117
+ async function remove(context, webhookId) {
118
+ const result = await request(context, "webhook delete", {
119
+ endpoint: `/webhooks/${webhookId}`,
120
+ method: "DELETE",
121
+ query: { force: "true" },
122
+ });
123
+ if (result.status != 404)
124
+ success(result, "webhook delete");
125
+ }
126
+ async function request(context, operation, value) {
127
+ try {
128
+ return await context.connector.execute(value, context.signal);
129
+ }
130
+ catch (cause) {
131
+ if (cause instanceof IntegrationConnectionError)
132
+ throw cause;
133
+ throw new TransientIntegrationError(`WooCommerce ${operation} request failed.`, { cause });
134
+ }
135
+ }
136
+ function success(result, operation) {
137
+ if (result.status >= 200 && result.status < 300)
138
+ return;
139
+ const code = errorCode(result.data);
140
+ if (result.status == 401 || result.status == 403)
141
+ throw new IntegrationConnectionError(`WooCommerce ${operation} rejected the Connection.`);
142
+ if (result.status == 404 ||
143
+ (result.status == 400 && (code.endsWith("_invalid_topic") || code.endsWith("_invalid_delivery_url"))) ||
144
+ (result.status == 501 && code == "woocommerce_rest_trash_not_supported")) {
145
+ throw new PermanentIntegrationError(`WooCommerce ${operation} rejected the subscription.`);
146
+ }
147
+ throw new TransientIntegrationError(`WooCommerce ${operation} failed with status ${result.status}.`);
148
+ }
149
+ function invalidId(result) {
150
+ return result.status == 400 && errorCode(result.data) == "woocommerce_rest_webhook_invalid_id";
151
+ }
152
+ function errorCode(data) {
153
+ const value = record(data)?.code;
154
+ return typeof value == "string" ? value : "";
155
+ }
156
+ function readId(data) {
157
+ const value = normalizeId(record(data)?.id);
158
+ if (value == null)
159
+ throw new TransientIntegrationError("WooCommerce webhook response is missing its ID.");
160
+ return value;
161
+ }
162
+ function normalizeId(value) {
163
+ if (typeof value == "string" && value.length > 0)
164
+ return value;
165
+ return typeof value == "number" && Number.isFinite(value) ? String(value) : null;
166
+ }
167
+ function requireState(value) {
168
+ if (value == null)
169
+ throw new PermanentIntegrationError("WooCommerce Integration state is missing.");
170
+ return value;
171
+ }
172
+ function later(now) {
173
+ return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1_000);
174
+ }
175
+ function record(value) {
176
+ return value != null && typeof value == "object" && !Array.isArray(value)
177
+ ? value
178
+ : undefined;
179
+ }
@@ -1,4 +1,7 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  export declare const executors: ProviderExecutors;
3
5
  export declare const proxy: ProviderProxyExecutor;
4
6
  export declare const credentialValidators: CredentialValidators;
7
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
@@ -1,5 +1,6 @@
1
1
  import { basicAuthorizationHeader, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, providerFetch, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireApiKeyCredential, requireOAuthCredential, toProviderProxyError, } from "../provider-runtime.js";
2
2
  import { validateZendeskCredential, zendeskActionHandlers } from "./runtime.js";
3
+ import { zendeskEvent } from "./trigger-on-event.js";
3
4
  const service = "zendesk";
4
5
  export const executors = defineProviderExecutors({
5
6
  service,
@@ -128,3 +129,4 @@ function normalizeZendeskSubdomain(raw) {
128
129
  }
129
130
  return subdomain;
130
131
  }
132
+ export const triggers = [zendeskEvent];
@@ -0,0 +1,2 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ export declare const zendeskEvent: IntegrationDefinition;
@@ -0,0 +1,5 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const endpoint: string;
3
+ export declare const snapshot: TriggerKeySnapshot & {
4
+ readonly type: "integration";
5
+ };
@@ -0,0 +1,101 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const events = [
3
+ "zen:event-type:ticket.agent_assignment_changed",
4
+ "zen:event-type:ticket.attachment_linked_to_comment",
5
+ "zen:event-type:ticket.attachment_redacted_from_comment",
6
+ "zen:event-type:ticket.brand_changed",
7
+ "zen:event-type:ticket.comment_added",
8
+ "zen:event-type:ticket.comment_made_private",
9
+ "zen:event-type:ticket.comment_redacted",
10
+ "zen:event-type:ticket.created",
11
+ "zen:event-type:ticket.csat_received",
12
+ "zen:event-type:ticket.csat_requested",
13
+ "zen:event-type:ticket.custom_field_changed",
14
+ "zen:event-type:ticket.custom_status_changed",
15
+ "zen:event-type:ticket.description_changed",
16
+ "zen:event-type:ticket.email_ccs_changed",
17
+ "zen:event-type:ticket.external_id_changed",
18
+ "zen:event-type:ticket.followers_changed",
19
+ "zen:event-type:ticket.form_changed",
20
+ "zen:event-type:ticket.group_assignment_changed",
21
+ "zen:event-type:ticket.marked_as_spam",
22
+ "zen:event-type:ticket.merged",
23
+ "zen:event-type:ticket.next_sla_breach_changed",
24
+ "zen:event-type:ticket.ola_policy_changed",
25
+ "zen:event-type:ticket.organization_changed",
26
+ "zen:event-type:ticket.permanently_deleted",
27
+ "zen:event-type:ticket.priority_changed",
28
+ "zen:event-type:ticket.problem_link_changed",
29
+ "zen:event-type:ticket.requester_changed",
30
+ "zen:event-type:ticket.schedule_changed",
31
+ "zen:event-type:ticket.sla_policy_changed",
32
+ "zen:event-type:ticket.soft_deleted",
33
+ "zen:event-type:ticket.status_changed",
34
+ "zen:event-type:ticket.subject_changed",
35
+ "zen:event-type:ticket.submitter_changed",
36
+ "zen:event-type:ticket.tags_changed",
37
+ "zen:event-type:ticket.task_due_at_changed",
38
+ "zen:event-type:ticket.type_changed",
39
+ "zen:event-type:ticket.undeleted",
40
+ "zen:event-type:organization.created",
41
+ "zen:event-type:organization.custom_field_changed",
42
+ "zen:event-type:organization.deleted",
43
+ "zen:event-type:organization.external_id_changed",
44
+ "zen:event-type:organization.name_changed",
45
+ "zen:event-type:organization.tags_changed",
46
+ "zen:event-type:user.active_changed",
47
+ "zen:event-type:user.alias_changed",
48
+ "zen:event-type:user.created",
49
+ "zen:event-type:user.custom_field_changed",
50
+ "zen:event-type:user.custom_role_changed",
51
+ "zen:event-type:user.default_group_changed",
52
+ "zen:event-type:user.deleted",
53
+ "zen:event-type:user.details_changed",
54
+ "zen:event-type:user.external_id_changed",
55
+ "zen:event-type:user.group_membership_created",
56
+ "zen:event-type:user.group_membership_deleted",
57
+ "zen:event-type:user.identity_changed",
58
+ "zen:event-type:user.identity_created",
59
+ "zen:event-type:user.identity_deleted",
60
+ "zen:event-type:user.last_login_changed",
61
+ "zen:event-type:user.merged",
62
+ "zen:event-type:user.name_changed",
63
+ "zen:event-type:user.notes_changed",
64
+ "zen:event-type:user.only_private_comments_changed",
65
+ "zen:event-type:user.organization_membership_created",
66
+ "zen:event-type:user.organization_membership_deleted",
67
+ "zen:event-type:user.password_changed",
68
+ "zen:event-type:user.photo_changed",
69
+ "zen:event-type:user.role_changed",
70
+ "zen:event-type:user.suspended_changed",
71
+ "zen:event-type:user.tags_changed",
72
+ "zen:event-type:user.time_zone_changed",
73
+ ];
74
+ export const endpoint = "/api/v2/webhooks";
75
+ export const snapshot = {
76
+ configInputs: [
77
+ {
78
+ handle: "events",
79
+ jsonSchema: s.array(s.stringEnum(events), { minItems: 1, uniqueItems: true }),
80
+ nullable: false,
81
+ },
82
+ ],
83
+ definitionVersion: 2,
84
+ description: "Triggers when one of the selected Zendesk account events occurs.",
85
+ displayName: "Event Subscription",
86
+ endpoint: {
87
+ body: { allowArray: false, allowEmpty: false, formats: ["json"] },
88
+ methods: ["POST"],
89
+ successStatus: 202,
90
+ },
91
+ key: "zendesk.on_event",
92
+ name: "on_event",
93
+ outputs: [
94
+ { handle: "body", jsonSchema: { type: "object" }, nullable: false },
95
+ { handle: "deliveryId", jsonSchema: s.string(), nullable: false },
96
+ { handle: "event", jsonSchema: s.string(), nullable: false },
97
+ { handle: "subject", jsonSchema: s.string(), nullable: false },
98
+ ],
99
+ provider: "zendesk",
100
+ type: "integration",
101
+ };