fxtwitter 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -31
- package/dist/{v1-KUPCoHD9.mjs → http-BTdKgEdX.mjs} +1 -56
- package/dist/http-CidaL0TV.d.cts +24 -0
- package/dist/http-CidaL0TV.d.mts +24 -0
- package/dist/{v1-Da3KbdIz.cjs → http-Cs4GJeg-.cjs} +2 -57
- package/dist/index.cjs +48 -2
- package/dist/index.d.cts +40 -2
- package/dist/index.d.mts +40 -2
- package/dist/index.mjs +45 -2
- package/dist/v1-BFKgLuJi.cjs +92 -0
- package/dist/v1-ByqsBlpO.mjs +87 -0
- package/dist/v1.cjs +1 -1
- package/dist/v1.d.cts +252 -1
- package/dist/v1.d.mts +252 -1
- package/dist/v1.mjs +1 -1
- package/dist/v2.cjs +183 -0
- package/dist/v2.d.cts +685 -0
- package/dist/v2.d.mts +685 -0
- package/dist/v2.mjs +181 -0
- package/package.json +9 -1
- package/dist/v1-BKUGwGbc.d.cts +0 -267
- package/dist/v1-BKUGwGbc.d.mts +0 -267
package/dist/v2.cjs
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_http = require("./http-Cs4GJeg-.cjs");
|
|
3
|
+
//#region src/v2.ts
|
|
4
|
+
/** Builds the `id:<rest_id>` handle form accepted by the profile endpoints. */
|
|
5
|
+
function byUserId(id) {
|
|
6
|
+
return `id:${id}`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Recovers the body of a 404 that carries a well-formed, empty result page,
|
|
10
|
+
* which is how the list endpoints report "no results or timeline unavailable".
|
|
11
|
+
*/
|
|
12
|
+
function emptyPage(error) {
|
|
13
|
+
if (!(error instanceof require_http.FxTwitterError) || error.status !== 404) return null;
|
|
14
|
+
const body = error.body;
|
|
15
|
+
if (typeof body !== "object" || body === null) return null;
|
|
16
|
+
const results = body.results;
|
|
17
|
+
return Array.isArray(results) ? body : null;
|
|
18
|
+
}
|
|
19
|
+
/** Client for the FxTwitter/FxEmbed v2 API (https://docs.fxembed.com/api/twitter/). */
|
|
20
|
+
var FxTwitterV2 = class {
|
|
21
|
+
http;
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
this.http = new require_http.HttpClient(options);
|
|
24
|
+
}
|
|
25
|
+
/** Only `/2/profile/{handle}/statuses` can answer 204, so everything else demands a body. */
|
|
26
|
+
async get(path, query, signal) {
|
|
27
|
+
const body = await this.http.get({
|
|
28
|
+
path,
|
|
29
|
+
query,
|
|
30
|
+
signal
|
|
31
|
+
});
|
|
32
|
+
if (body === null) throw new require_http.FxTwitterError("The API returned an empty response");
|
|
33
|
+
return body;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Same as {@link get}, for the endpoints that report "no results" as a 404
|
|
37
|
+
* carrying an otherwise normal body. An empty page is a result, not an
|
|
38
|
+
* error, so it is returned rather than thrown.
|
|
39
|
+
*
|
|
40
|
+
* The API uses that same 404 for an unknown handle, which it does not
|
|
41
|
+
* distinguish from an empty timeline.
|
|
42
|
+
*/
|
|
43
|
+
async getPage(path, query, signal) {
|
|
44
|
+
try {
|
|
45
|
+
return await this.get(path, query, signal);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const page = emptyPage(error);
|
|
48
|
+
if (page) return page;
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** `GET /2/status/{id}` — a single post by snowflake ID. */
|
|
53
|
+
getStatus(id, options = {}) {
|
|
54
|
+
return this.get(`/2/status/${encodeURIComponent(id)}`, {
|
|
55
|
+
about_account: options.aboutAccount ? "1" : void 0,
|
|
56
|
+
lang: options.lang
|
|
57
|
+
}, options.signal);
|
|
58
|
+
}
|
|
59
|
+
/** `GET /2/status/{id}/reposts` — users who reposted a post. */
|
|
60
|
+
getStatusReposts(id, options = {}) {
|
|
61
|
+
return this.getPage(`/2/status/${encodeURIComponent(id)}/reposts`, {
|
|
62
|
+
count: options.count,
|
|
63
|
+
cursor: options.cursor
|
|
64
|
+
}, options.signal);
|
|
65
|
+
}
|
|
66
|
+
/** `GET /2/status/{id}/quotes` — posts quoting a post. */
|
|
67
|
+
getStatusQuotes(id, options = {}) {
|
|
68
|
+
return this.getPage(`/2/status/${encodeURIComponent(id)}/quotes`, {
|
|
69
|
+
count: options.count,
|
|
70
|
+
cursor: options.cursor,
|
|
71
|
+
lang: options.lang
|
|
72
|
+
}, options.signal);
|
|
73
|
+
}
|
|
74
|
+
/** `GET /2/thread/{id}` — a post with its unrolled thread. */
|
|
75
|
+
getThread(id, options = {}) {
|
|
76
|
+
return this.get(`/2/thread/${encodeURIComponent(id)}`, {
|
|
77
|
+
about_account: options.aboutAccount ? "1" : void 0,
|
|
78
|
+
lang: options.lang
|
|
79
|
+
}, options.signal);
|
|
80
|
+
}
|
|
81
|
+
/** `GET /2/conversation/{id}` — a post, its thread, and ranked replies. */
|
|
82
|
+
getConversation(id, options = {}) {
|
|
83
|
+
return this.get(`/2/conversation/${encodeURIComponent(id)}`, {
|
|
84
|
+
ranking_mode: options.rankingMode,
|
|
85
|
+
cursor: options.cursor,
|
|
86
|
+
about_account: options.aboutAccount ? "1" : void 0,
|
|
87
|
+
lang: options.lang
|
|
88
|
+
}, options.signal);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `GET /2/profile/{handle}` — a user's profile. `handle` is a username
|
|
92
|
+
* without `@`, or `byUserId(id)` for a numeric user ID.
|
|
93
|
+
*/
|
|
94
|
+
getProfile(handle, options = {}) {
|
|
95
|
+
return this.get(`/2/profile/${encodeURIComponent(handle)}`, { about_account: options.aboutAccount ? "1" : void 0 }, options.signal);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `GET /2/profile/{handle}/statuses` — a user's posts. Resolves to `null`
|
|
99
|
+
* when `since` is set (without `cursor`) and nothing is newer than it.
|
|
100
|
+
*/
|
|
101
|
+
async getProfileStatuses(handle, options = {}) {
|
|
102
|
+
try {
|
|
103
|
+
return await this.http.get({
|
|
104
|
+
path: `/2/profile/${encodeURIComponent(handle)}/statuses`,
|
|
105
|
+
query: {
|
|
106
|
+
count: options.count,
|
|
107
|
+
cursor: options.cursor,
|
|
108
|
+
since: options.since,
|
|
109
|
+
with_replies: options.withReplies ? "1" : void 0,
|
|
110
|
+
groupthreads: options.groupThreads ? "1" : void 0,
|
|
111
|
+
lang: options.lang
|
|
112
|
+
},
|
|
113
|
+
signal: options.signal
|
|
114
|
+
});
|
|
115
|
+
} catch (error) {
|
|
116
|
+
const page = emptyPage(error);
|
|
117
|
+
if (page) return page;
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** `GET /2/profile/{handle}/articles` — a user's long-form articles. */
|
|
122
|
+
getProfileArticles(handle, options = {}) {
|
|
123
|
+
return this.getPage(`/2/profile/${encodeURIComponent(handle)}/articles`, {
|
|
124
|
+
count: options.count,
|
|
125
|
+
cursor: options.cursor,
|
|
126
|
+
lang: options.lang
|
|
127
|
+
}, options.signal);
|
|
128
|
+
}
|
|
129
|
+
/** `GET /2/profile/{handle}/about` — account metadata (based-in country, name changes). */
|
|
130
|
+
getProfileAbout(handle, options = {}) {
|
|
131
|
+
return this.get(`/2/profile/${encodeURIComponent(handle)}/about`, void 0, options.signal);
|
|
132
|
+
}
|
|
133
|
+
/** `GET /2/profile/{handle}/media` — a user's posts that contain media. */
|
|
134
|
+
getProfileMedia(handle, options = {}) {
|
|
135
|
+
return this.getPage(`/2/profile/${encodeURIComponent(handle)}/media`, {
|
|
136
|
+
count: options.count,
|
|
137
|
+
cursor: options.cursor,
|
|
138
|
+
lang: options.lang
|
|
139
|
+
}, options.signal);
|
|
140
|
+
}
|
|
141
|
+
/** `GET /2/profile/{handle}/followers` — a user's followers. */
|
|
142
|
+
getProfileFollowers(handle, options = {}) {
|
|
143
|
+
return this.getPage(`/2/profile/${encodeURIComponent(handle)}/followers`, {
|
|
144
|
+
count: options.count,
|
|
145
|
+
cursor: options.cursor
|
|
146
|
+
}, options.signal);
|
|
147
|
+
}
|
|
148
|
+
/** `GET /2/profile/{handle}/following` — accounts a user follows. */
|
|
149
|
+
getProfileFollowing(handle, options = {}) {
|
|
150
|
+
return this.getPage(`/2/profile/${encodeURIComponent(handle)}/following`, {
|
|
151
|
+
count: options.count,
|
|
152
|
+
cursor: options.cursor
|
|
153
|
+
}, options.signal);
|
|
154
|
+
}
|
|
155
|
+
/** `GET /2/search` — search posts. */
|
|
156
|
+
search(query, options = {}) {
|
|
157
|
+
return this.getPage("/2/search", {
|
|
158
|
+
q: query,
|
|
159
|
+
feed: options.feed,
|
|
160
|
+
count: options.count,
|
|
161
|
+
cursor: options.cursor,
|
|
162
|
+
lang: options.lang
|
|
163
|
+
}, options.signal);
|
|
164
|
+
}
|
|
165
|
+
/** `GET /2/typeahead` — search-box autocomplete suggestions. */
|
|
166
|
+
typeahead(query, options = {}) {
|
|
167
|
+
return this.get("/2/typeahead", {
|
|
168
|
+
q: query,
|
|
169
|
+
result_type: options.resultType?.join(","),
|
|
170
|
+
src: options.src
|
|
171
|
+
}, options.signal);
|
|
172
|
+
}
|
|
173
|
+
/** `GET /2/trends` — trending topics. */
|
|
174
|
+
trends(options = {}) {
|
|
175
|
+
return this.get("/2/trends", {
|
|
176
|
+
type: "trending",
|
|
177
|
+
count: options.count
|
|
178
|
+
}, options.signal);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
//#endregion
|
|
182
|
+
exports.FxTwitterV2 = FxTwitterV2;
|
|
183
|
+
exports.byUserId = byUserId;
|