@corsair-dev/xquik 0.1.0 → 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 ADDED
@@ -0,0 +1,56 @@
1
+ # @corsair-dev/xquik
2
+
3
+ Search tweets, inspect users, manage Xquik webhooks, upload media, and run X actions from Corsair.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @corsair-dev/xquik
9
+ ```
10
+
11
+ ## Endpoints
12
+
13
+ | Operation | Operation ID | Risk | Description |
14
+ |-----------|--------------|------|-------------|
15
+ | `media.download` | `xquik.api.media.download` | `read` | Download images and videos from one or more tweets |
16
+ | `media.uploadFromUrl` | `xquik.api.media.uploadFromUrl` | `write` | Upload public media URLs for use in Xquik tweet creation |
17
+ | `trends.get` | `xquik.api.trends.get` | `read` | Get trending X topics by WOEID region |
18
+ | `tweets.batch` | `xquik.api.tweets.batch` | `read` | Fetch up to 100 tweets by ID |
19
+ | `tweets.create` | `xquik.api.tweets.create` | `write` | Create a tweet or reply from a connected X account |
20
+ | `tweets.delete` | `xquik.api.tweets.delete` | `destructive` | Delete a tweet from a connected X account |
21
+ | `tweets.get` | `xquik.api.tweets.get` | `read` | Get a tweet with full text, author, metrics, and media |
22
+ | `tweets.like` | `xquik.api.tweets.like` | `write` | Like a tweet from a connected X account |
23
+ | `tweets.retweet` | `xquik.api.tweets.retweet` | `write` | Retweet a tweet from a connected X account |
24
+ | `tweets.search` | `xquik.api.tweets.search` | `read` | Search tweets with X query operators and pagination |
25
+ | `tweets.unlike` | `xquik.api.tweets.unlike` | `write` | Remove a like from a connected X account |
26
+ | `users.batch` | `xquik.api.users.batch` | `read` | Look up up to 100 X users by ID |
27
+ | `users.follow` | `xquik.api.users.follow` | `write` | Follow an X user from a connected account |
28
+ | `users.followers` | `xquik.api.users.followers` | `read` | List followers of an X user |
29
+ | `users.following` | `xquik.api.users.following` | `read` | List accounts an X user follows |
30
+ | `users.get` | `xquik.api.users.get` | `read` | Get an X user profile by username or user ID |
31
+ | `users.search` | `xquik.api.users.search` | `read` | Search X users by name or username |
32
+ | `users.tweets` | `xquik.api.users.tweets` | `read` | List recent tweets posted by an X user |
33
+ | `users.unfollow` | `xquik.api.users.unfollow` | `write` | Unfollow an X user from a connected account |
34
+ | `webhooks.create` | `xquik.api.webhooks.create` | `write` | Create an Xquik webhook endpoint subscription |
35
+ | `webhooks.deactivate` | `xquik.api.webhooks.deactivate` | `write` | Deactivate an Xquik webhook endpoint |
36
+ | `webhooks.deliveries` | `xquik.api.webhooks.deliveries` | `read` | List delivery attempts for an Xquik webhook endpoint |
37
+ | `webhooks.list` | `xquik.api.webhooks.list` | `read` | List configured Xquik webhook endpoints |
38
+ | `webhooks.test` | `xquik.api.webhooks.test` | `write` | Send a test delivery to an Xquik webhook endpoint |
39
+ | `webhooks.update` | `xquik.api.webhooks.update` | `write` | Update a Xquik webhook URL, event types, or active state |
40
+ | `writeActions.get` | `xquik.api.writeActions.get` | `read` | Check the status of a pending Xquik write action |
41
+
42
+ ## Auth
43
+
44
+ Auth: API key. Corsair prompts your tenant for credentials on first use.
45
+
46
+ ## Webhooks
47
+
48
+ Handles 2 webhook events. See the reference for payloads and `webhookHooks`.
49
+
50
+ ## Reference
51
+
52
+ Full docs, types, and examples: https://docs.corsair.dev/plugins/xquik
53
+
54
+ ## License
55
+
56
+ Apache-2.0
@@ -23,11 +23,11 @@ declare const TweetFilterSchema: z.ZodObject<{
23
23
  inReplyToTweetId: z.ZodOptional<z.ZodString>;
24
24
  language: z.ZodOptional<z.ZodString>;
25
25
  mediaType: z.ZodOptional<z.ZodEnum<{
26
+ none: "none";
26
27
  gifs: "gifs";
27
28
  images: "images";
28
29
  links: "links";
29
30
  media: "media";
30
- none: "none";
31
31
  videos: "videos";
32
32
  }>>;
33
33
  mentioning: z.ZodOptional<z.ZodString>;
@@ -418,11 +418,11 @@ export declare const TweetSearchInputSchema: z.ZodObject<{
418
418
  inReplyToTweetId: z.ZodOptional<z.ZodString>;
419
419
  language: z.ZodOptional<z.ZodString>;
420
420
  mediaType: z.ZodOptional<z.ZodEnum<{
421
+ none: "none";
421
422
  gifs: "gifs";
422
423
  images: "images";
423
424
  links: "links";
424
425
  media: "media";
425
- none: "none";
426
426
  videos: "videos";
427
427
  }>>;
428
428
  mentioning: z.ZodOptional<z.ZodString>;
@@ -499,11 +499,11 @@ export declare const UserTweetsInputSchema: z.ZodObject<{
499
499
  inReplyToTweetId: z.ZodOptional<z.ZodString>;
500
500
  language: z.ZodOptional<z.ZodString>;
501
501
  mediaType: z.ZodOptional<z.ZodEnum<{
502
+ none: "none";
502
503
  gifs: "gifs";
503
504
  images: "images";
504
505
  links: "links";
505
506
  media: "media";
506
- none: "none";
507
507
  videos: "videos";
508
508
  }>>;
509
509
  mentioning: z.ZodOptional<z.ZodString>;
@@ -720,11 +720,11 @@ export declare const XquikEndpointInputSchemas: {
720
720
  inReplyToTweetId: z.ZodOptional<z.ZodString>;
721
721
  language: z.ZodOptional<z.ZodString>;
722
722
  mediaType: z.ZodOptional<z.ZodEnum<{
723
+ none: "none";
723
724
  gifs: "gifs";
724
725
  images: "images";
725
726
  links: "links";
726
727
  media: "media";
727
- none: "none";
728
728
  videos: "videos";
729
729
  }>>;
730
730
  mentioning: z.ZodOptional<z.ZodString>;
@@ -806,11 +806,11 @@ export declare const XquikEndpointInputSchemas: {
806
806
  inReplyToTweetId: z.ZodOptional<z.ZodString>;
807
807
  language: z.ZodOptional<z.ZodString>;
808
808
  mediaType: z.ZodOptional<z.ZodEnum<{
809
+ none: "none";
809
810
  gifs: "gifs";
810
811
  images: "images";
811
812
  links: "links";
812
813
  media: "media";
813
- none: "none";
814
814
  videos: "videos";
815
815
  }>>;
816
816
  mentioning: z.ZodOptional<z.ZodString>;
package/dist/index.d.ts CHANGED
@@ -317,11 +317,11 @@ export declare const xquikEndpointSchemas: {
317
317
  inReplyToTweetId: import("zod").ZodOptional<import("zod").ZodString>;
318
318
  language: import("zod").ZodOptional<import("zod").ZodString>;
319
319
  mediaType: import("zod").ZodOptional<import("zod").ZodEnum<{
320
+ none: "none";
320
321
  gifs: "gifs";
321
322
  images: "images";
322
323
  links: "links";
323
324
  media: "media";
324
- none: "none";
325
325
  videos: "videos";
326
326
  }>>;
327
327
  mentioning: import("zod").ZodOptional<import("zod").ZodString>;
@@ -562,11 +562,11 @@ export declare const xquikEndpointSchemas: {
562
562
  inReplyToTweetId: import("zod").ZodOptional<import("zod").ZodString>;
563
563
  language: import("zod").ZodOptional<import("zod").ZodString>;
564
564
  mediaType: import("zod").ZodOptional<import("zod").ZodEnum<{
565
+ none: "none";
565
566
  gifs: "gifs";
566
567
  images: "images";
567
568
  links: "links";
568
569
  media: "media";
569
- none: "none";
570
570
  videos: "videos";
571
571
  }>>;
572
572
  mentioning: import("zod").ZodOptional<import("zod").ZodString>;
@@ -791,9 +791,7 @@ export declare const xquikEndpointSchemas: {
791
791
  };
792
792
  declare const defaultAuthType: AuthTypes;
793
793
  export declare const xquikAuthConfig: {
794
- readonly api_key: {
795
- readonly account: readonly ["one", "webhook_signature"];
796
- };
794
+ readonly api_key: {};
797
795
  };
798
796
  export type XquikKeyBuilderContext = KeyBuilderContext<XquikPluginOptions, typeof xquikAuthConfig>;
799
797
  export type BaseXquikPlugin<T extends XquikPluginOptions> = CorsairPlugin<'xquik', typeof XquikSchema, typeof xquikEndpointsNested, typeof xquikWebhooksNested, T, typeof defaultAuthType, typeof xquikAuthConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
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 Xe=Object.defineProperty;var q=(t,o)=>{for(var s in o)Xe(t,s,{get:o[s],enumerable:!0})};var T={};q(T,{download:()=>Re,uploadFromUrl:()=>ve});import{logEventFromContext as V}from"corsair/core";import{ApiError as K,request as Se}from"corsair/http";var Ue="https://xquik.com/api/v1",Ie="2026-04-29",k=class extends Error{constructor(s,p,u){super(s,u);this.code=p;this.name="XquikAPIError",u?.cause instanceof K&&(this.body=u.cause.body,this.rateLimitLimit=u.cause.rateLimitLimit,this.rateLimitRemaining=u.cause.rateLimitRemaining,this.rateLimitReset=u.cause.rateLimitReset,this.retryAfter=u.cause.retryAfter,this.status=u.cause.status,this.statusText=u.cause.statusText)}body;rateLimitLimit;rateLimitRemaining;rateLimitReset;retryAfter;status;statusText};async function n(t,o,s={}){let{baseUrl:p=Ue,body:u,method:g="GET",query:I}=s,Ee={BASE:p,CREDENTIALS:"omit",HEADERS:{"Content-Type":"application/json","x-api-key":o,"xquik-api-contract":Ie},TOKEN:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1},Te={body:g==="GET"?void 0:u,mediaType:"application/json; charset=utf-8",method:g,query:g==="GET"?I:void 0,url:t};try{return await Se(Ee,Te)}catch(y){throw y instanceof K?new k(y.message,y.status,{cause:y}):y instanceof Error?new k(y.message,void 0,{cause:y}):new k("Unknown Xquik API error")}}function i(t){return t.baseUrl}function v(t){return t.join(",")}function R(t){return{anyWords:t.anyWords,cashtags:t.cashtags,conversationId:t.conversationId,exactPhrase:t.exactPhrase,excludeWords:t.excludeWords,fromUser:t.fromUser,hashtags:t.hashtags,inReplyToTweetId:t.inReplyToTweetId,language:t.language,mediaType:t.mediaType,mentioning:t.mentioning,minFaves:t.minFaves,minQuotes:t.minQuotes,minReplies:t.minReplies,minRetweets:t.minRetweets,quotes:t.quotes,quotesOfTweetId:t.quotesOfTweetId,replies:t.replies,retweets:t.retweets,retweetsOfTweetId:t.retweetsOfTweetId,sinceDate:t.sinceDate,toUser:t.toUser,untilDate:t.untilDate,url:t.url,verifiedOnly:t.verifiedOnly}}var ve=async(t,o)=>{let s=await n("/x/media",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.uploadFromUrl",{account:o.account},"completed"),s},Re=async(t,o)=>{let s=await n("/x/media/download",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.download",{bulk:o.tweetIds!==void 0},"completed"),s};var A={};q(A,{get:()=>Pe});import{logEventFromContext as Ae}from"corsair/core";var Pe=async(t,o)=>{let s=await n("/x/trends",t.key,{baseUrl:i(t.options),query:{count:o.count,woeid:o.woeid}});return await Ae(t,"xquik.trends.get",{woeid:o.woeid??1},"completed"),s};var c={};q(c,{batch:()=>Ce,create:()=>Oe,deleteTweet:()=>De,get:()=>We,like:()=>Fe,retweet:()=>Me,search:()=>Le,unlike:()=>Ge});import{logEventFromContext as m}from"corsair/core";var Ce=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await m(t,"xquik.tweets.batch",{count:o.ids.length},"completed"),s},We=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options)});return await m(t,"xquik.tweets.get",{id:o.id},"completed"),s},Le=async(t,o)=>{let s=await n("/x/tweets/search",t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,limit:o.limit,q:o.q,queryType:o.queryType,sinceTime:o.sinceTime,untilTime:o.untilTime}});return await m(t,"xquik.tweets.search",{q:o.q},"completed"),s},Oe=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await m(t,"xquik.tweets.create",{account:o.account,pending:"status"in s&&s.status==="pending_confirmation"},"completed"),s},De=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.delete",{id:o.id},"completed"),s},Fe=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.like",{id:o.id},"completed"),s},Ge=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.unlike",{id:o.id},"completed"),s},Me=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/retweet`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.retweet",{id:o.id},"completed"),s};var d={};q(d,{batch:()=>Be,follow:()=>$e,followers:()=>Ne,following:()=>He,get:()=>_e,search:()=>ze,tweets:()=>je,unfollow:()=>Qe});import{logEventFromContext as h}from"corsair/core";var Be=async(t,o)=>{let s=await n("/x/users/batch",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await h(t,"xquik.users.batch",{count:o.ids.length},"completed"),s},_e=async(t,o)=>{let s=await n(`/x/users/${o.id}`,t.key,{baseUrl:i(t.options)});return await h(t,"xquik.users.get",{id:o.id},"completed"),s},ze=async(t,o)=>{let s=await n("/x/users/search",t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,q:o.q}});return await h(t,"xquik.users.search",{q:o.q},"completed"),s},je=async(t,o)=>{let s=await n(`/x/users/${o.id}/tweets`,t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,includeParentTweet:o.includeParentTweet,includeReplies:o.includeReplies,pageSize:o.pageSize}});return await h(t,"xquik.users.tweets",{id:o.id},"completed"),s},Ne=async(t,o)=>{let s=await n(`/x/users/${o.id}/followers`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.followers",{id:o.id},"completed"),s},He=async(t,o)=>{let s=await n(`/x/users/${o.id}/following`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.following",{id:o.id},"completed"),s},$e=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await h(t,"xquik.users.follow",{id:o.id},"completed"),s},Qe=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await h(t,"xquik.users.unfollow",{id:o.id},"completed"),s};var w={};q(w,{create:()=>Ve,deactivate:()=>Ye,deliveries:()=>Ze,list:()=>Ke,test:()=>et,update:()=>Je});import{logEventFromContext as x}from"corsair/core";var Ke=async t=>{let o=await n("/webhooks",t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.list",{count:o.webhooks.length},"completed"),o},Ve=async(t,o)=>{let s=await n("/webhooks",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await x(t,"xquik.webhooks.create",{eventTypes:o.eventTypes},"completed"),s},Je=async(t,o)=>{let{id:s,...p}=o,u=await n(`/webhooks/${s}`,t.key,{baseUrl:i(t.options),body:p,method:"PATCH"});return await x(t,"xquik.webhooks.update",{id:s},"completed"),u},Ye=async(t,o)=>{let s=await n(`/webhooks/${o.id}`,t.key,{baseUrl:i(t.options),method:"DELETE"});return await x(t,"xquik.webhooks.deactivate",{id:o.id},"completed"),s},Ze=async(t,o)=>{let s=await n(`/webhooks/${o.id}/deliveries`,t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.deliveries",{id:o.id},"completed"),s},et=async(t,o)=>{let s=await n(`/webhooks/${o.id}/test`,t.key,{baseUrl:i(t.options),method:"POST"});return await x(t,"xquik.webhooks.test",{id:o.id,success:s.success},"completed"),s};var P={};q(P,{get:()=>ot});import{logEventFromContext as tt}from"corsair/core";var ot=async(t,o)=>{let s=await n(`/x/write-actions/${o.id}`,t.key,{baseUrl:i(t.options)});return await tt(t,"xquik.writeActions.get",{id:o.id},"completed"),s};import{z as e}from"zod";var ee=e.enum(["tweet.new","tweet.quote","tweet.reply","tweet.retweet"]),G=e.array(ee).min(1),J=e.string().regex(/^\d{4}-\d{2}-\d{2}$/),f=e.string(),S=e.string().min(1),M=e.string().min(1),B=e.string().min(1),st=e.enum(["gifs","images","links","media","none","videos"]),O=e.enum(["exclude","include","only"]),te=e.object({anyWords:e.string().optional(),cashtags:e.string().optional(),conversationId:e.string().optional(),exactPhrase:e.string().optional(),excludeWords:e.string().optional(),fromUser:e.string().optional(),hashtags:e.string().optional(),inReplyToTweetId:e.string().optional(),language:e.string().optional(),mediaType:st.optional(),mentioning:e.string().optional(),minFaves:e.number().int().min(0).optional(),minQuotes:e.number().int().min(0).optional(),minReplies:e.number().int().min(0).optional(),minRetweets:e.number().int().min(0).optional(),quotes:O.optional(),quotesOfTweetId:e.string().optional(),replies:O.optional(),retweets:O.optional(),retweetsOfTweetId:e.string().optional(),sinceDate:J.optional(),toUser:e.string().optional(),untilDate:J.optional(),url:e.string().optional(),verifiedOnly:e.boolean().optional()}),_=e.object({cursor:e.string().optional()}),oe=e.object({account:B}),se=e.object({mediaUrl:e.string().optional(),type:e.enum(["animated_gif","photo","video"]).optional(),url:e.string().optional()}).passthrough(),U=e.object({coverPicture:e.string().optional(),createdAt:e.string().optional(),description:e.string().optional(),followers:e.number().int().optional(),following:e.number().int().optional(),id:e.string(),location:e.string().optional(),name:e.string(),profilePicture:e.string().optional(),statusesCount:e.number().int().optional(),username:e.string(),verified:e.boolean().optional()}).passthrough(),nt=e.object({followers:e.number().int(),id:e.string(),profilePicture:e.string().optional(),username:e.string(),verified:e.boolean()}).passthrough(),z=e.object({author:U.optional(),bookmarkCount:e.number().int().optional(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),inReplyToId:e.string().optional(),inReplyToUserId:e.string().optional(),inReplyToUsername:e.string().optional(),isLimitedReply:e.boolean().optional(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),lang:e.string().optional(),likeCount:e.number().int().optional(),media:e.array(se).optional(),quoteCount:e.number().int().optional(),replyCount:e.number().int().optional(),retweetCount:e.number().int().optional(),source:e.string().optional(),text:e.string(),type:e.string().optional(),url:e.string().optional(),viewCount:e.number().int().optional()}).passthrough(),j=e.object({bookmarkCount:e.number().int(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),likeCount:e.number().int(),media:e.array(se).optional(),quoteCount:e.number().int(),replyCount:e.number().int(),retweetCount:e.number().int(),source:e.string().optional(),text:e.string(),viewCount:e.number().int()}).passthrough(),D=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),tweets:e.array(z)}),C=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),users:e.array(U)}),it=e.object({author:nt.optional(),tweet:j}),b=e.object({success:e.literal(!0)}).passthrough(),rt=e.object({charged:e.boolean(),error:e.literal("x_write_unconfirmed"),message:e.string().optional(),retryable:e.literal(!1),status:e.literal("pending_confirmation"),writeActionId:e.string()}),at=e.union([e.object({success:e.literal(!0),tweetId:e.string()}),rt]),ut=e.object({action:e.string(),charged:e.boolean(),confirmationAttempts:e.number().int().optional(),confirmationCheckedAt:e.string().optional(),confirmationSource:e.string().nullable().optional(),confirmedAt:e.string().optional(),createdAt:e.string(),message:e.string().optional(),messageId:e.string().optional(),retryable:e.boolean(),sendDispatched:e.boolean(),sendDispatchedAt:e.string().optional(),status:e.enum(["failed","pending_confirmation","success"]),targetId:e.string().nullable().optional(),tweetId:e.string().optional(),writeActionId:e.string()}).passthrough(),pt=e.object({description:e.string().optional(),name:e.string(),query:e.string().optional(),rank:e.number().int().optional()}).passthrough(),ct=e.object({count:e.number().int(),trends:e.array(pt),woeid:e.number().int()}),dt=e.object({mediaId:e.string(),mediaUrl:e.string().url(),success:e.literal(!0)}),lt=e.object({cacheHit:e.boolean().optional(),galleryUrl:e.string().optional(),totalMedia:e.number().int().optional(),totalTweets:e.number().int().optional(),tweetId:e.string().optional()}).passthrough(),X=e.object({createdAt:f,eventTypes:G,id:e.string(),isActive:e.boolean(),url:e.string().url()}),N=e.object({attempts:e.number().int(),createdAt:f,deliveredAt:f.optional(),id:e.string(),lastError:e.string().optional(),lastStatusCode:e.number().int().optional(),status:e.string(),streamEventId:e.string()}),l=e.object({data:e.record(e.string(),e.unknown()),deliveryId:e.string().optional(),eventType:e.union([ee,e.literal("webhook.test")]),occurredAt:f.optional(),query:e.string().optional(),schemaVersion:e.string().optional(),streamEventId:e.string().optional(),timestamp:f.optional(),username:e.string().optional()}).passthrough(),wt=e.object({error:e.string().optional(),statusCode:e.number().int(),success:e.boolean()}),kt=e.object({ids:e.array(S).min(1).max(100)}),mt=e.object({id:S}),ht=te.merge(_).extend({limit:e.number().int().min(1).max(200).optional(),q:e.string().min(1),queryType:e.enum(["Latest","Top"]).optional(),sinceTime:f.optional(),untilTime:f.optional()}),yt=e.object({account:B,attachment_url:e.string().url().optional(),community_id:e.string().optional(),is_note_tweet:e.boolean().optional(),media:e.array(e.string().url()).max(4).optional(),reply_to_tweet_id:e.string().optional(),text:e.string().optional()}).refine(t=>t.text!==void 0&&t.text.length>0||t.media!==void 0&&t.media.length>0,{message:"Provide text, media, or both."}),W=oe.extend({id:S}),bt=e.object({ids:e.array(M).min(1).max(100)}),H=e.object({id:M}),ft=_.extend({q:e.string().min(1)}),ne=_.extend({pageSize:e.number().int().min(20).max(200).optional()}),gt=H.merge(ne).merge(te).extend({includeParentTweet:e.boolean().optional(),includeReplies:e.boolean().optional()}),Y=H.merge(ne),Z=oe.extend({id:M}),qt=e.object({count:e.number().int().min(1).max(50).optional(),woeid:e.number().int().optional()}),xt=e.object({account:B,url:e.string().url()}),Et=e.object({tweetId:S.optional(),tweetIds:e.array(S).max(50).optional(),tweetInput:e.string().optional(),tweetUrl:e.string().url().optional()}).refine(t=>t.tweetInput!==void 0||t.tweetId!==void 0||t.tweetUrl!==void 0||t.tweetIds!==void 0&&t.tweetIds.length>0,{message:"Provide tweetInput, tweetId, tweetUrl, or tweetIds."}),Tt=e.object({id:e.string().min(1)}),Xt=e.object({}),St=e.object({eventTypes:G,url:e.string().url()}),Ut=e.object({eventTypes:G.optional(),id:e.string().min(1),isActive:e.boolean().optional(),url:e.string().url().optional()}).refine(t=>t.eventTypes!==void 0||t.isActive!==void 0||t.url!==void 0,{message:"Provide at least one webhook field to update."}),F=e.object({id:e.string().min(1)}),r={mediaDownload:Et,mediaUploadFromUrl:xt,trendsGet:qt,tweetsBatch:kt,tweetsCreate:yt,tweetsDelete:W,tweetsGet:mt,tweetsLike:W,tweetsRetweet:W,tweetsSearch:ht,tweetsUnlike:W,usersBatch:bt,usersFollow:Z,usersFollowers:Y,usersFollowing:Y,usersGet:H,usersSearch:ft,usersTweets:gt,usersUnfollow:Z,webhooksCreate:St,webhooksDeactivate:F,webhooksDeliveries:F,webhooksList:Xt,webhooksTest:F,webhooksUpdate:Ut,writeActionsGet:Tt},a={mediaDownload:lt,mediaUploadFromUrl:dt,trendsGet:ct,tweetsBatch:D,tweetsCreate:at,tweetsDelete:b,tweetsGet:it,tweetsLike:b,tweetsRetweet:b,tweetsSearch:D,tweetsUnlike:b,usersBatch:C,usersFollow:b,usersFollowers:C,usersFollowing:C,usersGet:U,usersSearch:C,usersTweets:D,usersUnfollow:b,webhooksCreate:X.extend({secret:e.string()}),webhooksDeactivate:b,webhooksDeliveries:e.object({deliveries:e.array(N)}),webhooksList:e.object({webhooks:e.array(X)}),webhooksTest:wt,webhooksUpdate:X,writeActionsGet:ut};import{ApiError as re}from"corsair/http";function E(t){if(t instanceof re||t instanceof k)return t.status}function ie(t){if(t instanceof re||t instanceof k)return t.retryAfter}var ae={AUTH_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===401||s.includes("unauthorized")||s.includes("invalid api key")},handler:async()=>({maxRetries:0})},PAYMENT_REQUIRED:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===402||s.includes("insufficient_credits")},handler:async()=>({maxRetries:0})},PERMISSION_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===403||s.includes("account_needs_reauth")||s.includes("account_restricted")},handler:async()=>({maxRetries:0})},RATE_LIMIT_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===429||s.includes("rate_limited")||s.includes("too many requests")},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:5})},SERVER_ERROR:{match:t=>{let o=E(t);return o===424||o===502||o===503},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:3})},VALIDATION_ERROR:{match:t=>{let o=E(t);return o===400||o===422},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};var ue=z.or(j),pe=U,ce=X,de=N,le=l;var we={entities:{deliveries:de,events:le,tweets:ue,users:pe,webhooks:ce},version:"1.0.0"};import{logEventFromContext as ge}from"corsair/core";import{createHmac as It,timingSafeEqual as vt}from"crypto";var me="x-xquik-signature",Rt="x-xquik-timestamp",At="x-xquik-nonce",Pt="sha256=",Ct=300*1e3;function ke(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function he(t){if(typeof t=="string")try{let o=JSON.parse(t);return ke(o)?o:{}}catch{return{}}return ke(t)?t:{}}function L(t,o){let s=t[o]??t[o.toLowerCase()];if(Array.isArray(s))return s[0];if(typeof s=="string")return s;for(let[p,u]of Object.entries(t))if(p.toLowerCase()===o){if(Array.isArray(u))return u[0];if(typeof u=="string")return u}}function Wt(t){let o=Number.parseInt(t,10);return Number.isFinite(o)?Math.abs(Date.now()-o)<=Ct:!1}function Lt(t,o,s){return`${t}.${o}.${s}`}function Ot(t,o,s,p){let u=It("sha256",p).update(Lt(t,o,s)).digest("hex");return`${Pt}${u}`}function ye(t){return L(t.headers,me)!==void 0}function be(t){return o=>{let s=l.safeParse(he(o.body));return s.success&&s.data.eventType===t}}function fe(){return t=>{let o=l.safeParse(he(t.body));return o.success&&o.data.eventType!=="webhook.test"}}function $(t,o){if(o.trim().length===0)return{error:"Missing Xquik webhook secret",valid:!1};let s=L(t.headers,me),p=L(t.headers,Rt),u=L(t.headers,At);if(s===void 0)return{error:"Missing X-Xquik-Signature header",valid:!1};if(p===void 0)return{error:"Missing X-Xquik-Timestamp header",valid:!1};if(u===void 0)return{error:"Missing X-Xquik-Nonce header",valid:!1};if(!Wt(p))return{error:"Stale Xquik webhook timestamp",valid:!1};if(t.rawBody===void 0)return{error:"Missing raw body for signature verification",valid:!1};let g=Ot(p,u,t.rawBody,o);if(g.length!==s.length)return{error:"Invalid Xquik webhook signature",valid:!1};let I=vt(Buffer.from(g),Buffer.from(s));return I?{valid:I}:{error:"Invalid Xquik webhook signature",valid:!1}}var qe={match:fe(),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.monitorEvent",{eventType:p.eventType},"completed"),{data:p,success:!0}}},xe={match:be("webhook.test"),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.test",{eventType:p.eventType},"completed"),{data:p,success:!0}}};var Q={monitorEvent:qe,test:xe};var Dt={media:{download:T.download,uploadFromUrl:T.uploadFromUrl},trends:{get:A.get},tweets:{batch:c.batch,create:c.create,delete:c.deleteTweet,get:c.get,like:c.like,retweet:c.retweet,search:c.search,unlike:c.unlike},users:{batch:d.batch,follow:d.follow,followers:d.followers,following:d.following,get:d.get,search:d.search,tweets:d.tweets,unfollow:d.unfollow},webhooks:{create:w.create,deactivate:w.deactivate,deliveries:w.deliveries,list:w.list,test:w.test,update:w.update},writeActions:{get:P.get}},Ft={events:{monitor:Q.monitorEvent,test:Q.test}},Gt={"media.download":{input:r.mediaDownload,output:a.mediaDownload},"media.uploadFromUrl":{input:r.mediaUploadFromUrl,output:a.mediaUploadFromUrl},"trends.get":{input:r.trendsGet,output:a.trendsGet},"tweets.batch":{input:r.tweetsBatch,output:a.tweetsBatch},"tweets.create":{input:r.tweetsCreate,output:a.tweetsCreate},"tweets.delete":{input:r.tweetsDelete,output:a.tweetsDelete},"tweets.get":{input:r.tweetsGet,output:a.tweetsGet},"tweets.like":{input:r.tweetsLike,output:a.tweetsLike},"tweets.retweet":{input:r.tweetsRetweet,output:a.tweetsRetweet},"tweets.search":{input:r.tweetsSearch,output:a.tweetsSearch},"tweets.unlike":{input:r.tweetsUnlike,output:a.tweetsUnlike},"users.batch":{input:r.usersBatch,output:a.usersBatch},"users.follow":{input:r.usersFollow,output:a.usersFollow},"users.followers":{input:r.usersFollowers,output:a.usersFollowers},"users.following":{input:r.usersFollowing,output:a.usersFollowing},"users.get":{input:r.usersGet,output:a.usersGet},"users.search":{input:r.usersSearch,output:a.usersSearch},"users.tweets":{input:r.usersTweets,output:a.usersTweets},"users.unfollow":{input:r.usersUnfollow,output:a.usersUnfollow},"webhooks.create":{input:r.webhooksCreate,output:a.webhooksCreate},"webhooks.deactivate":{input:r.webhooksDeactivate,output:a.webhooksDeactivate},"webhooks.deliveries":{input:r.webhooksDeliveries,output:a.webhooksDeliveries},"webhooks.list":{input:r.webhooksList,output:a.webhooksList},"webhooks.test":{input:r.webhooksTest,output:a.webhooksTest},"webhooks.update":{input:r.webhooksUpdate,output:a.webhooksUpdate},"writeActions.get":{input:r.writeActionsGet,output:a.writeActionsGet}},Mt={"events.monitor":{description:"Handle a signed Xquik monitor event delivery",payload:l,response:l},"events.test":{description:"Handle a signed Xquik test webhook delivery",payload:l,response:l}},Bt="api_key",_t={"media.download":{description:"Download images and videos from one or more tweets",riskLevel:"read"},"media.uploadFromUrl":{description:"Upload public media URLs for use in Xquik tweet creation",riskLevel:"write"},"trends.get":{description:"Get trending X topics by WOEID region",riskLevel:"read"},"tweets.batch":{description:"Fetch up to 100 tweets by ID",riskLevel:"read"},"tweets.create":{description:"Create a tweet or reply from a connected X account",riskLevel:"write"},"tweets.delete":{description:"Delete a tweet from a connected X account",irreversible:!0,riskLevel:"destructive"},"tweets.get":{description:"Get a tweet with full text, author, metrics, and media",riskLevel:"read"},"tweets.like":{description:"Like a tweet from a connected X account",riskLevel:"write"},"tweets.retweet":{description:"Retweet a tweet from a connected X account",riskLevel:"write"},"tweets.search":{description:"Search tweets with X query operators and pagination",riskLevel:"read"},"tweets.unlike":{description:"Remove a like from a connected X account",riskLevel:"write"},"users.batch":{description:"Look up up to 100 X users by ID",riskLevel:"read"},"users.follow":{description:"Follow an X user from a connected account",riskLevel:"write"},"users.followers":{description:"List followers of an X user",riskLevel:"read"},"users.following":{description:"List accounts an X user follows",riskLevel:"read"},"users.get":{description:"Get an X user profile by username or user ID",riskLevel:"read"},"users.search":{description:"Search X users by name or username",riskLevel:"read"},"users.tweets":{description:"List recent tweets posted by an X user",riskLevel:"read"},"users.unfollow":{description:"Unfollow an X user from a connected account",riskLevel:"write"},"webhooks.create":{description:"Create an Xquik webhook endpoint subscription",riskLevel:"write"},"webhooks.deactivate":{description:"Deactivate an Xquik webhook endpoint",riskLevel:"write"},"webhooks.deliveries":{description:"List delivery attempts for an Xquik webhook endpoint",riskLevel:"read"},"webhooks.list":{description:"List configured Xquik webhook endpoints",riskLevel:"read"},"webhooks.test":{description:"Send a test delivery to an Xquik webhook endpoint",riskLevel:"write"},"webhooks.update":{description:"Update a Xquik webhook URL, event types, or active state",riskLevel:"write"},"writeActions.get":{description:"Check the status of a pending Xquik write action",riskLevel:"read"}},zt={api_key:{account:["one","webhook_signature"]}};function Go(t={}){let o={...t,authType:t.authType??Bt};return{authConfig:zt,endpointMeta:_t,endpointSchemas:Gt,endpoints:Dt,errorHandlers:{...ae,...o.errorHandlers},hooks:o.hooks,id:"xquik",keyBuilder:async(s,p)=>{if(p==="webhook"&&o.webhookSecret)return o.webhookSecret;if(p==="webhook")return await s.keys.get_webhook_signature()??"";if(p==="endpoint"&&o.key)return o.key;if(p==="endpoint"&&s.authType==="api_key")return await s.keys.get_api_key()??"";throw new Error(`[auth-missing:xquik:${s.authType}]: Xquik key is missing`)},options:o,pluginWebhookMatcher:ye,schema:we,webhookHooks:o.webhookHooks,webhookSchemas:Mt,webhooks:Ft}}export{Go as xquik,zt as xquikAuthConfig,Gt as xquikEndpointSchemas};
1
+ var Se=Object.defineProperty;var q=(t,o)=>{for(var s in o)Se(t,s,{get:o[s],enumerable:!0})};import{AuthMissingError as Ft}from"corsair/core";var E={};q(E,{download:()=>Ae,uploadFromUrl:()=>Re});import{logEventFromContext as V}from"corsair/core";import{ApiError as K,request as Ue}from"corsair/http";var Ie="https://xquik.com/api/v1",ve="2026-04-29",k=class extends Error{constructor(s,p,u){super(s,u);this.code=p;this.name="XquikAPIError",u?.cause instanceof K&&(this.body=u.cause.body,this.rateLimitLimit=u.cause.rateLimitLimit,this.rateLimitRemaining=u.cause.rateLimitRemaining,this.rateLimitReset=u.cause.rateLimitReset,this.retryAfter=u.cause.retryAfter,this.status=u.cause.status,this.statusText=u.cause.statusText)}body;rateLimitLimit;rateLimitRemaining;rateLimitReset;retryAfter;status;statusText};async function n(t,o,s={}){let{baseUrl:p=Ie,body:u,method:g="GET",query:I}=s,Ee={BASE:p,CREDENTIALS:"omit",HEADERS:{"Content-Type":"application/json","x-api-key":o,"xquik-api-contract":ve},TOKEN:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1},Xe={body:g==="GET"?void 0:u,mediaType:"application/json; charset=utf-8",method:g,query:g==="GET"?I:void 0,url:t};try{return await Ue(Ee,Xe)}catch(y){throw y instanceof K?new k(y.message,y.status,{cause:y}):y instanceof Error?new k(y.message,void 0,{cause:y}):new k("Unknown Xquik API error")}}function i(t){return t.baseUrl}function v(t){return t.join(",")}function R(t){return{anyWords:t.anyWords,cashtags:t.cashtags,conversationId:t.conversationId,exactPhrase:t.exactPhrase,excludeWords:t.excludeWords,fromUser:t.fromUser,hashtags:t.hashtags,inReplyToTweetId:t.inReplyToTweetId,language:t.language,mediaType:t.mediaType,mentioning:t.mentioning,minFaves:t.minFaves,minQuotes:t.minQuotes,minReplies:t.minReplies,minRetweets:t.minRetweets,quotes:t.quotes,quotesOfTweetId:t.quotesOfTweetId,replies:t.replies,retweets:t.retweets,retweetsOfTweetId:t.retweetsOfTweetId,sinceDate:t.sinceDate,toUser:t.toUser,untilDate:t.untilDate,url:t.url,verifiedOnly:t.verifiedOnly}}var Re=async(t,o)=>{let s=await n("/x/media",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.uploadFromUrl",{account:o.account},"completed"),s},Ae=async(t,o)=>{let s=await n("/x/media/download",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.download",{bulk:o.tweetIds!==void 0},"completed"),s};var A={};q(A,{get:()=>We});import{logEventFromContext as Pe}from"corsair/core";var We=async(t,o)=>{let s=await n("/x/trends",t.key,{baseUrl:i(t.options),query:{count:o.count,woeid:o.woeid}});return await Pe(t,"xquik.trends.get",{woeid:o.woeid??1},"completed"),s};var c={};q(c,{batch:()=>Ce,create:()=>De,deleteTweet:()=>Fe,get:()=>Le,like:()=>Ge,retweet:()=>Be,search:()=>Oe,unlike:()=>Me});import{logEventFromContext as m}from"corsair/core";var Ce=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await m(t,"xquik.tweets.batch",{count:o.ids.length},"completed"),s},Le=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options)});return await m(t,"xquik.tweets.get",{id:o.id},"completed"),s},Oe=async(t,o)=>{let s=await n("/x/tweets/search",t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,limit:o.limit,q:o.q,queryType:o.queryType,sinceTime:o.sinceTime,untilTime:o.untilTime}});return await m(t,"xquik.tweets.search",{q:o.q},"completed"),s},De=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await m(t,"xquik.tweets.create",{account:o.account,pending:"status"in s&&s.status==="pending_confirmation"},"completed"),s},Fe=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.delete",{id:o.id},"completed"),s},Ge=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.like",{id:o.id},"completed"),s},Me=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.unlike",{id:o.id},"completed"),s},Be=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/retweet`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.retweet",{id:o.id},"completed"),s};var d={};q(d,{batch:()=>_e,follow:()=>Qe,followers:()=>He,following:()=>$e,get:()=>ze,search:()=>je,tweets:()=>Ne,unfollow:()=>Ke});import{logEventFromContext as h}from"corsair/core";var _e=async(t,o)=>{let s=await n("/x/users/batch",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await h(t,"xquik.users.batch",{count:o.ids.length},"completed"),s},ze=async(t,o)=>{let s=await n(`/x/users/${o.id}`,t.key,{baseUrl:i(t.options)});return await h(t,"xquik.users.get",{id:o.id},"completed"),s},je=async(t,o)=>{let s=await n("/x/users/search",t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,q:o.q}});return await h(t,"xquik.users.search",{q:o.q},"completed"),s},Ne=async(t,o)=>{let s=await n(`/x/users/${o.id}/tweets`,t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,includeParentTweet:o.includeParentTweet,includeReplies:o.includeReplies,pageSize:o.pageSize}});return await h(t,"xquik.users.tweets",{id:o.id},"completed"),s},He=async(t,o)=>{let s=await n(`/x/users/${o.id}/followers`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.followers",{id:o.id},"completed"),s},$e=async(t,o)=>{let s=await n(`/x/users/${o.id}/following`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.following",{id:o.id},"completed"),s},Qe=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await h(t,"xquik.users.follow",{id:o.id},"completed"),s},Ke=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await h(t,"xquik.users.unfollow",{id:o.id},"completed"),s};var w={};q(w,{create:()=>Je,deactivate:()=>Ze,deliveries:()=>et,list:()=>Ve,test:()=>tt,update:()=>Ye});import{logEventFromContext as x}from"corsair/core";var Ve=async t=>{let o=await n("/webhooks",t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.list",{count:o.webhooks.length},"completed"),o},Je=async(t,o)=>{let s=await n("/webhooks",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await x(t,"xquik.webhooks.create",{eventTypes:o.eventTypes},"completed"),s},Ye=async(t,o)=>{let{id:s,...p}=o,u=await n(`/webhooks/${s}`,t.key,{baseUrl:i(t.options),body:p,method:"PATCH"});return await x(t,"xquik.webhooks.update",{id:s},"completed"),u},Ze=async(t,o)=>{let s=await n(`/webhooks/${o.id}`,t.key,{baseUrl:i(t.options),method:"DELETE"});return await x(t,"xquik.webhooks.deactivate",{id:o.id},"completed"),s},et=async(t,o)=>{let s=await n(`/webhooks/${o.id}/deliveries`,t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.deliveries",{id:o.id},"completed"),s},tt=async(t,o)=>{let s=await n(`/webhooks/${o.id}/test`,t.key,{baseUrl:i(t.options),method:"POST"});return await x(t,"xquik.webhooks.test",{id:o.id,success:s.success},"completed"),s};var P={};q(P,{get:()=>st});import{logEventFromContext as ot}from"corsair/core";var st=async(t,o)=>{let s=await n(`/x/write-actions/${o.id}`,t.key,{baseUrl:i(t.options)});return await ot(t,"xquik.writeActions.get",{id:o.id},"completed"),s};import{z as e}from"zod";var ee=e.enum(["tweet.new","tweet.quote","tweet.reply","tweet.retweet"]),G=e.array(ee).min(1),J=e.string().regex(/^\d{4}-\d{2}-\d{2}$/),f=e.string(),S=e.string().min(1),M=e.string().min(1),B=e.string().min(1),nt=e.enum(["gifs","images","links","media","none","videos"]),O=e.enum(["exclude","include","only"]),te=e.object({anyWords:e.string().optional(),cashtags:e.string().optional(),conversationId:e.string().optional(),exactPhrase:e.string().optional(),excludeWords:e.string().optional(),fromUser:e.string().optional(),hashtags:e.string().optional(),inReplyToTweetId:e.string().optional(),language:e.string().optional(),mediaType:nt.optional(),mentioning:e.string().optional(),minFaves:e.number().int().min(0).optional(),minQuotes:e.number().int().min(0).optional(),minReplies:e.number().int().min(0).optional(),minRetweets:e.number().int().min(0).optional(),quotes:O.optional(),quotesOfTweetId:e.string().optional(),replies:O.optional(),retweets:O.optional(),retweetsOfTweetId:e.string().optional(),sinceDate:J.optional(),toUser:e.string().optional(),untilDate:J.optional(),url:e.string().optional(),verifiedOnly:e.boolean().optional()}),_=e.object({cursor:e.string().optional()}),oe=e.object({account:B}),se=e.object({mediaUrl:e.string().optional(),type:e.enum(["animated_gif","photo","video"]).optional(),url:e.string().optional()}).passthrough(),U=e.object({coverPicture:e.string().optional(),createdAt:e.string().optional(),description:e.string().optional(),followers:e.number().int().optional(),following:e.number().int().optional(),id:e.string(),location:e.string().optional(),name:e.string(),profilePicture:e.string().optional(),statusesCount:e.number().int().optional(),username:e.string(),verified:e.boolean().optional()}).passthrough(),it=e.object({followers:e.number().int(),id:e.string(),profilePicture:e.string().optional(),username:e.string(),verified:e.boolean()}).passthrough(),z=e.object({author:U.optional(),bookmarkCount:e.number().int().optional(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),inReplyToId:e.string().optional(),inReplyToUserId:e.string().optional(),inReplyToUsername:e.string().optional(),isLimitedReply:e.boolean().optional(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),lang:e.string().optional(),likeCount:e.number().int().optional(),media:e.array(se).optional(),quoteCount:e.number().int().optional(),replyCount:e.number().int().optional(),retweetCount:e.number().int().optional(),source:e.string().optional(),text:e.string(),type:e.string().optional(),url:e.string().optional(),viewCount:e.number().int().optional()}).passthrough(),j=e.object({bookmarkCount:e.number().int(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),likeCount:e.number().int(),media:e.array(se).optional(),quoteCount:e.number().int(),replyCount:e.number().int(),retweetCount:e.number().int(),source:e.string().optional(),text:e.string(),viewCount:e.number().int()}).passthrough(),D=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),tweets:e.array(z)}),W=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),users:e.array(U)}),rt=e.object({author:it.optional(),tweet:j}),b=e.object({success:e.literal(!0)}).passthrough(),at=e.object({charged:e.boolean(),error:e.literal("x_write_unconfirmed"),message:e.string().optional(),retryable:e.literal(!1),status:e.literal("pending_confirmation"),writeActionId:e.string()}),ut=e.union([e.object({success:e.literal(!0),tweetId:e.string()}),at]),pt=e.object({action:e.string(),charged:e.boolean(),confirmationAttempts:e.number().int().optional(),confirmationCheckedAt:e.string().optional(),confirmationSource:e.string().nullable().optional(),confirmedAt:e.string().optional(),createdAt:e.string(),message:e.string().optional(),messageId:e.string().optional(),retryable:e.boolean(),sendDispatched:e.boolean(),sendDispatchedAt:e.string().optional(),status:e.enum(["failed","pending_confirmation","success"]),targetId:e.string().nullable().optional(),tweetId:e.string().optional(),writeActionId:e.string()}).passthrough(),ct=e.object({description:e.string().optional(),name:e.string(),query:e.string().optional(),rank:e.number().int().optional()}).passthrough(),dt=e.object({count:e.number().int(),trends:e.array(ct),woeid:e.number().int()}),lt=e.object({mediaId:e.string(),mediaUrl:e.string().url(),success:e.literal(!0)}),wt=e.object({cacheHit:e.boolean().optional(),galleryUrl:e.string().optional(),totalMedia:e.number().int().optional(),totalTweets:e.number().int().optional(),tweetId:e.string().optional()}).passthrough(),X=e.object({createdAt:f,eventTypes:G,id:e.string(),isActive:e.boolean(),url:e.string().url()}),N=e.object({attempts:e.number().int(),createdAt:f,deliveredAt:f.optional(),id:e.string(),lastError:e.string().optional(),lastStatusCode:e.number().int().optional(),status:e.string(),streamEventId:e.string()}),l=e.object({data:e.record(e.string(),e.unknown()),deliveryId:e.string().optional(),eventType:e.union([ee,e.literal("webhook.test")]),occurredAt:f.optional(),query:e.string().optional(),schemaVersion:e.string().optional(),streamEventId:e.string().optional(),timestamp:f.optional(),username:e.string().optional()}).passthrough(),kt=e.object({error:e.string().optional(),statusCode:e.number().int(),success:e.boolean()}),mt=e.object({ids:e.array(S).min(1).max(100)}),ht=e.object({id:S}),yt=te.merge(_).extend({limit:e.number().int().min(1).max(200).optional(),q:e.string().min(1),queryType:e.enum(["Latest","Top"]).optional(),sinceTime:f.optional(),untilTime:f.optional()}),bt=e.object({account:B,attachment_url:e.string().url().optional(),community_id:e.string().optional(),is_note_tweet:e.boolean().optional(),media:e.array(e.string().url()).max(4).optional(),reply_to_tweet_id:e.string().optional(),text:e.string().optional()}).refine(t=>t.text!==void 0&&t.text.length>0||t.media!==void 0&&t.media.length>0,{message:"Provide text, media, or both."}),C=oe.extend({id:S}),ft=e.object({ids:e.array(M).min(1).max(100)}),H=e.object({id:M}),gt=_.extend({q:e.string().min(1)}),ne=_.extend({pageSize:e.number().int().min(20).max(200).optional()}),qt=H.merge(ne).merge(te).extend({includeParentTweet:e.boolean().optional(),includeReplies:e.boolean().optional()}),Y=H.merge(ne),Z=oe.extend({id:M}),xt=e.object({count:e.number().int().min(1).max(50).optional(),woeid:e.number().int().optional()}),Tt=e.object({account:B,url:e.string().url()}),Et=e.object({tweetId:S.optional(),tweetIds:e.array(S).max(50).optional(),tweetInput:e.string().optional(),tweetUrl:e.string().url().optional()}).refine(t=>t.tweetInput!==void 0||t.tweetId!==void 0||t.tweetUrl!==void 0||t.tweetIds!==void 0&&t.tweetIds.length>0,{message:"Provide tweetInput, tweetId, tweetUrl, or tweetIds."}),Xt=e.object({id:e.string().min(1)}),St=e.object({}),Ut=e.object({eventTypes:G,url:e.string().url()}),It=e.object({eventTypes:G.optional(),id:e.string().min(1),isActive:e.boolean().optional(),url:e.string().url().optional()}).refine(t=>t.eventTypes!==void 0||t.isActive!==void 0||t.url!==void 0,{message:"Provide at least one webhook field to update."}),F=e.object({id:e.string().min(1)}),r={mediaDownload:Et,mediaUploadFromUrl:Tt,trendsGet:xt,tweetsBatch:mt,tweetsCreate:bt,tweetsDelete:C,tweetsGet:ht,tweetsLike:C,tweetsRetweet:C,tweetsSearch:yt,tweetsUnlike:C,usersBatch:ft,usersFollow:Z,usersFollowers:Y,usersFollowing:Y,usersGet:H,usersSearch:gt,usersTweets:qt,usersUnfollow:Z,webhooksCreate:Ut,webhooksDeactivate:F,webhooksDeliveries:F,webhooksList:St,webhooksTest:F,webhooksUpdate:It,writeActionsGet:Xt},a={mediaDownload:wt,mediaUploadFromUrl:lt,trendsGet:dt,tweetsBatch:D,tweetsCreate:ut,tweetsDelete:b,tweetsGet:rt,tweetsLike:b,tweetsRetweet:b,tweetsSearch:D,tweetsUnlike:b,usersBatch:W,usersFollow:b,usersFollowers:W,usersFollowing:W,usersGet:U,usersSearch:W,usersTweets:D,usersUnfollow:b,webhooksCreate:X.extend({secret:e.string()}),webhooksDeactivate:b,webhooksDeliveries:e.object({deliveries:e.array(N)}),webhooksList:e.object({webhooks:e.array(X)}),webhooksTest:kt,webhooksUpdate:X,writeActionsGet:pt};import{ApiError as re}from"corsair/http";function T(t){if(t instanceof re||t instanceof k)return t.status}function ie(t){if(t instanceof re||t instanceof k)return t.retryAfter}var ae={AUTH_ERROR:{match:t=>{let o=T(t),s=t.message.toLowerCase();return o===401||s.includes("unauthorized")||s.includes("invalid api key")},handler:async()=>({maxRetries:0})},PAYMENT_REQUIRED:{match:t=>{let o=T(t),s=t.message.toLowerCase();return o===402||s.includes("insufficient_credits")},handler:async()=>({maxRetries:0})},PERMISSION_ERROR:{match:t=>{let o=T(t),s=t.message.toLowerCase();return o===403||s.includes("account_needs_reauth")||s.includes("account_restricted")},handler:async()=>({maxRetries:0})},RATE_LIMIT_ERROR:{match:t=>{let o=T(t),s=t.message.toLowerCase();return o===429||s.includes("rate_limited")||s.includes("too many requests")},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:5})},SERVER_ERROR:{match:t=>{let o=T(t);return o===424||o===502||o===503},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:3})},VALIDATION_ERROR:{match:t=>{let o=T(t);return o===400||o===422},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};var ue=z.or(j),pe=U,ce=X,de=N,le=l;var we={entities:{deliveries:de,events:le,tweets:ue,users:pe,webhooks:ce},version:"1.0.0"};import{logEventFromContext as ge}from"corsair/core";import{createHmac as vt,timingSafeEqual as Rt}from"crypto";var me="x-xquik-signature",At="x-xquik-timestamp",Pt="x-xquik-nonce",Wt="sha256=",Ct=300*1e3;function ke(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function he(t){if(typeof t=="string")try{let o=JSON.parse(t);return ke(o)?o:{}}catch{return{}}return ke(t)?t:{}}function L(t,o){let s=t[o]??t[o.toLowerCase()];if(Array.isArray(s))return s[0];if(typeof s=="string")return s;for(let[p,u]of Object.entries(t))if(p.toLowerCase()===o){if(Array.isArray(u))return u[0];if(typeof u=="string")return u}}function Lt(t){let o=Number.parseInt(t,10);return Number.isFinite(o)?Math.abs(Date.now()-o)<=Ct:!1}function Ot(t,o,s){return`${t}.${o}.${s}`}function Dt(t,o,s,p){let u=vt("sha256",p).update(Ot(t,o,s)).digest("hex");return`${Wt}${u}`}function ye(t){return L(t.headers,me)!==void 0}function be(t){return o=>{let s=l.safeParse(he(o.body));return s.success&&s.data.eventType===t}}function fe(){return t=>{let o=l.safeParse(he(t.body));return o.success&&o.data.eventType!=="webhook.test"}}function $(t,o){if(o.trim().length===0)return{error:"Missing Xquik webhook secret",valid:!1};let s=L(t.headers,me),p=L(t.headers,At),u=L(t.headers,Pt);if(s===void 0)return{error:"Missing X-Xquik-Signature header",valid:!1};if(p===void 0)return{error:"Missing X-Xquik-Timestamp header",valid:!1};if(u===void 0)return{error:"Missing X-Xquik-Nonce header",valid:!1};if(!Lt(p))return{error:"Stale Xquik webhook timestamp",valid:!1};if(t.rawBody===void 0)return{error:"Missing raw body for signature verification",valid:!1};let g=Dt(p,u,t.rawBody,o);if(g.length!==s.length)return{error:"Invalid Xquik webhook signature",valid:!1};let I=Rt(Buffer.from(g),Buffer.from(s));return I?{valid:I}:{error:"Invalid Xquik webhook signature",valid:!1}}var qe={match:fe(),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.monitorEvent",{eventType:p.eventType},"completed"),{data:p,success:!0}}},xe={match:be("webhook.test"),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.test",{eventType:p.eventType},"completed"),{data:p,success:!0}}};var Q={monitorEvent:qe,test:xe};function Te(t){return null}var Gt={media:{download:E.download,uploadFromUrl:E.uploadFromUrl},trends:{get:A.get},tweets:{batch:c.batch,create:c.create,delete:c.deleteTweet,get:c.get,like:c.like,retweet:c.retweet,search:c.search,unlike:c.unlike},users:{batch:d.batch,follow:d.follow,followers:d.followers,following:d.following,get:d.get,search:d.search,tweets:d.tweets,unfollow:d.unfollow},webhooks:{create:w.create,deactivate:w.deactivate,deliveries:w.deliveries,list:w.list,test:w.test,update:w.update},writeActions:{get:P.get}},Mt={events:{monitor:Q.monitorEvent,test:Q.test}},Bt={"media.download":{input:r.mediaDownload,output:a.mediaDownload},"media.uploadFromUrl":{input:r.mediaUploadFromUrl,output:a.mediaUploadFromUrl},"trends.get":{input:r.trendsGet,output:a.trendsGet},"tweets.batch":{input:r.tweetsBatch,output:a.tweetsBatch},"tweets.create":{input:r.tweetsCreate,output:a.tweetsCreate},"tweets.delete":{input:r.tweetsDelete,output:a.tweetsDelete},"tweets.get":{input:r.tweetsGet,output:a.tweetsGet},"tweets.like":{input:r.tweetsLike,output:a.tweetsLike},"tweets.retweet":{input:r.tweetsRetweet,output:a.tweetsRetweet},"tweets.search":{input:r.tweetsSearch,output:a.tweetsSearch},"tweets.unlike":{input:r.tweetsUnlike,output:a.tweetsUnlike},"users.batch":{input:r.usersBatch,output:a.usersBatch},"users.follow":{input:r.usersFollow,output:a.usersFollow},"users.followers":{input:r.usersFollowers,output:a.usersFollowers},"users.following":{input:r.usersFollowing,output:a.usersFollowing},"users.get":{input:r.usersGet,output:a.usersGet},"users.search":{input:r.usersSearch,output:a.usersSearch},"users.tweets":{input:r.usersTweets,output:a.usersTweets},"users.unfollow":{input:r.usersUnfollow,output:a.usersUnfollow},"webhooks.create":{input:r.webhooksCreate,output:a.webhooksCreate},"webhooks.deactivate":{input:r.webhooksDeactivate,output:a.webhooksDeactivate},"webhooks.deliveries":{input:r.webhooksDeliveries,output:a.webhooksDeliveries},"webhooks.list":{input:r.webhooksList,output:a.webhooksList},"webhooks.test":{input:r.webhooksTest,output:a.webhooksTest},"webhooks.update":{input:r.webhooksUpdate,output:a.webhooksUpdate},"writeActions.get":{input:r.writeActionsGet,output:a.writeActionsGet}},_t={"events.monitor":{description:"Handle a signed Xquik monitor event delivery",payload:l,response:l},"events.test":{description:"Handle a signed Xquik test webhook delivery",payload:l,response:l}},zt="api_key",jt={"media.download":{description:"Download images and videos from one or more tweets",riskLevel:"read"},"media.uploadFromUrl":{description:"Upload public media URLs for use in Xquik tweet creation",riskLevel:"write"},"trends.get":{description:"Get trending X topics by WOEID region",riskLevel:"read"},"tweets.batch":{description:"Fetch up to 100 tweets by ID",riskLevel:"read"},"tweets.create":{description:"Create a tweet or reply from a connected X account",riskLevel:"write"},"tweets.delete":{description:"Delete a tweet from a connected X account",irreversible:!0,riskLevel:"destructive"},"tweets.get":{description:"Get a tweet with full text, author, metrics, and media",riskLevel:"read"},"tweets.like":{description:"Like a tweet from a connected X account",riskLevel:"write"},"tweets.retweet":{description:"Retweet a tweet from a connected X account",riskLevel:"write"},"tweets.search":{description:"Search tweets with X query operators and pagination",riskLevel:"read"},"tweets.unlike":{description:"Remove a like from a connected X account",riskLevel:"write"},"users.batch":{description:"Look up up to 100 X users by ID",riskLevel:"read"},"users.follow":{description:"Follow an X user from a connected account",riskLevel:"write"},"users.followers":{description:"List followers of an X user",riskLevel:"read"},"users.following":{description:"List accounts an X user follows",riskLevel:"read"},"users.get":{description:"Get an X user profile by username or user ID",riskLevel:"read"},"users.search":{description:"Search X users by name or username",riskLevel:"read"},"users.tweets":{description:"List recent tweets posted by an X user",riskLevel:"read"},"users.unfollow":{description:"Unfollow an X user from a connected account",riskLevel:"write"},"webhooks.create":{description:"Create an Xquik webhook endpoint subscription",riskLevel:"write"},"webhooks.deactivate":{description:"Deactivate an Xquik webhook endpoint",riskLevel:"write"},"webhooks.deliveries":{description:"List delivery attempts for an Xquik webhook endpoint",riskLevel:"read"},"webhooks.list":{description:"List configured Xquik webhook endpoints",riskLevel:"read"},"webhooks.test":{description:"Send a test delivery to an Xquik webhook endpoint",riskLevel:"write"},"webhooks.update":{description:"Update a Xquik webhook URL, event types, or active state",riskLevel:"write"},"writeActions.get":{description:"Check the status of a pending Xquik write action",riskLevel:"read"}},Nt={api_key:{}};function jo(t={}){let o={...t,authType:t.authType??zt};return{id:"xquik",authConfig:Nt,endpointMeta:jt,endpointSchemas:Bt,endpoints:Gt,errorHandlers:{...ae,...o.errorHandlers},hooks:o.hooks,keyBuilder:async(s,p)=>{if(p==="webhook"&&o.webhookSecret)return o.webhookSecret;if(p==="webhook")return await s.keys.get_webhook_signature()??"";if(p==="endpoint"&&o.key)return o.key;if(p==="endpoint"&&s.authType==="api_key")return await s.keys.get_api_key()??"";throw new Ft("xquik","api_key")},options:o,pluginWebhookMatcher:ye,pluginTenantWebhookMatcher:Te,schema:we,webhookHooks:o.webhookHooks,webhookSchemas:_t,webhooks:Mt}}export{jo as xquik,Nt as xquikAuthConfig,Bt as xquikEndpointSchemas};
@@ -0,0 +1,3 @@
1
+ import type { RawWebhookRequest, WebhookTenantMatch } from 'corsair/core';
2
+ export declare function matchXquikTenantWebhook(_request: RawWebhookRequest): WebhookTenantMatch | null;
3
+ //# sourceMappingURL=tenant-matcher.d.ts.map
@@ -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;AAK1E,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,iBAAiB,GACzB,kBAAkB,GAAG,IAAI,CAE3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@corsair-dev/xquik",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Search tweets, inspect users, manage Xquik webhooks, upload media, and run X actions from 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
- "corsair": "0.1.69"
26
+ "jest": "^29.7.0",
27
+ "corsair": "0.1.130"
27
28
  },
28
29
  "keywords": [
29
30
  "corsair",
30
31
  "xquik",
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
- "dependencies": {
39
- "jest": "^29.7.0"
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/corsairdev/corsair.git",
42
+ "directory": "packages/xquik"
40
43
  },
44
+ "homepage": "https://docs.corsair.dev/plugins/xquik",
41
45
  "scripts": {
42
46
  "build": "rm -rf dist && tsc --build --force && tsup",
43
47
  "typecheck": "tsc --noEmit",