@apicity/x 0.3.4 → 0.4.1
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 +37 -18
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/oauth.d.ts +3 -0
- package/dist/src/oauth.d.ts.map +1 -0
- package/dist/src/oauth.js +91 -0
- package/dist/src/oauth.js.map +1 -0
- package/dist/src/types.d.ts +25 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/x.d.ts +1 -1
- package/dist/src/zod.d.ts +46 -0
- package/dist/src/zod.d.ts.map +1 -1
- package/dist/src/zod.js +32 -2
- package/dist/src/zod.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
# @apicity/x
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@apicity/x)
|
|
4
|
-
[](package.json)
|
|
5
5
|
[](tsconfig.json)
|
|
6
6
|
|
|
7
7
|
X (formerly Twitter) social API provider for posting content (api.x.com).
|
|
8
8
|
|
|
9
|
+
Runtime dependencies:
|
|
10
|
+
|
|
11
|
+
- `zod@^3.24.0` — request schemas attached to every POST endpoint as `.schema`
|
|
12
|
+
|
|
9
13
|
## Installation
|
|
10
14
|
|
|
11
15
|
```bash
|
|
@@ -68,11 +72,12 @@ token + refresh token. Access tokens last 2 hours; the refresh token
|
|
|
68
72
|
re-authorizing.
|
|
69
73
|
|
|
70
74
|
<details>
|
|
71
|
-
<summary><code>mint-x-token.mjs</code> —
|
|
75
|
+
<summary><code>mint-x-token.mjs</code> — OAuth 2.0 PKCE helper</summary>
|
|
72
76
|
|
|
73
77
|
```javascript
|
|
74
78
|
import http from "node:http";
|
|
75
79
|
import crypto from "node:crypto";
|
|
80
|
+
import { createXOAuth } from "@apicity/x";
|
|
76
81
|
|
|
77
82
|
const CLIENT_ID = process.env.X_CLIENT_ID;
|
|
78
83
|
const CLIENT_SECRET = process.env.X_CLIENT_SECRET;
|
|
@@ -120,23 +125,16 @@ const server = http.createServer(async (req, res) => {
|
|
|
120
125
|
server.close();
|
|
121
126
|
process.exit(1);
|
|
122
127
|
}
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
body: new URLSearchParams({
|
|
133
|
-
grant_type: "authorization_code",
|
|
134
|
-
code,
|
|
135
|
-
redirect_uri: REDIRECT,
|
|
136
|
-
code_verifier: verifier,
|
|
137
|
-
}),
|
|
128
|
+
const oauth = createXOAuth({
|
|
129
|
+
clientId: CLIENT_ID,
|
|
130
|
+
clientSecret: CLIENT_SECRET,
|
|
131
|
+
});
|
|
132
|
+
const tok = await oauth.post.v2.oauth2.token({
|
|
133
|
+
grant_type: "authorization_code",
|
|
134
|
+
code,
|
|
135
|
+
redirect_uri: REDIRECT,
|
|
136
|
+
code_verifier: verifier,
|
|
138
137
|
});
|
|
139
|
-
const tok = await tokenRes.json();
|
|
140
138
|
console.log(JSON.stringify(tok, null, 2));
|
|
141
139
|
res.writeHead(200).end("Authorized — check your terminal.");
|
|
142
140
|
server.close();
|
|
@@ -159,6 +157,27 @@ await x.post.v2.tweets({
|
|
|
159
157
|
});
|
|
160
158
|
```
|
|
161
159
|
|
|
160
|
+
### 5. Refresh the token
|
|
161
|
+
|
|
162
|
+
Access tokens expire after 2 hours. Use `createXOAuth` with the refresh
|
|
163
|
+
token from step 3 to mint a fresh one without re-authorizing. Refresh
|
|
164
|
+
tokens may rotate — persist `refresh_token` from the response when X
|
|
165
|
+
returns one, and keep the old one when it's omitted.
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
import { createXOAuth } from "@apicity/x";
|
|
169
|
+
|
|
170
|
+
const oauth = createXOAuth({
|
|
171
|
+
clientId: process.env.X_CLIENT_ID!,
|
|
172
|
+
clientSecret: process.env.X_CLIENT_SECRET!,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const tok = await oauth.post.v2.oauth2.token({
|
|
176
|
+
grant_type: "refresh_token",
|
|
177
|
+
refresh_token: storedRefreshToken,
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
162
181
|
## Real-world example: post a video
|
|
163
182
|
|
|
164
183
|
Posting a video on X is a four-call dance — initialize a chunked
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { createX } from "./x";
|
|
2
|
-
export {
|
|
3
|
-
export
|
|
1
|
+
export { createX } from "./x.js";
|
|
2
|
+
export { createXOAuth } from "./oauth.js";
|
|
3
|
+
export { XError } from "./types.js";
|
|
4
|
+
export type { XOptions, XMediaUploadInitializeRequest, XMediaUploadInitializeResponse, XMediaUploadInitializeData, XMediaUploadInitializeMethod, XMediaUploadAppendRequest, XMediaUploadAppendResponse, XMediaUploadAppendMethod, XMediaUploadFinalizeResponse, XMediaUploadFinalizeMethod, XMediaUploadStatusResponse, XMediaUploadStatusMethod, XTweetCreateRequest, XTweetCreateResponse, XTweetCreateMethod, XMediaProcessingInfo, XMediaUploadNamespace, XMediaNamespace, XPostV2Namespace, XPostNamespace, XGetMediaNamespace, XGetV2Namespace, XGetNamespace, XProvider, XOAuthOptions, XOAuthTokenRequest, XOAuthTokenResponse, XOAuthTokenMethod, XOAuth2Namespace, XOAuthPostV2Namespace, XOAuthPostNamespace, XOAuthProvider, } from "./types.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAY,EACV,QAAQ,EACR,6BAA6B,EAC7B,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC"}
|
package/dist/src/index.js
CHANGED
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAGb,cAAc,EAEf,MAAM,SAAS,CAAC;AAIjB,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAwGhE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { XError, } from "./types.js";
|
|
2
|
+
import { XOAuthTokenRequestSchema } from "./zod.js";
|
|
3
|
+
import { attachExamples } from "./example.js";
|
|
4
|
+
export function createXOAuth(opts) {
|
|
5
|
+
const baseURL = opts.baseURL ?? "https://api.x.com";
|
|
6
|
+
const doFetch = opts.fetch ?? fetch;
|
|
7
|
+
const timeout = opts.timeout ?? 30000;
|
|
8
|
+
const basic = btoa(`${opts.clientId}:${opts.clientSecret}`);
|
|
9
|
+
function attachAbortHandler(signal, controller) {
|
|
10
|
+
if (signal.aborted) {
|
|
11
|
+
controller.abort();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
15
|
+
}
|
|
16
|
+
// The token endpoint reports failures in the RFC 6749 shape
|
|
17
|
+
// `{ error, error_description }`, not the X v2 `{ errors: [...] }` /
|
|
18
|
+
// `{ title, detail }` shapes the rest of the API uses.
|
|
19
|
+
function formatErrorMessage(status, body) {
|
|
20
|
+
if (typeof body === "object" && body !== null) {
|
|
21
|
+
const b = body;
|
|
22
|
+
if (b.error_description) {
|
|
23
|
+
return `X OAuth error ${status}: ${b.error_description}`;
|
|
24
|
+
}
|
|
25
|
+
if (b.error)
|
|
26
|
+
return `X OAuth error ${status}: ${b.error}`;
|
|
27
|
+
}
|
|
28
|
+
return `X OAuth error: ${status}`;
|
|
29
|
+
}
|
|
30
|
+
// sig-ok: numeric URL segments (`/2/`) become identifier-safe (`v2`)
|
|
31
|
+
// POST https://api.x.com/2/oauth2/token
|
|
32
|
+
// Docs: https://docs.x.com/x-api/fundamentals/authentication/oauth-2-0/user-access-token
|
|
33
|
+
// Confidential clients authenticate with Basic clientId:clientSecret; the
|
|
34
|
+
// grant_type field selects authorization-code (PKCE) exchange vs refresh.
|
|
35
|
+
const token = Object.assign(async (req, signal) => {
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
38
|
+
if (signal) {
|
|
39
|
+
attachAbortHandler(signal, controller);
|
|
40
|
+
}
|
|
41
|
+
const form = new URLSearchParams();
|
|
42
|
+
form.set("grant_type", req.grant_type);
|
|
43
|
+
if (req.grant_type === "authorization_code") {
|
|
44
|
+
form.set("code", req.code);
|
|
45
|
+
form.set("redirect_uri", req.redirect_uri);
|
|
46
|
+
form.set("code_verifier", req.code_verifier);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
form.set("refresh_token", req.refresh_token);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const res = await doFetch(`${baseURL}/2/oauth2/token`, {
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: {
|
|
55
|
+
Authorization: `Basic ${basic}`,
|
|
56
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
57
|
+
},
|
|
58
|
+
body: form,
|
|
59
|
+
signal: controller.signal,
|
|
60
|
+
});
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
let resBody = null;
|
|
64
|
+
try {
|
|
65
|
+
resBody = await res.json();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// ignore parse errors
|
|
69
|
+
}
|
|
70
|
+
throw new XError(formatErrorMessage(res.status, resBody), res.status, resBody);
|
|
71
|
+
}
|
|
72
|
+
return (await res.json());
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
clearTimeout(timeoutId);
|
|
76
|
+
if (error instanceof XError)
|
|
77
|
+
throw error;
|
|
78
|
+
throw new XError(`X request failed: ${error}`, 500);
|
|
79
|
+
}
|
|
80
|
+
}, { schema: XOAuthTokenRequestSchema });
|
|
81
|
+
return attachExamples({
|
|
82
|
+
post: {
|
|
83
|
+
v2: {
|
|
84
|
+
oauth2: {
|
|
85
|
+
token,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { XMediaUploadInitializeRequest, XMediaUploadAppendRequest, XTweetCreateRequest } from "./zod";
|
|
3
|
-
export type { XOptions, XMediaUploadInitializeRequest, XMediaUploadAppendRequest, XTweetCreateRequest, } from "./zod";
|
|
2
|
+
import type { XMediaUploadInitializeRequest, XMediaUploadAppendRequest, XTweetCreateRequest, XOAuthTokenRequest } from "./zod.js";
|
|
3
|
+
export type { XOptions, XOAuthOptions, XMediaUploadInitializeRequest, XMediaUploadAppendRequest, XTweetCreateRequest, XOAuthTokenRequest, } from "./zod.js";
|
|
4
4
|
export declare class XError extends Error {
|
|
5
5
|
readonly status: number;
|
|
6
6
|
readonly body: unknown;
|
|
@@ -40,6 +40,13 @@ export interface XTweetCreateResponse {
|
|
|
40
40
|
text: string;
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
+
export interface XOAuthTokenResponse {
|
|
44
|
+
access_token: string;
|
|
45
|
+
refresh_token?: string;
|
|
46
|
+
expires_in: number;
|
|
47
|
+
token_type?: string;
|
|
48
|
+
scope?: string;
|
|
49
|
+
}
|
|
43
50
|
export interface XMediaUploadInitializeMethod {
|
|
44
51
|
(req: XMediaUploadInitializeRequest, signal?: AbortSignal): Promise<XMediaUploadInitializeResponse>;
|
|
45
52
|
schema: z.ZodType<XMediaUploadInitializeRequest>;
|
|
@@ -58,6 +65,10 @@ export interface XTweetCreateMethod {
|
|
|
58
65
|
(req: XTweetCreateRequest, signal?: AbortSignal): Promise<XTweetCreateResponse>;
|
|
59
66
|
schema: z.ZodType<XTweetCreateRequest>;
|
|
60
67
|
}
|
|
68
|
+
export interface XOAuthTokenMethod {
|
|
69
|
+
(req: XOAuthTokenRequest, signal?: AbortSignal): Promise<XOAuthTokenResponse>;
|
|
70
|
+
schema: z.ZodType<XOAuthTokenRequest>;
|
|
71
|
+
}
|
|
61
72
|
export interface XMediaUploadNamespace {
|
|
62
73
|
initialize: XMediaUploadInitializeMethod;
|
|
63
74
|
append: XMediaUploadAppendMethod;
|
|
@@ -86,4 +97,16 @@ export interface XProvider {
|
|
|
86
97
|
post: XPostNamespace;
|
|
87
98
|
get: XGetNamespace;
|
|
88
99
|
}
|
|
100
|
+
export interface XOAuth2Namespace {
|
|
101
|
+
token: XOAuthTokenMethod;
|
|
102
|
+
}
|
|
103
|
+
export interface XOAuthPostV2Namespace {
|
|
104
|
+
oauth2: XOAuth2Namespace;
|
|
105
|
+
}
|
|
106
|
+
export interface XOAuthPostNamespace {
|
|
107
|
+
v2: XOAuthPostV2Namespace;
|
|
108
|
+
}
|
|
109
|
+
export interface XOAuthProvider {
|
|
110
|
+
post: XOAuthPostNamespace;
|
|
111
|
+
}
|
|
89
112
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,6BAA6B,EAC7B,yBAAyB,EACzB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAiBA,+EAA+E;AAE/E,MAAM,OAAO,MAAO,SAAQ,KAAK;IACtB,MAAM,CAAS;IACf,IAAI,CAAU;IACd,IAAI,CAAU;IAEvB,YAAY,OAAe,EAAE,MAAc,EAAE,IAAc,EAAE,IAAa;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
package/dist/src/x.d.ts
CHANGED
package/dist/src/zod.d.ts
CHANGED
|
@@ -16,6 +16,52 @@ export declare const XOptionsSchema: z.ZodObject<{
|
|
|
16
16
|
fetch?: typeof fetch | undefined;
|
|
17
17
|
}>;
|
|
18
18
|
export type XOptions = z.infer<typeof XOptionsSchema>;
|
|
19
|
+
export declare const XOAuthOptionsSchema: z.ZodObject<{
|
|
20
|
+
clientId: z.ZodString;
|
|
21
|
+
clientSecret: z.ZodString;
|
|
22
|
+
baseURL: z.ZodOptional<z.ZodString>;
|
|
23
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
fetch: z.ZodOptional<z.ZodType<typeof fetch, z.ZodTypeDef, typeof fetch>>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
clientId: string;
|
|
27
|
+
clientSecret: string;
|
|
28
|
+
baseURL?: string | undefined;
|
|
29
|
+
timeout?: number | undefined;
|
|
30
|
+
fetch?: typeof fetch | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
clientId: string;
|
|
33
|
+
clientSecret: string;
|
|
34
|
+
baseURL?: string | undefined;
|
|
35
|
+
timeout?: number | undefined;
|
|
36
|
+
fetch?: typeof fetch | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
export type XOAuthOptions = z.infer<typeof XOAuthOptionsSchema>;
|
|
39
|
+
export declare const XOAuthTokenRequestSchema: z.ZodDiscriminatedUnion<"grant_type", [z.ZodObject<{
|
|
40
|
+
grant_type: z.ZodLiteral<"authorization_code">;
|
|
41
|
+
code: z.ZodString;
|
|
42
|
+
redirect_uri: z.ZodString;
|
|
43
|
+
code_verifier: z.ZodString;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
code: string;
|
|
46
|
+
grant_type: "authorization_code";
|
|
47
|
+
redirect_uri: string;
|
|
48
|
+
code_verifier: string;
|
|
49
|
+
}, {
|
|
50
|
+
code: string;
|
|
51
|
+
grant_type: "authorization_code";
|
|
52
|
+
redirect_uri: string;
|
|
53
|
+
code_verifier: string;
|
|
54
|
+
}>, z.ZodObject<{
|
|
55
|
+
grant_type: z.ZodLiteral<"refresh_token">;
|
|
56
|
+
refresh_token: z.ZodString;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
grant_type: "refresh_token";
|
|
59
|
+
refresh_token: string;
|
|
60
|
+
}, {
|
|
61
|
+
grant_type: "refresh_token";
|
|
62
|
+
refresh_token: string;
|
|
63
|
+
}>]>;
|
|
64
|
+
export type XOAuthTokenRequest = z.infer<typeof XOAuthTokenRequestSchema>;
|
|
19
65
|
export declare const XMediaUploadInitializeRequestSchema: z.ZodObject<{
|
|
20
66
|
media_type: z.ZodOptional<z.ZodEnum<["video/mp4", "video/webm", "video/mp2t", "video/quicktime", "text/srt", "text/vtt", "image/jpeg", "image/gif", "image/bmp", "image/png", "image/webp", "image/pjpeg", "image/tiff", "model/gltf-binary", "model/vnd.usdz+zip"]>>;
|
|
21
67
|
total_bytes: z.ZodOptional<z.ZodNumber>;
|
package/dist/src/zod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAKzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAKtD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAkBhE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;IAWnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAsC1E,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;EAM9C,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,mCAAmC,CAC3C,CAAC;AAUF,eAAO,MAAM,+BAA+B;;;;;;;;;EAG1C,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAqEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
package/dist/src/zod.js
CHANGED
|
@@ -4,14 +4,25 @@ import { z } from "zod";
|
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
// X requires a user-context OAuth 2.0 access token to post or upload media.
|
|
6
6
|
// App-only Bearer tokens are read-only and rejected by the upload + tweets
|
|
7
|
-
// endpoints. The caller
|
|
8
|
-
//
|
|
7
|
+
// endpoints. The caller runs the browser authorize step (PKCE) externally,
|
|
8
|
+
// then uses `createXOAuth` to exchange the code and refresh tokens, and
|
|
9
|
+
// supplies the resulting access token here.
|
|
9
10
|
export const XOptionsSchema = z.object({
|
|
10
11
|
accessToken: z.string().min(1),
|
|
11
12
|
baseURL: z.string().optional(),
|
|
12
13
|
timeout: z.number().optional(),
|
|
13
14
|
fetch: z.custom().optional(),
|
|
14
15
|
});
|
|
16
|
+
// Options for the OAuth token client (`createXOAuth`). Authenticates as a
|
|
17
|
+
// confidential client with Basic clientId:clientSecret — no access token,
|
|
18
|
+
// since this is how access tokens are obtained in the first place.
|
|
19
|
+
export const XOAuthOptionsSchema = z.object({
|
|
20
|
+
clientId: z.string().min(1),
|
|
21
|
+
clientSecret: z.string().min(1),
|
|
22
|
+
baseURL: z.string().optional(),
|
|
23
|
+
timeout: z.number().optional(),
|
|
24
|
+
fetch: z.custom().optional(),
|
|
25
|
+
});
|
|
15
26
|
// ---------------------------------------------------------------------------
|
|
16
27
|
// Shared building blocks
|
|
17
28
|
// ---------------------------------------------------------------------------
|
|
@@ -19,6 +30,25 @@ export const XOptionsSchema = z.object({
|
|
|
19
30
|
// precision loss in JS — every id field on this surface uses this pattern.
|
|
20
31
|
const XIdStringSchema = z.string().regex(/^[0-9]{1,19}$/);
|
|
21
32
|
// ---------------------------------------------------------------------------
|
|
33
|
+
// POST /2/oauth2/token
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// One endpoint, two grants (RFC 6749): authorization_code finishes the PKCE
|
|
36
|
+
// flow started in a browser; refresh_token rotates an expiring access token.
|
|
37
|
+
// The body is form-encoded by the factory — the schema validates the typed
|
|
38
|
+
// request object.
|
|
39
|
+
export const XOAuthTokenRequestSchema = z.discriminatedUnion("grant_type", [
|
|
40
|
+
z.object({
|
|
41
|
+
grant_type: z.literal("authorization_code"),
|
|
42
|
+
code: z.string().min(1),
|
|
43
|
+
redirect_uri: z.string().min(1),
|
|
44
|
+
code_verifier: z.string().min(1),
|
|
45
|
+
}),
|
|
46
|
+
z.object({
|
|
47
|
+
grant_type: z.literal("refresh_token"),
|
|
48
|
+
refresh_token: z.string().min(1),
|
|
49
|
+
}),
|
|
50
|
+
]);
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
22
52
|
// POST /2/media/upload/initialize
|
|
23
53
|
// ---------------------------------------------------------------------------
|
|
24
54
|
const XMediaTypeSchema = z.enum([
|
package/dist/src/zod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,4EAA4E;AAC5E,2EAA2E;AAC3E,
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/zod.ts"],"names":[],"mappings":"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"}
|