auth-mn 1.0.0 → 1.1.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.
package/README.md CHANGED
@@ -1,187 +1,236 @@
1
- # auth-mn
2
-
3
- **Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
4
- (утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
5
- хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
6
- асууна.
7
-
8
- Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
9
-
10
- | Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
11
- |---|---|---|
12
- | Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
13
- | user_id / утас / имэйлээр хэрэглэгч хайх | `user.find({...})` | `user.read` |
14
- | Push мэдэгдэл, SMS, имэйл илгээх | `notification.push / sms / mail` | `notification.*` |
15
- | Хэрэглэгчийн нээлттэй апп дээр realtime toast / төлөв харуулах | `socket.toast / status / orderStatus / emit` | `socket.*` |
16
-
17
- Frontend дээр нэвтрэх товч, QR нэвтрэлт хэрэгтэй бол **[auth-mn-react](https://www.npmjs.com/package/auth-mn-react)** санг хэрэглэнэ.
18
-
19
- ```bash
20
- npm i auth-mn
21
- ```
22
-
23
- ---
24
-
25
- ## 1. Client бүртгүүлэх
26
-
27
- Auth.mn **admin panel → Апп-ууд (Client)** дээр апп-аа бүртгэхэд `client_id` (`cl_…`) болон
28
- `client_secret` (`sk_…`) олгоно. Secret **нэг л удаа** харагдана — `.env`-дээ хадгална.
29
- Тухайн апп ямар API дуудаж болохыг (эрхүүдийг) admin тэндээ сонгоно; эрхгүй API дуудвал
30
- `403` + ямар эрх дутууг хэлсэн message ирнэ.
31
-
32
- ```env
33
- AUTH_MN_CLIENT_ID=cl_xxxxxxxxxxxxxxxx
34
- AUTH_MN_CLIENT_SECRET=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
35
- ```
36
-
37
- ## 2. Тохиргоо
38
-
39
- ```ts
40
- import authMn, { setAuth, setHost } from "auth-mn";
41
-
42
- setHost("prod"); // "staging" эсвэл setHost({ MAIN: "https://api.auth.mn" })
43
- setAuth({
44
- client_id: process.env.AUTH_MN_CLIENT_ID!,
45
- client_secret: process.env.AUTH_MN_CLIENT_SECRET!
46
- });
47
- ```
48
-
49
- Үүний дараа юу ч хийх шаардлагагүй: сан `client_id + secret`-ээр access token (1 цаг) болон
50
- refresh token (30 хоног) авч, хугацаа дуусахаас өмнө өөрөө сунгана. 401 ирвэл token-оо
51
- сэргээж нэг удаа дахин оролдоно. **Бүх функц `{ success, message, data, status }` буцна, throw хийхгүй.**
52
-
53
- ## 3. Хэрэглэгч нэвтрүүлэх (гол урсгал)
54
-
55
- ```
56
- [Frontend] auth-mn-react → Auth.mn дээр нэвтэрнэ → таны сайт руу ?authToken=... буцна
57
- (эсвэл QR / OTP-оор token авна)
58
- │ Authorization: Bearer <authToken>
59
- ▼
60
- [Таны backend] authMn.user.verify(authToken) ──► Auth.mn (client token + user.verify эрх)
61
- │ token-ийг задалж, хэрэглэгчийн
62
- ▼ мэдээллийг буцаана
63
- өөрийн session / JWT үүсгэнэ, хэрэглэгчийг DB-дээ user_id-аар холбоно
64
- ```
65
-
66
- ### 3.1 Нэвтрэх endpoint
67
-
68
- ```ts
69
- app.post("/api/auth/callback", async (req, res) => {
70
- const v = await authMn.user.verify(req.body.authToken);
71
- if (!v.success) return res.status(401).json({ message: v.message });
72
-
73
- const u = v.data.user; // user_id, user_name, primary_phone, primary_email, profile_image_url, ...
74
- // 1) өөрийн DB-д user_id-аар хайж байхгүй бол үүсгэнэ
75
- // 2) өөрийн session / JWT үүсгэж cookie-д хадгална
76
- res.json({ success: true, user: u });
77
- });
78
- ```
79
-
80
- `v.data`:
81
-
82
- ```ts
83
- {
84
- user: UserT; // доорх бүтэц
85
- exp: number | null; // хэрэглэгчийн token дуусах хугацаа (unix sec)
86
- client: { client_id, name } // ямар client-ээр шалгасан
87
- }
88
- ```
89
-
90
- Шалгалт бүр хэрэглэгчийн **нэвтрэлтийн түүхэнд** "`<таны домэйн>`-д дамжуулсан" гэж бүртгэгдэнэ —
91
- хэрэглэгч Auth.mn дээрээ аль апп-д хэзээ нэвтэрснээ харна.
92
-
93
- ### 3.2 Route хамгаалах middleware
94
-
95
- Хэрэглэгчийн token-ийг хүсэлт бүрт шалгах бол:
96
-
97
- ```ts
98
- // Authorization: Bearer <token> (эсвэл ?authToken= / body.authToken)
99
- app.get("/api/me", authMn.user.middleware(), (req, res) => {
100
- res.json(req.authMnUser); // UserT
101
- });
102
-
103
- app.get("/api/feed", authMn.user.middleware({ required: false }), (req, res) => {
104
- // нэвтрээгүй бол req.authMnUser === null, алдаа өгөхгүй
105
- });
106
- ```
107
-
108
- > Хүсэлт бүрт Auth.mn руу нэг дуудлага хийдэг тул ачаалал ихтэй бол 3.1-ийн адил нэвтрэх үед нэг удаа
109
- > шалгаад өөрийн session/JWT ашиглахыг зөвлөнө.
110
-
111
- ### 3.3 Хэрэглэгч хайх
112
-
113
- ```ts
114
- const r = await authMn.user.find({ user_id: 5742248 }); // эсвэл { phone_number: "99112233" } / { email }
115
- if (r.success) console.log(r.data.user_name);
116
- ```
117
-
118
- ### UserT
119
-
120
- ```ts
121
- {
122
- user_id: number; // Auth.mn-ийн тогтмол ID — өөрийн DB-д үүгээр холбоно
123
- user_name: string;
124
- nick_name: string;
125
- primary_phone: string | null;
126
- primary_email: string | null;
127
- emails: { email, verified, primary }[];
128
- phone_numbers: { number, verified, primary }[];
129
- profile_image_url: string;
130
- gender?: "MEN" | "WOMEN";
131
- date_of_birth: Date | null;
132
- auth_profiles: { google_id, facebook_id, steam_id, ... };
133
- sign_up_date, last_login, ...
134
- }
135
- ```
136
-
137
- ## 4. Мэдэгдэл
138
-
139
- ```ts
140
- await authMn.notification.push({
141
- user_id: 5742248,
142
- target_app: "MY-APP",
143
- body: { title: "Захиалга", body: "Захиалга #123 батлагдлаа", button: { title: "Харах", url: "https://..." } }
144
- }); // notification.push
145
- await authMn.notification.sms({ to: "99112233", from: "MYAPP", text: "Код: 1234" }); // notification.sms
146
- await authMn.notification.mail({
147
- type: "notification", to: ["a@b.mn"], subject: "Сайн уу",
148
- body: { name: "Бат", title: "Тавтай морил", desc: "..." }
149
- }); // notification.mail
150
- ```
151
-
152
- ## 5. Socket (realtime)
153
-
154
- Хэрэглэгч Auth.mn-тэй холбогдсон аль нэг апп-аа нээлттэй байхад:
155
-
156
- ```ts
157
- await authMn.socket.toast({ user_id, type: "info", text: "Төлбөр амжилттай" }); // socket.toast
158
- await authMn.socket.status({ user_id, id: "order-123", type: "Loading", title: "Боловсруулж байна" }); // socket.status
159
- await authMn.socket.status({ user_id, id: "order-123", type: "Success", title: "Амжилттай", amount: 15000 });
160
- await authMn.socket.orderStatus({ user_id, order_id: "order-123" }); // socket.status
161
- await authMn.socket.emit([{ user_id, emit_name: "my-event", data: { any: 1 } }]); // socket.emit
162
- ```
163
-
164
- ## 6. Client өөрийн мэдээлэл
165
-
166
- ```ts
167
- await authMn.auth.me(); // { client_id, name, permissions, ... }
168
- authMn.auth.hasPermission("notification.sms"); // сүүлийн token-оос
169
- await authMn.auth.permissions(); // Auth.mn-ийн бүх боломжит эрх
170
- await authMn.auth.revoke(); // refresh token-оо хүчингүй болгоод cache цэвэрлэнэ
171
- ```
172
-
173
- ## Алдаа
174
-
175
- | status | Шалтгаан |
176
- |---|---|
177
- | 401 | client_id/secret буруу, client идэвхгүй, эсвэл хэрэглэгчийн token хүчингүй |
178
- | 403 | Энэ API-д шаардлагатай эрх client-д олгогдоогүй — admin panel дээр нэмнэ |
179
- | 0 | Сүлжээний алдаа (`message`-д шалтгаан) |
180
-
181
- ## 0.x → 1.0 шилжилт
182
-
183
- - `config.auth.username / password`, `auth.TOKEN({username,password})` → `setAuth({ client_id, client_secret })`.
184
- Хуучин client бүртгэлүүд admin panel дээр **Secret шинэчлэх** дарж secret авна.
185
- - `find.USER / MERCHANT / ADMIN / CLIENT / CRM` **хасагдсан** — хэрэглэгчийн мэдээлэл `user.verify` / `user.find`-ээр.
186
- - `notification.SinglePushNoti / SMS / MAIL`, `socket.ShowToast / ShowStatus / ShowOrderStatus / EMIT` хэвээр ажиллана (alias).
187
- - `notification._3RD.*` хасагдсан.
1
+ # auth-mn
2
+
3
+ **Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
4
+ (утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
5
+ хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
6
+ асууна.
7
+
8
+ Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
9
+
10
+ | Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
11
+ |---|---|---|
12
+ | Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
13
+ | user_id / утас / имэйлээр нэг хэрэглэгч авах | `user.find({...})` | `user.read` |
14
+ | Олон хэрэглэгч (өөрийн апп-ийн хэрэглэгчид, ID жагсаалт, хайлт) | `user.list({...})` / `user.listAll({...})` | `user.read` |
15
+ | Push мэдэгдэл, SMS, имэйл илгээх | `notification.push / sms / mail` | `notification.*` |
16
+ | Хэрэглэгчийн нээлттэй апп дээр realtime toast / төлөв харуулах | `socket.toast / status / orderStatus / emit` | `socket.*` |
17
+
18
+ Frontend дээр нэвтрэх товч, QR нэвтрэлт хэрэгтэй бол **[auth-mn-react](https://www.npmjs.com/package/auth-mn-react)** санг хэрэглэнэ.
19
+
20
+ ```bash
21
+ npm i auth-mn
22
+ ```
23
+
24
+ ---
25
+
26
+ ## 1. Client бүртгүүлэх
27
+
28
+ Auth.mn **admin panel → Апп-ууд (Client)** дээр апп-аа бүртгэхэд `client_id` (`cl_…`) болон
29
+ `client_secret` (`sk_…`) олгоно. Secret **нэг л удаа** харагдана — `.env`-дээ хадгална.
30
+ Тухайн апп ямар API дуудаж болохыг (эрхүүдийг) admin тэндээ сонгоно; эрхгүй API дуудвал
31
+ `403` + ямар эрх дутууг хэлсэн message ирнэ.
32
+
33
+ ```env
34
+ AUTH_MN_CLIENT_ID=cl_xxxxxxxxxxxxxxxx
35
+ AUTH_MN_CLIENT_SECRET=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
36
+ ```
37
+
38
+ ## 2. Тохиргоо
39
+
40
+ ```ts
41
+ import authMn, { setAuth, setHost } from "auth-mn";
42
+
43
+ setHost("prod"); // "staging" эсвэл setHost({ MAIN: "https://api.auth.mn" })
44
+ setAuth({
45
+ client_id: process.env.AUTH_MN_CLIENT_ID!,
46
+ client_secret: process.env.AUTH_MN_CLIENT_SECRET!
47
+ });
48
+ ```
49
+
50
+ Үүний дараа юу ч хийх шаардлагагүй: сан `client_id + secret`-ээр access token (1 цаг) болон
51
+ refresh token (30 хоног) авч, хугацаа дуусахаас өмнө өөрөө сунгана. 401 ирвэл token-оо
52
+ сэргээж нэг удаа дахин оролдоно. **Бүх функц `{ success, message, data, status }` буцна, throw хийхгүй.**
53
+
54
+ ## 3. Хэрэглэгч нэвтрүүлэх (гол урсгал)
55
+
56
+ ```
57
+ [Frontend] auth-mn-react → Auth.mn дээр нэвтэрнэ → таны сайт руу ?authToken=... буцна
58
+ (эсвэл QR / OTP-оор token авна)
59
+ │ Authorization: Bearer <authToken>
60
+ ▼
61
+ [Таны backend] authMn.user.verify(authToken) ──► Auth.mn (client token + user.verify эрх)
62
+ │ token-ийг задалж, хэрэглэгчийн
63
+ ▼ мэдээллийг буцаана
64
+ өөрийн session / JWT үүсгэнэ, хэрэглэгчийг DB-дээ user_id-аар холбоно
65
+ ```
66
+
67
+ ### 3.1 Нэвтрэх endpoint
68
+
69
+ ```ts
70
+ app.post("/api/auth/callback", async (req, res) => {
71
+ const v = await authMn.user.verify(req.body.authToken);
72
+ if (!v.success) return res.status(401).json({ message: v.message });
73
+
74
+ const u = v.data.user; // user_id, user_name, primary_phone, primary_email, profile_image_url, ...
75
+ // 1) өөрийн DB-д user_id-аар хайж байхгүй бол үүсгэнэ
76
+ // 2) өөрийн session / JWT үүсгэж cookie-д хадгална
77
+ res.json({ success: true, user: u });
78
+ });
79
+ ```
80
+
81
+ `v.data`:
82
+
83
+ ```ts
84
+ {
85
+ user: UserT; // доорх бүтэц
86
+ exp: number | null; // хэрэглэгчийн token дуусах хугацаа (unix sec)
87
+ client: { client_id, name } // ямар client-ээр шалгасан
88
+ }
89
+ ```
90
+
91
+ Шалгалт бүр хэрэглэгчийн **нэвтрэлтийн түүхэнд** "`<таны домэйн>`-д дамжуулсан" гэж бүртгэгдэнэ —
92
+ хэрэглэгч Auth.mn дээрээ аль апп-д хэзээ нэвтэрснээ харна.
93
+
94
+ ### 3.2 Route хамгаалах middleware
95
+
96
+ Хэрэглэгчийн token-ийг хүсэлт бүрт шалгах бол:
97
+
98
+ ```ts
99
+ // Authorization: Bearer <token> (эсвэл ?authToken= / body.authToken)
100
+ app.get("/api/me", authMn.user.middleware(), (req, res) => {
101
+ res.json(req.authMnUser); // UserT
102
+ });
103
+
104
+ app.get("/api/feed", authMn.user.middleware({ required: false }), (req, res) => {
105
+ // нэвтрээгүй бол req.authMnUser === null, алдаа өгөхгүй
106
+ });
107
+ ```
108
+
109
+ > Хүсэлт бүрт Auth.mn руу нэг дуудлага хийдэг тул ачаалал ихтэй бол 3.1-ийн адил нэвтрэх үед нэг удаа
110
+ > шалгаад өөрийн session/JWT ашиглахыг зөвлөнө.
111
+
112
+ ### 3.3 Хэрэглэгч хайх
113
+
114
+ ```ts
115
+ const r = await authMn.user.find({ user_id: 5742248 }); // эсвэл { phone_number: "99112233" } / { email }
116
+ if (r.success) console.log(r.data.user_name);
117
+ ```
118
+
119
+ ### 3.4 Олон хэрэглэгч (жагсаалт)
120
+
121
+ ```ts
122
+ // Таны апп-д бүртгүүлсэн бүх хэрэглэгч — campaign, push илгээхэд
123
+ const r = await authMn.user.list({ app_name: "CHARGEX", fields: "lite", page: 1, limit: 500 });
124
+ // r.data = { list: UserLite[], total, page, limit }
125
+
126
+ const all = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" }); // бүх хуудсыг нэгтгэнэ
127
+ await authMn.user.list({ user_ids: [5742248, 5742249] });
128
+ await authMn.user.list({ q: "9911", last_login_after: "2026-01-01" });
129
+ ```
130
+
131
+ Шүүлтүүр: `user_ids | app_name | phone_number | email | name | q | gender | last_login_after | page | limit (≤500) | fields ("full" | "lite")`.
132
+
133
+ ### UserT
134
+
135
+ ```ts
136
+ {
137
+ user_id: number; // Auth.mn-ийн тогтмол ID — өөрийн DB-д үүгээр холбоно
138
+ user_name: string;
139
+ nick_name: string;
140
+ primary_phone: string | null;
141
+ primary_email: string | null;
142
+ emails: { email, verified, primary }[];
143
+ phone_numbers: { number, verified, primary }[];
144
+ profile_image_url: string;
145
+ gender?: "MEN" | "WOMEN";
146
+ date_of_birth: Date | null;
147
+ auth_profiles: { google_id, facebook_id, steam_id, ... };
148
+ sign_up_date, last_login, ...
149
+ }
150
+ ```
151
+
152
+ ## 4. Мэдэгдэл
153
+
154
+ ```ts
155
+ await authMn.notification.push({
156
+ user_id: 5742248,
157
+ target_app: "MY-APP",
158
+ body: { title: "Захиалга", body: "Захиалга #123 батлагдлаа", button: { title: "Харах", url: "https://..." } }
159
+ }); // notification.push
160
+ await authMn.notification.sms({ to: "99112233", from: "MYAPP", text: "Код: 1234" }); // notification.sms
161
+ await authMn.notification.mail({
162
+ type: "notification", to: ["a@b.mn"], subject: "Сайн уу",
163
+ body: { name: "Бат", title: "Тавтай морил", desc: "..." }
164
+ }); // notification.mail
165
+ ```
166
+
167
+ ## 5. Socket (realtime)
168
+
169
+ Хэрэглэгч Auth.mn-тэй холбогдсон аль нэг апп-аа нээлттэй байхад:
170
+
171
+ ```ts
172
+ await authMn.socket.toast({ user_id, type: "info", text: "Төлбөр амжилттай" }); // socket.toast
173
+ await authMn.socket.status({ user_id, id: "order-123", type: "Loading", title: "Боловсруулж байна" }); // socket.status
174
+ await authMn.socket.status({ user_id, id: "order-123", type: "Success", title: "Амжилттай", amount: 15000 });
175
+ await authMn.socket.orderStatus({ user_id, order_id: "order-123" }); // socket.status
176
+ await authMn.socket.emit([{ user_id, emit_name: "my-event", data: { any: 1 } }]); // socket.emit
177
+ ```
178
+
179
+ ## 6. EXP нэмэх (Seller Panda г.м.)
180
+
181
+ Хэрэглэгчид exp олгох. client_id/secret-ээс **тусдаа EXP түлхүүр** хэрэгтэй — Admin panel →
182
+ **EXP түлхүүр** дээр нэр (ж: `Seller Panda`) + нэг дуудлагад олгох exp-ийг admin тохируулж
183
+ үүсгэнэ (`exp_…`, нэг удаа харагдана). Хэдэн exp нэмэгдэх нь түлхүүр дээр тогтсон — дуудагч
184
+ тал өөрчилж чадахгүй.
185
+
186
+ ```ts
187
+ import authMn, { setExpKey } from "auth-mn";
188
+
189
+ setExpKey(process.env.AUTH_MN_EXP_KEY); // exp_…
190
+
191
+ // user_id-ээр
192
+ const r = await authMn.exp.add({
193
+ user_id: 8636569,
194
+ desc: "Худалдан авалт #1234",
195
+ ref: "order-1234" // optional — ижил ref-ээр дахин дуудахад давхар нэмэхгүй
196
+ });
197
+ // r.data → { user_id, exp: 10, exp_total: 1250, desc, ref, duplicate: false, ... }
198
+
199
+ // эсвэл frontend-ээс ирсэн хэрэглэгчийн token-оор
200
+ await authMn.exp.add({ token: userToken, desc: "Өдөр тутмын нэвтрэлт" });
201
+
202
+ // тухайн түлхүүрээр нэмсэн лог
203
+ const logs = await authMn.exp.logs({ user_id: 8636569, page: 1, limit: 20 });
204
+ ```
205
+
206
+ Шууд HTTP: `POST https://api.auth.mn/main/v1/auth/exp/add` — `Authorization: Bearer exp_…`
207
+ (эсвэл `x-exp-key: exp_…`), body `{ user_id | token, desc, ref? }`.
208
+
209
+ ## 7. Client өөрийн мэдээлэл
210
+
211
+ ```ts
212
+ import { config } from "auth-mn";
213
+ await authMn.auth.getToken(); // хүчинтэй access token (шаардлагатай бол refresh / login хийгээд)
214
+ config.token; // одоогийн access token — гараар Authorization: Bearer үүсгэхэд
215
+
216
+ await authMn.auth.me(); // { client_id, name, permissions, ... }
217
+ authMn.auth.hasPermission("notification.sms"); // сүүлийн token-оос
218
+ await authMn.auth.permissions(); // Auth.mn-ийн бүх боломжит эрх
219
+ await authMn.auth.revoke(); // refresh token-оо хүчингүй болгоод cache цэвэрлэнэ
220
+ ```
221
+
222
+ ## Алдаа
223
+
224
+ | status | Шалтгаан |
225
+ |---|---|
226
+ | 401 | client_id/secret буруу, client идэвхгүй, эсвэл хэрэглэгчийн token хүчингүй |
227
+ | 403 | Энэ API-д шаардлагатай эрх client-д олгогдоогүй — admin panel дээр нэмнэ |
228
+ | 0 | Сүлжээний алдаа (`message`-д шалтгаан) |
229
+
230
+ ## 0.x → 1.0 шилжилт
231
+
232
+ - `config.auth.username / password`, `auth.TOKEN({username,password})` → `setAuth({ client_id, client_secret })`.
233
+ Хуучин client бүртгэлүүд admin panel дээр **Secret шинэчлэх** дарж secret авна.
234
+ - `find.USER / MERCHANT / ADMIN / CLIENT / CRM` **хасагдсан** — хэрэглэгчийн мэдээлэл `user.verify` / `user.find`-ээр.
235
+ - `notification.SinglePushNoti / SMS / MAIL`, `socket.ShowToast / ShowStatus / ShowOrderStatus / EMIT` хэвээр ажиллана (alias).
236
+ - `notification._3RD.*` хасагдсан.
package/dist/auth.d.ts CHANGED
@@ -26,6 +26,8 @@ export declare const refresh: () => Promise<Result<TokenData>>;
26
26
  * Бусад бүх API функц үүнийг автоматаар дуудна.
27
27
  */
28
28
  export declare const getToken: () => Promise<string>;
29
+ /** Одоогийн access token (хоосон бол авч амжаагүй) — config.token-той ижил */
30
+ export declare const token: () => string;
29
31
  /** Одоогийн refresh token-ийг серверт хүчингүй болгоод cache цэвэрлэнэ */
30
32
  export declare const revoke: () => Promise<Result<null>>;
31
33
  /** Client-ийн мэдээлэл + олгогдсон permission */
@@ -44,6 +46,7 @@ export declare const TOKEN: (_legacy?: {
44
46
  }) => Promise<string>;
45
47
  declare const _default: {
46
48
  getToken: () => Promise<string>;
49
+ token: () => string;
47
50
  login: () => Promise<Result<TokenData>>;
48
51
  refresh: () => Promise<Result<TokenData>>;
49
52
  revoke: () => Promise<Result<null>>;
package/dist/auth.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TOKEN = exports.hasPermission = exports.permissions = exports.me = exports.revoke = exports.getToken = exports.refresh = exports.login = exports.authState = exports.AuthState = void 0;
3
+ exports.TOKEN = exports.hasPermission = exports.permissions = exports.me = exports.revoke = exports.token = exports.getToken = exports.refresh = exports.login = exports.authState = exports.AuthState = void 0;
4
4
  const index_1 = require("./index");
5
5
  const request_1 = require("./request");
6
6
  /** Хугацаа дуусахаас хэдэн секундын өмнө refresh хийх */
@@ -27,6 +27,7 @@ class AuthState {
27
27
  }
28
28
  apply(d) {
29
29
  this.accessToken = d.access_token;
30
+ index_1.config.token = d.access_token;
30
31
  this.refreshToken = d.refresh_token;
31
32
  this.accessExpiresAt = Date.now() + d.expires_in * 1000;
32
33
  this.refreshExpiresAt = Date.now() + d.refresh_expires_in * 1000;
@@ -35,6 +36,7 @@ class AuthState {
35
36
  }
36
37
  clear() {
37
38
  this.accessToken = "";
39
+ index_1.config.token = "";
38
40
  this.refreshToken = "";
39
41
  this.accessExpiresAt = 0;
40
42
  this.refreshExpiresAt = 0;
@@ -107,6 +109,9 @@ const getToken = () => exports.authState.single(async () => {
107
109
  return l.success ? exports.authState.accessToken : "";
108
110
  });
109
111
  exports.getToken = getToken;
112
+ /** Одоогийн access token (хоосон бол авч амжаагүй) — config.token-той ижил */
113
+ const token = () => index_1.config.token;
114
+ exports.token = token;
110
115
  /** Одоогийн refresh token-ийг серверт хүчингүй болгоод cache цэвэрлэнэ */
111
116
  const revoke = async () => {
112
117
  const rt = exports.authState.refreshToken;
@@ -144,4 +149,4 @@ const TOKEN = async (_legacy) => {
144
149
  return (0, exports.getToken)();
145
150
  };
146
151
  exports.TOKEN = TOKEN;
147
- exports.default = { getToken: exports.getToken, login: exports.login, refresh: exports.refresh, revoke: exports.revoke, me: exports.me, permissions: exports.permissions, hasPermission: exports.hasPermission, TOKEN: exports.TOKEN, state: exports.authState };
152
+ exports.default = { getToken: exports.getToken, token: exports.token, login: exports.login, refresh: exports.refresh, revoke: exports.revoke, me: exports.me, permissions: exports.permissions, hasPermission: exports.hasPermission, TOKEN: exports.TOKEN, state: exports.authState };
package/dist/exp.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ import { ExpAddResult, ExpLog, PageResult, Result } from "./types";
2
+ export declare const add: (input: {
3
+ user_id?: number | string;
4
+ token?: string;
5
+ desc: string;
6
+ ref?: string;
7
+ }, key?: string) => Promise<Result<ExpAddResult>>;
8
+ /** Тухайн түлхүүрээр нэмсэн exp-ийн лог (user_id-ээр шүүж болно) */
9
+ export declare const logs: (filter?: {
10
+ user_id?: number | string;
11
+ page?: number;
12
+ limit?: number;
13
+ }, key?: string) => Promise<Result<PageResult<ExpLog>>>;
14
+ declare const _default: {
15
+ add: (input: {
16
+ user_id?: number | string;
17
+ token?: string;
18
+ desc: string;
19
+ ref?: string;
20
+ }, key?: string) => Promise<Result<ExpAddResult>>;
21
+ logs: (filter?: {
22
+ user_id?: number | string;
23
+ page?: number;
24
+ limit?: number;
25
+ }, key?: string) => Promise<Result<PageResult<ExpLog>>>;
26
+ };
27
+ export default _default;
package/dist/exp.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logs = exports.add = void 0;
4
+ const index_1 = require("./index");
5
+ const request_1 = require("./request");
6
+ /**
7
+ * EXP — хэрэглэгчид exp нэмэх.
8
+ *
9
+ * Admin panel → "EXP түлхүүр" дээр нэр (ж: Seller Panda) + нэг дуудлагад олгох exp-тэй
10
+ * түлхүүр үүсгэнэ. Энэ түлхүүр client_id/secret-ээс тусдаа: setExpKey("exp_…")-ээр
11
+ * тохируулна (эсвэл дуудлага бүрт key өгнө).
12
+ *
13
+ * import authMn, { setExpKey } from "auth-mn";
14
+ * setExpKey(process.env.AUTH_MN_EXP_KEY);
15
+ * await authMn.exp.add({ user_id: 8636569, desc: "Худалдан авалт #1234", ref: "order-1234" });
16
+ * // эсвэл frontend-ээс ирсэн хэрэглэгчийн token-оор:
17
+ * await authMn.exp.add({ token: userToken, desc: "Худалдан авалт" });
18
+ *
19
+ * Хэдэн exp нэмэгдэх нь түлхүүр дээр admin-ийн тохируулсан хэмжээ — дуудагч тал өөрчилж чадахгүй.
20
+ * `ref` өгвөл ижил ref-ээр дахин дуудахад давхар нэмэхгүй (data.duplicate = true).
21
+ */
22
+ const keyOf = (key) => {
23
+ const k = (key || index_1.config.expKey || "").trim();
24
+ if (!k)
25
+ throw new Error("[auth-mn] EXP түлхүүр тохируулаагүй байна: setExpKey(\"exp_…\")");
26
+ return k;
27
+ };
28
+ const add = (input, key) => {
29
+ let k;
30
+ try {
31
+ k = keyOf(key);
32
+ }
33
+ catch (e) {
34
+ return Promise.resolve({ success: false, message: e.message, data: null, status: 0 });
35
+ }
36
+ return (0, request_1.rawRequest)({ method: "POST", path: "/main/v1/auth/exp/add", name: "exp add", data: input, auth: false }, k);
37
+ };
38
+ exports.add = add;
39
+ /** Тухайн түлхүүрээр нэмсэн exp-ийн лог (user_id-ээр шүүж болно) */
40
+ const logs = (filter = {}, key) => {
41
+ let k;
42
+ try {
43
+ k = keyOf(key);
44
+ }
45
+ catch (e) {
46
+ return Promise.resolve({ success: false, message: e.message, data: null, status: 0 });
47
+ }
48
+ return (0, request_1.rawRequest)({ method: "GET", path: "/main/v1/auth/exp/logs", name: "exp logs", params: filter, auth: false }, k);
49
+ };
50
+ exports.logs = logs;
51
+ exports.default = { add: exports.add, logs: exports.logs };
package/dist/index.d.ts CHANGED
@@ -10,15 +10,18 @@
10
10
  * Client-д олгосон permission-ээс гадуур API дуудвал 403 + message буцна.
11
11
  *
12
12
  * Хамрах хүрээ: хэрэглэгч (verify / find), мэдэгдэл (push / sms / mail),
13
- * socket (toast / status / orderStatus / emit). Merchant/admin зэрэг дотоод
14
- * бүртгэлүүд энэ санд байхгүй.
13
+ * socket (toast / status / orderStatus / emit), exp (хэрэглэгчид exp нэмэх —
14
+ * тусдаа EXP түлхүүр, setExpKey). Merchant/admin зэрэг дотоод бүртгэлүүд энэ санд байхгүй.
15
15
  */
16
16
  import auth from "./auth";
17
17
  import user from "./user";
18
18
  import notification from "./notification";
19
19
  import socket from "./socket";
20
+ import exp from "./exp";
20
21
  export type Env = "prod" | "staging";
21
22
  export type Config = {
23
+ /** Одоогийн client access token (сан автоматаар шинэчилнэ; гараар Authorization header үүсгэхэд ашиглаж болно) */
24
+ token: string;
22
25
  env: Env;
23
26
  hosts: {
24
27
  MAIN: string;
@@ -28,6 +31,8 @@ export type Config = {
28
31
  client_id: string;
29
32
  client_secret: string;
30
33
  };
34
+ /** EXP түлхүүр (exp_…) — Admin panel → EXP түлхүүр. authMn.exp.* дуудлагад ашиглана */
35
+ expKey: string;
31
36
  logger: boolean;
32
37
  /** Хүсэлтийн timeout (ms), default 20000 */
33
38
  timeout: number;
@@ -43,15 +48,18 @@ export declare const setAuth: (auth: {
43
48
  client_id: string;
44
49
  client_secret: string;
45
50
  }) => void;
51
+ /** EXP түлхүүр (Admin panel → EXP түлхүүр дээрээс авна). authMn.exp.add-д ашиглана */
52
+ export declare const setExpKey: (key: string | undefined | null) => void;
46
53
  export declare const setLogger: (status: boolean) => void;
47
54
  export declare const jsonToQueryString: (params: Record<string, any>) => string;
48
55
  export declare const ObjectId: () => string;
49
56
  import { authState } from "./auth";
50
- export { auth, user, notification, socket, authState };
57
+ export { auth, user, notification, socket, exp, authState };
51
58
  export * from "./types";
52
59
  declare const _default: {
53
60
  auth: {
54
61
  getToken: () => Promise<string>;
62
+ token: () => string;
55
63
  login: () => Promise<import("./types").Result<import("./types").TokenData>>;
56
64
  refresh: () => Promise<import("./types").Result<import("./types").TokenData>>;
57
65
  revoke: () => Promise<import("./types").Result<null>>;
@@ -71,6 +79,8 @@ declare const _default: {
71
79
  phone_number?: string;
72
80
  email?: string;
73
81
  }) => Promise<import("./types").Result<import("./types").UserT>>;
82
+ list: typeof import("./user").list;
83
+ listAll: typeof import("./user").listAll;
74
84
  middleware: (opts?: import("./user").MiddlewareOptions) => (req: {
75
85
  [k: string]: any;
76
86
  headers: Record<string, any>;
@@ -100,6 +110,19 @@ declare const _default: {
100
110
  ShowOrderStatus: (body: import("./types").OrderStatusT) => Promise<import("./types").Result<null>>;
101
111
  EMIT: (body: import("./types").EmitT[]) => Promise<import("./types").Result<null>>;
102
112
  };
113
+ exp: {
114
+ add: (input: {
115
+ user_id?: number | string;
116
+ token?: string;
117
+ desc: string;
118
+ ref?: string;
119
+ }, key?: string) => Promise<import("./types").Result<import("./types").ExpAddResult>>;
120
+ logs: (filter?: {
121
+ user_id?: number | string;
122
+ page?: number;
123
+ limit?: number;
124
+ }, key?: string) => Promise<import("./types").Result<import("./types").PageResult<import("./types").ExpLog>>>;
125
+ };
103
126
  setAuth: (auth: {
104
127
  client_id: string;
105
128
  client_secret: string;
@@ -108,6 +131,7 @@ declare const _default: {
108
131
  MAIN: string;
109
132
  WALLET?: string;
110
133
  }, env?: Env) => void;
134
+ setExpKey: (key: string | undefined | null) => void;
111
135
  setLogger: (status: boolean) => void;
112
136
  ObjectId: () => string;
113
137
  };
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.authState = exports.socket = exports.notification = exports.user = exports.auth = exports.ObjectId = exports.jsonToQueryString = exports.setLogger = exports.setAuth = exports.setHost = exports.config = void 0;
17
+ exports.authState = exports.exp = exports.socket = exports.notification = exports.user = exports.auth = exports.ObjectId = exports.jsonToQueryString = exports.setLogger = exports.setExpKey = exports.setAuth = exports.setHost = exports.config = void 0;
18
18
  /**
19
19
  * auth-mn — Auth.mn API client (Node.js)
20
20
  *
@@ -27,8 +27,8 @@ exports.authState = exports.socket = exports.notification = exports.user = expor
27
27
  * Client-д олгосон permission-ээс гадуур API дуудвал 403 + message буцна.
28
28
  *
29
29
  * Хамрах хүрээ: хэрэглэгч (verify / find), мэдэгдэл (push / sms / mail),
30
- * socket (toast / status / orderStatus / emit). Merchant/admin зэрэг дотоод
31
- * бүртгэлүүд энэ санд байхгүй.
30
+ * socket (toast / status / orderStatus / emit), exp (хэрэглэгчид exp нэмэх —
31
+ * тусдаа EXP түлхүүр, setExpKey). Merchant/admin зэрэг дотоод бүртгэлүүд энэ санд байхгүй.
32
32
  */
33
33
  const auth_1 = require("./auth");
34
34
  exports.auth = auth_1.default;
@@ -38,14 +38,18 @@ const notification_1 = require("./notification");
38
38
  exports.notification = notification_1.default;
39
39
  const socket_1 = require("./socket");
40
40
  exports.socket = socket_1.default;
41
+ const exp_1 = require("./exp");
42
+ exports.exp = exp_1.default;
41
43
  const HOSTS = {
42
44
  prod: { MAIN: "https://api.auth.mn", WALLET: "https://api.auth.mn" },
43
45
  staging: { MAIN: "https://staging-api.auth.mn", WALLET: "https://staging-api.auth.mn" }
44
46
  };
45
47
  exports.config = {
48
+ token: "",
46
49
  env: "prod",
47
50
  hosts: { ...HOSTS.prod },
48
51
  auth: { client_id: "", client_secret: "" },
52
+ expKey: "",
49
53
  logger: false,
50
54
  timeout: 20000
51
55
  };
@@ -73,6 +77,11 @@ const setAuth = (auth) => {
73
77
  auth_2.authState.clear();
74
78
  };
75
79
  exports.setAuth = setAuth;
80
+ /** EXP түлхүүр (Admin panel → EXP түлхүүр дээрээс авна). authMn.exp.add-д ашиглана */
81
+ const setExpKey = (key) => {
82
+ exports.config.expKey = (key || "").trim();
83
+ };
84
+ exports.setExpKey = setExpKey;
76
85
  const setLogger = (status) => {
77
86
  exports.config.logger = status;
78
87
  };
@@ -94,4 +103,15 @@ exports.ObjectId = ObjectId;
94
103
  const auth_2 = require("./auth");
95
104
  Object.defineProperty(exports, "authState", { enumerable: true, get: function () { return auth_2.authState; } });
96
105
  __exportStar(require("./types"), exports);
97
- exports.default = { auth: auth_1.default, user: user_1.default, notification: notification_1.default, socket: socket_1.default, setAuth: exports.setAuth, setHost: exports.setHost, setLogger: exports.setLogger, ObjectId: exports.ObjectId };
106
+ exports.default = {
107
+ auth: auth_1.default,
108
+ user: user_1.default,
109
+ notification: notification_1.default,
110
+ socket: socket_1.default,
111
+ exp: exp_1.default,
112
+ setAuth: exports.setAuth,
113
+ setHost: exports.setHost,
114
+ setExpKey: exports.setExpKey,
115
+ setLogger: exports.setLogger,
116
+ ObjectId: exports.ObjectId
117
+ };
package/dist/types.d.ts CHANGED
@@ -132,6 +132,50 @@ export type UserT = {
132
132
  dynamic_info?: Record<string, any>;
133
133
  apps?: UserAppItem[];
134
134
  };
135
+ export type UserListFilter = {
136
+ /** user_id жагсаалт (max 1000) */
137
+ user_ids?: (number | string)[];
138
+ /** Таны апп-д бүртгүүлсэн хэрэглэгчид (apps.app_name) */
139
+ app_name?: string;
140
+ phone_number?: string;
141
+ email?: string;
142
+ /** нэр (хэсэгчилсэн) */
143
+ name?: string;
144
+ /** нэр / nick / имэйл / утас дээр ерөнхий хайлт */
145
+ q?: string;
146
+ gender?: Gender;
147
+ /** энэ хугацаанаас хойш нэвтэрсэн (ISO) */
148
+ last_login_after?: string | Date;
149
+ page?: number;
150
+ /** max 500, default 100 */
151
+ limit?: number;
152
+ /** lite: зөвхөн user_id, нэр, утас, имэйл, зураг, last_login (хурдан) */
153
+ fields?: "full" | "lite";
154
+ };
155
+ export type UserLite = Pick<UserT, "user_id" | "user_name" | "nick_name" | "primary_phone" | "primary_email" | "profile_image_url" | "last_login">;
156
+ export type PageResult<T> = {
157
+ list: T[];
158
+ total: number;
159
+ page: number;
160
+ limit: number;
161
+ };
162
+ export type ExpLog = {
163
+ _id: string;
164
+ user_id: number;
165
+ key_id: string;
166
+ key_name: string;
167
+ /** Нэмсэн exp */
168
+ exp: number;
169
+ /** Нэмсний дараах хэрэглэгчийн нийт exp */
170
+ exp_total: number;
171
+ desc: string;
172
+ ref?: string;
173
+ createdAt?: string;
174
+ };
175
+ export type ExpAddResult = ExpLog & {
176
+ /** true бол ижил ref-ээр өмнө нь нэмэгдсэн — давхар нэмээгүй */
177
+ duplicate: boolean;
178
+ };
135
179
  export type PushNotiT = {
136
180
  user_id: number;
137
181
  target_app: string;
package/dist/user.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Result, UserT, VerifiedUser } from "./types";
1
+ import { PageResult, Result, UserListFilter, UserLite, UserT, VerifiedUser } from "./types";
2
2
  /**
3
3
  * Хэрэглэгчийн token-ийг Auth.mn сервер дээр баталгаажуулж, хэрэглэгчийн
4
4
  * мэдээллийг авна. Frontend (auth-mn-react redirect / QR / OTP) -ээс ирсэн
@@ -18,6 +18,23 @@ export declare const find: (query: {
18
18
  phone_number?: string;
19
19
  email?: string;
20
20
  }) => Promise<Result<UserT>>;
21
+ /**
22
+ * Олон хэрэглэгч — хуудаслалттай. Permission: user.read
23
+ * await authMn.user.list({ app_name: "CHARGEX", fields: "lite", limit: 500 });
24
+ * → { list, total, page, limit }
25
+ */
26
+ export declare function list(filter: UserListFilter & {
27
+ fields: "lite";
28
+ }): Promise<Result<PageResult<UserLite>>>;
29
+ export declare function list(filter?: UserListFilter): Promise<Result<PageResult<UserT>>>;
30
+ /**
31
+ * Бүх хуудсыг татаж нэг массив болгоно (campaign, тайлан г.м.). max нь хамгаалалт (default 50000).
32
+ * const users = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" });
33
+ */
34
+ export declare function listAll(filter: UserListFilter & {
35
+ fields: "lite";
36
+ }, max?: number): Promise<Result<UserLite[]>>;
37
+ export declare function listAll(filter?: UserListFilter, max?: number): Promise<Result<UserT[]>>;
21
38
  type AnyReq = {
22
39
  headers: Record<string, any>;
23
40
  query?: any;
@@ -54,6 +71,8 @@ declare const _default: {
54
71
  phone_number?: string;
55
72
  email?: string;
56
73
  }) => Promise<Result<UserT>>;
74
+ list: typeof list;
75
+ listAll: typeof listAll;
57
76
  middleware: (opts?: MiddlewareOptions) => (req: AnyReq, res: AnyRes, next: Next) => Promise<any>;
58
77
  };
59
78
  export default _default;
package/dist/user.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.middleware = exports.find = exports.verify = void 0;
4
+ exports.list = list;
5
+ exports.listAll = listAll;
4
6
  const request_1 = require("./request");
5
7
  /**
6
8
  * Хэрэглэгчийн token-ийг Auth.mn сервер дээр баталгаажуулж, хэрэглэгчийн
@@ -24,6 +26,29 @@ exports.verify = verify;
24
26
  */
25
27
  const find = (query) => (0, request_1.request)({ method: "POST", path: "/main/v1/auth/client/user/find", name: "user find", data: query });
26
28
  exports.find = find;
29
+ function list(filter = {}) {
30
+ return (0, request_1.request)({
31
+ method: "POST",
32
+ path: "/main/v1/auth/client/user/list",
33
+ name: "user list",
34
+ data: filter
35
+ });
36
+ }
37
+ async function listAll(filter = {}, max = 50000) {
38
+ const limit = Math.min(500, filter.limit || 500);
39
+ const all = [];
40
+ let page = 1;
41
+ for (;;) {
42
+ const r = await list({ ...filter, page, limit });
43
+ if (!r.success || !r.data)
44
+ return { success: false, message: r.message, data: null, status: r.status };
45
+ all.push(...r.data.list);
46
+ if (all.length >= r.data.total || r.data.list.length < limit || all.length >= max)
47
+ break;
48
+ page++;
49
+ }
50
+ return { success: true, message: "Амжилттай", data: all, status: 200 };
51
+ }
27
52
  const defaultGetToken = (req) => {
28
53
  var _a, _b, _c, _d;
29
54
  const h = String(((_a = req.headers) === null || _a === void 0 ? void 0 : _a.authorization) || ((_b = req.headers) === null || _b === void 0 ? void 0 : _b.Authorization) || "");
@@ -65,4 +90,4 @@ const middleware = (opts = {}) => async (req, res, next) => {
65
90
  return next();
66
91
  };
67
92
  exports.middleware = middleware;
68
- exports.default = { verify: exports.verify, find: exports.find, middleware: exports.middleware };
93
+ exports.default = { verify: exports.verify, find: exports.find, list, listAll, middleware: exports.middleware };
package/package.json CHANGED
@@ -1,47 +1,47 @@
1
- {
2
- "name": "auth-mn",
3
- "version": "1.0.0",
4
- "description": "Auth.mn API client for Node.js — client_id/secret token, user, notification, socket",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "files": [
8
- "dist/"
9
- ],
10
- "scripts": {
11
- "test": "echo \"Error: no test specified\" && exit 1",
12
- "build-ts": "rm -rf ./dist && npx tsc",
13
- "build": "npx tsc",
14
- "debug": "npm run build && npm run watch-debug",
15
- "lint": "tsc --noEmit && eslint \"**/*.{js,ts}\" --quiet --fix",
16
- "typecheck": "tsc --noEmit"
17
- },
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/togtokh-dev/auth-mn.git"
21
- },
22
- "keywords": [
23
- "auth.mn",
24
- "axios",
25
- "togtokh.dev"
26
- ],
27
- "author": "TOGTOKH.DEV",
28
- "license": "ISC",
29
- "bugs": {
30
- "url": "https://github.com/togtokh-dev/auth-mn/issues"
31
- },
32
- "homepage": "https://github.com/togtokh-dev/auth-mn/#readme",
33
- "dependencies": {
34
- "axios": "^1.6.2"
35
- },
36
- "devDependencies": {
37
- "@types/node": "^18.15.11",
38
- "@typescript-eslint/eslint-plugin": "^6.4.0",
39
- "@typescript-eslint/parser": "^6.4.0",
40
- "eslint": "^8.47.0",
41
- "ts-node": "^10.9.2",
42
- "typescript": "^5.0.4"
43
- },
44
- "publishConfig": {
45
- "access": "public"
46
- }
47
- }
1
+ {
2
+ "name": "auth-mn",
3
+ "version": "1.1.0",
4
+ "description": "Auth.mn API client for Node.js — client_id/secret token, user, notification, socket",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist/"
9
+ ],
10
+ "scripts": {
11
+ "test": "echo \"Error: no test specified\" && exit 1",
12
+ "build-ts": "rm -rf ./dist && npx tsc",
13
+ "build": "npx tsc",
14
+ "debug": "npm run build && npm run watch-debug",
15
+ "lint": "tsc --noEmit && eslint \"**/*.{js,ts}\" --quiet --fix",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/togtokh-dev/auth-mn.git"
21
+ },
22
+ "keywords": [
23
+ "auth.mn",
24
+ "axios",
25
+ "togtokh.dev"
26
+ ],
27
+ "author": "TOGTOKH.DEV",
28
+ "license": "ISC",
29
+ "bugs": {
30
+ "url": "https://github.com/togtokh-dev/auth-mn/issues"
31
+ },
32
+ "homepage": "https://github.com/togtokh-dev/auth-mn/#readme",
33
+ "dependencies": {
34
+ "axios": "^1.6.2"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^18.15.11",
38
+ "@typescript-eslint/eslint-plugin": "^6.4.0",
39
+ "@typescript-eslint/parser": "^6.4.0",
40
+ "eslint": "^8.47.0",
41
+ "ts-node": "^10.9.2",
42
+ "typescript": "^5.0.4"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ }
47
+ }