lemmy-js-client 0.19.4-alpha.8 → 0.19.4

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -22,31 +22,34 @@ A javascript / typescript http client and type system for [Lemmy](https://github
22
22
  [LemmyHttp docs](https://join-lemmy.org/api/classes/LemmyHttp.html)
23
23
 
24
24
  ```ts
25
- import { LemmyHttp, Login } from 'lemmy-js-client';
25
+ import { LemmyHttp, Login } from "lemmy-js-client";
26
26
 
27
- let baseUrl = 'https://lemmy.ml';
28
- let client: LemmyHttp = new LemmyHttp(baseUrl, headers?);
29
- let loginForm: Login = {
27
+ // Build the client
28
+ const baseUrl = "https://lemmy.ml";
29
+ const client: LemmyHttp = new LemmyHttp(baseUrl);
30
+
31
+ // Build the login form
32
+ const loginForm: Login = {
30
33
  username_or_email: "my_name",
31
34
  password: "my_pass",
32
35
  };
33
- let jwt = await client.login(loginForm).jwt;
34
- ```
35
-
36
- ## Development
37
36
 
38
- You can use [yalc](https://github.com/wclr/yalc) to develop and test changes locally:
37
+ // Login and set the client headers with your jwt
38
+ const { jwt } = await client.login(loginForm);
39
+ client.setHeaders({ Authorization: `Bearer ${jwt}` });
39
40
 
41
+ // Fetch top posts for the day
42
+ const getPostsForm: GetPosts = {
43
+ sort: "TopDay",
44
+ type_: "Local",
45
+ };
46
+ const posts = await client.getPosts(getPostsForm);
40
47
  ```
41
- pnpm i --global add yalc
42
48
 
43
- # Go to lemmy-js-client dir
44
- yalc publish --push
49
+ ## Development
45
50
 
46
- # Go to your client dir
47
- yalc add lemmy-js-client
51
+ Use `pnpm add` to develop and test changes locally:
48
52
 
49
- # To do updates, go back to the lemmy-js-client dir
50
- # This also updates it, in every dir you've added it.
51
- yalc publish --push
53
+ ```
54
+ pnpm add path/to/lemmy-js-client
52
55
  ```
package/dist/http.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import fetch from "cross-fetch";
2
1
  import { AddAdmin } from "./types/AddAdmin";
3
2
  import { AddAdminResponse } from "./types/AddAdminResponse";
4
3
  import { AddModToCommunity } from "./types/AddModToCommunity";
@@ -211,9 +210,15 @@ export declare class LemmyHttp {
211
210
  /**
212
211
  * List all the media for your user
213
212
  *
214
- * `HTTP.GET /user/list_media`
213
+ * `HTTP.GET /account/list_media`
215
214
  */
216
- listMedia(form: ListMedia): Promise<ListMediaResponse>;
215
+ listMedia(form?: ListMedia): Promise<ListMediaResponse>;
216
+ /**
217
+ * List all the media known to your instance.
218
+ *
219
+ * `HTTP.GET /admin/list_all_media`
220
+ */
221
+ listAllMedia(form?: ListMedia): Promise<ListMediaResponse>;
217
222
  /**
218
223
  * Enable / Disable TOTP / two-factor authentication.
219
224
  *
@@ -560,6 +565,11 @@ export declare class LemmyHttp {
560
565
  * `HTTP.POST /user/login`
561
566
  */
562
567
  login(form: Login): Promise<LoginResponse>;
568
+ /**
569
+ * Invalidate the currently used auth token.
570
+ *
571
+ * `HTTP.POST /user/logout`
572
+ */
563
573
  logout(): Promise<SuccessResponse>;
564
574
  /**
565
575
  * Get the details for a person.
package/dist/http.js CHANGED
@@ -19,14 +19,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
19
19
  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");
20
20
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
21
  };
22
- var __importDefault = (this && this.__importDefault) || function (mod) {
23
- return (mod && mod.__esModule) ? mod : { "default": mod };
24
- };
25
22
  var _LemmyHttp_instances, _LemmyHttp_apiUrl, _LemmyHttp_headers, _LemmyHttp_pictrsUrl, _LemmyHttp_fetchFunction, _LemmyHttp_buildFullUrl, _LemmyHttp_wrapper;
26
23
  Object.defineProperty(exports, "__esModule", { value: true });
27
24
  exports.LemmyHttp = void 0;
28
- const cross_fetch_1 = __importDefault(require("cross-fetch"));
29
- const form_data_1 = __importDefault(require("form-data"));
30
25
  const other_types_1 = require("./other_types");
31
26
  var HttpType;
32
27
  (function (HttpType) {
@@ -48,7 +43,7 @@ class LemmyHttp {
48
43
  _LemmyHttp_apiUrl.set(this, void 0);
49
44
  _LemmyHttp_headers.set(this, {});
50
45
  _LemmyHttp_pictrsUrl.set(this, void 0);
51
- _LemmyHttp_fetchFunction.set(this, cross_fetch_1.default);
46
+ _LemmyHttp_fetchFunction.set(this, fetch.bind(globalThis));
52
47
  __classPrivateFieldSet(this, _LemmyHttp_apiUrl, `${baseUrl.replace(/\/+$/, "")}/api/${other_types_1.VERSION}`, "f");
53
48
  __classPrivateFieldSet(this, _LemmyHttp_pictrsUrl, `${baseUrl}/pictrs/image`, "f");
54
49
  if (options === null || options === void 0 ? void 0 : options.headers) {
@@ -136,10 +131,18 @@ class LemmyHttp {
136
131
  /**
137
132
  * List all the media for your user
138
133
  *
139
- * `HTTP.GET /user/list_media`
134
+ * `HTTP.GET /account/list_media`
135
+ */
136
+ listMedia(form = {}) {
137
+ return __classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_wrapper).call(this, HttpType.Get, "/account/list_media", form);
138
+ }
139
+ /**
140
+ * List all the media known to your instance.
141
+ *
142
+ * `HTTP.GET /admin/list_all_media`
140
143
  */
141
- listMedia(form) {
142
- return __classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_wrapper).call(this, HttpType.Get, "/user/list_media", form);
144
+ listAllMedia(form = {}) {
145
+ return __classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_wrapper).call(this, HttpType.Get, "/admin/list_all_media", form);
143
146
  }
144
147
  /**
145
148
  * Enable / Disable TOTP / two-factor authentication.
@@ -601,6 +604,11 @@ class LemmyHttp {
601
604
  login(form) {
602
605
  return __classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_wrapper).call(this, HttpType.Post, "/user/login", form);
603
606
  }
607
+ /**
608
+ * Invalidate the currently used auth token.
609
+ *
610
+ * `HTTP.POST /user/logout`
611
+ */
604
612
  logout() {
605
613
  return __classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_wrapper).call(this, HttpType.Post, "/user/logout", {});
606
614
  }
@@ -847,8 +855,8 @@ class LemmyHttp {
847
855
  /**
848
856
  * Upload an image to the server.
849
857
  */
850
- uploadImage({ image }) {
851
- return __awaiter(this, void 0, void 0, function* () {
858
+ uploadImage(_a) {
859
+ return __awaiter(this, arguments, void 0, function* ({ image }) {
852
860
  const formData = createFormData(image);
853
861
  let url = undefined;
854
862
  let delete_url = undefined;
@@ -873,8 +881,8 @@ class LemmyHttp {
873
881
  /**
874
882
  * Delete a pictrs image
875
883
  */
876
- deleteImage({ token, filename }) {
877
- return __awaiter(this, void 0, void 0, function* () {
884
+ deleteImage(_a) {
885
+ return __awaiter(this, arguments, void 0, function* ({ token, filename }) {
878
886
  const deleteUrl = `${__classPrivateFieldGet(this, _LemmyHttp_pictrsUrl, "f")}/delete/${token}/${filename}`;
879
887
  const response = yield __classPrivateFieldGet(this, _LemmyHttp_fetchFunction, "f").call(this, deleteUrl, {
880
888
  method: HttpType.Get,
@@ -894,8 +902,8 @@ exports.LemmyHttp = LemmyHttp;
894
902
  _LemmyHttp_apiUrl = new WeakMap(), _LemmyHttp_headers = new WeakMap(), _LemmyHttp_pictrsUrl = new WeakMap(), _LemmyHttp_fetchFunction = new WeakMap(), _LemmyHttp_instances = new WeakSet(), _LemmyHttp_buildFullUrl = function _LemmyHttp_buildFullUrl(endpoint) {
895
903
  return `${__classPrivateFieldGet(this, _LemmyHttp_apiUrl, "f")}${endpoint}`;
896
904
  }, _LemmyHttp_wrapper = function _LemmyHttp_wrapper(type_, endpoint, form) {
897
- var _a;
898
905
  return __awaiter(this, void 0, void 0, function* () {
906
+ var _a;
899
907
  let response;
900
908
  if (type_ === HttpType.Get) {
901
909
  const getUrl = `${__classPrivateFieldGet(this, _LemmyHttp_instances, "m", _LemmyHttp_buildFullUrl).call(this, endpoint)}?${encodeGetParams(form)}`;
@@ -928,18 +936,18 @@ _LemmyHttp_apiUrl = new WeakMap(), _LemmyHttp_headers = new WeakMap(), _LemmyHtt
928
936
  };
929
937
  function encodeGetParams(p) {
930
938
  return Object.entries(p)
931
- .filter(kv => !!kv[1])
939
+ .filter(kv => kv[1] !== undefined && kv[1] !== null)
932
940
  .map(kv => kv.map(encodeURIComponent).join("="))
933
941
  .join("&");
934
942
  }
935
943
  function createFormData(image) {
936
- let formData = new form_data_1.default();
937
- if (image.constructor.name === "File") {
944
+ let formData = new FormData();
945
+ if (image instanceof File) {
938
946
  formData.append("images[]", image);
939
947
  }
940
948
  else {
941
949
  // The filename doesn't affect the file type or file name that ends up in pictrs
942
- formData.append("images[]", image, { filename: "image.jpg" });
950
+ formData.append("images[]", new Blob([image], { type: "image/jpeg" }), "image.jpg");
943
951
  }
944
952
  return formData;
945
953
  }
package/dist/index.d.ts CHANGED
@@ -137,6 +137,7 @@ export { ListRegistrationApplications } from "./types/ListRegistrationApplicatio
137
137
  export { ListRegistrationApplicationsResponse } from "./types/ListRegistrationApplicationsResponse";
138
138
  export { ListingType } from "./types/ListingType";
139
139
  export { LocalImage } from "./types/LocalImage";
140
+ export { LocalImageView } from "./types/LocalImageView";
140
141
  export { LocalSite } from "./types/LocalSite";
141
142
  export { LocalSiteId } from "./types/LocalSiteId";
142
143
  export { LocalSiteRateLimit } from "./types/LocalSiteRateLimit";
@@ -144,6 +145,7 @@ export { LocalSiteUrlBlocklist } from "./types/LocalSiteUrlBlocklist";
144
145
  export { LocalUser } from "./types/LocalUser";
145
146
  export { LocalUserId } from "./types/LocalUserId";
146
147
  export { LocalUserView } from "./types/LocalUserView";
148
+ export { LocalUserVoteDisplayMode } from "./types/LocalUserVoteDisplayMode";
147
149
  export { LockPost } from "./types/LockPost";
148
150
  export { Login } from "./types/Login";
149
151
  export { LoginResponse } from "./types/LoginResponse";
@@ -14,6 +14,7 @@ export interface CommentReplyView {
14
14
  recipient: Person;
15
15
  counts: CommentAggregates;
16
16
  creator_banned_from_community: boolean;
17
+ banned_from_community: boolean;
17
18
  creator_is_moderator: boolean;
18
19
  creator_is_admin: boolean;
19
20
  subscribed: SubscribedType;
@@ -4,6 +4,7 @@ import type { CommentReport } from "./CommentReport";
4
4
  import type { Community } from "./Community";
5
5
  import type { Person } from "./Person";
6
6
  import type { Post } from "./Post";
7
+ import type { SubscribedType } from "./SubscribedType";
7
8
  export interface CommentReportView {
8
9
  comment_report: CommentReport;
9
10
  comment: Comment;
@@ -13,6 +14,11 @@ export interface CommentReportView {
13
14
  comment_creator: Person;
14
15
  counts: CommentAggregates;
15
16
  creator_banned_from_community: boolean;
17
+ creator_is_moderator: boolean;
18
+ creator_is_admin: boolean;
19
+ creator_blocked: boolean;
20
+ subscribed: SubscribedType;
21
+ saved: boolean;
16
22
  my_vote?: number;
17
23
  resolver?: Person;
18
24
  }
@@ -11,6 +11,7 @@ export interface CommentView {
11
11
  community: Community;
12
12
  counts: CommentAggregates;
13
13
  creator_banned_from_community: boolean;
14
+ banned_from_community: boolean;
14
15
  creator_is_moderator: boolean;
15
16
  creator_is_admin: boolean;
16
17
  subscribed: SubscribedType;
@@ -66,6 +66,26 @@ export type LemmyErrorType = {
66
66
  error: "couldnt_find_community";
67
67
  } | {
68
68
  error: "couldnt_find_person";
69
+ } | {
70
+ error: "couldnt_find_comment";
71
+ } | {
72
+ error: "couldnt_find_comment_report";
73
+ } | {
74
+ error: "couldnt_find_post_report";
75
+ } | {
76
+ error: "couldnt_find_private_message_report";
77
+ } | {
78
+ error: "couldnt_find_local_user";
79
+ } | {
80
+ error: "couldnt_find_person_mention";
81
+ } | {
82
+ error: "couldnt_find_registration_application";
83
+ } | {
84
+ error: "couldnt_find_comment_reply";
85
+ } | {
86
+ error: "couldnt_find_private_message";
87
+ } | {
88
+ error: "couldnt_find_activity";
69
89
  } | {
70
90
  error: "person_is_blocked";
71
91
  } | {
@@ -157,12 +177,10 @@ export type LemmyErrorType = {
157
177
  error: "invalid_vote_value";
158
178
  } | {
159
179
  error: "page_does_not_specify_creator";
160
- } | {
161
- error: "page_does_not_specify_group";
162
- } | {
163
- error: "no_community_found_in_cc";
164
180
  } | {
165
181
  error: "no_email_setup";
182
+ } | {
183
+ error: "local_site_not_setup";
166
184
  } | {
167
185
  error: "email_smtp_server_needs_a_port";
168
186
  } | {
@@ -286,8 +304,6 @@ export type LemmyErrorType = {
286
304
  error: "invalid_regex";
287
305
  } | {
288
306
  error: "captcha_incorrect";
289
- } | {
290
- error: "password_reset_limit_reached";
291
307
  } | {
292
308
  error: "couldnt_create_audio_captcha";
293
309
  } | {
@@ -310,6 +326,10 @@ export type LemmyErrorType = {
310
326
  error: "invalid_bot_action";
311
327
  } | {
312
328
  error: "cant_block_local_instance";
329
+ } | {
330
+ error: "url_without_domain";
331
+ } | {
332
+ error: "inbox_timeout";
313
333
  } | {
314
334
  error: "unknown";
315
335
  message: string;
@@ -1,4 +1,4 @@
1
- import type { LocalImage } from "./LocalImage";
1
+ import type { LocalImageView } from "./LocalImageView";
2
2
  export interface ListMediaResponse {
3
- images: Array<LocalImage>;
3
+ images: Array<LocalImageView>;
4
4
  }
@@ -1,6 +1,6 @@
1
1
  import type { LocalUserId } from "./LocalUserId";
2
2
  export interface LocalImage {
3
- local_user_id: LocalUserId;
3
+ local_user_id?: LocalUserId;
4
4
  pictrs_alias: string;
5
5
  pictrs_delete_token: string;
6
6
  published: string;
@@ -0,0 +1,6 @@
1
+ import type { LocalImage } from "./LocalImage";
2
+ import type { Person } from "./Person";
3
+ export interface LocalImageView {
4
+ local_image: LocalImage;
5
+ person: Person;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,8 +1,10 @@
1
1
  import type { LocalUser } from "./LocalUser";
2
+ import type { LocalUserVoteDisplayMode } from "./LocalUserVoteDisplayMode";
2
3
  import type { Person } from "./Person";
3
4
  import type { PersonAggregates } from "./PersonAggregates";
4
5
  export interface LocalUserView {
5
6
  local_user: LocalUser;
7
+ local_user_vote_display_mode: LocalUserVoteDisplayMode;
6
8
  person: Person;
7
9
  counts: PersonAggregates;
8
10
  }
@@ -0,0 +1,8 @@
1
+ import type { LocalUserId } from "./LocalUserId";
2
+ export interface LocalUserVoteDisplayMode {
3
+ local_user_id: LocalUserId;
4
+ score: boolean;
5
+ upvotes: boolean;
6
+ downvotes: boolean;
7
+ upvote_percentage: boolean;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -14,6 +14,7 @@ export interface PersonMentionView {
14
14
  recipient: Person;
15
15
  counts: CommentAggregates;
16
16
  creator_banned_from_community: boolean;
17
+ banned_from_community: boolean;
17
18
  creator_is_moderator: boolean;
18
19
  creator_is_admin: boolean;
19
20
  subscribed: SubscribedType;
@@ -3,6 +3,7 @@ import type { Person } from "./Person";
3
3
  import type { Post } from "./Post";
4
4
  import type { PostAggregates } from "./PostAggregates";
5
5
  import type { PostReport } from "./PostReport";
6
+ import type { SubscribedType } from "./SubscribedType";
6
7
  export interface PostReportView {
7
8
  post_report: PostReport;
8
9
  post: Post;
@@ -10,7 +11,15 @@ export interface PostReportView {
10
11
  creator: Person;
11
12
  post_creator: Person;
12
13
  creator_banned_from_community: boolean;
14
+ creator_is_moderator: boolean;
15
+ creator_is_admin: boolean;
16
+ subscribed: SubscribedType;
17
+ saved: boolean;
18
+ read: boolean;
19
+ hidden: boolean;
20
+ creator_blocked: boolean;
13
21
  my_vote?: number;
22
+ unread_comments: number;
14
23
  counts: PostAggregates;
15
24
  resolver?: Person;
16
25
  }
@@ -8,6 +8,7 @@ export interface PostView {
8
8
  creator: Person;
9
9
  community: Community;
10
10
  creator_banned_from_community: boolean;
11
+ banned_from_community: boolean;
11
12
  creator_is_moderator: boolean;
12
13
  creator_is_admin: boolean;
13
14
  counts: PostAggregates;
@@ -2,7 +2,7 @@ export interface Register {
2
2
  username: string;
3
3
  password: string;
4
4
  password_verify: string;
5
- show_nsfw: boolean;
5
+ show_nsfw?: boolean;
6
6
  email?: string;
7
7
  captcha_uuid?: string;
8
8
  captcha_answer?: string;
@@ -6,7 +6,6 @@ export interface SaveUserSettings {
6
6
  show_nsfw?: boolean;
7
7
  blur_nsfw?: boolean;
8
8
  auto_expand?: boolean;
9
- show_scores?: boolean;
10
9
  theme?: string;
11
10
  default_sort_type?: SortType;
12
11
  default_listing_type?: ListingType;
@@ -29,4 +28,8 @@ export interface SaveUserSettings {
29
28
  enable_keyboard_navigation?: boolean;
30
29
  enable_animated_images?: boolean;
31
30
  collapse_bot_comments?: boolean;
31
+ show_scores?: boolean;
32
+ show_upvotes?: boolean;
33
+ show_downvotes?: boolean;
34
+ show_upvote_percentage?: boolean;
32
35
  }
@@ -12,7 +12,6 @@ export interface Site {
12
12
  actor_id: string;
13
13
  last_refreshed_at: string;
14
14
  inbox_url: string;
15
- private_key?: string;
16
15
  public_key: string;
17
16
  instance_id: InstanceId;
18
17
  content_warning?: string;
@@ -1,5 +1,6 @@
1
1
  import type { Person } from "./Person";
2
2
  export interface VoteView {
3
3
  creator: Person;
4
+ creator_banned_from_community: boolean;
4
5
  score: number;
5
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lemmy-js-client",
3
3
  "description": "A javascript / typescript client for Lemmy",
4
- "version": "0.19.4-alpha.8",
4
+ "version": "0.19.4",
5
5
  "author": "Dessalines <tyhou13@gmx.com>",
6
6
  "license": "AGPL-3.0",
7
7
  "main": "./dist/index.js",
@@ -11,22 +11,18 @@
11
11
  "scripts": {
12
12
  "build": "tsc",
13
13
  "docs": "typedoc src/index.ts",
14
- "lint": "tsc --noEmit && eslint --report-unused-disable-directives --ext .js,.ts,.tsx src && prettier --check src",
14
+ "lint": "tsc --noEmit && eslint --report-unused-disable-directives && prettier --check src",
15
15
  "prepare": "pnpm run build && husky"
16
16
  },
17
17
  "repository": {
18
18
  "type": "git",
19
19
  "url": "git+https://github.com/LemmyNet/lemmy-js-client.git"
20
20
  },
21
- "dependencies": {
22
- "cross-fetch": "^4.0.0",
23
- "form-data": "^4.0.0"
24
- },
25
21
  "devDependencies": {
26
22
  "@types/node": "^20.11.19",
27
23
  "@typescript-eslint/eslint-plugin": "^7.0.1",
28
24
  "@typescript-eslint/parser": "^7.0.1",
29
- "eslint": "^8.56.0",
25
+ "eslint": "^9.0.0",
30
26
  "eslint-plugin-prettier": "^5.1.3",
31
27
  "husky": "^9.0.11",
32
28
  "lint-staged": "^15.2.2",
@@ -36,8 +32,10 @@
36
32
  "prettier-plugin-packagejson": "^2.4.11",
37
33
  "sortpack": "^2.4.0",
38
34
  "typedoc": "^0.25.8",
39
- "typescript": "^5.3.3"
35
+ "typescript": "^5.3.3",
36
+ "typescript-eslint": "^7.9.0"
40
37
  },
38
+ "packageManager": "pnpm@9.1.4",
41
39
  "types": "./dist/index.d.ts",
42
40
  "lint-staged": {
43
41
  "*.{ts,tsx,js}": [