@corsair-dev/zendesk 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/webhooks/tenant-matcher.d.ts +3 -0
- package/dist/webhooks/tenant-matcher.d.ts.map +1 -0
- package/package.json +9 -5
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# @corsair-dev/zendesk
|
|
2
|
+
|
|
3
|
+
Zendesk plugin for Corsair.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @corsair-dev/zendesk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Endpoints
|
|
12
|
+
|
|
13
|
+
| Operation | Operation ID | Risk | Description |
|
|
14
|
+
|-----------|--------------|------|-------------|
|
|
15
|
+
| `comments.list` | `zendesk.api.comments.list` | `read` | List comments for a specific ticket |
|
|
16
|
+
| `tickets.create` | `zendesk.api.tickets.create` | `write` | Create a new ticket |
|
|
17
|
+
| `tickets.delete` | `zendesk.api.tickets.delete` | `destructive` | Delete a ticket by its ID |
|
|
18
|
+
| `tickets.get` | `zendesk.api.tickets.get` | `read` | Retrieve a ticket by its ID |
|
|
19
|
+
| `tickets.list` | `zendesk.api.tickets.list` | `read` | List tickets with pagination |
|
|
20
|
+
| `tickets.update` | `zendesk.api.tickets.update` | `write` | Update an existing ticket |
|
|
21
|
+
| `users.create` | `zendesk.api.users.create` | `write` | Create a new user |
|
|
22
|
+
| `users.delete` | `zendesk.api.users.delete` | `destructive` | Delete a user by their ID |
|
|
23
|
+
| `users.get` | `zendesk.api.users.get` | `read` | Retrieve a user by their ID |
|
|
24
|
+
| `users.list` | `zendesk.api.users.list` | `read` | List users with pagination |
|
|
25
|
+
| `users.update` | `zendesk.api.users.update` | `write` | Update an existing user |
|
|
26
|
+
|
|
27
|
+
## Auth
|
|
28
|
+
|
|
29
|
+
Auth: API key. Corsair prompts your tenant for credentials on first use.
|
|
30
|
+
|
|
31
|
+
## Webhooks
|
|
32
|
+
|
|
33
|
+
Handles 1 webhook event. See the reference for payloads and `webhookHooks`.
|
|
34
|
+
|
|
35
|
+
## Reference
|
|
36
|
+
|
|
37
|
+
Full docs, types, and examples: https://docs.corsair.dev/plugins/zendesk
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
Apache-2.0
|
package/dist/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export type ZendeskPluginOptions = {
|
|
|
14
14
|
};
|
|
15
15
|
export declare const zendeskAuthConfig: {
|
|
16
16
|
readonly api_key: {
|
|
17
|
-
readonly account: readonly ["subdomain"];
|
|
17
|
+
readonly account: readonly ["subdomain", "account_id"];
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
20
|
export type ZendeskContext = CorsairPluginContext<typeof ZendeskSchema, ZendeskPluginOptions, undefined, typeof zendeskAuthConfig>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EAER,uBAAuB,EAIvB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EACX,qBAAqB,EACrB,sBAAsB,EACtB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var G=Object.defineProperty;var x=(s,t)=>{for(var r in t)G(s,r,{get:t[r],enumerable:!0})};import{AuthMissingError as P}from"corsair/core";var h={};x(h,{list:()=>M});import{logEventFromContext as B}from"corsair/core";import{ApiError as q,request as W}from"corsair/http";var g=class extends Error{constructor(r,i){super(r);this.code=i;this.name="ZendeskAPIError"}};async function d(s,t,r,i={}){if(!r)throw new g("Subdomain is required for Zendesk integration","MISSING_SUBDOMAIN");let{method:n="GET",body:o,query:u}=i,Z={BASE:`https://${r}.zendesk.com/api/v2`,VERSION:"2.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:void 0,HEADERS:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Basic ${Buffer.from(t).toString("base64")}`}},S={method:n,url:s,body:n==="POST"||n==="PUT"||n==="PATCH"?o:void 0,mediaType:"application/json; charset=utf-8",query:n==="GET"||n==="DELETE"?u:void 0};try{return await W(Z,S)}catch(b){throw b instanceof q?b:b instanceof Error?new g(b.message):new g("Unknown error")}}var M=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.ticket_id}/comments.json`,s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page}}}),n=i.comments||[];if(s.db.comments)for(let o of n)try{await s.db.comments.upsertByEntityId(String(o.id),{id:o.id,ticketId:t.ticket_id,body:o.body??null,authorId:o.author_id??null,public:o.public??null,createdAt:o.created_at?new Date(o.created_at):null})}catch(u){console.warn("Failed to save comment to database:",u)}return await B(s,"zendesk.comments.list",{...t},"completed"),i};var m={};x(m,{create:()=>H,deleteTicket:()=>K,get:()=>N,list:()=>$,update:()=>F});import{logEventFromContext as y}from"corsair/core";var H=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("tickets.json",s.key,r,{method:"POST",body:{ticket:{...t.subject&&{subject:t.subject},...t.description&&{description:t.description},...t.comment&&{comment:t.comment},...t.status&&{status:t.status},...t.priority&&{priority:t.priority},...t.requester_id!==void 0&&{requester_id:t.requester_id},...t.assignee_id!==void 0&&{assignee_id:t.assignee_id},...t.group_id!==void 0&&{group_id:t.group_id},...t.organization_id!==void 0&&{organization_id:t.organization_id},...t.tags&&{tags:t.tags}}}}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.create",{...t},"completed"),i},N=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.id}.json`,s.key,r,{method:"GET"}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.get",{...t},"completed"),i},F=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.id}.json`,s.key,r,{method:"PUT",body:{ticket:{...t.subject&&{subject:t.subject},...t.status&&{status:t.status},...t.priority&&{priority:t.priority},...t.requester_id!==void 0&&{requester_id:t.requester_id},...t.assignee_id!==void 0&&{assignee_id:t.assignee_id},...t.comment&&{comment:t.comment},...t.tags&&{tags:t.tags}}}}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.update",{...t},"completed"),i},K=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"";if(await d(`tickets/${t.id}.json`,s.key,r,{method:"DELETE"}),s.db.tickets)try{await s.db.tickets.deleteByEntityId(String(t.id))}catch(i){console.warn("Failed to delete ticket from database:",i)}return await y(s,"zendesk.tickets.delete",{...t},"completed"),{id:t.id}},$=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("tickets.json",s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page},...t.sort_by&&{sort_by:t.sort_by},...t.sort_order&&{sort_order:t.sort_order}}}),n=i.tickets||[];if(s.db.tickets)for(let o of n)try{await s.db.tickets.upsertByEntityId(String(o.id),{id:o.id,subject:o.subject??null,description:o.description??null,status:o.status??null,priority:o.priority??null,requesterId:o.requester_id??null,assigneeId:o.assignee_id??null,organizationId:o.organization_id??null,groupId:o.group_id??null,createdAt:o.created_at?new Date(o.created_at):null,updatedAt:o.updated_at?new Date(o.updated_at):null})}catch(u){console.warn("Failed to save ticket to database:",u)}return await y(s,"zendesk.tickets.list",{...t},"completed"),i};var k={};x(k,{create:()=>V,deleteUser:()=>X,get:()=>J,list:()=>Y,update:()=>Q});import{logEventFromContext as f}from"corsair/core";var V=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("users.json",s.key,r,{method:"POST",body:{user:{name:t.name,email:t.email,...t.role&&{role:t.role},...t.external_id&&{external_id:t.external_id},...t.active!==void 0&&{active:t.active}}}}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.create",{...t},"completed"),i},J=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`users/${t.id}.json`,s.key,r,{method:"GET"}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.get",{...t},"completed"),i},Q=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`users/${t.id}.json`,s.key,r,{method:"PUT",body:{user:{...t.name&&{name:t.name},...t.email&&{email:t.email},...t.role&&{role:t.role},...t.external_id&&{external_id:t.external_id},...t.active!==void 0&&{active:t.active}}}}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.update",{...t},"completed"),i},X=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"";if(await d(`users/${t.id}.json`,s.key,r,{method:"DELETE"}),s.db.users)try{await s.db.users.deleteByEntityId(String(t.id))}catch(i){console.warn("Failed to delete user from database:",i)}return await f(s,"zendesk.users.delete",{...t},"completed"),{id:t.id}},Y=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("users.json",s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page},...t.role&&{role:t.role}}}),n=i.users||[];if(s.db.users)for(let o of n)try{await s.db.users.upsertByEntityId(String(o.id),{id:o.id,name:o.name??null,email:o.email??null,role:o.role??null,active:o.active??null,timeZone:o.time_zone??null,locale:o.locale??null,createdAt:o.created_at?new Date(o.created_at):null,updatedAt:o.updated_at?new Date(o.updated_at):null})}catch(u){console.warn("Failed to save user to database:",u)}return await f(s,"zendesk.users.list",{...t},"completed"),i};import{z as e}from"zod";var _=e.object({id:e.number(),url:e.string().optional().nullable(),external_id:e.string().optional().nullable(),created_at:e.string().optional().nullable(),updated_at:e.string().optional().nullable(),type:e.string().optional().nullable(),subject:e.string().optional().nullable(),raw_subject:e.string().optional().nullable(),description:e.string().optional().nullable(),priority:e.string().optional().nullable(),status:e.string().optional().nullable(),recipient:e.string().optional().nullable(),requester_id:e.number().optional().nullable(),submitter_id:e.number().optional().nullable(),assignee_id:e.number().optional().nullable(),organization_id:e.number().optional().nullable(),group_id:e.number().optional().nullable(),collaborator_ids:e.array(e.number()).optional().nullable(),follower_ids:e.array(e.number()).optional().nullable(),email_cc_ids:e.array(e.number()).optional().nullable(),forum_topic_id:e.number().optional().nullable(),problem_id:e.number().optional().nullable(),has_incidents:e.boolean().optional().nullable(),is_public:e.boolean().optional().nullable(),due_at:e.string().optional().nullable(),tags:e.array(e.string()).optional().nullable()}),E=e.object({id:e.number(),url:e.string().optional().nullable(),name:e.string(),email:e.string().optional().nullable(),created_at:e.string().optional().nullable(),updated_at:e.string().optional().nullable(),time_zone:e.string().optional().nullable(),iana_time_zone:e.string().optional().nullable(),phone:e.string().optional().nullable(),shared_phone:e.boolean().optional().nullable(),locale_id:e.number().optional().nullable(),locale:e.string().optional().nullable(),organization_id:e.number().optional().nullable(),role:e.string().optional().nullable(),verified:e.boolean().optional().nullable(),external_id:e.string().optional().nullable(),tags:e.array(e.string()).optional().nullable(),active:e.boolean().optional().nullable()}),ee=e.object({id:e.number(),type:e.string().optional().nullable(),body:e.string().optional().nullable(),html_body:e.string().optional().nullable(),plain_body:e.string().optional().nullable(),public:e.boolean().optional().nullable(),author_id:e.number().optional().nullable(),attachments:e.array(e.unknown()).optional().nullable(),created_at:e.string().optional().nullable()}),te=e.object({subject:e.string().optional(),description:e.string().optional(),comment:e.object({body:e.string(),public:e.boolean().optional(),author_id:e.number().optional()}).optional(),status:e.string().optional(),priority:e.string().optional(),requester_id:e.number().optional(),assignee_id:e.number().optional(),group_id:e.number().optional(),organization_id:e.number().optional(),tags:e.array(e.string()).optional()}),se=e.object({ticket:_}),ne=e.object({id:e.number()}),oe=e.object({ticket:_}),ie=e.object({id:e.number(),subject:e.string().optional(),status:e.string().optional(),priority:e.string().optional(),requester_id:e.number().optional(),assignee_id:e.number().optional(),comment:e.object({body:e.string(),public:e.boolean().optional(),author_id:e.number().optional()}).optional(),tags:e.array(e.string()).optional()}),re=e.object({ticket:_}),ae=e.object({id:e.number()}),de=e.object({id:e.number().optional()}),le=e.object({page:e.number().optional(),per_page:e.number().optional(),sort_by:e.string().optional(),sort_order:e.string().optional()}),pe=e.object({tickets:e.array(_),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),ue=e.object({name:e.string(),email:e.string(),role:e.string().optional(),external_id:e.string().optional(),active:e.boolean().optional()}),ce=e.object({user:E}),me=e.object({id:e.number()}),ke=e.object({user:E}),be=e.object({id:e.number(),name:e.string().optional(),email:e.string().optional(),role:e.string().optional(),external_id:e.string().optional(),active:e.boolean().optional()}),ge=e.object({user:E}),ye=e.object({id:e.number()}),fe=e.object({id:e.number().optional()}),he=e.object({page:e.number().optional(),per_page:e.number().optional(),role:e.string().optional()}),_e=e.object({users:e.array(E),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),Ee=e.object({ticket_id:e.number(),page:e.number().optional(),per_page:e.number().optional()}),we=e.object({comments:e.array(ee),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),l={ticketsCreate:te,ticketsGet:ne,ticketsUpdate:ie,ticketsDelete:ae,ticketsList:le,usersCreate:ue,usersGet:me,usersUpdate:be,usersDelete:ye,usersList:he,commentsList:Ee},p={ticketsCreate:se,ticketsGet:oe,ticketsUpdate:re,ticketsDelete:de,ticketsList:pe,usersCreate:ce,usersGet:ke,usersUpdate:ge,usersDelete:fe,usersList:_e,commentsList:we};import{ApiError as I}from"corsair/http";var C={RATE_LIMIT_ERROR:{match:s=>{if(s instanceof I&&s.status===429)return!0;let t=s.message.toLowerCase();return t.includes("rate_limited")||t.includes("429")},handler:async s=>{let t;return s instanceof I&&s.retryAfter!==void 0&&(t=s.retryAfter),{maxRetries:5,headersRetryAfterMs:t}}},AUTH_ERROR:{match:s=>{if(s instanceof I&&s.status===401)return!0;let t=s.message.toLowerCase();return t.includes("unauthorized")||t.includes("invalid_auth")},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};import{z as a}from"zod";var z=a.object({id:a.number(),subject:a.string().optional().nullable(),description:a.string().optional().nullable(),status:a.string().optional().nullable(),priority:a.string().optional().nullable(),requesterId:a.number().optional().nullable(),assigneeId:a.number().optional().nullable(),organizationId:a.number().optional().nullable(),groupId:a.number().optional().nullable(),createdAt:a.coerce.date().optional().nullable(),updatedAt:a.coerce.date().optional().nullable()}),U=a.object({id:a.number(),name:a.string().optional().nullable(),email:a.string().optional().nullable(),role:a.string().optional().nullable(),active:a.boolean().optional().nullable(),timeZone:a.string().optional().nullable(),locale:a.string().optional().nullable(),createdAt:a.coerce.date().optional().nullable(),updatedAt:a.coerce.date().optional().nullable()}),R=a.object({id:a.number(),ticketId:a.number().optional().nullable(),body:a.string().optional().nullable(),authorId:a.number().optional().nullable(),public:a.boolean().optional().nullable(),createdAt:a.coerce.date().optional().nullable()});var v={version:"1.0.0",entities:{tickets:z,users:U,comments:R}};import{logEventFromContext as Ie}from"corsair/core";import*as w from"crypto";import{z as c}from"zod";var Ze=c.object({type:c.string(),created_at:c.string(),data:c.record(c.string(),c.unknown())}),T=Ze.extend({type:c.literal("example"),data:c.object({id:c.string()}).loose()});function xe(s){if(typeof s=="string")try{let t=JSON.parse(s);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}return s!==null&&typeof s=="object"&&!Array.isArray(s)?s:null}function L(s){return t=>{let r=xe(t.body);return r!==null&&r.type===s}}function D(s,t){if(!t)return{valid:!1,error:"Missing webhook signing secret configuration"};let r=s.rawBody;if(r==null)return{valid:!1,error:"Missing raw body for signature verification"};let i=s.headers,n=Array.isArray(i["x-zendesk-webhook-signature"])?i["x-zendesk-webhook-signature"][0]:i["x-zendesk-webhook-signature"],o=Array.isArray(i["x-zendesk-webhook-signature-timestamp"])?i["x-zendesk-webhook-signature-timestamp"][0]:i["x-zendesk-webhook-signature-timestamp"];if(!n)return{valid:!1,error:"Missing x-zendesk-webhook-signature header"};if(!o)return{valid:!1,error:"Missing x-zendesk-webhook-signature-timestamp header"};let u=Date.parse(o);if(Number.isNaN(u))return{valid:!1,error:"Invalid x-zendesk-webhook-signature-timestamp header format"};let Z=Date.now();if(Math.abs(Z-u)/1e3>300)return{valid:!1,error:"Webhook request timestamp is stale (outside 5-minute window)"};let b=o+r,O=w.createHmac("sha256",t).update(b).digest("base64");try{if(!w.timingSafeEqual(Buffer.from(n),Buffer.from(O)))return{valid:!1,error:"Invalid signature"}}catch{return{valid:!1,error:"Invalid signature"}}return{valid:!0}}var j={match:L("example"),handler:async(s,t)=>{let r=D(t,s.key);if(!r.valid)return{success:!1,statusCode:401,error:r.error||"Signature verification failed"};let i=t.payload;return i.type!=="example"?{success:!0,data:void 0}:(await Ie(s,"zendesk.webhook.example",{...i},"completed"),{success:!0,data:i})}};var A={example:j};var Te={api_key:{account:["subdomain"]}},Se={tickets:{create:m.create,get:m.get,update:m.update,delete:m.deleteTicket,list:m.list},users:{create:k.create,get:k.get,update:k.update,delete:k.deleteUser,list:k.list},comments:{list:h.list}},Ce={example:{example:A.example}},ze={"tickets.create":{input:l.ticketsCreate,output:p.ticketsCreate},"tickets.get":{input:l.ticketsGet,output:p.ticketsGet},"tickets.update":{input:l.ticketsUpdate,output:p.ticketsUpdate},"tickets.delete":{input:l.ticketsDelete,output:p.ticketsDelete},"tickets.list":{input:l.ticketsList,output:p.ticketsList},"users.create":{input:l.usersCreate,output:p.usersCreate},"users.get":{input:l.usersGet,output:p.usersGet},"users.update":{input:l.usersUpdate,output:p.usersUpdate},"users.delete":{input:l.usersDelete,output:p.usersDelete},"users.list":{input:l.usersList,output:p.usersList},"comments.list":{input:l.commentsList,output:p.commentsList}},Ue={"example.example":{description:"An example webhook event",payload:T,response:T}},Re="api_key",ve={"tickets.create":{riskLevel:"write",description:"Create a new ticket"},"tickets.get":{riskLevel:"read",description:"Retrieve a ticket by its ID"},"tickets.update":{riskLevel:"write",description:"Update an existing ticket"},"tickets.delete":{riskLevel:"destructive",description:"Delete a ticket by its ID"},"tickets.list":{riskLevel:"read",description:"List tickets with pagination"},"users.create":{riskLevel:"write",description:"Create a new user"},"users.get":{riskLevel:"read",description:"Retrieve a user by their ID"},"users.update":{riskLevel:"write",description:"Update an existing user"},"users.delete":{riskLevel:"destructive",description:"Delete a user by their ID"},"users.list":{riskLevel:"read",description:"List users with pagination"},"comments.list":{riskLevel:"read",description:"List comments for a specific ticket"}};function kt(s={}){let t={...s,authType:s.authType??Re};return{id:"zendesk",schema:v,options:t,hooks:t.hooks,webhookHooks:t.webhookHooks,endpoints:Se,webhooks:Ce,authConfig:Te,endpointMeta:ve,endpointSchemas:ze,webhookSchemas:Ue,pluginWebhookMatcher:r=>"x-zendesk-webhook-signature"in r.headers,errorHandlers:{...C,...t.errorHandlers},keyBuilder:async(r,i)=>{let n=r.authType;if(i==="webhook"&&t.webhookSecret)return t.webhookSecret;if(i==="webhook"){let o=await r.keys.get_webhook_signature();if(!o)throw new Error("[auth-missing:zendesk:webhook_signature]: Zendesk webhook signature is missing");return o}if(i==="endpoint"&&t.key)return t.key;if(i==="endpoint"&&r.authType==="api_key"){let o=await r.keys.get_api_key();if(!o)throw new P("zendesk","api_key");return o}throw new P("zendesk","api_key")}}}export{kt as zendesk,Te as zendeskAuthConfig,ze as zendeskEndpointSchemas};
|
|
1
|
+
var G=Object.defineProperty;var x=(s,t)=>{for(var r in t)G(s,r,{get:t[r],enumerable:!0})};import{AuthMissingError as O}from"corsair/core";var h={};x(h,{list:()=>H});import{logEventFromContext as M}from"corsair/core";import{ApiError as q,request as B}from"corsair/http";var g=class extends Error{constructor(r,i){super(r);this.code=i;this.name="ZendeskAPIError"}};async function d(s,t,r,i={}){if(!r)throw new g("Subdomain is required for Zendesk integration","MISSING_SUBDOMAIN");let{method:n="GET",body:o,query:u}=i,Z={BASE:`https://${r}.zendesk.com/api/v2`,VERSION:"2.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:void 0,HEADERS:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Basic ${Buffer.from(t).toString("base64")}`}},S={method:n,url:s,body:n==="POST"||n==="PUT"||n==="PATCH"?o:void 0,mediaType:"application/json; charset=utf-8",query:n==="GET"||n==="DELETE"?u:void 0};try{return await B(Z,S)}catch(b){throw b instanceof q?b:b instanceof Error?new g(b.message):new g("Unknown error")}}var H=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.ticket_id}/comments.json`,s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page}}}),n=i.comments||[];if(s.db.comments)for(let o of n)try{await s.db.comments.upsertByEntityId(String(o.id),{id:o.id,ticketId:t.ticket_id,body:o.body??null,authorId:o.author_id??null,public:o.public??null,createdAt:o.created_at?new Date(o.created_at):null})}catch(u){console.warn("Failed to save comment to database:",u)}return await M(s,"zendesk.comments.list",{...t},"completed"),i};var m={};x(m,{create:()=>N,deleteTicket:()=>$,get:()=>F,list:()=>V,update:()=>K});import{logEventFromContext as y}from"corsair/core";var N=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("tickets.json",s.key,r,{method:"POST",body:{ticket:{...t.subject&&{subject:t.subject},...t.description&&{description:t.description},...t.comment&&{comment:t.comment},...t.status&&{status:t.status},...t.priority&&{priority:t.priority},...t.requester_id!==void 0&&{requester_id:t.requester_id},...t.assignee_id!==void 0&&{assignee_id:t.assignee_id},...t.group_id!==void 0&&{group_id:t.group_id},...t.organization_id!==void 0&&{organization_id:t.organization_id},...t.tags&&{tags:t.tags}}}}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.create",{...t},"completed"),i},F=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.id}.json`,s.key,r,{method:"GET"}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.get",{...t},"completed"),i},K=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`tickets/${t.id}.json`,s.key,r,{method:"PUT",body:{ticket:{...t.subject&&{subject:t.subject},...t.status&&{status:t.status},...t.priority&&{priority:t.priority},...t.requester_id!==void 0&&{requester_id:t.requester_id},...t.assignee_id!==void 0&&{assignee_id:t.assignee_id},...t.comment&&{comment:t.comment},...t.tags&&{tags:t.tags}}}}),n=i.ticket;if(n&&s.db.tickets)try{await s.db.tickets.upsertByEntityId(String(n.id),{id:n.id,subject:n.subject??null,description:n.description??null,status:n.status??null,priority:n.priority??null,requesterId:n.requester_id??null,assigneeId:n.assignee_id??null,organizationId:n.organization_id??null,groupId:n.group_id??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save ticket to database:",o)}return await y(s,"zendesk.tickets.update",{...t},"completed"),i},$=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"";if(await d(`tickets/${t.id}.json`,s.key,r,{method:"DELETE"}),s.db.tickets)try{await s.db.tickets.deleteByEntityId(String(t.id))}catch(i){console.warn("Failed to delete ticket from database:",i)}return await y(s,"zendesk.tickets.delete",{...t},"completed"),{id:t.id}},V=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("tickets.json",s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page},...t.sort_by&&{sort_by:t.sort_by},...t.sort_order&&{sort_order:t.sort_order}}}),n=i.tickets||[];if(s.db.tickets)for(let o of n)try{await s.db.tickets.upsertByEntityId(String(o.id),{id:o.id,subject:o.subject??null,description:o.description??null,status:o.status??null,priority:o.priority??null,requesterId:o.requester_id??null,assigneeId:o.assignee_id??null,organizationId:o.organization_id??null,groupId:o.group_id??null,createdAt:o.created_at?new Date(o.created_at):null,updatedAt:o.updated_at?new Date(o.updated_at):null})}catch(u){console.warn("Failed to save ticket to database:",u)}return await y(s,"zendesk.tickets.list",{...t},"completed"),i};var k={};x(k,{create:()=>J,deleteUser:()=>Y,get:()=>Q,list:()=>ee,update:()=>X});import{logEventFromContext as f}from"corsair/core";var J=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("users.json",s.key,r,{method:"POST",body:{user:{name:t.name,email:t.email,...t.role&&{role:t.role},...t.external_id&&{external_id:t.external_id},...t.active!==void 0&&{active:t.active}}}}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.create",{...t},"completed"),i},Q=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`users/${t.id}.json`,s.key,r,{method:"GET"}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.get",{...t},"completed"),i},X=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d(`users/${t.id}.json`,s.key,r,{method:"PUT",body:{user:{...t.name&&{name:t.name},...t.email&&{email:t.email},...t.role&&{role:t.role},...t.external_id&&{external_id:t.external_id},...t.active!==void 0&&{active:t.active}}}}),n=i.user;if(n&&s.db.users)try{await s.db.users.upsertByEntityId(String(n.id),{id:n.id,name:n.name??null,email:n.email??null,role:n.role??null,active:n.active??null,timeZone:n.time_zone??null,locale:n.locale??null,createdAt:n.created_at?new Date(n.created_at):null,updatedAt:n.updated_at?new Date(n.updated_at):null})}catch(o){console.warn("Failed to save user to database:",o)}return await f(s,"zendesk.users.update",{...t},"completed"),i},Y=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"";if(await d(`users/${t.id}.json`,s.key,r,{method:"DELETE"}),s.db.users)try{await s.db.users.deleteByEntityId(String(t.id))}catch(i){console.warn("Failed to delete user from database:",i)}return await f(s,"zendesk.users.delete",{...t},"completed"),{id:t.id}},ee=async(s,t)=>{let r=s.options.subdomain??await s.keys.get_subdomain()??"",i=await d("users.json",s.key,r,{method:"GET",query:{...t.page!==void 0&&{page:t.page},...t.per_page!==void 0&&{per_page:t.per_page},...t.role&&{role:t.role}}}),n=i.users||[];if(s.db.users)for(let o of n)try{await s.db.users.upsertByEntityId(String(o.id),{id:o.id,name:o.name??null,email:o.email??null,role:o.role??null,active:o.active??null,timeZone:o.time_zone??null,locale:o.locale??null,createdAt:o.created_at?new Date(o.created_at):null,updatedAt:o.updated_at?new Date(o.updated_at):null})}catch(u){console.warn("Failed to save user to database:",u)}return await f(s,"zendesk.users.list",{...t},"completed"),i};import{z as e}from"zod";var _=e.object({id:e.number(),url:e.string().optional().nullable(),external_id:e.string().optional().nullable(),created_at:e.string().optional().nullable(),updated_at:e.string().optional().nullable(),type:e.string().optional().nullable(),subject:e.string().optional().nullable(),raw_subject:e.string().optional().nullable(),description:e.string().optional().nullable(),priority:e.string().optional().nullable(),status:e.string().optional().nullable(),recipient:e.string().optional().nullable(),requester_id:e.number().optional().nullable(),submitter_id:e.number().optional().nullable(),assignee_id:e.number().optional().nullable(),organization_id:e.number().optional().nullable(),group_id:e.number().optional().nullable(),collaborator_ids:e.array(e.number()).optional().nullable(),follower_ids:e.array(e.number()).optional().nullable(),email_cc_ids:e.array(e.number()).optional().nullable(),forum_topic_id:e.number().optional().nullable(),problem_id:e.number().optional().nullable(),has_incidents:e.boolean().optional().nullable(),is_public:e.boolean().optional().nullable(),due_at:e.string().optional().nullable(),tags:e.array(e.string()).optional().nullable()}),E=e.object({id:e.number(),url:e.string().optional().nullable(),name:e.string(),email:e.string().optional().nullable(),created_at:e.string().optional().nullable(),updated_at:e.string().optional().nullable(),time_zone:e.string().optional().nullable(),iana_time_zone:e.string().optional().nullable(),phone:e.string().optional().nullable(),shared_phone:e.boolean().optional().nullable(),locale_id:e.number().optional().nullable(),locale:e.string().optional().nullable(),organization_id:e.number().optional().nullable(),role:e.string().optional().nullable(),verified:e.boolean().optional().nullable(),external_id:e.string().optional().nullable(),tags:e.array(e.string()).optional().nullable(),active:e.boolean().optional().nullable()}),te=e.object({id:e.number(),type:e.string().optional().nullable(),body:e.string().optional().nullable(),html_body:e.string().optional().nullable(),plain_body:e.string().optional().nullable(),public:e.boolean().optional().nullable(),author_id:e.number().optional().nullable(),attachments:e.array(e.unknown()).optional().nullable(),created_at:e.string().optional().nullable()}),se=e.object({subject:e.string().optional(),description:e.string().optional(),comment:e.object({body:e.string(),public:e.boolean().optional(),author_id:e.number().optional()}).optional(),status:e.string().optional(),priority:e.string().optional(),requester_id:e.number().optional(),assignee_id:e.number().optional(),group_id:e.number().optional(),organization_id:e.number().optional(),tags:e.array(e.string()).optional()}),ne=e.object({ticket:_}),oe=e.object({id:e.number()}),ie=e.object({ticket:_}),re=e.object({id:e.number(),subject:e.string().optional(),status:e.string().optional(),priority:e.string().optional(),requester_id:e.number().optional(),assignee_id:e.number().optional(),comment:e.object({body:e.string(),public:e.boolean().optional(),author_id:e.number().optional()}).optional(),tags:e.array(e.string()).optional()}),ae=e.object({ticket:_}),de=e.object({id:e.number()}),le=e.object({id:e.number().optional()}),pe=e.object({page:e.number().optional(),per_page:e.number().optional(),sort_by:e.string().optional(),sort_order:e.string().optional()}),ue=e.object({tickets:e.array(_),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),ce=e.object({name:e.string(),email:e.string(),role:e.string().optional(),external_id:e.string().optional(),active:e.boolean().optional()}),me=e.object({user:E}),ke=e.object({id:e.number()}),be=e.object({user:E}),ge=e.object({id:e.number(),name:e.string().optional(),email:e.string().optional(),role:e.string().optional(),external_id:e.string().optional(),active:e.boolean().optional()}),ye=e.object({user:E}),fe=e.object({id:e.number()}),he=e.object({id:e.number().optional()}),_e=e.object({page:e.number().optional(),per_page:e.number().optional(),role:e.string().optional()}),Ee=e.object({users:e.array(E),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),we=e.object({ticket_id:e.number(),page:e.number().optional(),per_page:e.number().optional()}),Ze=e.object({comments:e.array(te),next_page:e.string().nullable().optional(),previous_page:e.string().nullable().optional(),count:e.number().optional()}),l={ticketsCreate:se,ticketsGet:oe,ticketsUpdate:re,ticketsDelete:de,ticketsList:pe,usersCreate:ce,usersGet:ke,usersUpdate:ge,usersDelete:fe,usersList:_e,commentsList:we},p={ticketsCreate:ne,ticketsGet:ie,ticketsUpdate:ae,ticketsDelete:le,ticketsList:ue,usersCreate:me,usersGet:be,usersUpdate:ye,usersDelete:he,usersList:Ee,commentsList:Ze};import{ApiError as T}from"corsair/http";var C={RATE_LIMIT_ERROR:{match:s=>{if(s instanceof T&&s.status===429)return!0;let t=s.message.toLowerCase();return t.includes("rate_limited")||t.includes("429")},handler:async s=>{let t;return s instanceof T&&s.retryAfter!==void 0&&(t=s.retryAfter),{maxRetries:5,headersRetryAfterMs:t}}},AUTH_ERROR:{match:s=>{if(s instanceof T&&s.status===401)return!0;let t=s.message.toLowerCase();return t.includes("unauthorized")||t.includes("invalid_auth")},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};import{z as a}from"zod";var z=a.object({id:a.number(),subject:a.string().optional().nullable(),description:a.string().optional().nullable(),status:a.string().optional().nullable(),priority:a.string().optional().nullable(),requesterId:a.number().optional().nullable(),assigneeId:a.number().optional().nullable(),organizationId:a.number().optional().nullable(),groupId:a.number().optional().nullable(),createdAt:a.coerce.date().optional().nullable(),updatedAt:a.coerce.date().optional().nullable()}),U=a.object({id:a.number(),name:a.string().optional().nullable(),email:a.string().optional().nullable(),role:a.string().optional().nullable(),active:a.boolean().optional().nullable(),timeZone:a.string().optional().nullable(),locale:a.string().optional().nullable(),createdAt:a.coerce.date().optional().nullable(),updatedAt:a.coerce.date().optional().nullable()}),R=a.object({id:a.number(),ticketId:a.number().optional().nullable(),body:a.string().optional().nullable(),authorId:a.number().optional().nullable(),public:a.boolean().optional().nullable(),createdAt:a.coerce.date().optional().nullable()});var v={version:"1.0.0",entities:{tickets:z,users:U,comments:R}};import{logEventFromContext as Ie}from"corsair/core";import*as w from"crypto";import{z as c}from"zod";var xe=c.object({type:c.string(),created_at:c.string(),data:c.record(c.string(),c.unknown())}),I=xe.extend({type:c.literal("example"),data:c.object({id:c.string()}).loose()});function Te(s){if(typeof s=="string")try{let t=JSON.parse(s);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}return s!==null&&typeof s=="object"&&!Array.isArray(s)?s:null}function L(s){return t=>{let r=Te(t.body);return r!==null&&r.type===s}}function D(s,t){if(!t)return{valid:!1,error:"Missing webhook signing secret configuration"};let r=s.rawBody;if(r==null)return{valid:!1,error:"Missing raw body for signature verification"};let i=s.headers,n=Array.isArray(i["x-zendesk-webhook-signature"])?i["x-zendesk-webhook-signature"][0]:i["x-zendesk-webhook-signature"],o=Array.isArray(i["x-zendesk-webhook-signature-timestamp"])?i["x-zendesk-webhook-signature-timestamp"][0]:i["x-zendesk-webhook-signature-timestamp"];if(!n)return{valid:!1,error:"Missing x-zendesk-webhook-signature header"};if(!o)return{valid:!1,error:"Missing x-zendesk-webhook-signature-timestamp header"};let u=Date.parse(o);if(Number.isNaN(u))return{valid:!1,error:"Invalid x-zendesk-webhook-signature-timestamp header format"};let Z=Date.now();if(Math.abs(Z-u)/1e3>300)return{valid:!1,error:"Webhook request timestamp is stale (outside 5-minute window)"};let b=o+r,W=w.createHmac("sha256",t).update(b).digest("base64");try{if(!w.timingSafeEqual(Buffer.from(n),Buffer.from(W)))return{valid:!1,error:"Invalid signature"}}catch{return{valid:!1,error:"Invalid signature"}}return{valid:!0}}var j={match:L("example"),handler:async(s,t)=>{let r=D(t,s.key);if(!r.valid)return{success:!1,statusCode:401,error:r.error||"Signature verification failed"};let i=t.payload;return i.type!=="example"?{success:!0,data:void 0}:(await Ie(s,"zendesk.webhook.example",{...i},"completed"),{success:!0,data:i})}};var A={example:j};import{firstString as Se,getHeader as Ce,readBodyRecord as ze}from"corsair/core";function P(s){let t=ze(s);if(!t)return null;let r=Se([Ce(s.headers,"x-zendesk-account-id"),t.account_id]);return r?{linkType:"account_id",externalId:r}:null}var Ue={api_key:{account:["subdomain","account_id"]}},Re={tickets:{create:m.create,get:m.get,update:m.update,delete:m.deleteTicket,list:m.list},users:{create:k.create,get:k.get,update:k.update,delete:k.deleteUser,list:k.list},comments:{list:h.list}},ve={example:{example:A.example}},Le={"tickets.create":{input:l.ticketsCreate,output:p.ticketsCreate},"tickets.get":{input:l.ticketsGet,output:p.ticketsGet},"tickets.update":{input:l.ticketsUpdate,output:p.ticketsUpdate},"tickets.delete":{input:l.ticketsDelete,output:p.ticketsDelete},"tickets.list":{input:l.ticketsList,output:p.ticketsList},"users.create":{input:l.usersCreate,output:p.usersCreate},"users.get":{input:l.usersGet,output:p.usersGet},"users.update":{input:l.usersUpdate,output:p.usersUpdate},"users.delete":{input:l.usersDelete,output:p.usersDelete},"users.list":{input:l.usersList,output:p.usersList},"comments.list":{input:l.commentsList,output:p.commentsList}},De={"example.example":{description:"An example webhook event",payload:I,response:I}},je="api_key",Ae={"tickets.create":{riskLevel:"write",description:"Create a new ticket"},"tickets.get":{riskLevel:"read",description:"Retrieve a ticket by its ID"},"tickets.update":{riskLevel:"write",description:"Update an existing ticket"},"tickets.delete":{riskLevel:"destructive",description:"Delete a ticket by its ID"},"tickets.list":{riskLevel:"read",description:"List tickets with pagination"},"users.create":{riskLevel:"write",description:"Create a new user"},"users.get":{riskLevel:"read",description:"Retrieve a user by their ID"},"users.update":{riskLevel:"write",description:"Update an existing user"},"users.delete":{riskLevel:"destructive",description:"Delete a user by their ID"},"users.list":{riskLevel:"read",description:"List users with pagination"},"comments.list":{riskLevel:"read",description:"List comments for a specific ticket"}};function Et(s={}){let t={...s,authType:s.authType??je};return{id:"zendesk",schema:v,options:t,hooks:t.hooks,webhookHooks:t.webhookHooks,endpoints:Re,webhooks:ve,authConfig:Ue,endpointMeta:Ae,endpointSchemas:Le,webhookSchemas:De,pluginWebhookMatcher:r=>"x-zendesk-webhook-signature"in r.headers,pluginTenantWebhookMatcher:P,errorHandlers:{...C,...t.errorHandlers},keyBuilder:async(r,i)=>{let n=r.authType;if(i==="webhook"&&t.webhookSecret)return t.webhookSecret;if(i==="webhook"){let o=await r.keys.get_webhook_signature();if(!o)throw new Error("[auth-missing:zendesk:webhook_signature]: Zendesk webhook signature is missing");return o}if(i==="endpoint"&&t.key)return t.key;if(i==="endpoint"&&r.authType==="api_key"){let o=await r.keys.get_api_key();if(!o)throw new O("zendesk","api_key");return o}throw new O("zendesk","api_key")}}}export{Et as zendesk,Ue as zendeskAuthConfig,Le as zendeskEndpointSchemas};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-matcher.d.ts","sourceRoot":"","sources":["../../webhooks/tenant-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAM1E,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,iBAAiB,GACxB,kBAAkB,GAAG,IAAI,CAW3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corsair-dev/zendesk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Zendesk plugin for Corsair",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,21 +23,25 @@
|
|
|
23
23
|
"tsup": "^8.0.1",
|
|
24
24
|
"typescript": "^5.9.3",
|
|
25
25
|
"zod": "^4.1.13",
|
|
26
|
-
"
|
|
26
|
+
"jest": "^29.7.0",
|
|
27
|
+
"corsair": "0.1.130"
|
|
27
28
|
},
|
|
28
29
|
"keywords": [
|
|
29
30
|
"corsair",
|
|
30
31
|
"zendesk",
|
|
31
32
|
"plugin"
|
|
32
33
|
],
|
|
33
|
-
"author": "",
|
|
34
|
+
"author": "Corsair (https://corsair.dev)",
|
|
34
35
|
"license": "Apache-2.0",
|
|
35
36
|
"files": [
|
|
36
37
|
"dist"
|
|
37
38
|
],
|
|
38
|
-
"
|
|
39
|
-
"
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/corsairdev/corsair.git",
|
|
42
|
+
"directory": "packages/zendesk"
|
|
40
43
|
},
|
|
44
|
+
"homepage": "https://docs.corsair.dev/plugins/zendesk",
|
|
41
45
|
"scripts": {
|
|
42
46
|
"build": "rm -rf dist && tsc --build --force && tsup",
|
|
43
47
|
"typecheck": "tsc --noEmit",
|