@antcoder/birdxtwittercli 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/LICENSE +21 -0
  3. package/README.md +388 -0
  4. package/dist/cli/pagination.d.ts +35 -0
  5. package/dist/cli/pagination.d.ts.map +1 -0
  6. package/dist/cli/pagination.js +43 -0
  7. package/dist/cli/pagination.js.map +1 -0
  8. package/dist/cli/program.d.ts +5 -0
  9. package/dist/cli/program.d.ts.map +1 -0
  10. package/dist/cli/program.js +113 -0
  11. package/dist/cli/program.js.map +1 -0
  12. package/dist/cli/shared.d.ts +77 -0
  13. package/dist/cli/shared.d.ts.map +1 -0
  14. package/dist/cli/shared.js +327 -0
  15. package/dist/cli/shared.js.map +1 -0
  16. package/dist/cli.d.ts +12 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +29 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands/bookmarks.d.ts +4 -0
  21. package/dist/commands/bookmarks.d.ts.map +1 -0
  22. package/dist/commands/bookmarks.js +189 -0
  23. package/dist/commands/bookmarks.js.map +1 -0
  24. package/dist/commands/check.d.ts +4 -0
  25. package/dist/commands/check.d.ts.map +1 -0
  26. package/dist/commands/check.js +43 -0
  27. package/dist/commands/check.js.map +1 -0
  28. package/dist/commands/follow.d.ts +4 -0
  29. package/dist/commands/follow.d.ts.map +1 -0
  30. package/dist/commands/follow.js +91 -0
  31. package/dist/commands/follow.js.map +1 -0
  32. package/dist/commands/help.d.ts +4 -0
  33. package/dist/commands/help.d.ts.map +1 -0
  34. package/dist/commands/help.js +19 -0
  35. package/dist/commands/help.js.map +1 -0
  36. package/dist/commands/home.d.ts +4 -0
  37. package/dist/commands/home.d.ts.map +1 -0
  38. package/dist/commands/home.js +43 -0
  39. package/dist/commands/home.js.map +1 -0
  40. package/dist/commands/lists.d.ts +4 -0
  41. package/dist/commands/lists.d.ts.map +1 -0
  42. package/dist/commands/lists.js +213 -0
  43. package/dist/commands/lists.js.map +1 -0
  44. package/dist/commands/news.d.ts +4 -0
  45. package/dist/commands/news.d.ts.map +1 -0
  46. package/dist/commands/news.js +131 -0
  47. package/dist/commands/news.js.map +1 -0
  48. package/dist/commands/post.d.ts +4 -0
  49. package/dist/commands/post.d.ts.map +1 -0
  50. package/dist/commands/post.js +101 -0
  51. package/dist/commands/post.js.map +1 -0
  52. package/dist/commands/query-ids.d.ts +4 -0
  53. package/dist/commands/query-ids.d.ts.map +1 -0
  54. package/dist/commands/query-ids.js +80 -0
  55. package/dist/commands/query-ids.js.map +1 -0
  56. package/dist/commands/read.d.ts +4 -0
  57. package/dist/commands/read.d.ts.map +1 -0
  58. package/dist/commands/read.js +152 -0
  59. package/dist/commands/read.js.map +1 -0
  60. package/dist/commands/search.d.ts +4 -0
  61. package/dist/commands/search.d.ts.map +1 -0
  62. package/dist/commands/search.js +115 -0
  63. package/dist/commands/search.js.map +1 -0
  64. package/dist/commands/unbookmark.d.ts +4 -0
  65. package/dist/commands/unbookmark.d.ts.map +1 -0
  66. package/dist/commands/unbookmark.js +36 -0
  67. package/dist/commands/unbookmark.js.map +1 -0
  68. package/dist/commands/user-tweets.d.ts +4 -0
  69. package/dist/commands/user-tweets.d.ts.map +1 -0
  70. package/dist/commands/user-tweets.js +109 -0
  71. package/dist/commands/user-tweets.js.map +1 -0
  72. package/dist/commands/users.d.ts +4 -0
  73. package/dist/commands/users.d.ts.map +1 -0
  74. package/dist/commands/users.js +295 -0
  75. package/dist/commands/users.js.map +1 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +2 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/lib/cli-args.d.ts +7 -0
  81. package/dist/lib/cli-args.d.ts.map +1 -0
  82. package/dist/lib/cli-args.js +25 -0
  83. package/dist/lib/cli-args.js.map +1 -0
  84. package/dist/lib/cookies.d.ts +31 -0
  85. package/dist/lib/cookies.d.ts.map +1 -0
  86. package/dist/lib/cookies.js +173 -0
  87. package/dist/lib/cookies.js.map +1 -0
  88. package/dist/lib/extract-bookmark-folder-id.d.ts +2 -0
  89. package/dist/lib/extract-bookmark-folder-id.d.ts.map +1 -0
  90. package/dist/lib/extract-bookmark-folder-id.js +20 -0
  91. package/dist/lib/extract-bookmark-folder-id.js.map +1 -0
  92. package/dist/lib/extract-list-id.d.ts +2 -0
  93. package/dist/lib/extract-list-id.d.ts.map +1 -0
  94. package/dist/lib/extract-list-id.js +19 -0
  95. package/dist/lib/extract-list-id.js.map +1 -0
  96. package/dist/lib/extract-tweet-id.d.ts +2 -0
  97. package/dist/lib/extract-tweet-id.d.ts.map +1 -0
  98. package/dist/lib/extract-tweet-id.js +14 -0
  99. package/dist/lib/extract-tweet-id.js.map +1 -0
  100. package/dist/lib/features.json +17 -0
  101. package/dist/lib/index.d.ts +10 -0
  102. package/dist/lib/index.d.ts.map +1 -0
  103. package/dist/lib/index.js +4 -0
  104. package/dist/lib/index.js.map +1 -0
  105. package/dist/lib/normalize-handle.d.ts +6 -0
  106. package/dist/lib/normalize-handle.d.ts.map +1 -0
  107. package/dist/lib/normalize-handle.js +31 -0
  108. package/dist/lib/normalize-handle.js.map +1 -0
  109. package/dist/lib/output.d.ts +29 -0
  110. package/dist/lib/output.d.ts.map +1 -0
  111. package/dist/lib/output.js +88 -0
  112. package/dist/lib/output.js.map +1 -0
  113. package/dist/lib/paginate-cursor.d.ts +27 -0
  114. package/dist/lib/paginate-cursor.d.ts.map +1 -0
  115. package/dist/lib/paginate-cursor.js +37 -0
  116. package/dist/lib/paginate-cursor.js.map +1 -0
  117. package/dist/lib/query-ids.json +20 -0
  118. package/dist/lib/runtime-features.d.ts +19 -0
  119. package/dist/lib/runtime-features.d.ts.map +1 -0
  120. package/dist/lib/runtime-features.js +151 -0
  121. package/dist/lib/runtime-features.js.map +1 -0
  122. package/dist/lib/runtime-query-ids.d.ts +33 -0
  123. package/dist/lib/runtime-query-ids.d.ts.map +1 -0
  124. package/dist/lib/runtime-query-ids.js +264 -0
  125. package/dist/lib/runtime-query-ids.js.map +1 -0
  126. package/dist/lib/thread-filters.d.ts +8 -0
  127. package/dist/lib/thread-filters.d.ts.map +1 -0
  128. package/dist/lib/thread-filters.js +124 -0
  129. package/dist/lib/thread-filters.js.map +1 -0
  130. package/dist/lib/twitter-client-base.d.ts +38 -0
  131. package/dist/lib/twitter-client-base.d.ts.map +1 -0
  132. package/dist/lib/twitter-client-base.js +129 -0
  133. package/dist/lib/twitter-client-base.js.map +1 -0
  134. package/dist/lib/twitter-client-bookmarks.d.ts +7 -0
  135. package/dist/lib/twitter-client-bookmarks.d.ts.map +1 -0
  136. package/dist/lib/twitter-client-bookmarks.js +61 -0
  137. package/dist/lib/twitter-client-bookmarks.js.map +1 -0
  138. package/dist/lib/twitter-client-constants.d.ts +44 -0
  139. package/dist/lib/twitter-client-constants.d.ts.map +1 -0
  140. package/dist/lib/twitter-client-constants.js +51 -0
  141. package/dist/lib/twitter-client-constants.js.map +1 -0
  142. package/dist/lib/twitter-client-engagement.d.ts +16 -0
  143. package/dist/lib/twitter-client-engagement.d.ts.map +1 -0
  144. package/dist/lib/twitter-client-engagement.js +81 -0
  145. package/dist/lib/twitter-client-engagement.js.map +1 -0
  146. package/dist/lib/twitter-client-features.d.ts +14 -0
  147. package/dist/lib/twitter-client-features.d.ts.map +1 -0
  148. package/dist/lib/twitter-client-features.js +347 -0
  149. package/dist/lib/twitter-client-features.js.map +1 -0
  150. package/dist/lib/twitter-client-follow.d.ts +8 -0
  151. package/dist/lib/twitter-client-follow.d.ts.map +1 -0
  152. package/dist/lib/twitter-client-follow.js +178 -0
  153. package/dist/lib/twitter-client-follow.js.map +1 -0
  154. package/dist/lib/twitter-client-home.d.ts +13 -0
  155. package/dist/lib/twitter-client-home.d.ts.map +1 -0
  156. package/dist/lib/twitter-client-home.js +138 -0
  157. package/dist/lib/twitter-client-home.js.map +1 -0
  158. package/dist/lib/twitter-client-lists.d.ts +12 -0
  159. package/dist/lib/twitter-client-lists.d.ts.map +1 -0
  160. package/dist/lib/twitter-client-lists.js +390 -0
  161. package/dist/lib/twitter-client-lists.js.map +1 -0
  162. package/dist/lib/twitter-client-media.d.ts +11 -0
  163. package/dist/lib/twitter-client-media.d.ts.map +1 -0
  164. package/dist/lib/twitter-client-media.js +136 -0
  165. package/dist/lib/twitter-client-media.js.map +1 -0
  166. package/dist/lib/twitter-client-news.d.ts +47 -0
  167. package/dist/lib/twitter-client-news.d.ts.map +1 -0
  168. package/dist/lib/twitter-client-news.js +283 -0
  169. package/dist/lib/twitter-client-news.js.map +1 -0
  170. package/dist/lib/twitter-client-posting.d.ts +8 -0
  171. package/dist/lib/twitter-client-posting.d.ts.map +1 -0
  172. package/dist/lib/twitter-client-posting.js +218 -0
  173. package/dist/lib/twitter-client-posting.js.map +1 -0
  174. package/dist/lib/twitter-client-search.d.ts +19 -0
  175. package/dist/lib/twitter-client-search.d.ts.map +1 -0
  176. package/dist/lib/twitter-client-search.js +157 -0
  177. package/dist/lib/twitter-client-search.js.map +1 -0
  178. package/dist/lib/twitter-client-timelines.d.ts +23 -0
  179. package/dist/lib/twitter-client-timelines.d.ts.map +1 -0
  180. package/dist/lib/twitter-client-timelines.js +471 -0
  181. package/dist/lib/twitter-client-timelines.js.map +1 -0
  182. package/dist/lib/twitter-client-tweet-detail.d.ts +25 -0
  183. package/dist/lib/twitter-client-tweet-detail.d.ts.map +1 -0
  184. package/dist/lib/twitter-client-tweet-detail.js +295 -0
  185. package/dist/lib/twitter-client-tweet-detail.js.map +1 -0
  186. package/dist/lib/twitter-client-types.d.ts +407 -0
  187. package/dist/lib/twitter-client-types.d.ts.map +1 -0
  188. package/dist/lib/twitter-client-types.js +2 -0
  189. package/dist/lib/twitter-client-types.js.map +1 -0
  190. package/dist/lib/twitter-client-user-lookup.d.ts +16 -0
  191. package/dist/lib/twitter-client-user-lookup.d.ts.map +1 -0
  192. package/dist/lib/twitter-client-user-lookup.js +224 -0
  193. package/dist/lib/twitter-client-user-lookup.js.map +1 -0
  194. package/dist/lib/twitter-client-user-tweets.d.ts +22 -0
  195. package/dist/lib/twitter-client-user-tweets.d.ts.map +1 -0
  196. package/dist/lib/twitter-client-user-tweets.js +154 -0
  197. package/dist/lib/twitter-client-user-tweets.js.map +1 -0
  198. package/dist/lib/twitter-client-users.d.ts +9 -0
  199. package/dist/lib/twitter-client-users.d.ts.map +1 -0
  200. package/dist/lib/twitter-client-users.js +358 -0
  201. package/dist/lib/twitter-client-users.js.map +1 -0
  202. package/dist/lib/twitter-client-utils.d.ts +173 -0
  203. package/dist/lib/twitter-client-utils.d.ts.map +1 -0
  204. package/dist/lib/twitter-client-utils.js +511 -0
  205. package/dist/lib/twitter-client-utils.js.map +1 -0
  206. package/dist/lib/twitter-client.d.ts +23 -0
  207. package/dist/lib/twitter-client.d.ts.map +1 -0
  208. package/dist/lib/twitter-client.js +21 -0
  209. package/dist/lib/twitter-client.js.map +1 -0
  210. package/dist/lib/version.d.ts +6 -0
  211. package/dist/lib/version.d.ts.map +1 -0
  212. package/dist/lib/version.js +174 -0
  213. package/dist/lib/version.js.map +1 -0
  214. package/package.json +61 -0
@@ -0,0 +1,19 @@
1
+ // ABOUTME: Extract list ID from an X/Twitter list URL.
2
+ // ABOUTME: Returns list ID or null if input is invalid.
3
+ const LIST_URL_REGEX = /(?:twitter\.com|x\.com)\/i\/lists\/(\d+)/i;
4
+ const LIST_ID_REGEX = /^\d{5,}$/;
5
+ export function extractListId(input) {
6
+ const trimmed = input.trim();
7
+ if (!trimmed) {
8
+ return null;
9
+ }
10
+ const urlMatch = LIST_URL_REGEX.exec(trimmed);
11
+ if (urlMatch) {
12
+ return urlMatch[1];
13
+ }
14
+ if (LIST_ID_REGEX.test(trimmed)) {
15
+ return trimmed;
16
+ }
17
+ return null;
18
+ }
19
+ //# sourceMappingURL=extract-list-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-list-id.js","sourceRoot":"","sources":["../../src/lib/extract-list-id.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,wDAAwD;AAExD,MAAM,cAAc,GAAG,2CAA2C,CAAC;AACnE,MAAM,aAAa,GAAG,UAAU,CAAC;AAEjC,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractTweetId(input: string): string;
2
+ //# sourceMappingURL=extract-tweet-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-tweet-id.d.ts","sourceRoot":"","sources":["../../src/lib/extract-tweet-id.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Extract tweet ID from a Twitter/X URL or return the input unchanged if it's already an ID.
3
+ */
4
+ const TWEET_URL_REGEX = /(?:twitter\.com|x\.com)\/(?:\w+\/status|i\/web\/status)\/(\d+)/i;
5
+ export function extractTweetId(input) {
6
+ // If it's a URL, extract the tweet ID
7
+ const urlMatch = TWEET_URL_REGEX.exec(input);
8
+ if (urlMatch) {
9
+ return urlMatch[1];
10
+ }
11
+ // Assume it's already an ID
12
+ return input;
13
+ }
14
+ //# sourceMappingURL=extract-tweet-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-tweet-id.js","sourceRoot":"","sources":["../../src/lib/extract-tweet-id.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,eAAe,GAAG,iEAAiE,CAAC;AAE1F,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,sCAAsC;IACtC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,4BAA4B;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "global": {
3
+ "responsive_web_grok_annotations_enabled": false,
4
+ "post_ctas_fetch_enabled": true,
5
+ "responsive_web_graphql_exclude_directive_enabled": true
6
+ },
7
+ "sets": {
8
+ "lists": {
9
+ "blue_business_profile_image_shape_enabled": true,
10
+ "tweetypie_unmention_optimization_enabled": true,
11
+ "responsive_web_text_conversations_enabled": false,
12
+ "interactive_text_enabled": true,
13
+ "vibe_api_enabled": true,
14
+ "responsive_web_twitter_blue_verified_badge_is_enabled": true
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,10 @@
1
+ export { type CookieExtractionResult, type CookieSource, extractCookiesFromChrome, extractCookiesFromFirefox, extractCookiesFromSafari, resolveCredentials, type TwitterCookies, } from './cookies.js';
2
+ export { runtimeQueryIds } from './runtime-query-ids.js';
3
+ export { type CurrentUserResult, type FollowingResult, type GetTweetResult, type SearchResult, type TweetData, TwitterClient, type TwitterClientOptions, type TwitterUser, } from './twitter-client.js';
4
+ export type { HomeTimelineFetchOptions } from './twitter-client-home.js';
5
+ export type { ExploreTab, NewsFetchOptions, NewsItem, NewsResult } from './twitter-client-news.js';
6
+ export type { SearchFetchOptions } from './twitter-client-search.js';
7
+ export type { TimelineFetchOptions } from './twitter-client-timelines.js';
8
+ export type { TweetFetchOptions } from './twitter-client-tweet-detail.js';
9
+ export type { AboutAccountProfile, AboutAccountResult, TweetResult, UploadMediaResult, } from './twitter-client-types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACnG,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GAClB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { extractCookiesFromChrome, extractCookiesFromFirefox, extractCookiesFromSafari, resolveCredentials, } from './cookies.js';
2
+ export { runtimeQueryIds } from './runtime-query-ids.js';
3
+ export { TwitterClient, } from './twitter-client.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAML,aAAa,GAGd,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function normalizeHandle(input?: string | null): string | null;
2
+ export declare function mentionsQueryFromUserOption(userOption?: string | null): {
3
+ query: string | null;
4
+ error: string | null;
5
+ };
6
+ //# sourceMappingURL=normalize-handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-handle.d.ts","sourceRoot":"","sources":["../../src/lib/normalize-handle.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAkBpE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAcA"}
@@ -0,0 +1,31 @@
1
+ const HANDLE_REGEX = /^[A-Za-z0-9_]{1,15}$/;
2
+ export function normalizeHandle(input) {
3
+ const raw = (input ?? '').trim();
4
+ if (!raw) {
5
+ return null;
6
+ }
7
+ const withoutAt = raw.startsWith('@') ? raw.slice(1) : raw;
8
+ const handle = withoutAt.trim();
9
+ if (!handle) {
10
+ return null;
11
+ }
12
+ // X/Twitter handles are traditionally max 15 chars; keep strict to avoid surprising queries.
13
+ if (!HANDLE_REGEX.test(handle)) {
14
+ return null;
15
+ }
16
+ return handle;
17
+ }
18
+ export function mentionsQueryFromUserOption(userOption) {
19
+ if (typeof userOption === 'undefined') {
20
+ return { query: null, error: null };
21
+ }
22
+ const handle = normalizeHandle(userOption);
23
+ if (!handle) {
24
+ return {
25
+ query: null,
26
+ error: 'Invalid --user handle. Expected something like @steipete (letters, digits, underscore; max 15).',
27
+ };
28
+ }
29
+ return { query: `@${handle}`, error: null };
30
+ }
31
+ //# sourceMappingURL=normalize-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-handle.js","sourceRoot":"","sources":["../../src/lib/normalize-handle.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,KAAqB;IACnD,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6FAA6F;IAC7F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAA0B;IAIpE,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,iGAAiG;SACzG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type OutputConfig = {
2
+ plain: boolean;
3
+ emoji: boolean;
4
+ color: boolean;
5
+ hyperlinks: boolean;
6
+ };
7
+ export type StatusKind = 'ok' | 'warn' | 'err' | 'info' | 'hint';
8
+ export type LabelKind = 'url' | 'date' | 'source' | 'engine' | 'credentials' | 'user' | 'userId' | 'email';
9
+ export declare function resolveOutputConfigFromArgv(argv: string[], env: NodeJS.ProcessEnv, isTty: boolean): OutputConfig;
10
+ export declare function resolveOutputConfigFromCommander(opts: {
11
+ plain?: boolean;
12
+ emoji?: boolean;
13
+ color?: boolean;
14
+ }, env: NodeJS.ProcessEnv, isTty: boolean): OutputConfig;
15
+ export declare function statusPrefix(kind: StatusKind, cfg: OutputConfig): string;
16
+ export declare function labelPrefix(kind: LabelKind, cfg: OutputConfig): string;
17
+ export declare function formatStatsLine(stats: {
18
+ likeCount?: number | null;
19
+ retweetCount?: number | null;
20
+ replyCount?: number | null;
21
+ }, cfg: OutputConfig): string;
22
+ export declare function formatTweetUrl(tweetId: string): string;
23
+ /**
24
+ * Wraps a URL in OSC 8 escape sequences to make it clickable in supported terminals.
25
+ * Falls back to plain text when not in a TTY or when hyperlinks are disabled.
26
+ */
27
+ export declare function hyperlink(url: string, text?: string, cfg?: OutputConfig): string;
28
+ export declare function formatTweetUrlLine(tweetId: string, cfg: OutputConfig): string;
29
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAqB3G,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAUhH;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3D,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,EAAE,OAAO,GACb,YAAY,CAUd;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAQxE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAQtE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC9F,GAAG,EAAE,YAAY,GAChB,MAAM,CAYR;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,CAUhF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAG7E"}
@@ -0,0 +1,88 @@
1
+ const STATUS = {
2
+ ok: { emoji: '✅', text: 'OK:', plain: '[ok]' },
3
+ warn: { emoji: '⚠️', text: 'Warning:', plain: '[warn]' },
4
+ err: { emoji: '❌', text: 'Error:', plain: '[err]' },
5
+ info: { emoji: 'ℹ️', text: 'Info:', plain: '[info]' },
6
+ hint: { emoji: 'ℹ️', text: 'Hint:', plain: '[hint]' },
7
+ };
8
+ const LABELS = {
9
+ url: { emoji: '🔗', text: 'URL:', plain: 'url:' },
10
+ date: { emoji: '📅', text: 'Date:', plain: 'date:' },
11
+ source: { emoji: '📍', text: 'Source:', plain: 'source:' },
12
+ engine: { emoji: '⚙️', text: 'Engine:', plain: 'engine:' },
13
+ credentials: { emoji: '🔑', text: 'Credentials:', plain: 'credentials:' },
14
+ user: { emoji: '🙋', text: 'User:', plain: 'user:' },
15
+ userId: { emoji: '🪪', text: 'User ID:', plain: 'user_id:' },
16
+ email: { emoji: '📧', text: 'Email:', plain: 'email:' },
17
+ };
18
+ export function resolveOutputConfigFromArgv(argv, env, isTty) {
19
+ const hasNoColorEnv = Object.hasOwn(env, 'NO_COLOR') || env.TERM === 'dumb';
20
+ const defaultColor = isTty && !hasNoColorEnv;
21
+ const plain = argv.includes('--plain');
22
+ const emoji = !plain && !argv.includes('--no-emoji');
23
+ const color = !plain && !argv.includes('--no-color') && defaultColor;
24
+ const hyperlinks = !plain && isTty;
25
+ return { plain, emoji, color, hyperlinks };
26
+ }
27
+ export function resolveOutputConfigFromCommander(opts, env, isTty) {
28
+ const hasNoColorEnv = Object.hasOwn(env, 'NO_COLOR') || env.TERM === 'dumb';
29
+ const defaultColor = isTty && !hasNoColorEnv;
30
+ const plain = Boolean(opts.plain);
31
+ const emoji = !plain && (opts.emoji ?? true);
32
+ const color = !plain && (opts.color ?? true) && defaultColor;
33
+ const hyperlinks = !plain && isTty;
34
+ return { plain, emoji, color, hyperlinks };
35
+ }
36
+ export function statusPrefix(kind, cfg) {
37
+ if (cfg.plain) {
38
+ return `${STATUS[kind].plain} `;
39
+ }
40
+ if (cfg.emoji) {
41
+ return `${STATUS[kind].emoji} `;
42
+ }
43
+ return `${STATUS[kind].text} `;
44
+ }
45
+ export function labelPrefix(kind, cfg) {
46
+ if (cfg.plain) {
47
+ return `${LABELS[kind].plain} `;
48
+ }
49
+ if (cfg.emoji) {
50
+ return `${LABELS[kind].emoji} `;
51
+ }
52
+ return `${LABELS[kind].text} `;
53
+ }
54
+ export function formatStatsLine(stats, cfg) {
55
+ const likeCount = stats.likeCount ?? 0;
56
+ const retweetCount = stats.retweetCount ?? 0;
57
+ const replyCount = stats.replyCount ?? 0;
58
+ if (cfg.plain) {
59
+ return `likes: ${likeCount} retweets: ${retweetCount} replies: ${replyCount}`;
60
+ }
61
+ if (!cfg.emoji) {
62
+ return `Likes ${likeCount} Retweets ${retweetCount} Replies ${replyCount}`;
63
+ }
64
+ return `❤️ ${likeCount} 🔁 ${retweetCount} 💬 ${replyCount}`;
65
+ }
66
+ export function formatTweetUrl(tweetId) {
67
+ return `https://x.com/i/status/${tweetId}`;
68
+ }
69
+ /**
70
+ * Wraps a URL in OSC 8 escape sequences to make it clickable in supported terminals.
71
+ * Falls back to plain text when not in a TTY or when hyperlinks are disabled.
72
+ */
73
+ export function hyperlink(url, text, cfg) {
74
+ const displayText = text ?? url;
75
+ // Only use hyperlinks when explicitly enabled (requires TTY and not plain mode)
76
+ if (!cfg?.hyperlinks) {
77
+ return displayText;
78
+ }
79
+ const safeUrl = url.replaceAll('\x1b', '').replaceAll('\x07', '');
80
+ const safeText = displayText.replaceAll('\x1b', '').replaceAll('\x07', '');
81
+ // OSC 8 hyperlink: \x1b]8;;URL\x07TEXT\x1b]8;;\x07
82
+ return `\x1b]8;;${safeUrl}\x07${safeText}\x1b]8;;\x07`;
83
+ }
84
+ export function formatTweetUrlLine(tweetId, cfg) {
85
+ const url = formatTweetUrl(tweetId);
86
+ return `${labelPrefix('url', cfg)}${hyperlink(url, url, cfg)}`;
87
+ }
88
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type CursorPage<T> = {
2
+ success: true;
3
+ items: T[];
4
+ cursor?: string;
5
+ } | {
6
+ success: false;
7
+ error: string;
8
+ };
9
+ export type CursorPaginationResult<T> = {
10
+ success: true;
11
+ items: T[];
12
+ nextCursor?: string;
13
+ } | {
14
+ success: false;
15
+ error: string;
16
+ items?: T[];
17
+ nextCursor?: string;
18
+ };
19
+ export declare function paginateCursor<T>(opts: {
20
+ cursor?: string;
21
+ maxPages?: number;
22
+ pageDelayMs?: number;
23
+ sleep: (ms: number) => Promise<void>;
24
+ getKey: (item: T) => string;
25
+ fetchPage: (cursor?: string) => Promise<CursorPage<T>>;
26
+ }): Promise<CursorPaginationResult<T>>;
27
+ //# sourceMappingURL=paginate-cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate-cursor.d.ts","sourceRoot":"","sources":["../../src/lib/paginate-cursor.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAChC;IACE,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,wBAAsB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC5B,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAyCrC"}
@@ -0,0 +1,37 @@
1
+ export async function paginateCursor(opts) {
2
+ const { maxPages, pageDelayMs = 1000 } = opts;
3
+ const seen = new Set();
4
+ const items = [];
5
+ let cursor = opts.cursor;
6
+ let pagesFetched = 0;
7
+ while (true) {
8
+ if (pagesFetched > 0 && pageDelayMs > 0) {
9
+ await opts.sleep(pageDelayMs);
10
+ }
11
+ const page = await opts.fetchPage(cursor);
12
+ if (!page.success) {
13
+ if (items.length > 0) {
14
+ return { success: false, error: page.error, items, nextCursor: cursor };
15
+ }
16
+ return page;
17
+ }
18
+ pagesFetched += 1;
19
+ for (const item of page.items) {
20
+ const key = opts.getKey(item);
21
+ if (seen.has(key)) {
22
+ continue;
23
+ }
24
+ seen.add(key);
25
+ items.push(item);
26
+ }
27
+ const pageCursor = page.cursor;
28
+ if (!pageCursor || pageCursor === cursor) {
29
+ return { success: true, items, nextCursor: undefined };
30
+ }
31
+ if (maxPages !== undefined && pagesFetched >= maxPages) {
32
+ return { success: true, items, nextCursor: pageCursor };
33
+ }
34
+ cursor = pageCursor;
35
+ }
36
+ }
37
+ //# sourceMappingURL=paginate-cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate-cursor.js","sourceRoot":"","sources":["../../src/lib/paginate-cursor.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,IAOvC;IACC,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,IAAI,MAAM,GAAuB,IAAI,CAAC,MAAM,CAAC;IAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,YAAY,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAC1E,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,YAAY,IAAI,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACzD,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ {
2
+ "CreateTweet": "nmdAQXJDxw6-0KKF2on7eA",
3
+ "CreateRetweet": "LFho5rIi4xcKO90p9jwG7A",
4
+ "CreateFriendship": "8h9JVdV8dlSyqyRDJEPCsA",
5
+ "DestroyFriendship": "ppXWuagMNXgvzx6WoXBW0Q",
6
+ "FavoriteTweet": "lI07N6Otwv1PhnEgXILM7A",
7
+ "DeleteBookmark": "Wlmlj2-xzyS1GN3a6cj-mQ",
8
+ "TweetDetail": "_NvJCnIjOW__EP5-RF197A",
9
+ "SearchTimeline": "6AAys3t42mosm_yTI_QENg",
10
+ "Bookmarks": "RV1g3b8n_SGOHwkqKYSCFw",
11
+ "BookmarkFolderTimeline": "KJIQpsvxrTfRIlbaRIySHQ",
12
+ "Following": "mWYeougg_ocJS2Vr1Vt28w",
13
+ "Followers": "SFYY3WsgwjlXSLlfnEUE4A",
14
+ "Likes": "ETJflBunfqNa1uE1mBPCaw",
15
+ "ExploreSidebar": "lpSN4M6qpimkF4nRFPE3nQ",
16
+ "ExplorePage": "kheAINB_4pzRDqkzG3K-ng",
17
+ "GenericTimelineById": "uGSr7alSjR9v6QJAIaqSKQ",
18
+ "TrendHistory": "Sj4T-jSB9pr0Mxtsc1UKZQ",
19
+ "AboutAccountQuery": "zs_jFPFT78rBpXv9Z3U2YQ"
20
+ }
@@ -0,0 +1,19 @@
1
+ export type FeatureOverrides = {
2
+ global?: Record<string, boolean>;
3
+ sets?: Record<string, Record<string, boolean>>;
4
+ };
5
+ type NormalizedFeatureOverrides = {
6
+ global: Record<string, boolean>;
7
+ sets: Record<string, Record<string, boolean>>;
8
+ };
9
+ export type FeatureOverridesSnapshot = {
10
+ cachePath: string;
11
+ overrides: FeatureOverrides;
12
+ };
13
+ export declare function loadFeatureOverrides(): NormalizedFeatureOverrides;
14
+ export declare function getFeatureOverridesSnapshot(): FeatureOverridesSnapshot;
15
+ export declare function applyFeatureOverrides(setName: string, base: Record<string, boolean>): Record<string, boolean>;
16
+ export declare function refreshFeatureOverridesCache(): Promise<FeatureOverridesSnapshot>;
17
+ export declare function clearFeatureOverridesCache(): void;
18
+ export {};
19
+ //# sourceMappingURL=runtime-features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-features.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-features.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAwGF,wBAAgB,oBAAoB,IAAI,0BAA0B,CAgBjE;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAMtE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmB7G;AAED,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAQtF;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,151 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import path from 'node:path';
5
+ // biome-ignore lint/correctness/useImportExtensions: JSON module import doesn't use .js extension.
6
+ import defaultOverrides from './features.json' with { type: 'json' };
7
+ const DEFAULT_CACHE_FILENAME = 'features.json';
8
+ let cachedOverrides = null;
9
+ function normalizeFeatureMap(value) {
10
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
11
+ return {};
12
+ }
13
+ const result = {};
14
+ for (const [key, entry] of Object.entries(value)) {
15
+ if (typeof entry === 'boolean') {
16
+ result[key] = entry;
17
+ }
18
+ }
19
+ return result;
20
+ }
21
+ function normalizeOverrides(value) {
22
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
23
+ return { global: {}, sets: {} };
24
+ }
25
+ const record = value;
26
+ const global = normalizeFeatureMap(record.global);
27
+ const sets = {};
28
+ const rawSets = record.sets && typeof record.sets === 'object' && !Array.isArray(record.sets)
29
+ ? record.sets
30
+ : {};
31
+ for (const [setName, setValue] of Object.entries(rawSets)) {
32
+ const normalized = normalizeFeatureMap(setValue);
33
+ if (Object.keys(normalized).length > 0) {
34
+ sets[setName] = normalized;
35
+ }
36
+ }
37
+ return { global, sets };
38
+ }
39
+ function mergeOverrides(base, next) {
40
+ const sets = { ...base.sets };
41
+ for (const [setName, overrides] of Object.entries(next.sets)) {
42
+ const existing = sets[setName];
43
+ sets[setName] = existing ? { ...existing, ...overrides } : { ...overrides };
44
+ }
45
+ return {
46
+ global: { ...base.global, ...next.global },
47
+ sets,
48
+ };
49
+ }
50
+ function toFeatureOverrides(overrides) {
51
+ const result = {};
52
+ if (Object.keys(overrides.global).length > 0) {
53
+ result.global = overrides.global;
54
+ }
55
+ const setEntries = Object.entries(overrides.sets).filter(([, value]) => Object.keys(value).length > 0);
56
+ if (setEntries.length > 0) {
57
+ result.sets = Object.fromEntries(setEntries);
58
+ }
59
+ return result;
60
+ }
61
+ function resolveFeaturesCachePath() {
62
+ const override = process.env.BIRD_FEATURES_CACHE ?? process.env.BIRD_FEATURES_PATH;
63
+ if (override && override.trim().length > 0) {
64
+ return path.resolve(override.trim());
65
+ }
66
+ return path.join(homedir(), '.config', 'bird', DEFAULT_CACHE_FILENAME);
67
+ }
68
+ function readOverridesFromFile(cachePath) {
69
+ if (!existsSync(cachePath)) {
70
+ return null;
71
+ }
72
+ try {
73
+ const raw = readFileSync(cachePath, 'utf8');
74
+ return normalizeOverrides(JSON.parse(raw));
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function readOverridesFromEnv() {
81
+ const raw = process.env.BIRD_FEATURES_JSON;
82
+ if (!raw || raw.trim().length === 0) {
83
+ return null;
84
+ }
85
+ try {
86
+ return normalizeOverrides(JSON.parse(raw));
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function writeOverridesToDisk(cachePath, overrides) {
93
+ const payload = toFeatureOverrides(overrides);
94
+ return mkdir(path.dirname(cachePath), { recursive: true }).then(() => writeFile(cachePath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8'));
95
+ }
96
+ export function loadFeatureOverrides() {
97
+ if (cachedOverrides) {
98
+ return cachedOverrides;
99
+ }
100
+ const base = normalizeOverrides(defaultOverrides);
101
+ const fromFile = readOverridesFromFile(resolveFeaturesCachePath());
102
+ const fromEnv = readOverridesFromEnv();
103
+ let merged = base;
104
+ if (fromFile) {
105
+ merged = mergeOverrides(merged, fromFile);
106
+ }
107
+ if (fromEnv) {
108
+ merged = mergeOverrides(merged, fromEnv);
109
+ }
110
+ cachedOverrides = merged;
111
+ return merged;
112
+ }
113
+ export function getFeatureOverridesSnapshot() {
114
+ const overrides = toFeatureOverrides(loadFeatureOverrides());
115
+ return {
116
+ cachePath: resolveFeaturesCachePath(),
117
+ overrides,
118
+ };
119
+ }
120
+ export function applyFeatureOverrides(setName, base) {
121
+ const overrides = loadFeatureOverrides();
122
+ const globalOverrides = overrides.global;
123
+ const setOverrides = overrides.sets[setName];
124
+ if (Object.keys(globalOverrides).length === 0 && (!setOverrides || Object.keys(setOverrides).length === 0)) {
125
+ return base;
126
+ }
127
+ if (setOverrides) {
128
+ return {
129
+ ...base,
130
+ ...globalOverrides,
131
+ ...setOverrides,
132
+ };
133
+ }
134
+ return {
135
+ ...base,
136
+ ...globalOverrides,
137
+ };
138
+ }
139
+ export async function refreshFeatureOverridesCache() {
140
+ const cachePath = resolveFeaturesCachePath();
141
+ const base = normalizeOverrides(defaultOverrides);
142
+ const fromFile = readOverridesFromFile(cachePath);
143
+ const merged = mergeOverrides(base, fromFile ?? { global: {}, sets: {} });
144
+ await writeOverridesToDisk(cachePath, merged);
145
+ cachedOverrides = null;
146
+ return { cachePath, overrides: toFeatureOverrides(merged) };
147
+ }
148
+ export function clearFeatureOverridesCache() {
149
+ cachedOverrides = null;
150
+ }
151
+ //# sourceMappingURL=runtime-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-features.js","sourceRoot":"","sources":["../../src/lib/runtime-features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type RuntimeQueryIdSnapshot = {
2
+ fetchedAt: string;
3
+ ttlMs: number;
4
+ ids: Record<string, string>;
5
+ discovery: {
6
+ pages: string[];
7
+ bundles: string[];
8
+ };
9
+ };
10
+ export type RuntimeQueryIdSnapshotInfo = {
11
+ snapshot: RuntimeQueryIdSnapshot;
12
+ cachePath: string;
13
+ ageMs: number;
14
+ isFresh: boolean;
15
+ };
16
+ export type RuntimeQueryIdsOptions = {
17
+ cachePath?: string;
18
+ ttlMs?: number;
19
+ fetchImpl?: typeof fetch;
20
+ };
21
+ export type RuntimeQueryIdStore = {
22
+ cachePath: string;
23
+ ttlMs: number;
24
+ getSnapshotInfo: () => Promise<RuntimeQueryIdSnapshotInfo | null>;
25
+ getQueryId: (operationName: string) => Promise<string | null>;
26
+ refresh: (operationNames: string[], opts?: {
27
+ force?: boolean;
28
+ }) => Promise<RuntimeQueryIdSnapshotInfo | null>;
29
+ clearMemory: () => void;
30
+ };
31
+ export declare function createRuntimeQueryIdStore(options?: RuntimeQueryIdsOptions): RuntimeQueryIdStore;
32
+ export declare const runtimeQueryIds: RuntimeQueryIdStore;
33
+ //# sourceMappingURL=runtime-query-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-query-ids.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-query-ids.ts"],"names":[],"mappings":"AA+CA,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IAClE,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IAC9G,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AA6JF,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,sBAA2B,GAAG,mBAAmB,CAwGnG;AAED,eAAO,MAAM,eAAe,qBAA8B,CAAC"}