@devvit/reddit 0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0 → 0.12.6-next-2025-12-11-18-30-05-ab21270e1.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.
@@ -1,10 +1,15 @@
1
1
  import type { GraphQL, Metadata, QueryResponse } from '@devvit/protos';
2
2
  import type { PersistedQueryRequest, QueryRequest } from '@devvit/protos/types/devvit/plugin/redditapi/graphql/graphql_msg.js';
3
+ import type { PluginMock } from '@devvit/shared-types/test/index.js';
3
4
  import type { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
4
- export declare class GraphQLMock implements GraphQL {
5
+ export declare class GraphQLPluginMock implements GraphQL {
5
6
  private readonly _linksAndCommentsMock;
6
7
  constructor(linksAndCommentsMock: LinksAndCommentsMock);
7
8
  PersistedQuery(request: PersistedQueryRequest, _metadata?: Metadata): Promise<QueryResponse>;
8
9
  Query(_request: QueryRequest, _metadata?: Metadata): Promise<QueryResponse>;
9
10
  }
11
+ export declare class GraphQLMock implements PluginMock<GraphQL> {
12
+ readonly plugin: GraphQLPluginMock;
13
+ constructor(linksAndCommentsMock: LinksAndCommentsMock);
14
+ }
10
15
  //# sourceMappingURL=GraphQLMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLMock.d.ts","sourceRoot":"","sources":["../../src/mocks/GraphQLMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,qEAAqE,CAAC;AAE7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAatE,qBAAa,WAAY,YAAW,OAAO;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;gBAEjD,oBAAoB,EAAE,oBAAoB;IAIhD,cAAc,CAClB,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,aAAa,CAAC;IA+BnB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAMlF"}
1
+ {"version":3,"file":"GraphQLMock.d.ts","sourceRoot":"","sources":["../../src/mocks/GraphQLMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAatE,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;gBAEjD,oBAAoB,EAAE,oBAAoB;IAIhD,cAAc,CAClB,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,aAAa,CAAC;IA+BnB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAMlF;AAED,qBAAa,WAAY,YAAW,UAAU,CAAC,OAAO,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,oBAAoB,EAAE,oBAAoB;CAGvD"}
@@ -8,7 +8,7 @@ const methodMap = {
8
8
  GetSubredditInfoById: 'getSubredditInfoById',
9
9
  CreateShareUrl: 'createShareUrl',
10
10
  };
11
- export class GraphQLMock {
11
+ export class GraphQLPluginMock {
12
12
  constructor(linksAndCommentsMock) {
13
13
  this._linksAndCommentsMock = linksAndCommentsMock;
14
14
  }
@@ -41,3 +41,8 @@ export class GraphQLMock {
41
41
  `For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
42
42
  }
43
43
  }
44
+ export class GraphQLMock {
45
+ constructor(linksAndCommentsMock) {
46
+ this.plugin = new GraphQLPluginMock(linksAndCommentsMock);
47
+ }
48
+ }
@@ -2,9 +2,14 @@ import type { Empty, LinksAndComments, Metadata } from '@devvit/protos';
2
2
  import { type JsonRedditObjects, type JsonStatus, type Listing, RedditObject } from '@devvit/protos/types/devvit/plugin/redditapi/common/common_msg.js';
3
3
  import type { BasicIdRequest, CommentRequest, EditCustomPostRequest, FollowPostRequest, InfoRequest, JsonWrappedComment, MoreChildrenRequest, ReportAwardRequest, ReportRequest, SaveRequest, SendRepliesRequest, SetContestModeRequest, SetCustomPostPreviewRequest, SetSubredditStickyRequest, SetSuggestedSortRequest, SubmitRequest, SubmitResponse, VoteRequest } from '@devvit/protos/types/devvit/plugin/redditapi/linksandcomments/linksandcomments_msg.js';
4
4
  import { type JsonObject, T3 } from '@devvit/shared';
5
- export declare class LinksAndCommentsMock implements LinksAndComments {
6
- private _posts;
7
- private _postData;
5
+ import type { PluginMock } from '@devvit/shared-types/test/index.js';
6
+ type LinksAndCommentsStore = {
7
+ posts: Map<string, RedditObject>;
8
+ postData: Map<string, Readonly<JsonObject>>;
9
+ };
10
+ export declare class LinksAndCommentsPluginMock implements LinksAndComments {
11
+ private readonly _store;
12
+ constructor(store: LinksAndCommentsStore);
8
13
  Comment(_request: CommentRequest, _metadata?: Metadata): Promise<JsonWrappedComment>;
9
14
  Del(request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
10
15
  EditCustomPost(request: EditCustomPostRequest, _metadata?: Metadata): Promise<JsonRedditObjects>;
@@ -32,10 +37,23 @@ export declare class LinksAndCommentsMock implements LinksAndComments {
32
37
  Unsave(_request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
33
38
  Unspoiler(_request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
34
39
  Vote(_request: VoteRequest, _metadata?: Metadata): Promise<Empty>;
40
+ }
41
+ export declare class LinksAndCommentsMock implements PluginMock<LinksAndComments> {
42
+ readonly plugin: LinksAndCommentsPluginMock;
43
+ private readonly _store;
44
+ constructor();
45
+ /**
46
+ * Retrieves developer data associated with a post.
47
+ */
35
48
  getPostData(postId: string): JsonObject | undefined;
49
+ /**
50
+ * Seeds the mock database with a Post.
51
+ * This allows tests to set up state before calling `reddit.getPostById`.
52
+ */
36
53
  addPost(post: Omit<Partial<RedditObject>, 'id'> & {
37
54
  id: T3;
38
55
  title: string;
39
56
  }): RedditObject;
40
57
  }
58
+ export {};
41
59
  //# sourceMappingURL=LinksAndCommentsMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinksAndCommentsMock.d.ts","sourceRoot":"","sources":["../../src/mocks/LinksAndCommentsMock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LinksAndCommentsMock.d.ts","sourceRoot":"","sources":["../../src/mocks/LinksAndCommentsMock.ts"],"names":[],"mappings":"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"}
@@ -194,27 +194,26 @@ const DEFAULT_COMMENT = {
194
194
  function fakeId() {
195
195
  return `t3_${Math.random().toString(36).substring(7)}`;
196
196
  }
197
- export class LinksAndCommentsMock {
198
- constructor() {
199
- this._posts = new Map();
200
- this._postData = new Map();
197
+ export class LinksAndCommentsPluginMock {
198
+ constructor(store) {
199
+ this._store = store;
201
200
  }
202
201
  async Comment(_request, _metadata) {
203
202
  throw new Error(`Reddit API method Users.Friend is not implemented in the test harness.\n` +
204
203
  `For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
205
204
  }
206
205
  async Del(request, _metadata) {
207
- this._posts.delete(request.id);
206
+ this._store.posts.delete(request.id);
208
207
  return {};
209
208
  }
210
209
  async EditCustomPost(request, _metadata) {
211
210
  if (request.postData?.developerData) {
212
- this._postData.set(request.thingId, request.postData.developerData);
211
+ this._store.postData.set(request.thingId, request.postData.developerData);
213
212
  }
214
213
  return { json: { errors: [], data: { things: [] } } };
215
214
  }
216
215
  async EditUserText(request, _metadata) {
217
- const post = this._posts.get(request.thingId);
216
+ const post = this._store.posts.get(request.thingId);
218
217
  if (!post) {
219
218
  throw new Error('Post not found');
220
219
  }
@@ -254,7 +253,7 @@ export class LinksAndCommentsMock {
254
253
  async Info(request, _metadata) {
255
254
  const children = [];
256
255
  for (const id of request.thingIds) {
257
- const post = this._posts.get(id);
256
+ const post = this._store.posts.get(id);
258
257
  if (post) {
259
258
  children.push({
260
259
  kind: 't3',
@@ -334,7 +333,7 @@ export class LinksAndCommentsMock {
334
333
  selftext: request.text,
335
334
  authorFullname: 't2_testuser',
336
335
  };
337
- this._posts.set(id, post);
336
+ this._store.posts.set(id, post);
338
337
  return {
339
338
  json: {
340
339
  data: {
@@ -363,9 +362,9 @@ export class LinksAndCommentsMock {
363
362
  selftext: '',
364
363
  authorFullname: 't2_testuser',
365
364
  };
366
- this._posts.set(id, post);
365
+ this._store.posts.set(id, post);
367
366
  if (request.postData?.developerData) {
368
- this._postData.set(id, request.postData.developerData);
367
+ this._store.postData.set(id, request.postData.developerData);
369
368
  }
370
369
  return {
371
370
  json: {
@@ -402,9 +401,25 @@ export class LinksAndCommentsMock {
402
401
  throw new Error(`Reddit API method LinksAndComments.Vote is not implemented in the test harness.\n` +
403
402
  `For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
404
403
  }
404
+ }
405
+ export class LinksAndCommentsMock {
406
+ constructor() {
407
+ this._store = {
408
+ posts: new Map(),
409
+ postData: new Map(),
410
+ };
411
+ this.plugin = new LinksAndCommentsPluginMock(this._store);
412
+ }
413
+ /**
414
+ * Retrieves developer data associated with a post.
415
+ */
405
416
  getPostData(postId) {
406
- return this._postData.get(postId);
417
+ return this._store.postData.get(postId);
407
418
  }
419
+ /**
420
+ * Seeds the mock database with a Post.
421
+ * This allows tests to set up state before calling `reddit.getPostById`.
422
+ */
408
423
  addPost(post) {
409
424
  const fullId = post.id;
410
425
  const shortId = fullId.replace(/^t3_/, '');
@@ -422,7 +437,7 @@ export class LinksAndCommentsMock {
422
437
  id: shortId,
423
438
  name: post.title,
424
439
  };
425
- this._posts.set(fullId, newPost);
440
+ this._store.posts.set(fullId, newPost);
426
441
  return newPost;
427
442
  }
428
443
  }
@@ -1,8 +1,3 @@
1
- import type { RedditObject } from '@devvit/protos/types/devvit/plugin/redditapi/common/common_msg.js';
2
- import type { SubredditAboutResponse_AboutData } from '@devvit/protos/types/devvit/plugin/redditapi/subreddits/subreddits_msg.js';
3
- import type { User } from '@devvit/protos/types/devvit/reddit/user.js';
4
- import { T3, type T5 } from '@devvit/shared';
5
- import { T2 } from '@devvit/shared-types/tid.js';
6
1
  import { GraphQLMock } from './GraphQLMock.js';
7
2
  import { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
8
3
  import { SubredditMock } from './SubredditMock.js';
@@ -42,42 +37,18 @@ export declare class RedditPluginMock {
42
37
  */
43
38
  getPluginRegistrations(): {
44
39
  "devvit.plugin.redditapi.flair.Flair": unknown;
45
- "devvit.plugin.redditapi.graphql.GraphQL": GraphQLMock;
46
- "devvit.plugin.redditapi.linksandcomments.LinksAndComments": LinksAndCommentsMock;
40
+ "devvit.plugin.redditapi.graphql.GraphQL": import("./GraphQLMock.js").GraphQLPluginMock;
41
+ "devvit.plugin.redditapi.linksandcomments.LinksAndComments": import("./LinksAndCommentsMock.js").LinksAndCommentsPluginMock;
47
42
  "devvit.plugin.redditapi.listings.Listings": unknown;
48
43
  "devvit.plugin.redditapi.moderation.Moderation": unknown;
49
44
  "devvit.plugin.redditapi.modnote.ModNote": unknown;
50
45
  "devvit.plugin.redditapi.newmodmail.NewModmail": unknown;
51
46
  "devvit.plugin.redditapi.privatemessages.PrivateMessages": unknown;
52
- "devvit.plugin.redditapi.subreddits.Subreddits": SubredditMock;
53
- "devvit.plugin.redditapi.users.Users": UserMock;
47
+ "devvit.plugin.redditapi.subreddits.Subreddits": import("./SubredditMock.js").SubredditPluginMock;
48
+ "devvit.plugin.redditapi.users.Users": import("./UserMock.js").UserPluginMock;
54
49
  "devvit.plugin.redditapi.widgets.Widgets": unknown;
55
50
  "devvit.plugin.redditapi.wiki.Wiki": unknown;
56
51
  };
57
- /**
58
- * Helper to seed the mock database with a User.
59
- * This allows tests to set up state before calling `reddit.getUserByUsername`.
60
- */
61
- addUser(user: Omit<Partial<User>, 'id'> & {
62
- name: string;
63
- id: T2;
64
- }): User;
65
- /**
66
- * Helper to seed the mock database with a Post.
67
- * This allows tests to set up state before calling `reddit.getPostById`.
68
- */
69
- addPost(post: Omit<Partial<RedditObject>, 'id'> & {
70
- id: T3;
71
- title: string;
72
- }): RedditObject;
73
- /**
74
- * Helper to seed the mock database with a Subreddit.
75
- * This allows tests to set up state before calling `reddit.getSubredditByName`.
76
- */
77
- addSubreddit(data: Partial<SubredditAboutResponse_AboutData> & {
78
- id: T5;
79
- displayName: string;
80
- }): SubredditAboutResponse_AboutData;
81
52
  private _createUnimplementedPluginService;
82
53
  }
83
54
  //# sourceMappingURL=RedditPluginMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RedditPluginMock.d.ts","sourceRoot":"","sources":["../../src/mocks/RedditPluginMock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mEAAmE,CAAC;AAQtG,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAKlI,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4CAA4C,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB;IAE3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;;IAwCvB;;;OAGG;IACH,sBAAsB;;;;;;;;;;;;;;IAiBtB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,EAAE,CAAA;KAAE,GAAG,IAAI;IAIzE;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY;IAI1F;;;OAGG;IACH,YAAY,CACV,IAAI,EAAE,OAAO,CAAC,gCAAgC,CAAC,GAAG;QAAE,EAAE,EAAE,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAChF,gCAAgC;IAInC,OAAO,CAAC,iCAAiC;CAa1C"}
1
+ {"version":3,"file":"RedditPluginMock.d.ts","sourceRoot":"","sources":["../../src/mocks/RedditPluginMock.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB;IAE3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;;IAwCvB;;;OAGG;IACH,sBAAsB;;;;;;;;;;;;;;IAiBtB,OAAO,CAAC,iCAAiC;CAa1C"}
@@ -10,8 +10,6 @@ import { SubredditsDefinition } from '@devvit/protos/types/devvit/plugin/reddita
10
10
  import { UsersDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/users/users_svc.js';
11
11
  import { WidgetsDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/widgets/widgets_svc.js';
12
12
  import { WikiDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/wiki/wiki_svc.js';
13
- import { T3 } from '@devvit/shared';
14
- import { T2 } from '@devvit/shared-types/tid.js';
15
13
  import { GraphQLMock } from './GraphQLMock.js';
16
14
  import { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
17
15
  import { SubredditMock } from './SubredditMock.js';
@@ -69,40 +67,19 @@ export class RedditPluginMock {
69
67
  getPluginRegistrations() {
70
68
  return {
71
69
  [FlairDefinition.fullName]: this.flair,
72
- [GraphQLDefinition.fullName]: this.graphQL,
73
- [LinksAndCommentsDefinition.fullName]: this.linksAndComments,
70
+ [GraphQLDefinition.fullName]: this.graphQL.plugin,
71
+ [LinksAndCommentsDefinition.fullName]: this.linksAndComments.plugin,
74
72
  [ListingsDefinition.fullName]: this.listings,
75
73
  [ModerationDefinition.fullName]: this.moderation,
76
74
  [ModNoteDefinition.fullName]: this.modNote,
77
75
  [NewModmailDefinition.fullName]: this.newModmail,
78
76
  [PrivateMessagesDefinition.fullName]: this.privateMessages,
79
- [SubredditsDefinition.fullName]: this.subreddits,
80
- [UsersDefinition.fullName]: this.users,
77
+ [SubredditsDefinition.fullName]: this.subreddits.plugin,
78
+ [UsersDefinition.fullName]: this.users.plugin,
81
79
  [WidgetsDefinition.fullName]: this.widgets,
82
80
  [WikiDefinition.fullName]: this.wiki,
83
81
  };
84
82
  }
85
- /**
86
- * Helper to seed the mock database with a User.
87
- * This allows tests to set up state before calling `reddit.getUserByUsername`.
88
- */
89
- addUser(user) {
90
- return this.users.addUser(user);
91
- }
92
- /**
93
- * Helper to seed the mock database with a Post.
94
- * This allows tests to set up state before calling `reddit.getPostById`.
95
- */
96
- addPost(post) {
97
- return this.linksAndComments.addPost(post);
98
- }
99
- /**
100
- * Helper to seed the mock database with a Subreddit.
101
- * This allows tests to set up state before calling `reddit.getSubredditByName`.
102
- */
103
- addSubreddit(data) {
104
- return this.subreddits.addSubreddit(data);
105
- }
106
83
  _createUnimplementedPluginService(pluginName) {
107
84
  return new Proxy({}, {
108
85
  get: () => () => {
@@ -2,8 +2,14 @@ import type { JsonStatus, Listing, Metadata, Subreddits } from '@devvit/protos';
2
2
  import type { Empty, StringValue } from '@devvit/protos/community.js';
3
3
  import type { AboutWhereRequest, BasicSearchRequest, BasicSubredditRequest, BasicWhereRequest, DeleteSrImgRequest, SearchRedditNamesResponse, SearchSubredditsResponse, SiteAdminRequest, StickyRequest, StickyResponse, SubmitTextResponse, SubredditAboutEditRequest, SubredditAboutEditResponse, SubredditAboutResponse, SubredditAboutResponse_AboutData, SubredditAboutRulesResponse, SubredditAboutTrafficResponse, SubredditAddRemovalReasonRequest, SubredditAddRemovalReasonResponse, SubredditAutocompleteRequest, SubredditAutocompleteResponse, SubredditGetRemovalReasonsRequest, SubredditGetRemovalReasonsResponse, SubredditPostRequirementsResponse, SubredditsSearchRequest, SubredditsSearchResponse, SubredditStylesheetRequest, SubscribeRequest, UploadSrImgRequest, UploadSrImgResponse, UserSearchResponse, UsersSearchRequest } from '@devvit/protos/types/devvit/plugin/redditapi/subreddits/subreddits_msg.js';
4
4
  import type { T5 } from '@devvit/shared';
5
- export declare class SubredditMock implements Subreddits {
6
- private _subreddits;
5
+ import type { PluginMock } from '@devvit/shared-types/test/index.js';
6
+ type SubredditDisplayName = string;
7
+ type SubredditStore = {
8
+ subreddits: Map<SubredditDisplayName, SubredditAboutResponse_AboutData>;
9
+ };
10
+ export declare class SubredditPluginMock implements Subreddits {
11
+ private readonly _store;
12
+ constructor(store: SubredditStore);
7
13
  AboutWhere(_request: AboutWhereRequest, _metadata?: Metadata): Promise<Listing>;
8
14
  DeleteSrBanner(_request: BasicSubredditRequest, _metadata?: Metadata): Promise<JsonStatus>;
9
15
  DeleteSrHeader(_request: BasicSubredditRequest, _metadata?: Metadata): Promise<JsonStatus>;
@@ -31,9 +37,19 @@ export declare class SubredditMock implements Subreddits {
31
37
  UploadSrImg(_request: UploadSrImgRequest, _metadata?: Metadata): Promise<UploadSrImgResponse>;
32
38
  UsersSearch(_request: UsersSearchRequest, _metadata?: Metadata): Promise<UserSearchResponse>;
33
39
  UsersWhere(_request: BasicWhereRequest, _metadata?: Metadata): Promise<SubredditsSearchResponse>;
40
+ }
41
+ export declare class SubredditMock implements PluginMock<Subreddits> {
42
+ readonly plugin: SubredditPluginMock;
43
+ private readonly _store;
44
+ constructor();
45
+ /**
46
+ * Helper to seed the mock database with a Subreddit.
47
+ * This allows tests to set up state before calling `reddit.getSubredditByName`.
48
+ */
34
49
  addSubreddit(data: Partial<SubredditAboutResponse_AboutData> & {
35
50
  id: T5;
36
51
  displayName: string;
37
52
  }): SubredditAboutResponse_AboutData;
38
53
  }
54
+ export {};
39
55
  //# sourceMappingURL=SubredditMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubredditMock.d.ts","sourceRoot":"","sources":["../../src/mocks/SubredditMock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubredditMock.d.ts","sourceRoot":"","sources":["../../src/mocks/SubredditMock.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- export class SubredditMock {
2
- constructor() {
3
- this._subreddits = new Map();
1
+ export class SubredditPluginMock {
2
+ constructor(store) {
3
+ this._store = store;
4
4
  }
5
5
  async AboutWhere(_request, _metadata) {
6
6
  throw new Error(`Reddit API method Subreddits.AboutWhere is not implemented in the test harness.\n` +
@@ -49,7 +49,7 @@ export class SubredditMock {
49
49
  async SubredditAbout(request, _metadata) {
50
50
  const subredditName = request.subreddit;
51
51
  let found;
52
- for (const [name, data] of this._subreddits.entries()) {
52
+ for (const [name, data] of this._store.subreddits.entries()) {
53
53
  if (name.toLowerCase() === subredditName.toLowerCase()) {
54
54
  found = data;
55
55
  break;
@@ -120,6 +120,18 @@ export class SubredditMock {
120
120
  throw new Error(`Reddit API method Subreddits.UsersWhere is not implemented in the test harness.\n` +
121
121
  `For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
122
122
  }
123
+ }
124
+ export class SubredditMock {
125
+ constructor() {
126
+ this._store = {
127
+ subreddits: new Map(),
128
+ };
129
+ this.plugin = new SubredditPluginMock(this._store);
130
+ }
131
+ /**
132
+ * Helper to seed the mock database with a Subreddit.
133
+ * This allows tests to set up state before calling `reddit.getSubredditByName`.
134
+ */
123
135
  addSubreddit(data) {
124
136
  const subreddit = {
125
137
  createdUtc: Math.floor(Date.now() / 1000),
@@ -134,7 +146,7 @@ export class SubredditMock {
134
146
  ...data,
135
147
  id: data.id.replace(/^t5_/, ''),
136
148
  };
137
- this._subreddits.set(data.displayName, subreddit);
149
+ this._store.subreddits.set(data.displayName, subreddit);
138
150
  return subreddit;
139
151
  }
140
152
  }
@@ -2,9 +2,15 @@ import type { Empty, JsonStatus, Listing, Metadata, Users } from '@devvit/protos
2
2
  import type { BoolValue } from '@devvit/protos/community.js';
3
3
  import type { BlockUserRequest, BlockUserResponse, FriendRequest, GeneralFriendResponse, GenericUsersRequest, GetUserKarmaForSubredditRequest, GetUserKarmaForSubredditResponse, ReportUserRequest, SetPermissionsRequest, UnfriendRequest, UpdateFriendRelationshipRequest, UserAboutRequest, UserAboutResponse, UserDataByAccountIdsRequest, UserDataByAccountIdsResponse, UsernameAvailableRequest, UserTrophiesResponse, UserWhereRequest } from '@devvit/protos/types/devvit/plugin/redditapi/users/users_msg.js';
4
4
  import type { User } from '@devvit/protos/types/devvit/reddit/user.js';
5
+ import type { PluginMock } from '@devvit/shared-types/test/index.js';
5
6
  import { T2 } from '@devvit/shared-types/tid.js';
6
- export declare class UserMock implements Users {
7
- private _users;
7
+ type Username = string;
8
+ type UserStore = {
9
+ users: Map<Username, User>;
10
+ };
11
+ export declare class UserPluginMock implements Users {
12
+ private readonly _store;
13
+ constructor(store: UserStore);
8
14
  UserAbout(request: UserAboutRequest, _metadata?: Metadata): Promise<UserAboutResponse>;
9
15
  UserDataByAccountIds(request: UserDataByAccountIdsRequest, _metadata?: Metadata): Promise<UserDataByAccountIdsResponse>;
10
16
  BlockUser(_request: BlockUserRequest, _metadata?: Metadata): Promise<BlockUserResponse>;
@@ -19,9 +25,19 @@ export declare class UserMock implements Users {
19
25
  UserTrophies(_request: GenericUsersRequest, _metadata?: Metadata): Promise<UserTrophiesResponse>;
20
26
  UserWhere(_request: UserWhereRequest, _metadata?: Metadata): Promise<Listing>;
21
27
  UsernameAvailable(_request: UsernameAvailableRequest, _metadata?: Metadata): Promise<BoolValue>;
28
+ }
29
+ export declare class UserMock implements PluginMock<Users> {
30
+ readonly plugin: UserPluginMock;
31
+ private readonly _store;
32
+ constructor();
33
+ /**
34
+ * Seeds the mock database with a User.
35
+ * This allows tests to set up state before calling `reddit.getUserByUsername`.
36
+ */
22
37
  addUser(data: Omit<Partial<User>, 'id'> & {
23
38
  name: string;
24
39
  id: T2;
25
40
  }): User;
26
41
  }
42
+ export {};
27
43
  //# sourceMappingURL=UserMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserMock.d.ts","sourceRoot":"","sources":["../../src/mocks/UserMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,+BAA+B,EAC/B,gCAAgC,EAChC,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,+BAA+B,EAC/B,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAE5B,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,iEAAiE,CAAC;AACzE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4CAA4C,CAAC;AACvE,OAAO,EAAQ,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAIvD,qBAAa,QAAS,YAAW,KAAK;IACpC,OAAO,CAAC,MAAM,CAA6B;IAErC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAStF,oBAAoB,CACxB,OAAO,EAAE,2BAA2B,EACpC,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,4BAA4B,CAAC;IA6BlC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOvF,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAO1E,oBAAoB,CACxB,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAO3B,wBAAwB,CAC5B,QAAQ,EAAE,+BAA+B,EACzC,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,gCAAgC,CAAC;IAOtC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAO7E,cAAc,CAAC,QAAQ,EAAE,qBAAqB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAO1F,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAOzE,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAOjF,wBAAwB,CAC5B,QAAQ,EAAE,+BAA+B,EACzC,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAO3B,YAAY,CAChB,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAO1B,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAO7E,iBAAiB,CACrB,QAAQ,EAAE,wBAAwB,EAClC,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,SAAS,CAAC;IAOrB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,EAAE,CAAA;KAAE,GAAG,IAAI;CA4B1E"}
1
+ {"version":3,"file":"UserMock.d.ts","sourceRoot":"","sources":["../../src/mocks/UserMock.ts"],"names":[],"mappings":"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"}
package/mocks/UserMock.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { isT2, T2 } from '@devvit/shared-types/tid.js';
2
- export class UserMock {
3
- constructor() {
4
- this._users = new Map();
2
+ export class UserPluginMock {
3
+ constructor(store) {
4
+ this._store = store;
5
5
  }
6
6
  async UserAbout(request, _metadata) {
7
- const user = this._users.get(request.username);
7
+ const user = this._store.users.get(request.username);
8
8
  if (!user) {
9
9
  // Simulate 404
10
10
  throw new Error('HTTP 404 Not Found');
@@ -16,7 +16,7 @@ export class UserMock {
16
16
  const responseUsers = {};
17
17
  for (const id of ids) {
18
18
  const targetId = T2(isT2(id) ? id : `t2_${id}`);
19
- const user = Array.from(this._users.values()).find((u) => {
19
+ const user = Array.from(this._store.users.values()).find((u) => {
20
20
  if (!u.id) {
21
21
  return false;
22
22
  }
@@ -84,6 +84,18 @@ export class UserMock {
84
84
  throw new Error(`Reddit API method Users.UsernameAvailable is not implemented in the test harness.\n` +
85
85
  `For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
86
86
  }
87
+ }
88
+ export class UserMock {
89
+ constructor() {
90
+ this._store = {
91
+ users: new Map(),
92
+ };
93
+ this.plugin = new UserPluginMock(this._store);
94
+ }
95
+ /**
96
+ * Seeds the mock database with a User.
97
+ * This allows tests to set up state before calling `reddit.getUserByUsername`.
98
+ */
87
99
  addUser(data) {
88
100
  const user = {
89
101
  createdUtc: data.createdUtc ?? Math.floor(Date.now() / 1000),
@@ -107,7 +119,7 @@ export class UserMock {
107
119
  ...data,
108
120
  id: data.id.replace(/^t2_/, ''),
109
121
  };
110
- this._users.set(data.name, user);
122
+ this._store.users.set(data.name, user);
111
123
  return user;
112
124
  }
113
125
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devvit/reddit",
3
- "version": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
3
+ "version": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
4
4
  "license": "BSD-3-Clause",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,22 +32,22 @@
32
32
  "test:unit-with-coverage": "vitest run --coverage"
33
33
  },
34
34
  "dependencies": {
35
- "@devvit/protos": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
36
- "@devvit/public-api": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
37
- "@devvit/shared": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
38
- "@devvit/shared-types": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
39
- "@devvit/splash": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0"
35
+ "@devvit/protos": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
36
+ "@devvit/public-api": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
37
+ "@devvit/shared": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
38
+ "@devvit/shared-types": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
39
+ "@devvit/splash": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@devvit/server": "*"
43
43
  },
44
44
  "devDependencies": {
45
- "@devvit/repo-tools": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
46
- "@devvit/server": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
47
- "@devvit/tsconfig": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
45
+ "@devvit/repo-tools": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
46
+ "@devvit/server": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
47
+ "@devvit/tsconfig": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
48
48
  "eslint": "9.11.1",
49
49
  "typescript": "5.8.3",
50
50
  "vitest": "1.6.1"
51
51
  },
52
- "gitHead": "54eef0d373b14d9fab0ea151b82e026269cd19aa"
52
+ "gitHead": "b5df4e08e30b06913b446adb0177d7eb00253139"
53
53
  }