gs-x-parser 1.0.2 → 1.0.3
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/lib/dom.cjs +141 -0
- package/lib/dom.d.ts +30 -0
- package/lib/dom.mjs +158 -0
- package/lib/index.cjs +22 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.mjs +3 -0
- package/lib/listen-tweet-register.cjs +20 -0
- package/lib/listen-tweet-register.d.ts +10 -0
- package/lib/listen-tweet-register.mjs +22 -0
- package/lib/listen-tweet-start.cjs +68 -0
- package/lib/listen-tweet-start.d.ts +9 -0
- package/lib/listen-tweet-start.mjs +74 -0
- package/lib/listen-tweet-starter.cjs +71 -0
- package/lib/listen-tweet-starter.d.ts +5 -0
- package/lib/listen-tweet-starter.mjs +77 -0
- package/lib/type.cjs +9 -3
- package/lib/type.d.ts +606 -433
- package/lib/type.mjs +10 -2
- package/package.json +20 -2
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var xhr = require('gs-web-hooks/xhr'), parser = require('./parser.cjs'), event = require('gs-dom/event'), type = require('./type.cjs'), observer = require('gs-dom/observer'), dom = require('./dom.cjs');
|
|
3
|
+
const ListenFlagKey = "__listen-tweet-flag-key";
|
|
4
|
+
class ListenFlag {
|
|
5
|
+
static #flag;
|
|
6
|
+
static get flag() {
|
|
7
|
+
return this.#flag || (this.#flag = self[ListenFlagKey]);
|
|
8
|
+
}
|
|
9
|
+
static isInit(arg) {
|
|
10
|
+
const init = !!this.flag;
|
|
11
|
+
return arg && this.update(arg), init;
|
|
12
|
+
}
|
|
13
|
+
static update(arg) {
|
|
14
|
+
self[ListenFlagKey] ? (arg?.enableTweetDetected && (self[ListenFlagKey].enableTweetDetected = !0), arg?.enableUserDetected && (self[ListenFlagKey].enableUserDetected = !0)) : Object.defineProperty(self, ListenFlagKey, {
|
|
15
|
+
value: { ...arg },
|
|
16
|
+
enumerable: !1,
|
|
17
|
+
configurable: !1,
|
|
18
|
+
writable: !1
|
|
19
|
+
}), this.#flag = self[ListenFlagKey];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const timelineRegex = /TweetDetail|Timeline|Bookmarks|UserTweets|UserMedia|Likes/, id = "__listen-tweet-interceptor";
|
|
23
|
+
function listenNet() {
|
|
24
|
+
xhr.addXhrInterceptor({
|
|
25
|
+
id,
|
|
26
|
+
before: (url) => timelineRegex.test(url) ? url : void 0,
|
|
27
|
+
after: (text) => {
|
|
28
|
+
const json = JSON.parse(text), { tweets, users, videos } = parser.XParser.parseSimple(json), flag = ListenFlag.flag || {};
|
|
29
|
+
if (flag.enableVideoDetected && videos?.length) try {
|
|
30
|
+
event.trigger(type.ListenTweetEvents.VideoDetected, { detail: videos });
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
if (flag.enableTweetDetected && tweets?.length) try {
|
|
34
|
+
event.trigger(type.ListenTweetEvents.UserDetected, { detail: tweets });
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
if (flag.enableUserDetected && users?.length) try {
|
|
38
|
+
event.trigger(type.ListenTweetEvents.UserDetected, { detail: users });
|
|
39
|
+
} catch {
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const containerSelector = "main,main *", itemAndInnerSelector = [dom.primaryItemSelector, dom.primaryCellInnerSelector].join(",");
|
|
45
|
+
function addedElements(els) {
|
|
46
|
+
const { enableVideoRendered: vr, enableTweetRendered: tr } = ListenFlag.flag || {};
|
|
47
|
+
if (!vr && !tr)
|
|
48
|
+
return;
|
|
49
|
+
const tweets = [];
|
|
50
|
+
function parseTweetId(el) {
|
|
51
|
+
const id2 = dom.parseTweetIdByProps(el);
|
|
52
|
+
id2 && tweets.push(id2);
|
|
53
|
+
}
|
|
54
|
+
function processTarget(el) {
|
|
55
|
+
el.matches(dom.primaryItemSelector) ? tr && parseTweetId(el) : el.matches(dom.primaryCellSelector) ? (tr && parseTweetId(el), els.push(...el.querySelectorAll(itemAndInnerSelector))) : el.matches(dom.primaryCellInnerSelector) ? tr && parseTweetId(el) : el.matches(containerSelector) && el.clientHeight > 300 && els.push(...el.querySelectorAll(dom.primaryTweetSelector));
|
|
56
|
+
}
|
|
57
|
+
for (let i = 0; i < els.length; i++)
|
|
58
|
+
try {
|
|
59
|
+
processTarget(els[i]);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
console.warn(e);
|
|
62
|
+
}
|
|
63
|
+
tr && tweets.length && event.trigger(type.ListenTweetEvents.TweetRendered, { detail: tweets });
|
|
64
|
+
}
|
|
65
|
+
function observePage() {
|
|
66
|
+
observer.observe({ subtree: !0, addedElements });
|
|
67
|
+
}
|
|
68
|
+
function startListen(option) {
|
|
69
|
+
ListenFlag.isInit(option) || (listenNet(), observePage());
|
|
70
|
+
}
|
|
71
|
+
exports.startListen = startListen;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { addXhrInterceptor } from 'gs-web-hooks/xhr';
|
|
2
|
+
import { XParser } from './parser.mjs';
|
|
3
|
+
import { trigger } from 'gs-dom/event';
|
|
4
|
+
import { ListenTweetEvents } from './type.mjs';
|
|
5
|
+
import { observe } from 'gs-dom/observer';
|
|
6
|
+
import { primaryItemSelector, primaryCellSelector, primaryCellInnerSelector, primaryTweetSelector, parseTweetIdByProps } from './dom.mjs';
|
|
7
|
+
const ListenFlagKey = "__listen-tweet-flag-key";
|
|
8
|
+
class ListenFlag {
|
|
9
|
+
static #flag;
|
|
10
|
+
static get flag() {
|
|
11
|
+
return this.#flag || (this.#flag = self[ListenFlagKey]);
|
|
12
|
+
}
|
|
13
|
+
static isInit(arg) {
|
|
14
|
+
const init = !!this.flag;
|
|
15
|
+
return arg && this.update(arg), init;
|
|
16
|
+
}
|
|
17
|
+
static update(arg) {
|
|
18
|
+
self[ListenFlagKey] ? (arg?.enableTweetDetected && (self[ListenFlagKey].enableTweetDetected = !0), arg?.enableUserDetected && (self[ListenFlagKey].enableUserDetected = !0)) : Object.defineProperty(self, ListenFlagKey, {
|
|
19
|
+
value: { ...arg },
|
|
20
|
+
enumerable: !1,
|
|
21
|
+
configurable: !1,
|
|
22
|
+
writable: !1
|
|
23
|
+
}), this.#flag = self[ListenFlagKey];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const timelineRegex = /TweetDetail|Timeline|Bookmarks|UserTweets|UserMedia|Likes/, id = "__listen-tweet-interceptor";
|
|
27
|
+
function listenNet() {
|
|
28
|
+
addXhrInterceptor({
|
|
29
|
+
id,
|
|
30
|
+
before: (url) => timelineRegex.test(url) ? url : void 0,
|
|
31
|
+
after: (text) => {
|
|
32
|
+
const json = JSON.parse(text), { tweets, users, videos } = XParser.parseSimple(json), flag = ListenFlag.flag || {};
|
|
33
|
+
if (flag.enableVideoDetected && videos?.length) try {
|
|
34
|
+
trigger(ListenTweetEvents.VideoDetected, { detail: videos });
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
if (flag.enableTweetDetected && tweets?.length) try {
|
|
38
|
+
trigger(ListenTweetEvents.UserDetected, { detail: tweets });
|
|
39
|
+
} catch {
|
|
40
|
+
}
|
|
41
|
+
if (flag.enableUserDetected && users?.length) try {
|
|
42
|
+
trigger(ListenTweetEvents.UserDetected, { detail: users });
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const containerSelector = "main,main *", itemAndInnerSelector = [primaryItemSelector, primaryCellInnerSelector].join(",");
|
|
49
|
+
function addedElements(els) {
|
|
50
|
+
const { enableVideoRendered: vr, enableTweetRendered: tr } = ListenFlag.flag || {};
|
|
51
|
+
if (!vr && !tr)
|
|
52
|
+
return;
|
|
53
|
+
const tweets = [];
|
|
54
|
+
function parseTweetId(el) {
|
|
55
|
+
const id2 = parseTweetIdByProps(el);
|
|
56
|
+
id2 && tweets.push(id2);
|
|
57
|
+
}
|
|
58
|
+
function processTarget(el) {
|
|
59
|
+
el.matches(primaryItemSelector) ? tr && parseTweetId(el) : el.matches(primaryCellSelector) ? (tr && parseTweetId(el), els.push(...el.querySelectorAll(itemAndInnerSelector))) : el.matches(primaryCellInnerSelector) ? tr && parseTweetId(el) : el.matches(containerSelector) && el.clientHeight > 300 && els.push(...el.querySelectorAll(primaryTweetSelector));
|
|
60
|
+
}
|
|
61
|
+
for (let i = 0; i < els.length; i++)
|
|
62
|
+
try {
|
|
63
|
+
processTarget(els[i]);
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.warn(e);
|
|
66
|
+
}
|
|
67
|
+
tr && tweets.length && trigger(ListenTweetEvents.TweetRendered, { detail: tweets });
|
|
68
|
+
}
|
|
69
|
+
function observePage() {
|
|
70
|
+
observe({ subtree: !0, addedElements });
|
|
71
|
+
}
|
|
72
|
+
function startListen(option) {
|
|
73
|
+
ListenFlag.isInit(option) || (listenNet(), observePage());
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
startListen
|
|
77
|
+
};
|
package/lib/type.cjs
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
const DomDisplayTypes = [
|
|
3
|
+
"Tweet",
|
|
4
|
+
"defaultDisplayType",
|
|
5
|
+
"FocalTweet",
|
|
6
|
+
"MediaGrid",
|
|
7
|
+
"User"
|
|
8
|
+
], USER_TYPENAMES = ["User", "UserUnavailable"], TWEET_TYPENAMES = ["Tweet", "TextTombstone", "TweetTombstone", "TweetWithVisibilityResults", "ContextualTweetInterstitial"], COMMUNITY_TYPENAMES = ["Community", "CommunityDeleteActionUnavailable", "CommunityUserDefaultModerationState", "CommunityJoinRequestsUnavailable"], TIMELINE_TYPENAMES = ["TimelineTimelineItem", "TimelineMessagePrompt"], TIMELINE_ITEM_TYPENAMES = ["TimelineTweet", "TimelineMessagePrompt"], TIMELINE_INSTRUCTION_TYPES = ["TimelineAddEntries"], TIMELINE_ENTRY_TYPES = ["TimelineTimelineItem", "TimelineTimelineModule", "TimelineTimelineCursor"], TIMELINE_ITEM_TYPES = ["TimelineTweet", "TimelineMessagePrompt"], MEDIA_TYPES = ["photo", "video", "animated_gif"], ELIGIBILITY_TYPES = ["Eligible", "IneligibleUserUnauthorized"], DISPLAY_TYPES = ["Carousel", "Vertical", "VerticalConversation", "Classic", "EntireTweet"], TWEET_DISPLAY_TYPES = ["CondensedTweet", "Tweet", "SelfThread"], USER_DISPLAY_TYPES = ["SubscribableUser", "User"], INJECTION_TYPES = ["ForYouInNetwork", "ForYouPromoted", "WhoToFollow", "creators-only-connect-tab", "CommunityToJoin", "FollowingInNetwork"], TRANSPARENT_GUIDE_DETAIL_TYPES = ["TimelineEventUrtMetadata"], ELEMENT_TYPES = ["tweet", "user", "event", "feedback", "trend", "users_followed_you", "generic_report_received", "users_liked_your_tweet", "user_quoted_your_tweet", "user_replied_to_your_tweet", "users_retweeted_your_tweet", "user_mentioned_you"], TWEET_QUALITIES = ["HighQuality", "LowQuality", "AbusiveQuality", "RelatedTweet"], COMPONENT_VALUES = ["url", "tweet", "trends", "unified_events", "related_tweet", "suggest_who_to_follow", "for_you_in_network", "for-you-promoted", "alt-text-prompt-injection", "ads-sharing-x-premium-upsell-candidate"], ITEM_TYPES = ["TimelineTweet", "TimelineUser", "TimelineEventSummary", "TimelineMessagePrompt", "TimelineCommunity", "CommunityPinnedTimeline"], CURSOR_TYPES = ["Top", "Bottom", "ShowMore", "ShowMoreThreads"], INSTRUCTION_TYPES = ["TimelineClearCache", "TimelineAddEntries", "TimelineTerminateTimeline", "TimelineShowAlert", "TimelineShowCover"], CONTENT_TYPES = ["TimelineTweetMedia", "TimelineUrl"], VIDEO_CONTENT_TYPES = ["application/x-mpegURL", "video/mp4"], VIDEO_QUALITIES = ["high", "medium", "low"], MESSAGE_INBOX_TIMELINE_INDEXES = ["trusted", "untrusted", "untrusted_low_quality"], NOTIFICATION_KEYS = ["clearCache", "addEntries", "clearEntriesUnreadState", "markEntriesUnreadGreaterThanSortIndex"], VERIFIED_TYPES = ["Business", "Government", "Blue", "None"], USER_LABEL_TYPES = ["BusinessLabel", "AutomatedLabel"], URL_TYPES = ["ExternalUrl", "DeepLink", "UrtEndpoint"], VIEW_STATES = ["EnabledWithCount", "Enabled"], LEGACY_CARD_BINDING_KEY_TYPES = ["thumbnail_image", "description", "domain", "thumbnail_image_large", "thumbnail_image_original", "thumbnail_image_small", "thumbnail_image_x_large", "thumbnail_image_color", "summary_photo_image", "summary_photo_image_small", "summary_photo_image_large", "summary_photo_image_x_large", "summary_photo_image_original", "summary_photo_image_color", "photo_image_full_size_color", "vanity_url", "title", "card_url", "creator", "site", "player_image", "player_image_small", "player_image_large", "player_image_x_large", "player_image_original", "player_image_color", "player_url", "player_width", "player_height", "app_name", "app_is_free", "app_star_rating", "app_num_ratings", "app_price_currency", "unified_card", "app_price_amount"], LEGACY_CARD_BINDING_VALUE_TYPES = ["STRING", "IMAGE_COLOR", "IMAGE", "USER"];
|
|
9
|
+
var IdPrefixes = /* @__PURE__ */ ((IdPrefixes2) => (IdPrefixes2.MessagePrompt = "messageprompt-", IdPrefixes2.NormalTweet = "tweet-", IdPrefixes2.PromotedTweet = "promoted-tweet-", IdPrefixes2.User = "user-", IdPrefixes2.CommunityToJoin = "community-to-join-", IdPrefixes2.HomeConversation = "home-conversation-", IdPrefixes2.Conversationthread = "conversationthread-", IdPrefixes2.CommunityConversation = "community-conversation-", IdPrefixes2.CommunityGrid = "communities-grid-", IdPrefixes2.PinnedTweets = "pinned-tweets-", IdPrefixes2.WhoToFollow = "who-to-follow-", IdPrefixes2.CreatorsOnlyConnectTab = "creators-only-connect-tab-", IdPrefixes2.Label = "label-", IdPrefixes2.Guide = "Guide-", IdPrefixes2.ProfileGrid = "profile-grid-", IdPrefixes2.Notification = "notification-", IdPrefixes2.Cursor = "cursor-", IdPrefixes2.CursorTop = "cursor-top-", IdPrefixes2.CursorBottom = "cursor-bottom-", IdPrefixes2.TweetDetailRelatedTweets = "tweetdetailrelatedtweets-", IdPrefixes2.Trends = "trends-", IdPrefixes2))(IdPrefixes || {}), ListenTweetEvents = /* @__PURE__ */ ((ListenTweetEvents2) => (ListenTweetEvents2.VideoDetected = "__listen-tweet-video-detected", ListenTweetEvents2.TweetDetected = "__listen-tweet-tweet-detected", ListenTweetEvents2.UserDetected = "__listen-tweet-user-detected", ListenTweetEvents2.TweetRendered = "__listen-tweet-tweet-rendered", ListenTweetEvents2.VideoRendered = "__listen-tweet-video-rendered", ListenTweetEvents2))(ListenTweetEvents || {});
|
|
10
|
+
exports.COMMUNITY_TYPENAMES = COMMUNITY_TYPENAMES, exports.COMPONENT_VALUES = COMPONENT_VALUES, exports.CONTENT_TYPES = CONTENT_TYPES, exports.CURSOR_TYPES = CURSOR_TYPES, exports.DISPLAY_TYPES = DISPLAY_TYPES, exports.DomDisplayTypes = DomDisplayTypes, exports.ELEMENT_TYPES = ELEMENT_TYPES, exports.ELIGIBILITY_TYPES = ELIGIBILITY_TYPES, exports.INJECTION_TYPES = INJECTION_TYPES, exports.INSTRUCTION_TYPES = INSTRUCTION_TYPES, exports.ITEM_TYPES = ITEM_TYPES, exports.IdPrefixes = IdPrefixes, exports.LEGACY_CARD_BINDING_KEY_TYPES = LEGACY_CARD_BINDING_KEY_TYPES, exports.LEGACY_CARD_BINDING_VALUE_TYPES = LEGACY_CARD_BINDING_VALUE_TYPES, exports.ListenTweetEvents = ListenTweetEvents, exports.MEDIA_TYPES = MEDIA_TYPES, exports.MESSAGE_INBOX_TIMELINE_INDEXES = MESSAGE_INBOX_TIMELINE_INDEXES, exports.NOTIFICATION_KEYS = NOTIFICATION_KEYS, exports.TIMELINE_ENTRY_TYPES = TIMELINE_ENTRY_TYPES, exports.TIMELINE_INSTRUCTION_TYPES = TIMELINE_INSTRUCTION_TYPES, exports.TIMELINE_ITEM_TYPENAMES = TIMELINE_ITEM_TYPENAMES, exports.TIMELINE_ITEM_TYPES = TIMELINE_ITEM_TYPES, exports.TIMELINE_TYPENAMES = TIMELINE_TYPENAMES, exports.TRANSPARENT_GUIDE_DETAIL_TYPES = TRANSPARENT_GUIDE_DETAIL_TYPES, exports.TWEET_DISPLAY_TYPES = TWEET_DISPLAY_TYPES, exports.TWEET_QUALITIES = TWEET_QUALITIES, exports.TWEET_TYPENAMES = TWEET_TYPENAMES, exports.URL_TYPES = URL_TYPES, exports.USER_DISPLAY_TYPES = USER_DISPLAY_TYPES, exports.USER_LABEL_TYPES = USER_LABEL_TYPES, exports.USER_TYPENAMES = USER_TYPENAMES, exports.VERIFIED_TYPES = VERIFIED_TYPES, exports.VIDEO_CONTENT_TYPES = VIDEO_CONTENT_TYPES, exports.VIDEO_QUALITIES = VIDEO_QUALITIES, exports.VIEW_STATES = VIEW_STATES;
|