@devvit/reddit 0.11.17-next-2025-05-28-417d95f5a.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 (97) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +5 -0
  3. package/RedditClient.d.ts +1155 -0
  4. package/RedditClient.d.ts.map +1 -0
  5. package/RedditClient.js +1417 -0
  6. package/common.d.ts +10 -0
  7. package/common.d.ts.map +1 -0
  8. package/common.js +5 -0
  9. package/getReddit.d.ts +3 -0
  10. package/getReddit.d.ts.map +1 -0
  11. package/getReddit.js +8 -0
  12. package/getRedditApiPlugins.d.ts +23 -0
  13. package/getRedditApiPlugins.d.ts.map +1 -0
  14. package/getRedditApiPlugins.js +25 -0
  15. package/getUserActionsPlugin.d.ts +6 -0
  16. package/getUserActionsPlugin.d.ts.map +1 -0
  17. package/getUserActionsPlugin.js +12 -0
  18. package/graphql/GraphQL.d.ts +10 -0
  19. package/graphql/GraphQL.d.ts.map +1 -0
  20. package/graphql/GraphQL.js +27 -0
  21. package/helpers/makeGettersEnumerable.d.ts +2 -0
  22. package/helpers/makeGettersEnumerable.d.ts.map +1 -0
  23. package/helpers/makeGettersEnumerable.js +19 -0
  24. package/helpers/permissions.d.ts +6 -0
  25. package/helpers/permissions.d.ts.map +1 -0
  26. package/helpers/permissions.js +24 -0
  27. package/helpers/richtextToString.d.ts +3 -0
  28. package/helpers/richtextToString.d.ts.map +1 -0
  29. package/helpers/richtextToString.js +14 -0
  30. package/helpers/textFallbackToRichtext.d.ts +4 -0
  31. package/helpers/textFallbackToRichtext.d.ts.map +1 -0
  32. package/helpers/textFallbackToRichtext.js +14 -0
  33. package/index.d.ts +3 -0
  34. package/index.d.ts.map +1 -0
  35. package/index.js +1 -0
  36. package/models/Comment.d.ts +138 -0
  37. package/models/Comment.d.ts.map +1 -0
  38. package/models/Comment.js +597 -0
  39. package/models/Flair.d.ts +171 -0
  40. package/models/Flair.d.ts.map +1 -0
  41. package/models/Flair.js +293 -0
  42. package/models/Listing.d.ts +53 -0
  43. package/models/Listing.d.ts.map +1 -0
  44. package/models/Listing.js +101 -0
  45. package/models/ModAction.d.ts +32 -0
  46. package/models/ModAction.d.ts.map +1 -0
  47. package/models/ModAction.js +70 -0
  48. package/models/ModMail.d.ts +655 -0
  49. package/models/ModMail.d.ts.map +1 -0
  50. package/models/ModMail.js +723 -0
  51. package/models/ModNote.d.ts +57 -0
  52. package/models/ModNote.d.ts.map +1 -0
  53. package/models/ModNote.js +103 -0
  54. package/models/Post.d.ts +491 -0
  55. package/models/Post.d.ts.map +1 -0
  56. package/models/Post.js +1022 -0
  57. package/models/PrivateMessage.d.ts +52 -0
  58. package/models/PrivateMessage.d.ts.map +1 -0
  59. package/models/PrivateMessage.js +126 -0
  60. package/models/Subreddit.d.ts +606 -0
  61. package/models/Subreddit.d.ts.map +1 -0
  62. package/models/Subreddit.js +750 -0
  63. package/models/User.d.ts +238 -0
  64. package/models/User.d.ts.map +1 -0
  65. package/models/User.js +458 -0
  66. package/models/Vault.d.ts +32 -0
  67. package/models/Vault.d.ts.map +1 -0
  68. package/models/Vault.js +25 -0
  69. package/models/Widget.d.ts +133 -0
  70. package/models/Widget.d.ts.map +1 -0
  71. package/models/Widget.js +467 -0
  72. package/models/WikiPage.d.ts +137 -0
  73. package/models/WikiPage.d.ts.map +1 -0
  74. package/models/WikiPage.js +329 -0
  75. package/models/index.d.ts +14 -0
  76. package/models/index.d.ts.map +1 -0
  77. package/models/index.js +13 -0
  78. package/package.json +46 -0
  79. package/tests/comment.api.test.d.ts.map +1 -0
  80. package/tests/flair.api.test.d.ts.map +1 -0
  81. package/tests/modmail.api.test.d.ts.map +1 -0
  82. package/tests/modnote.api.test.d.ts.map +1 -0
  83. package/tests/post.api.test.d.ts.map +1 -0
  84. package/tests/subreddit.api.test.d.ts.map +1 -0
  85. package/tests/user.api.test.d.ts.map +1 -0
  86. package/tests/utils/createTestPreview.d.ts +2 -0
  87. package/tests/utils/createTestPreview.d.ts.map +1 -0
  88. package/tests/utils/createTestPreview.js +5 -0
  89. package/tests/utils/redditApiPluginsMock.d.ts +203 -0
  90. package/tests/utils/redditApiPluginsMock.d.ts.map +1 -0
  91. package/tests/utils/redditApiPluginsMock.js +202 -0
  92. package/tests/utils/runWithTestContext.d.ts +4 -0
  93. package/tests/utils/runWithTestContext.d.ts.map +1 -0
  94. package/tests/utils/runWithTestContext.js +12 -0
  95. package/tests/utils/userActionsPluginMock.d.ts +6 -0
  96. package/tests/utils/userActionsPluginMock.d.ts.map +1 -0
  97. package/tests/utils/userActionsPluginMock.js +5 -0
@@ -0,0 +1,57 @@
1
+ import type { DeleteNotesRequest, GetNotesRequest, PostNotesRequest, PostRemovalNoteRequest } from '@devvit/protos';
2
+ import type { Prettify } from '@devvit/shared-types/Prettify.js';
3
+ import type { T1ID, T2ID, T3ID, T5ID } from '@devvit/shared-types/tid.js';
4
+ import type { ListingFetchOptions } from './Listing.js';
5
+ import { Listing } from './Listing.js';
6
+ import type { ModAction } from './ModAction.js';
7
+ export type ModNoteType = 'NOTE' | 'APPROVAL' | 'REMOVAL' | 'BAN' | 'MUTE' | 'INVITE' | 'SPAM' | 'CONTENT_CHANGE' | 'MOD_ACTION' | 'ALL';
8
+ export type UserNoteLabel = 'BOT_BAN' | 'PERMA_BAN' | 'BAN' | 'ABUSE_WARNING' | 'SPAM_WARNING' | 'SPAM_WATCH' | 'SOLID_CONTRIBUTOR' | 'HELPFUL_USER';
9
+ export type UserNote = {
10
+ note?: string | undefined;
11
+ redditId?: T1ID | T3ID | T5ID | undefined;
12
+ label?: UserNoteLabel | undefined;
13
+ };
14
+ export interface ModNote {
15
+ id: string;
16
+ operator: {
17
+ id?: T2ID | undefined;
18
+ name?: string | undefined;
19
+ };
20
+ user: {
21
+ id?: T2ID | undefined;
22
+ name?: string | undefined;
23
+ };
24
+ subreddit: {
25
+ id?: T5ID | undefined;
26
+ name?: string | undefined;
27
+ };
28
+ type: ModNoteType;
29
+ createdAt: Date;
30
+ userNote?: UserNote | undefined;
31
+ modAction?: ModAction;
32
+ }
33
+ export type GetModNotesOptions = Prettify<Pick<GetNotesRequest, 'subreddit' | 'user'> & {
34
+ filter?: ModNoteType;
35
+ } & Pick<ListingFetchOptions, 'limit' | 'before'>>;
36
+ export type CreateModNoteOptions = Prettify<PostNotesRequest & {
37
+ redditId?: T1ID | T3ID;
38
+ label?: UserNoteLabel;
39
+ }>;
40
+ export type DeleteNotesOptions = Prettify<DeleteNotesRequest>;
41
+ export type AddRemovalNoteOptions = Prettify<PostRemovalNoteRequest>;
42
+ export declare class ModNote {
43
+ #private;
44
+ /**
45
+ * @internal
46
+ */
47
+ private constructor();
48
+ /** @internal */
49
+ static get(options: GetModNotesOptions): Listing<ModNote>;
50
+ /** @internal */
51
+ static delete(options: DeleteNotesOptions): Promise<boolean>;
52
+ /** @internal */
53
+ static add(options: CreateModNoteOptions): Promise<ModNote>;
54
+ /** @internal */
55
+ static addRemovalNote(options: AddRemovalNoteOptions): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=ModNote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModNote.d.ts","sourceRoot":"","sources":["../../src/models/ModNote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _a, _ModNote_fromProto, _ModNote_metadata_get;
7
+ import { getContext } from '@devvit/server';
8
+ import { assertNonNull } from '@devvit/shared-types/NonNull.js';
9
+ import { asT2ID, asT5ID, asTID } from '@devvit/shared-types/tid.js';
10
+ import { getRedditApiPlugins } from '../getRedditApiPlugins.js';
11
+ import { Listing } from './Listing.js';
12
+ export class ModNote {
13
+ /**
14
+ * @internal
15
+ */
16
+ constructor() { }
17
+ /** @internal */
18
+ static get(options) {
19
+ const client = getRedditApiPlugins().ModNote;
20
+ return new Listing({
21
+ hasMore: true,
22
+ before: options.before,
23
+ limit: options.limit,
24
+ pageSize: options.limit,
25
+ fetch: async (fetchOptions) => {
26
+ const protoRes = await client.GetNotes({
27
+ subreddit: options.subreddit,
28
+ user: options.user,
29
+ filter: options.filter,
30
+ before: fetchOptions.before,
31
+ limit: fetchOptions.limit,
32
+ }, __classPrivateFieldGet(this, _a, "a", _ModNote_metadata_get));
33
+ return {
34
+ children: protoRes.modNotes?.map((protoModNote) => __classPrivateFieldGet(this, _a, "m", _ModNote_fromProto).call(this, protoModNote)) || [],
35
+ // if the response says that there are no more pages, then we should set before to undefined
36
+ // to prevent more requests from being made
37
+ before: protoRes.hasNextPage ? protoRes.endCursor : undefined,
38
+ hasMore: protoRes.hasNextPage,
39
+ };
40
+ },
41
+ });
42
+ }
43
+ /** @internal */
44
+ static async delete(options) {
45
+ const client = getRedditApiPlugins().ModNote;
46
+ const { deleted } = await client.DeleteNotes(options, __classPrivateFieldGet(this, _a, "a", _ModNote_metadata_get));
47
+ return !!deleted;
48
+ }
49
+ /** @internal */
50
+ static async add(options) {
51
+ const client = getRedditApiPlugins().ModNote;
52
+ const res = await client.PostNotes(options, __classPrivateFieldGet(this, _a, "a", _ModNote_metadata_get));
53
+ if (!res?.created) {
54
+ throw new Error('Failed to create mod note');
55
+ }
56
+ return __classPrivateFieldGet(this, _a, "m", _ModNote_fromProto).call(this, res.created);
57
+ }
58
+ /** @internal */
59
+ static async addRemovalNote(options) {
60
+ const client = getRedditApiPlugins().ModNote;
61
+ await client.PostRemovalNote(options, __classPrivateFieldGet(this, _a, "a", _ModNote_metadata_get));
62
+ }
63
+ }
64
+ _a = ModNote, _ModNote_fromProto = function _ModNote_fromProto(protoModNote) {
65
+ // check that all required fields of protoModNote needed to create a ModNote are present
66
+ assertNonNull(protoModNote.id, 'Mod note ID is null or undefined');
67
+ assertNonNull(protoModNote.createdAt, 'Mod note createdAt is null or undefined');
68
+ assertNonNull(protoModNote.type, 'Mod note type is null or undefined');
69
+ assertNonNull(protoModNote.subreddit, 'Mod note subreddit is null or undefined');
70
+ assertNonNull(protoModNote.subredditId, 'Mod note subredditId is null or undefined');
71
+ assertNonNull(protoModNote.operator, 'Mod note operator is null or undefined');
72
+ assertNonNull(protoModNote.operatorId, 'Mod note operatorId is null or undefined');
73
+ assertNonNull(protoModNote.user, 'Mod note user is null or undefined');
74
+ assertNonNull(protoModNote.userId, 'Mod note userId is null or undefined');
75
+ assertNonNull(protoModNote.userNoteData, 'Mod note userNote is null or undefined');
76
+ assertNonNull(protoModNote.modActionData, 'Mod note modAction is null or undefined');
77
+ return {
78
+ id: protoModNote.id,
79
+ user: {
80
+ id: asT2ID(protoModNote.userId ?? ''),
81
+ name: protoModNote.user,
82
+ },
83
+ subreddit: {
84
+ id: asT5ID(protoModNote.subredditId ?? ''),
85
+ name: protoModNote.subreddit,
86
+ },
87
+ operator: {
88
+ id: asT2ID(protoModNote.operatorId ?? ''),
89
+ name: protoModNote.operator,
90
+ },
91
+ createdAt: new Date(protoModNote.createdAt * 1000), // convert to ms
92
+ userNote: {
93
+ note: protoModNote.userNoteData?.note,
94
+ redditId: protoModNote.userNoteData?.redditId
95
+ ? asTID(protoModNote.userNoteData?.redditId)
96
+ : undefined,
97
+ label: protoModNote.userNoteData?.label,
98
+ },
99
+ type: protoModNote.type,
100
+ };
101
+ }, _ModNote_metadata_get = function _ModNote_metadata_get() {
102
+ return getContext().debug.metadata;
103
+ };
@@ -0,0 +1,491 @@
1
+ import type { RedditObject } from '@devvit/protos';
2
+ import type { GalleryMediaStatus as GalleryMediaStatusProto } from '@devvit/protos';
3
+ import { RichTextBuilder } from '@devvit/shared-types/richtext/RichTextBuilder.js';
4
+ import type { T2ID, T3ID, T5ID } from '@devvit/shared-types/tid.js';
5
+ import { type UserGeneratedContent } from '../common.js';
6
+ import type { CommentSubmissionOptions } from './Comment.js';
7
+ import { Comment } from './Comment.js';
8
+ import type { ListingFetchOptions } from './Listing.js';
9
+ import { Listing } from './Listing.js';
10
+ import { User } from './User.js';
11
+ export type GetPostsOptions = ListingFetchOptions & {
12
+ subredditName?: string;
13
+ };
14
+ export type GetPostsOptionsWithTimeframe = GetPostsOptions & {
15
+ timeframe?: 'hour' | 'day' | 'week' | 'month' | 'year' | 'all';
16
+ };
17
+ export type GetSortedPostsOptions = GetPostsOptionsWithTimeframe & {
18
+ sort: 'top' | 'controversial';
19
+ };
20
+ export type GetHotPostsOptions = GetPostsOptions & {
21
+ location?: 'GLOBAL' | 'US' | 'AR' | 'AU' | 'BG' | 'CA' | 'CL' | 'CO' | 'HR' | 'CZ' | 'FI' | 'FR' | 'DE' | 'GR' | 'HU' | 'IS' | 'IN' | 'IE' | 'IT' | 'JP' | 'MY' | 'MX' | 'NZ' | 'PH' | 'PL' | 'PT' | 'PR' | 'RO' | 'RS' | 'SG' | 'ES' | 'SE' | 'TW' | 'TH' | 'TR' | 'GB' | 'US_WA' | 'US_DE' | 'US_DC' | 'US_WI' | 'US_WV' | 'US_HI' | 'US_FL' | 'US_WY' | 'US_NH' | 'US_NJ' | 'US_NM' | 'US_TX' | 'US_LA' | 'US_NC' | 'US_ND' | 'US_NE' | 'US_TN' | 'US_NY' | 'US_PA' | 'US_CA' | 'US_NV' | 'US_VA' | 'US_CO' | 'US_AK' | 'US_AL' | 'US_AR' | 'US_VT' | 'US_IL' | 'US_GA' | 'US_IN' | 'US_IA' | 'US_OK' | 'US_AZ' | 'US_ID' | 'US_CT' | 'US_ME' | 'US_MD' | 'US_MA' | 'US_OH' | 'US_UT' | 'US_MO' | 'US_MN' | 'US_MI' | 'US_RI' | 'US_KS' | 'US_MT' | 'US_MS' | 'US_SC' | 'US_KY' | 'US_OR' | 'US_SD';
22
+ };
23
+ export type GetPostsByUserOptions = {
24
+ username: string;
25
+ sort?: 'hot' | 'new' | 'top' | 'controversial';
26
+ timeframe?: 'hour' | 'day' | 'week' | 'month' | 'year' | 'all';
27
+ pageSize?: number;
28
+ limit?: number;
29
+ after?: string;
30
+ before?: string;
31
+ };
32
+ export type PostSuggestedCommentSort = 'BLANK'
33
+ /** "Best" sort. */
34
+ | 'CONFIDENCE' | 'CONTROVERSIAL' | 'LIVE'
35
+ /** Sort comments by creation time. */
36
+ | 'NEW' | 'OLD'
37
+ /** Similar to the "best" (confidence) sort, but specially designed for
38
+ Q&A-type threads to highlight good question/answer pairs. */
39
+ | 'QA' | 'RANDOM'
40
+ /** Sort by top upvoted comments. */
41
+ | 'TOP';
42
+ export type PostTextOptions = {
43
+ text: string;
44
+ } | {
45
+ richtext: object | RichTextBuilder;
46
+ };
47
+ export type CustomPostRichTextFallback = RichTextBuilder | string;
48
+ export type CustomPostTextFallbackOptions = {
49
+ /**
50
+ * May also include markdown. See https://www.reddit.com/r/reddit.com/wiki/markdown/
51
+ */
52
+ text: string;
53
+ } | {
54
+ richtext: CustomPostRichTextFallback;
55
+ };
56
+ export type SubmitLinkOptions = CommonSubmitPostOptions & {
57
+ url: string;
58
+ /**
59
+ * @deprecated Unsupported. This property is for backwards compatibility and
60
+ * has no effect. It will removed in a future version. New code should not
61
+ * use it.
62
+ */
63
+ resubmit?: boolean;
64
+ };
65
+ export type SubmitMediaOptions = CommonSubmitPostOptions & {
66
+ kind: 'image' | 'video' | 'videogif';
67
+ videoPosterUrl?: string;
68
+ imageUrls?: [string];
69
+ };
70
+ export type SubmitSelfPostOptions = PostTextOptions & CommonSubmitPostOptions;
71
+ export type SubmitCustomPostTextFallbackOptions = {
72
+ textFallback?: CustomPostTextFallbackOptions;
73
+ };
74
+ export type SubmitCustomPostOptions = CommonSubmitPostOptions & SubmitCustomPostTextFallbackOptions & {
75
+ preview: JSX.Element;
76
+ userGeneratedContent?: UserGeneratedContent;
77
+ };
78
+ export type CommonSubmitPostOptions = {
79
+ title: string;
80
+ sendreplies?: boolean;
81
+ nsfw?: boolean;
82
+ spoiler?: boolean;
83
+ flairId?: string;
84
+ flairText?: string;
85
+ runAs?: 'USER' | 'APP';
86
+ };
87
+ export type SubmitPostOptions = (SubmitLinkOptions | SubmitSelfPostOptions | SubmitCustomPostOptions | SubmitMediaOptions) & {
88
+ subredditName: string;
89
+ };
90
+ export type CrosspostOptions = CommonSubmitPostOptions & {
91
+ subredditName: string;
92
+ postId: string;
93
+ };
94
+ export type LinkFlair = {
95
+ /**
96
+ * One of: "text", "richtext"
97
+ */
98
+ type?: string | undefined;
99
+ /**
100
+ * Flair template ID to use when rendering this flair
101
+ */
102
+ templateId?: string | undefined;
103
+ /**
104
+ * Plain text representation of the flair
105
+ */
106
+ text?: string | undefined;
107
+ /**
108
+ * RichText object representation of the flair
109
+ */
110
+ richtext: {
111
+ /**
112
+ * Enum of element types. e.g. emoji or text
113
+ */
114
+ elementType?: string | undefined;
115
+ /**
116
+ * Text to show up in the flair, e.g. "Need Advice"
117
+ */
118
+ text?: string | undefined;
119
+ /**
120
+ * Emoji references, e.g. ":rainbow:"
121
+ */
122
+ emojiRef?: string | undefined;
123
+ /**
124
+ * url string, e.g. "https://reddit.com/"
125
+ */
126
+ url?: string | undefined;
127
+ }[];
128
+ /**
129
+ * Custom CSS classes from the subreddit's stylesheet to apply to the flair if rendered as HTML
130
+ */
131
+ cssClass?: string | undefined;
132
+ /**
133
+ * One of: "light", "dark"
134
+ */
135
+ textColor?: string | undefined;
136
+ /**
137
+ * Flair background color as a hex color string (# prefixed)
138
+ * @example "#FF4500"
139
+ */
140
+ backgroundColor?: string | undefined;
141
+ };
142
+ /**
143
+ * oEmbed is a format for allowing an embedded representation of a URL on third party sites.
144
+ * The simple API allows a website to display embedded content (such as photos or videos)
145
+ * when a user posts a link to that resource, without having to parse the resource directly.
146
+ * See: https://oembed.com/
147
+ */
148
+ export type OEmbed = {
149
+ /** The resource type. Valid values, along with value-specific parameters, are described below. E.g. "video" */
150
+ type: string;
151
+ /** A text title, describing the resource. */
152
+ title?: string | undefined;
153
+ /** A URL for the author/owner of the resource. E.g. "YouTube" */
154
+ providerName?: string | undefined;
155
+ /** The name of the resource provider. E.g "https://www.youtube.com/" */
156
+ providerUrl?: string | undefined;
157
+ /** The oEmbed version number. This must be 1.0. */
158
+ version: string;
159
+ /** The width of the optional thumbnail in pixels */
160
+ thumbnailWidth?: number | undefined;
161
+ /** The height of the optional thumbnail in pixels */
162
+ thumbnailHeight?: number | undefined;
163
+ /** A URL to a thumbnail image representing the resource. */
164
+ thumbnailUrl?: string | undefined;
165
+ /** The HTML required to embed a video player. The HTML should have no padding or margins. Consumers may wish to load the HTML in an off-domain iframe to avoid XSS vulnerabilities. */
166
+ html: string;
167
+ /** The width in pixels required to display the HTML. */
168
+ height?: number | undefined;
169
+ /** The height in pixels required to display the HTML. */
170
+ width?: number | undefined;
171
+ /** A URL for the author/owner of the resource. E.g. "https://www.youtube.com/@Reddit" */
172
+ authorUrl?: string | undefined;
173
+ /** The name of the author/owner of the resource. E.g. "Reddit" */
174
+ authorName?: string | undefined;
175
+ };
176
+ /**
177
+ * Contains the data for a video hosted on Reddit that is in a post
178
+ */
179
+ export type RedditVideo = {
180
+ /** The bitrate of the video in kilobits per second. E.g. 450 */
181
+ bitrateKbps?: number | undefined;
182
+ /** The URL to the DASH playlist file. E.g. "https://v.redd.it/abc123/DASHPlaylist.mpd" */
183
+ dashUrl?: string | undefined;
184
+ /** The duration of the video in seconds. E.g. 30 */
185
+ duration?: number | undefined;
186
+ /** The direct URL to the video. E.g. "https://v.redd.it/abc123/DASH_1080.mp4?source=fallback" */
187
+ fallbackUrl?: string | undefined;
188
+ /** The height of the video in pixels. E.g. 1080 */
189
+ height?: number | undefined;
190
+ /** The URL to the HLS playlist file. E.g. "https://v.redd.it/abc123/HLSPlaylist.m3u8" */
191
+ hlsUrl?: string | undefined;
192
+ /** If `true`, the video is a GIF */
193
+ isGif?: boolean | undefined;
194
+ /** The URL to the scrubber media file. E.g. "https://v.redd.it/abc123/DASH_96.mp4" */
195
+ scrubberMediaUrl?: string | undefined;
196
+ /** The status of the transcoding process. E.g. "completed" */
197
+ transcodingStatus?: string | undefined;
198
+ /** The width of the video in pixels. E.g. 1920 */
199
+ width?: number | undefined;
200
+ };
201
+ export type SecureMedia = {
202
+ /** The type of the OEmbed media, if present (e.g. "youtube.com") */
203
+ type?: string | undefined;
204
+ oembed?: OEmbed | undefined;
205
+ redditVideo?: RedditVideo | undefined;
206
+ };
207
+ /**
208
+ * Contains data about a post's thumbnail. Also contains a blurred version if the thumbnail is NSFW.
209
+ */
210
+ export type EnrichedThumbnail = {
211
+ /** Attribution text for the thumbnail */
212
+ attribution?: string;
213
+ /** The image used for the thumbnail. May have different resolution from Post.thumbnail */
214
+ image: {
215
+ url: string;
216
+ height: number;
217
+ width: number;
218
+ };
219
+ /** Whether this thumbnail appears blurred by default */
220
+ isObfuscatedDefault: boolean;
221
+ /** The blurred image for NSFW thumbnails */
222
+ obfuscatedImage?: {
223
+ url: string;
224
+ height: number;
225
+ width: number;
226
+ };
227
+ };
228
+ export declare const GalleryMediaStatus: {
229
+ readonly UNKNOWN: 0;
230
+ readonly VALID: 1;
231
+ readonly FAILED: 2;
232
+ };
233
+ export type GalleryMediaStatus = (typeof GalleryMediaStatusProto)[keyof typeof GalleryMediaStatusProto];
234
+ /**
235
+ * Represents media that the post may contain.
236
+ */
237
+ export type GalleryMedia = {
238
+ /** Status of the media. Media that were successfully uplaoded will have GalleryMediaStatus.VALID status */
239
+ status: GalleryMediaStatus;
240
+ url: string;
241
+ height: number;
242
+ width: number;
243
+ };
244
+ export declare class Post {
245
+ #private;
246
+ /**
247
+ * @internal
248
+ */
249
+ constructor(data: RedditObject);
250
+ get id(): T3ID;
251
+ get authorId(): T2ID | undefined;
252
+ get authorName(): string;
253
+ get subredditId(): T5ID;
254
+ get subredditName(): string;
255
+ get permalink(): string;
256
+ get title(): string;
257
+ get body(): string | undefined;
258
+ get bodyHtml(): string | undefined;
259
+ get url(): string;
260
+ get thumbnail(): {
261
+ url: string;
262
+ height: number;
263
+ width: number;
264
+ } | undefined;
265
+ get createdAt(): Date;
266
+ get score(): number;
267
+ get numberOfComments(): number;
268
+ get numberOfReports(): number;
269
+ get approved(): boolean;
270
+ get approvedAtUtc(): number;
271
+ get bannedAtUtc(): number;
272
+ get spam(): boolean;
273
+ get stickied(): boolean;
274
+ get removed(): boolean;
275
+ /**
276
+ * Who removed this object (username)
277
+ */
278
+ get removedBy(): string | undefined;
279
+ /**
280
+ * who/what removed this object. It will return one of the following:
281
+ * - "anti_evil_ops": object is removed by a aeops member
282
+ * - "author": object is removed by author of the post
283
+ * - "automod_filtered": object is filtered by automod
284
+ * - "community_ops": object is removed by a community team member
285
+ * - "content_takedown": object is removed due to content violation
286
+ * - "copyright_takedown": object is removed due to copyright violation
287
+ * - "deleted": object is deleted
288
+ * - "moderator": object is removed by a mod of the sub
289
+ * - "reddit": object is removed by anyone else
290
+ * - undefined: object is not removed
291
+ */
292
+ get removedByCategory(): string | undefined;
293
+ get archived(): boolean;
294
+ get edited(): boolean;
295
+ get locked(): boolean;
296
+ get nsfw(): boolean;
297
+ get quarantined(): boolean;
298
+ get spoiler(): boolean;
299
+ get hidden(): boolean;
300
+ get ignoringReports(): boolean;
301
+ get distinguishedBy(): string | undefined;
302
+ get comments(): Listing<Comment>;
303
+ get flair(): LinkFlair | undefined;
304
+ get secureMedia(): SecureMedia | undefined;
305
+ get userReportReasons(): string[];
306
+ get modReportReasons(): string[];
307
+ /**
308
+ * Get the media in the post. Empty if the post doesn't have any media.
309
+ */
310
+ get gallery(): GalleryMedia[];
311
+ toJSON(): Pick<Post, 'id' | 'authorId' | 'authorName' | 'subredditId' | 'subredditName' | 'permalink' | 'title' | 'body' | 'bodyHtml' | 'url' | 'thumbnail' | 'score' | 'numberOfComments' | 'numberOfReports' | 'createdAt' | 'approved' | 'spam' | 'stickied' | 'removed' | 'removedBy' | 'removedByCategory' | 'archived' | 'edited' | 'locked' | 'nsfw' | 'quarantined' | 'spoiler' | 'hidden' | 'ignoringReports' | 'distinguishedBy' | 'flair' | 'secureMedia' | 'userReportReasons' | 'modReportReasons'>;
312
+ isApproved(): boolean;
313
+ isSpam(): boolean;
314
+ isStickied(): boolean;
315
+ isRemoved(): boolean;
316
+ isArchived(): boolean;
317
+ isEdited(): boolean;
318
+ isLocked(): boolean;
319
+ isNsfw(): boolean;
320
+ isQuarantined(): boolean;
321
+ isSpoiler(): boolean;
322
+ isHidden(): boolean;
323
+ isIgnoringReports(): boolean;
324
+ isDistinguishedBy(): string | undefined;
325
+ edit(options: PostTextOptions): Promise<void>;
326
+ /**
327
+ * Set the suggested sort for comments on a Post.
328
+ *
329
+ * @throws {Error} Throws an error if the suggested sort could not be set.
330
+ * @example
331
+ * ```ts
332
+ * const post = await reddit.getPostById(context.postId);
333
+ * await post.setSuggestedCommentSort("NEW");
334
+ * ```
335
+ */
336
+ setSuggestedCommentSort(suggestedSort: PostSuggestedCommentSort): Promise<void>;
337
+ /**
338
+ * Set a lightweight UI that shows while the custom post renders
339
+ *
340
+ * @param {JSX.ComponentFunction} ui - A JSX component function that returns a simple ui to be rendered.
341
+ * @throws {Error} Throws an error if the preview could not be set.
342
+ * @example
343
+ * ```ts
344
+ * const preview = (
345
+ * <vstack height="100%" width="100%" alignment="middle center">
346
+ * <text size="large">An updated preview!</text>
347
+ * </vstack>
348
+ * );
349
+ * const post = await reddit.getPostById(context.postId);
350
+ * await post.setCustomPostPreview(() => preview);
351
+ * ```
352
+ */
353
+ setCustomPostPreview(ui: JSX.ComponentFunction): Promise<void>;
354
+ /**
355
+ * Set a text fallback for the custom post
356
+ *
357
+ * @param {CustomPostTextFallbackOptions} options - A text or a richtext to render in a fallback
358
+ * @throws {Error} Throws an error if the fallback could not be set.
359
+ * @example
360
+ * ```ts
361
+ * // from a menu action, form, scheduler, trigger, custom post click event, etc
362
+ * const newTextFallback = { text: 'This is an updated text fallback' };
363
+ * const post = await context.reddit.getPostById(context.postId);
364
+ * await post.setTextFallback(newTextFallback);
365
+ * ```
366
+ */
367
+ setTextFallback(options: CustomPostTextFallbackOptions): Promise<void>;
368
+ addComment(options: CommentSubmissionOptions): Promise<Comment>;
369
+ delete(): Promise<void>;
370
+ approve(): Promise<void>;
371
+ remove(isSpam?: boolean): Promise<void>;
372
+ lock(): Promise<void>;
373
+ unlock(): Promise<void>;
374
+ hide(): Promise<void>;
375
+ unhide(): Promise<void>;
376
+ markAsNsfw(): Promise<void>;
377
+ unmarkAsNsfw(): Promise<void>;
378
+ markAsSpoiler(): Promise<void>;
379
+ unmarkAsSpoiler(): Promise<void>;
380
+ sticky(position?: 1 | 2 | 3 | 4): Promise<void>;
381
+ unsticky(): Promise<void>;
382
+ distinguish(): Promise<void>;
383
+ distinguishAsAdmin(): Promise<void>;
384
+ undistinguish(): Promise<void>;
385
+ ignoreReports(): Promise<void>;
386
+ unignoreReports(): Promise<void>;
387
+ getAuthor(): Promise<User | undefined>;
388
+ crosspost(options: Omit<CrosspostOptions, 'postId'>): Promise<Post>;
389
+ /**
390
+ * Add a mod note for why the post was removed
391
+ *
392
+ * @param options.reasonId id of a Removal Reason - you can leave this as an empty string if you don't have one
393
+ * @param options.modNote the reason for removal (maximum 100 characters) (optional)
394
+ * @returns
395
+ */
396
+ addRemovalNote(options: {
397
+ reasonId: string;
398
+ modNote?: string;
399
+ }): Promise<void>;
400
+ /**
401
+ * Get a thumbnail that contains a preview image and also contains a blurred preview for
402
+ * NSFW images. The thumbnail returned has higher resolution than Post.thumbnail.
403
+ * Returns undefined if the post doesn't have a thumbnail
404
+ *
405
+ * @returns {EnrichedThumbnail | undefined}
406
+ * @throws {Error} Throws an error if the thumbnail could not be fetched
407
+ * @example
408
+ * ```ts
409
+ * // from a menu action, form, scheduler, trigger, custom post click event, etc
410
+ * const post = await context.reddit.getPostById(context.postId);
411
+ * const enrichedThumbnail = await post.getEnrichedThumbnail();
412
+ * ```
413
+ */
414
+ getEnrichedThumbnail(): Promise<EnrichedThumbnail | undefined>;
415
+ /** @internal */
416
+ static getById(id: T3ID): Promise<Post>;
417
+ /** @internal */
418
+ static submit(options: SubmitPostOptions): Promise<Post>;
419
+ /** @internal */
420
+ static crosspost(options: CrosspostOptions): Promise<Post>;
421
+ /** @internal */
422
+ static edit(options: PostTextOptions & {
423
+ id: T3ID;
424
+ }): Promise<Post>;
425
+ /** @internal */
426
+ static setSuggestedCommentSort(options: {
427
+ suggestedSort: PostSuggestedCommentSort;
428
+ id: T3ID;
429
+ subredditId: T5ID;
430
+ }): Promise<void>;
431
+ /** @internal */
432
+ static setCustomPostPreview(options: {
433
+ id: T3ID;
434
+ ui: JSX.ComponentFunction;
435
+ }): Promise<void>;
436
+ /** @internal */
437
+ static setTextFallback(options: CustomPostTextFallbackOptions, postId: T3ID): Promise<Post>;
438
+ /** @internal */
439
+ static delete(id: T3ID): Promise<void>;
440
+ /** @internal */
441
+ static approve(id: T3ID): Promise<void>;
442
+ /** @internal */
443
+ static remove(id: T3ID, isSpam?: boolean): Promise<void>;
444
+ /** @internal */
445
+ static hide(id: T3ID): Promise<void>;
446
+ /** @internal */
447
+ static unhide(id: T3ID): Promise<void>;
448
+ /** @internal */
449
+ static markAsNsfw(id: T3ID): Promise<void>;
450
+ /** @internal */
451
+ static unmarkAsNsfw(id: T3ID): Promise<void>;
452
+ /** @internal */
453
+ static markAsSpoiler(id: T3ID): Promise<void>;
454
+ /** @internal */
455
+ static unmarkAsSpoiler(id: T3ID): Promise<void>;
456
+ /** @internal */
457
+ static sticky(id: T3ID, position: 1 | 2 | 3 | 4 | undefined): Promise<void>;
458
+ /** @internal */
459
+ static unsticky(id: T3ID): Promise<void>;
460
+ /** @internal */
461
+ static lock(id: T3ID): Promise<void>;
462
+ /** @internal */
463
+ static unlock(id: T3ID): Promise<void>;
464
+ /** @internal */
465
+ static distinguish(id: T3ID, asAdmin: boolean): Promise<{
466
+ distinguishedBy: string | undefined;
467
+ }>;
468
+ /** @internal */
469
+ static undistinguish(id: T3ID): Promise<{
470
+ distinguishedBy: string | undefined;
471
+ }>;
472
+ /** @internal */
473
+ static ignoreReports(id: T3ID): Promise<void>;
474
+ /** @internal */
475
+ static unignoreReports(id: T3ID): Promise<void>;
476
+ /** @internal */
477
+ static getControversialPosts(options?: GetPostsOptionsWithTimeframe): Listing<Post>;
478
+ /** @internal */
479
+ static getTopPosts(options?: GetPostsOptionsWithTimeframe): Listing<Post>;
480
+ /** @internal */
481
+ static getSortedPosts(options: GetSortedPostsOptions): Listing<Post>;
482
+ /** @internal */
483
+ static getHotPosts(options?: GetHotPostsOptions): Listing<Post>;
484
+ /** @internal */
485
+ static getNewPosts(options: GetPostsOptions): Listing<Post>;
486
+ /** @internal */
487
+ static getRisingPosts(options: GetPostsOptions): Listing<Post>;
488
+ /** @internal */
489
+ static getPostsByUser(options: GetPostsByUserOptions): Listing<Post>;
490
+ }
491
+ //# sourceMappingURL=Post.d.ts.map