@meowpanel/api 0.3.0 → 0.5.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/esm/mod.d.ts +37 -16
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +25 -7
- package/esm/src/client.d.ts +48 -11
- package/esm/src/client.d.ts.map +1 -1
- package/esm/src/client.js +53 -12
- package/esm/src/http.d.ts +2 -2
- package/esm/src/http.d.ts.map +1 -1
- package/esm/src/http.js +5 -2
- package/esm/src/namespace.d.ts +1 -1
- package/esm/src/namespace.js +1 -1
- package/esm/src/resources/account.d.ts +50 -19
- package/esm/src/resources/account.d.ts.map +1 -1
- package/esm/src/resources/account.js +51 -13
- package/esm/src/resources/api-keys.d.ts +16 -24
- package/esm/src/resources/api-keys.d.ts.map +1 -1
- package/esm/src/resources/api-keys.js +16 -20
- package/esm/src/resources/auth.d.ts +70 -4
- package/esm/src/resources/auth.d.ts.map +1 -1
- package/esm/src/resources/auth.js +47 -4
- package/esm/src/resources/eggs.d.ts +261 -22
- package/esm/src/resources/eggs.d.ts.map +1 -1
- package/esm/src/resources/eggs.js +261 -25
- package/esm/src/resources/features.d.ts +35 -0
- package/esm/src/resources/features.d.ts.map +1 -0
- package/esm/src/resources/features.js +21 -0
- package/esm/src/resources/hosts.d.ts +151 -21
- package/esm/src/resources/hosts.d.ts.map +1 -1
- package/esm/src/resources/hosts.js +143 -10
- package/esm/src/resources/logs.d.ts +39 -0
- package/esm/src/resources/logs.d.ts.map +1 -0
- package/esm/src/resources/logs.js +38 -0
- package/esm/src/resources/nodes.d.ts +108 -33
- package/esm/src/resources/nodes.d.ts.map +1 -1
- package/esm/src/resources/nodes.js +116 -24
- package/esm/src/resources/permissions.d.ts +45 -0
- package/esm/src/resources/permissions.d.ts.map +1 -0
- package/esm/src/resources/permissions.js +26 -0
- package/esm/src/resources/request-logs.d.ts +91 -0
- package/esm/src/resources/request-logs.d.ts.map +1 -0
- package/esm/src/resources/request-logs.js +70 -0
- package/esm/src/resources/roles.d.ts +128 -0
- package/esm/src/resources/roles.d.ts.map +1 -0
- package/esm/src/resources/roles.js +142 -0
- package/esm/src/resources/server-groups.d.ts +141 -7
- package/esm/src/resources/server-groups.d.ts.map +1 -1
- package/esm/src/resources/server-groups.js +157 -8
- package/esm/src/resources/servers/activity.d.ts +50 -8
- package/esm/src/resources/servers/activity.d.ts.map +1 -1
- package/esm/src/resources/servers/activity.js +54 -13
- package/esm/src/resources/servers/allocations.d.ts +3 -3
- package/esm/src/resources/servers/allocations.d.ts.map +1 -1
- package/esm/src/resources/servers/allocations.js +7 -7
- package/esm/src/resources/servers/backups.d.ts +46 -0
- package/esm/src/resources/servers/backups.d.ts.map +1 -0
- package/esm/src/resources/servers/backups.js +43 -0
- package/esm/src/resources/servers/connection.d.ts +33 -13
- package/esm/src/resources/servers/connection.d.ts.map +1 -1
- package/esm/src/resources/servers/connection.js +32 -11
- package/esm/src/resources/servers/features.d.ts +81 -0
- package/esm/src/resources/servers/features.d.ts.map +1 -0
- package/esm/src/resources/servers/features.js +60 -0
- package/esm/src/resources/servers/files.d.ts +41 -53
- package/esm/src/resources/servers/files.d.ts.map +1 -1
- package/esm/src/resources/servers/files.js +74 -116
- package/esm/src/resources/servers/index.d.ts +46 -27
- package/esm/src/resources/servers/index.d.ts.map +1 -1
- package/esm/src/resources/servers/index.js +26 -12
- package/esm/src/resources/servers/jobs.d.ts +88 -0
- package/esm/src/resources/servers/jobs.d.ts.map +1 -0
- package/esm/src/resources/servers/jobs.js +115 -0
- package/esm/src/resources/servers/node-client.d.ts +33 -0
- package/esm/src/resources/servers/node-client.d.ts.map +1 -0
- package/esm/src/resources/servers/node-client.js +61 -0
- package/esm/src/resources/servers/profiles.d.ts +83 -18
- package/esm/src/resources/servers/profiles.d.ts.map +1 -1
- package/esm/src/resources/servers/profiles.js +78 -11
- package/esm/src/resources/servers/server.d.ts +13 -28
- package/esm/src/resources/servers/server.d.ts.map +1 -1
- package/esm/src/resources/servers/server.js +21 -37
- package/esm/src/resources/servers/sftp.d.ts +12 -19
- package/esm/src/resources/servers/sftp.d.ts.map +1 -1
- package/esm/src/resources/servers/sftp.js +10 -14
- package/esm/src/resources/servers/sub-users.d.ts +99 -0
- package/esm/src/resources/servers/sub-users.d.ts.map +1 -0
- package/esm/src/resources/servers/sub-users.js +94 -0
- package/esm/src/resources/servers/types.d.ts +30 -28
- package/esm/src/resources/servers/types.d.ts.map +1 -1
- package/esm/src/resources/systems.d.ts +124 -0
- package/esm/src/resources/systems.d.ts.map +1 -0
- package/esm/src/resources/systems.js +139 -0
- package/esm/src/resources/users.d.ts +330 -0
- package/esm/src/resources/users.d.ts.map +1 -0
- package/esm/src/resources/users.js +280 -0
- package/esm/src/types.d.ts +18 -1
- package/esm/src/types.d.ts.map +1 -1
- package/esm/src/types.js +11 -0
- package/package.json +1 -1
- package/script/mod.d.ts +37 -16
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +50 -5
- package/script/src/client.d.ts +48 -11
- package/script/src/client.d.ts.map +1 -1
- package/script/src/client.js +53 -12
- package/script/src/http.d.ts +2 -2
- package/script/src/http.d.ts.map +1 -1
- package/script/src/http.js +5 -2
- package/script/src/namespace.d.ts +1 -1
- package/script/src/namespace.js +1 -1
- package/script/src/resources/account.d.ts +50 -19
- package/script/src/resources/account.d.ts.map +1 -1
- package/script/src/resources/account.js +50 -12
- package/script/src/resources/api-keys.d.ts +16 -24
- package/script/src/resources/api-keys.d.ts.map +1 -1
- package/script/src/resources/api-keys.js +15 -19
- package/script/src/resources/auth.d.ts +70 -4
- package/script/src/resources/auth.d.ts.map +1 -1
- package/script/src/resources/auth.js +47 -4
- package/script/src/resources/eggs.d.ts +261 -22
- package/script/src/resources/eggs.d.ts.map +1 -1
- package/script/src/resources/eggs.js +267 -26
- package/script/src/resources/features.d.ts +35 -0
- package/script/src/resources/features.d.ts.map +1 -0
- package/script/src/resources/features.js +25 -0
- package/script/src/resources/hosts.d.ts +151 -21
- package/script/src/resources/hosts.d.ts.map +1 -1
- package/script/src/resources/hosts.js +144 -10
- package/script/src/resources/logs.d.ts +39 -0
- package/script/src/resources/logs.d.ts.map +1 -0
- package/script/src/resources/logs.js +42 -0
- package/script/src/resources/nodes.d.ts +108 -33
- package/script/src/resources/nodes.d.ts.map +1 -1
- package/script/src/resources/nodes.js +117 -24
- package/script/src/resources/permissions.d.ts +45 -0
- package/script/src/resources/permissions.d.ts.map +1 -0
- package/script/src/resources/permissions.js +31 -0
- package/script/src/resources/request-logs.d.ts +91 -0
- package/script/src/resources/request-logs.d.ts.map +1 -0
- package/script/src/resources/request-logs.js +75 -0
- package/script/src/resources/roles.d.ts +128 -0
- package/script/src/resources/roles.d.ts.map +1 -0
- package/script/src/resources/roles.js +148 -0
- package/script/src/resources/server-groups.d.ts +141 -7
- package/script/src/resources/server-groups.d.ts.map +1 -1
- package/script/src/resources/server-groups.js +158 -8
- package/script/src/resources/servers/activity.d.ts +50 -8
- package/script/src/resources/servers/activity.d.ts.map +1 -1
- package/script/src/resources/servers/activity.js +54 -12
- package/script/src/resources/servers/allocations.d.ts +3 -3
- package/script/src/resources/servers/allocations.d.ts.map +1 -1
- package/script/src/resources/servers/allocations.js +7 -7
- package/script/src/resources/servers/backups.d.ts +46 -0
- package/script/src/resources/servers/backups.d.ts.map +1 -0
- package/script/src/resources/servers/backups.js +47 -0
- package/script/src/resources/servers/connection.d.ts +33 -13
- package/script/src/resources/servers/connection.d.ts.map +1 -1
- package/script/src/resources/servers/connection.js +32 -11
- package/script/src/resources/servers/features.d.ts +81 -0
- package/script/src/resources/servers/features.d.ts.map +1 -0
- package/script/src/resources/servers/features.js +64 -0
- package/script/src/resources/servers/files.d.ts +41 -53
- package/script/src/resources/servers/files.d.ts.map +1 -1
- package/script/src/resources/servers/files.js +74 -116
- package/script/src/resources/servers/index.d.ts +46 -27
- package/script/src/resources/servers/index.d.ts.map +1 -1
- package/script/src/resources/servers/index.js +26 -12
- package/script/src/resources/servers/jobs.d.ts +88 -0
- package/script/src/resources/servers/jobs.d.ts.map +1 -0
- package/script/src/resources/servers/jobs.js +120 -0
- package/script/src/resources/servers/node-client.d.ts +33 -0
- package/script/src/resources/servers/node-client.d.ts.map +1 -0
- package/script/src/resources/servers/node-client.js +65 -0
- package/script/src/resources/servers/profiles.d.ts +83 -18
- package/script/src/resources/servers/profiles.d.ts.map +1 -1
- package/script/src/resources/servers/profiles.js +77 -10
- package/script/src/resources/servers/server.d.ts +13 -28
- package/script/src/resources/servers/server.d.ts.map +1 -1
- package/script/src/resources/servers/server.js +21 -37
- package/script/src/resources/servers/sftp.d.ts +12 -19
- package/script/src/resources/servers/sftp.d.ts.map +1 -1
- package/script/src/resources/servers/sftp.js +10 -14
- package/script/src/resources/servers/sub-users.d.ts +99 -0
- package/script/src/resources/servers/sub-users.d.ts.map +1 -0
- package/script/src/resources/servers/sub-users.js +99 -0
- package/script/src/resources/servers/types.d.ts +30 -28
- package/script/src/resources/servers/types.d.ts.map +1 -1
- package/script/src/resources/systems.d.ts +124 -0
- package/script/src/resources/systems.d.ts.map +1 -0
- package/script/src/resources/systems.js +145 -0
- package/script/src/resources/users.d.ts +330 -0
- package/script/src/resources/users.d.ts.map +1 -0
- package/script/src/resources/users.js +287 -0
- package/script/src/types.d.ts +18 -1
- package/script/src/types.d.ts.map +1 -1
- package/script/src/types.js +12 -0
- package/esm/src/resources/members.d.ts +0 -138
- package/esm/src/resources/members.d.ts.map +0 -1
- package/esm/src/resources/members.js +0 -122
- package/script/src/resources/members.d.ts +0 -138
- package/script/src/resources/members.d.ts.map +0 -1
- package/script/src/resources/members.js +0 -127
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsersNamespace = exports.UserPermissionsManager = exports.UserRolesManager = exports.User = void 0;
|
|
4
|
+
const namespace_js_1 = require("../namespace.js");
|
|
5
|
+
const reactive_js_1 = require("../reactive.js");
|
|
6
|
+
const types_js_1 = require("../types.js");
|
|
7
|
+
const permissions_js_1 = require("./permissions.js");
|
|
8
|
+
/**
|
|
9
|
+
* A MeowPanel user account.
|
|
10
|
+
*
|
|
11
|
+
* Retrieved via {@link UsersNamespace.get} or {@link UsersNamespace.list}.
|
|
12
|
+
*/
|
|
13
|
+
class User extends reactive_js_1.ReactiveResource {
|
|
14
|
+
/** The user's unique NanoID. */
|
|
15
|
+
id;
|
|
16
|
+
/** The issuer type, `'user'` for user accounts. */
|
|
17
|
+
issuerType;
|
|
18
|
+
/** The user's login email address. */
|
|
19
|
+
email;
|
|
20
|
+
/** When the user verified their email, or `null` if unverified. */
|
|
21
|
+
emailVerifiedAt;
|
|
22
|
+
/** The user's display nickname. */
|
|
23
|
+
nickname;
|
|
24
|
+
/** URL of the user's avatar image, or `null` if no avatar is set. */
|
|
25
|
+
avatarUri;
|
|
26
|
+
/** When the user account was disabled, or `null` if active. */
|
|
27
|
+
disabledAt;
|
|
28
|
+
/** Display and locale preferences. Requires `?include=preferences`. */
|
|
29
|
+
preferences;
|
|
30
|
+
/** The user's assigned permission scopes. Requires `?include=permissions`. */
|
|
31
|
+
permissions;
|
|
32
|
+
/** The user's external identifiers. Requires `?include=identifiers`. */
|
|
33
|
+
identifiers;
|
|
34
|
+
/** When this user account was created. */
|
|
35
|
+
createdAt;
|
|
36
|
+
/** When this user account was last updated. */
|
|
37
|
+
updatedAt;
|
|
38
|
+
/** @internal */
|
|
39
|
+
constructor(data) {
|
|
40
|
+
super();
|
|
41
|
+
this.id = data.ref_id ? (0, types_js_1.toNanoID)(data.ref_id) : (0, types_js_1.parseIssuerRef)(data.id).id;
|
|
42
|
+
this.applyData(data);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Apply raw API data to this user instance, updating all mutable fields.
|
|
46
|
+
*
|
|
47
|
+
* Called by the constructor and by {@link UsersNamespace.update} to update the instance in-place.
|
|
48
|
+
*/
|
|
49
|
+
applyData(data) {
|
|
50
|
+
this.issuerType = data.type ?? 'user';
|
|
51
|
+
this.email = data.email;
|
|
52
|
+
this.emailVerifiedAt = data.email_verified_at ? new Date(data.email_verified_at) : null;
|
|
53
|
+
this.nickname = data.nickname;
|
|
54
|
+
this.avatarUri = data.avatar_uri;
|
|
55
|
+
this.disabledAt = data.disabled_at ? new Date(data.disabled_at) : null;
|
|
56
|
+
this.preferences = data.preferences ?? undefined;
|
|
57
|
+
this.permissions = data.permissions;
|
|
58
|
+
this.identifiers = data.identifiers ? parseIdentifiers(data.identifiers) : undefined;
|
|
59
|
+
this.createdAt = new Date(data.created_at);
|
|
60
|
+
this.updatedAt = new Date(data.updated_at);
|
|
61
|
+
this.notify();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.User = User;
|
|
65
|
+
function parseIdentifiers(data) {
|
|
66
|
+
return {
|
|
67
|
+
password: data.password
|
|
68
|
+
? {
|
|
69
|
+
createdAt: new Date(data.password.created_at),
|
|
70
|
+
lastUsedAt: data.password.last_used_at ? new Date(data.password.last_used_at) : null,
|
|
71
|
+
}
|
|
72
|
+
: null,
|
|
73
|
+
whmcs: data.whmcs
|
|
74
|
+
? {
|
|
75
|
+
whmcsId: data.whmcs.whmcs_id,
|
|
76
|
+
email: data.whmcs.email,
|
|
77
|
+
name: data.whmcs.name,
|
|
78
|
+
syncEmail: data.whmcs.sync_email,
|
|
79
|
+
syncNickname: data.whmcs.sync_nickname,
|
|
80
|
+
lastUsedAt: data.whmcs.last_used_at ? new Date(data.whmcs.last_used_at) : null,
|
|
81
|
+
createdAt: new Date(data.whmcs.created_at),
|
|
82
|
+
updatedAt: new Date(data.whmcs.updated_at),
|
|
83
|
+
}
|
|
84
|
+
: null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Manages a user's role assignments.
|
|
89
|
+
*
|
|
90
|
+
* Access via `api.users.roles(userId)`.
|
|
91
|
+
*/
|
|
92
|
+
class UserRolesManager {
|
|
93
|
+
userId;
|
|
94
|
+
http;
|
|
95
|
+
/** @internal */
|
|
96
|
+
constructor(userId, http) {
|
|
97
|
+
this.userId = userId;
|
|
98
|
+
this.http = http;
|
|
99
|
+
}
|
|
100
|
+
/** List the roles assigned to the user. */
|
|
101
|
+
async list() {
|
|
102
|
+
const data = await this.http.get(`/users/${this.userId}/roles`);
|
|
103
|
+
return data.map((d) => ({
|
|
104
|
+
id: (0, types_js_1.toNanoID)(d.id),
|
|
105
|
+
title: d.title,
|
|
106
|
+
description: d.description,
|
|
107
|
+
color: d.color,
|
|
108
|
+
order: d.order,
|
|
109
|
+
scope: d.scope,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
/** Assign one or more roles to the user. */
|
|
113
|
+
async assign(roles) {
|
|
114
|
+
const body = (Array.isArray(roles) ? roles : [roles]).map((r) => ({
|
|
115
|
+
role_id: r.roleId,
|
|
116
|
+
scope: r.scope,
|
|
117
|
+
order: r.order,
|
|
118
|
+
}));
|
|
119
|
+
await this.http.post(`/users/${this.userId}/roles`, body);
|
|
120
|
+
}
|
|
121
|
+
/** Remove a role from the user. */
|
|
122
|
+
async remove(roleId) {
|
|
123
|
+
await this.http.delete(`/users/${this.userId}/roles/${roleId}`);
|
|
124
|
+
}
|
|
125
|
+
/** Change a role assignment's sort order. */
|
|
126
|
+
async setOrder(roleId, order) {
|
|
127
|
+
await this.http.patch(`/users/${this.userId}/roles/${roleId}`, { order });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.UserRolesManager = UserRolesManager;
|
|
131
|
+
/**
|
|
132
|
+
* Manages a user's direct permission grants.
|
|
133
|
+
*
|
|
134
|
+
* Access via `api.users.permissions(userId)`.
|
|
135
|
+
*/
|
|
136
|
+
class UserPermissionsManager {
|
|
137
|
+
userId;
|
|
138
|
+
http;
|
|
139
|
+
/** @internal */
|
|
140
|
+
constructor(userId, http) {
|
|
141
|
+
this.userId = userId;
|
|
142
|
+
this.http = http;
|
|
143
|
+
}
|
|
144
|
+
/** List the user's direct permission grants. */
|
|
145
|
+
async list() {
|
|
146
|
+
const data = await this.http.get(`/users/${this.userId}/permissions`);
|
|
147
|
+
return data.map(permissions_js_1.parseGrant);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Grant one or more permissions to the user.
|
|
151
|
+
*
|
|
152
|
+
* You cannot grant a permission you do not hold yourself at the target scope.
|
|
153
|
+
*/
|
|
154
|
+
async grant(grants) {
|
|
155
|
+
await this.http.post(`/users/${this.userId}/permissions`, (0, permissions_js_1.grantsToBody)(grants));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Revoke a permission from the user.
|
|
159
|
+
*
|
|
160
|
+
* @param permission The permission name to revoke.
|
|
161
|
+
* @param scope The namespaced scope (`"<type>:<id>"`) to revoke at, or omit for the global grant.
|
|
162
|
+
*/
|
|
163
|
+
async revoke(permission, scope) {
|
|
164
|
+
const params = scope ? { scope } : undefined;
|
|
165
|
+
await this.http.delete(`/users/${this.userId}/permissions/${encodeURIComponent(permission)}`, { params });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.UserPermissionsManager = UserPermissionsManager;
|
|
169
|
+
/**
|
|
170
|
+
* Namespace for user management.
|
|
171
|
+
*
|
|
172
|
+
* Access via `api.users`.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```ts ignore
|
|
176
|
+
* const users = await api.users.list();
|
|
177
|
+
* const user = await api.users.get(id);
|
|
178
|
+
* await api.users.update(id, { nickname: 'newname' });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
class UsersNamespace extends namespace_js_1.ResourceNamespace {
|
|
182
|
+
/** @internal */
|
|
183
|
+
constructor(http) {
|
|
184
|
+
super(http);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Fetch a paginated list of all users.
|
|
188
|
+
*
|
|
189
|
+
* @param opts Pagination, search, and include options.
|
|
190
|
+
*/
|
|
191
|
+
async list(opts = {}) {
|
|
192
|
+
const extra = {};
|
|
193
|
+
const include = (0, types_js_1.joinIncludes)(opts);
|
|
194
|
+
if (include)
|
|
195
|
+
extra['include'] = include;
|
|
196
|
+
const result = await this.http.list('/users', opts, extra);
|
|
197
|
+
const users = result.data.map((d) => new User(d));
|
|
198
|
+
this.setCache(users);
|
|
199
|
+
return { ...result, data: users };
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Fetch a single user by ID.
|
|
203
|
+
*
|
|
204
|
+
* @param id The user's NanoID.
|
|
205
|
+
* @param opts Include options.
|
|
206
|
+
*/
|
|
207
|
+
async get(id, opts = {}) {
|
|
208
|
+
const params = {};
|
|
209
|
+
const include = (0, types_js_1.joinIncludes)(opts);
|
|
210
|
+
if (include)
|
|
211
|
+
params['include'] = include;
|
|
212
|
+
const data = await this.http.get(`/users/${id}`, { params });
|
|
213
|
+
return new User(data);
|
|
214
|
+
}
|
|
215
|
+
/** Create a user. */
|
|
216
|
+
async create(payload) {
|
|
217
|
+
const body = {
|
|
218
|
+
email: payload.email,
|
|
219
|
+
nickname: payload.nickname,
|
|
220
|
+
email_verified: payload.emailVerified,
|
|
221
|
+
identifiers: payload.whmcs ? { whmcs: { id: payload.whmcs.id, name: payload.whmcs.name } } : undefined,
|
|
222
|
+
};
|
|
223
|
+
const data = await this.http.post('/users', body);
|
|
224
|
+
const user = new User(data);
|
|
225
|
+
this.addToCache(user);
|
|
226
|
+
this.emit('created', user);
|
|
227
|
+
return user;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Update a user's profile fields.
|
|
231
|
+
*
|
|
232
|
+
* @param id The user's NanoID.
|
|
233
|
+
* @param payload The fields to update.
|
|
234
|
+
*/
|
|
235
|
+
async update(id, payload) {
|
|
236
|
+
const data = await this.http.patch(`/users/${id}`, payload);
|
|
237
|
+
const existing = this.cache.find((u) => u.id === id);
|
|
238
|
+
if (existing) {
|
|
239
|
+
existing.applyData(data);
|
|
240
|
+
this.upsertCache(existing);
|
|
241
|
+
this.emit('updated', existing);
|
|
242
|
+
return existing;
|
|
243
|
+
}
|
|
244
|
+
const user = new User(data);
|
|
245
|
+
this.upsertCache(user);
|
|
246
|
+
this.emit('updated', user);
|
|
247
|
+
return user;
|
|
248
|
+
}
|
|
249
|
+
/** Disable a user, blocking them from authenticating. */
|
|
250
|
+
async disable(id) {
|
|
251
|
+
await this.http.post(`/users/${id}/disable`);
|
|
252
|
+
}
|
|
253
|
+
/** Re-enable a disabled user. */
|
|
254
|
+
async enable(id) {
|
|
255
|
+
await this.http.post(`/users/${id}/enable`);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Propagate WHMCS-sourced changes to the linked user.
|
|
259
|
+
*
|
|
260
|
+
* @param whmcsId The linked WHMCS client UUID.
|
|
261
|
+
* @param payload The WHMCS-side email and/or name.
|
|
262
|
+
*/
|
|
263
|
+
async syncWhmcs(whmcsId, payload) {
|
|
264
|
+
const data = await this.http.patch(`/users/whmcs/${encodeURIComponent(whmcsId)}`, payload);
|
|
265
|
+
return { user: new User(data.user), skipped: data.skipped };
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Unlink a WHMCS-linked user.
|
|
269
|
+
*
|
|
270
|
+
* @param whmcsId The linked WHMCS client UUID.
|
|
271
|
+
* @param opts `unlink: true` only removes the link; otherwise the user is also disabled.
|
|
272
|
+
*/
|
|
273
|
+
async unlinkWhmcs(whmcsId, opts = {}) {
|
|
274
|
+
const params = opts.unlink ? { unlink: 'true' } : undefined;
|
|
275
|
+
const data = await this.http.delete(`/users/whmcs/${encodeURIComponent(whmcsId)}`, { params });
|
|
276
|
+
return new User(data);
|
|
277
|
+
}
|
|
278
|
+
/** Manage a user's role assignments. */
|
|
279
|
+
roles(userId) {
|
|
280
|
+
return new UserRolesManager(userId, this.http);
|
|
281
|
+
}
|
|
282
|
+
/** Manage a user's direct permission grants. */
|
|
283
|
+
permissions(userId) {
|
|
284
|
+
return new UserPermissionsManager(userId, this.http);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
exports.UsersNamespace = UsersNamespace;
|
package/script/src/types.d.ts
CHANGED
|
@@ -22,6 +22,23 @@ export type NanoID = string & {
|
|
|
22
22
|
export declare function toNanoID(raw: string): NanoID;
|
|
23
23
|
/** ISO 8601 date-time string as returned by the MeowPanel API, e.g. `"2024-01-15T12:00:00.000Z"`. */
|
|
24
24
|
export type ISODate = string;
|
|
25
|
+
/** A UI color label used for visual grouping (hosts, roles). */
|
|
26
|
+
export type ResourceColor = 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'purple' | 'pink' | 'brown' | 'black' | 'white';
|
|
27
|
+
/** A namespaced issuer reference, e.g. `"user:abc123def456"`. */
|
|
28
|
+
export type IssuerRef = string;
|
|
29
|
+
/** The parsed parts of an {@link IssuerRef}. */
|
|
30
|
+
export interface ParsedIssuer {
|
|
31
|
+
/** The issuer type token, e.g. `"user"`, `"system"`, `"api_key"`, `"node"`. */
|
|
32
|
+
type: string;
|
|
33
|
+
/** The bare resource NanoID. */
|
|
34
|
+
id: NanoID;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Split a namespaced issuer reference (`"<type>:<id>"`) into its type and bare id.
|
|
38
|
+
*
|
|
39
|
+
* A bare id with no prefix yields an empty `type`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseIssuerRef(ref: string): ParsedIssuer;
|
|
25
42
|
/** Options for paginated list requests. */
|
|
26
43
|
export interface ListOptions {
|
|
27
44
|
/** Page number (1-based). Defaults to 1. */
|
|
@@ -122,5 +139,5 @@ export type ServerRestrictedState = 'installing' | 'install_failed' | 'restoring
|
|
|
122
139
|
/**
|
|
123
140
|
* An SFTP permission scope that can be assigned to a path pattern for an SFTP user.
|
|
124
141
|
*/
|
|
125
|
-
export type SftpPermission = '
|
|
142
|
+
export type SftpPermission = 'server.file.list' | 'server.file.read' | 'server.file.create' | 'server.file.manage' | 'server.file.delete';
|
|
126
143
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAEnE;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,qGAAqG;AACrG,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC3B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IAC3B,qCAAqC;IACrC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAC/G,KAAK,CAAC;AAET;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,CACvB,CAAC,EACD,UAAU,EACV,CAAC,SAAS,SAAS,CAAC,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,IAE1C,CAAC,GACD,mBAAmB,CACpB,CAAC,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CACtF,CAAC;AAEH;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,CAAC,SAAS,SAAS,OAAO,EAAE,GAAG,EAAE;IACxF;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAG7G;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAC9B,YAAY,GACZ,gBAAgB,GAChB,kBAAkB,GAClB,aAAa,GACb,cAAc,GACd,YAAY,GACZ,SAAS,GACT,SAAS,GACT,IAAI,CAAC;AAER;;GAEG;AACH,MAAM,MAAM,cAAc,GACvB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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"}
|
package/script/src/types.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.toNanoID = toNanoID;
|
|
4
|
+
exports.parseIssuerRef = parseIssuerRef;
|
|
4
5
|
exports.joinIncludes = joinIncludes;
|
|
5
6
|
/**
|
|
6
7
|
* Cast a raw string from the API to a {@link NanoID}.
|
|
@@ -13,6 +14,17 @@ exports.joinIncludes = joinIncludes;
|
|
|
13
14
|
function toNanoID(raw) {
|
|
14
15
|
return raw;
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Split a namespaced issuer reference (`"<type>:<id>"`) into its type and bare id.
|
|
19
|
+
*
|
|
20
|
+
* A bare id with no prefix yields an empty `type`.
|
|
21
|
+
*/
|
|
22
|
+
function parseIssuerRef(ref) {
|
|
23
|
+
const sep = ref.indexOf(':');
|
|
24
|
+
if (sep === -1)
|
|
25
|
+
return { type: '', id: toNanoID(ref) };
|
|
26
|
+
return { type: ref.slice(0, sep), id: toNanoID(ref.slice(sep + 1)) };
|
|
27
|
+
}
|
|
16
28
|
/**
|
|
17
29
|
* Joins the `include` and `rawInclude` arrays into a single comma-separated string
|
|
18
30
|
* suitable for the `?include=` query parameter.
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import type { HttpClient } from '../http.js';
|
|
2
|
-
import { ResourceNamespace } from '../namespace.js';
|
|
3
|
-
import { ReactiveResource } from '../reactive.js';
|
|
4
|
-
import type { IncludeOptions, ResourceWith } from '../types.js';
|
|
5
|
-
import { type ISODate, type NanoID, type Paginated } from '../types.js';
|
|
6
|
-
/** Raw API response shape for a member (user). @internal */
|
|
7
|
-
export interface MemberData {
|
|
8
|
-
id: string;
|
|
9
|
-
issuer_type: 'user';
|
|
10
|
-
email: string;
|
|
11
|
-
nickname: string | null;
|
|
12
|
-
avatar_uri: string | null;
|
|
13
|
-
display?: {
|
|
14
|
-
language: string | null;
|
|
15
|
-
theme: string | null;
|
|
16
|
-
} | null;
|
|
17
|
-
permissions?: string[];
|
|
18
|
-
created_at: ISODate;
|
|
19
|
-
updated_at: ISODate;
|
|
20
|
-
}
|
|
21
|
-
/** Display preferences for a member. */
|
|
22
|
-
export interface MemberDisplay {
|
|
23
|
-
/** The member's preferred UI language code. */
|
|
24
|
-
language: string | null;
|
|
25
|
-
/** The member's preferred UI theme identifier. */
|
|
26
|
-
theme: string | null;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* A MeowPanel user account (member).
|
|
30
|
-
*
|
|
31
|
-
* Retrieved via {@link MembersNamespace.get} or {@link MembersNamespace.list}.
|
|
32
|
-
*/
|
|
33
|
-
export declare class Member extends ReactiveResource {
|
|
34
|
-
/** The member's unique NanoID. */
|
|
35
|
-
readonly id: NanoID;
|
|
36
|
-
/** Always `'user'` for member accounts. */
|
|
37
|
-
issuerType: 'user';
|
|
38
|
-
/** The member's login email address. */
|
|
39
|
-
email: string;
|
|
40
|
-
/** The member's display nickname. */
|
|
41
|
-
nickname: string | null;
|
|
42
|
-
/** URL of the member's avatar image, or `null` if no avatar is set. */
|
|
43
|
-
avatarUri: string | null;
|
|
44
|
-
/** Display preferences (language and theme). */
|
|
45
|
-
display: MemberDisplay | null | undefined;
|
|
46
|
-
/** The member's assigned permission scopes. */
|
|
47
|
-
permissions: string[] | undefined;
|
|
48
|
-
/** When this member account was created. */
|
|
49
|
-
createdAt: Date;
|
|
50
|
-
/** When this member account was last updated. */
|
|
51
|
-
updatedAt: Date;
|
|
52
|
-
/** @internal */
|
|
53
|
-
constructor(data: MemberData);
|
|
54
|
-
/**
|
|
55
|
-
* Apply raw API data to this member instance, updating all mutable fields.
|
|
56
|
-
*
|
|
57
|
-
* Called by the constructor and by {@link MembersNamespace.update} to update the instance in-place.
|
|
58
|
-
*/
|
|
59
|
-
applyData(data: MemberData): void;
|
|
60
|
-
}
|
|
61
|
-
/** Fields that can be updated on a member. All fields are optional. */
|
|
62
|
-
export interface UpdateMemberPayload {
|
|
63
|
-
/** New email address for the member. */
|
|
64
|
-
email?: string;
|
|
65
|
-
/** New display nickname. */
|
|
66
|
-
nickname?: string;
|
|
67
|
-
/** Display preference updates. */
|
|
68
|
-
display?: {
|
|
69
|
-
/** UI language code, or `null` to clear. */
|
|
70
|
-
language?: string | null;
|
|
71
|
-
/** UI theme identifier, or `null` to clear. */
|
|
72
|
-
theme?: string | null;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/** Valid include keys for member endpoints. */
|
|
76
|
-
export type MemberInclude = 'display' | 'permissions';
|
|
77
|
-
/** Maps each {@link MemberInclude} key to the field(s) it guarantees on the {@link Member} instance. */
|
|
78
|
-
interface MemberIncludeMap {
|
|
79
|
-
display: {
|
|
80
|
-
display: MemberDisplay | null;
|
|
81
|
-
};
|
|
82
|
-
permissions: {
|
|
83
|
-
permissions: string[];
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
/** A {@link Member} with specific include fields guaranteed to be populated. */
|
|
87
|
-
export type MemberWith<I extends readonly MemberInclude[] = []> = ResourceWith<Member, MemberIncludeMap, I>;
|
|
88
|
-
/** Typed events emitted by {@link MembersNamespace}. */
|
|
89
|
-
export interface MemberEvents {
|
|
90
|
-
/** Fired after a member is successfully updated. */
|
|
91
|
-
updated: Member;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Namespace for member (user) management.
|
|
95
|
-
*
|
|
96
|
-
* Access via `api.members`.
|
|
97
|
-
*
|
|
98
|
-
* @example
|
|
99
|
-
* ```ts ignore
|
|
100
|
-
* // Reactive store
|
|
101
|
-
* // {#each $api.members as member} ... {/each}
|
|
102
|
-
*
|
|
103
|
-
* // Imperative
|
|
104
|
-
* const members = await api.members.list();
|
|
105
|
-
* const member = await api.members.get(id);
|
|
106
|
-
* await api.members.update(id, { nickname: 'newname' });
|
|
107
|
-
* ```
|
|
108
|
-
*/
|
|
109
|
-
export declare class MembersNamespace extends ResourceNamespace<Member, MemberEvents> {
|
|
110
|
-
/** @internal */
|
|
111
|
-
constructor(http: HttpClient);
|
|
112
|
-
/**
|
|
113
|
-
* Fetch a paginated list of all members.
|
|
114
|
-
*
|
|
115
|
-
* @param opts Pagination, search, and include options.
|
|
116
|
-
*/
|
|
117
|
-
list<const I extends readonly MemberInclude[] = []>(opts?: {
|
|
118
|
-
page?: number;
|
|
119
|
-
perPage?: number;
|
|
120
|
-
search?: string;
|
|
121
|
-
} & IncludeOptions<MemberInclude, I>): Promise<Paginated<MemberWith<I>>>;
|
|
122
|
-
/**
|
|
123
|
-
* Fetch a single member by ID.
|
|
124
|
-
*
|
|
125
|
-
* @param id The member's NanoID.
|
|
126
|
-
* @param opts Include options.
|
|
127
|
-
*/
|
|
128
|
-
get<const I extends readonly MemberInclude[] = []>(id: NanoID, opts?: IncludeOptions<MemberInclude, I>): Promise<MemberWith<I>>;
|
|
129
|
-
/**
|
|
130
|
-
* Update a member's profile fields.
|
|
131
|
-
*
|
|
132
|
-
* @param id The member's NanoID.
|
|
133
|
-
* @param payload The fields to update.
|
|
134
|
-
*/
|
|
135
|
-
update(id: NanoID, payload: UpdateMemberPayload): Promise<Member>;
|
|
136
|
-
}
|
|
137
|
-
export {};
|
|
138
|
-
//# sourceMappingURL=members.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/src/resources/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { ResourceNamespace } from '../namespace.js';
|
|
2
|
-
import { ReactiveResource } from '../reactive.js';
|
|
3
|
-
import { joinIncludes, toNanoID } from '../types.js';
|
|
4
|
-
/**
|
|
5
|
-
* A MeowPanel user account (member).
|
|
6
|
-
*
|
|
7
|
-
* Retrieved via {@link MembersNamespace.get} or {@link MembersNamespace.list}.
|
|
8
|
-
*/
|
|
9
|
-
export class Member extends ReactiveResource {
|
|
10
|
-
/** The member's unique NanoID. */
|
|
11
|
-
id;
|
|
12
|
-
/** Always `'user'` for member accounts. */
|
|
13
|
-
issuerType;
|
|
14
|
-
/** The member's login email address. */
|
|
15
|
-
email;
|
|
16
|
-
/** The member's display nickname. */
|
|
17
|
-
nickname;
|
|
18
|
-
/** URL of the member's avatar image, or `null` if no avatar is set. */
|
|
19
|
-
avatarUri;
|
|
20
|
-
/** Display preferences (language and theme). */
|
|
21
|
-
display;
|
|
22
|
-
/** The member's assigned permission scopes. */
|
|
23
|
-
permissions;
|
|
24
|
-
/** When this member account was created. */
|
|
25
|
-
createdAt;
|
|
26
|
-
/** When this member account was last updated. */
|
|
27
|
-
updatedAt;
|
|
28
|
-
/** @internal */
|
|
29
|
-
constructor(data) {
|
|
30
|
-
super();
|
|
31
|
-
this.id = toNanoID(data.id);
|
|
32
|
-
this.issuerType = data.issuer_type;
|
|
33
|
-
this.applyData(data);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Apply raw API data to this member instance, updating all mutable fields.
|
|
37
|
-
*
|
|
38
|
-
* Called by the constructor and by {@link MembersNamespace.update} to update the instance in-place.
|
|
39
|
-
*/
|
|
40
|
-
applyData(data) {
|
|
41
|
-
this.issuerType = data.issuer_type;
|
|
42
|
-
this.email = data.email;
|
|
43
|
-
this.nickname = data.nickname;
|
|
44
|
-
this.avatarUri = data.avatar_uri;
|
|
45
|
-
this.display = data.display ?? undefined;
|
|
46
|
-
this.permissions = data.permissions;
|
|
47
|
-
this.createdAt = new Date(data.created_at);
|
|
48
|
-
this.updatedAt = new Date(data.updated_at);
|
|
49
|
-
this.notify();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Namespace for member (user) management.
|
|
54
|
-
*
|
|
55
|
-
* Access via `api.members`.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```ts ignore
|
|
59
|
-
* // Reactive store
|
|
60
|
-
* // {#each $api.members as member} ... {/each}
|
|
61
|
-
*
|
|
62
|
-
* // Imperative
|
|
63
|
-
* const members = await api.members.list();
|
|
64
|
-
* const member = await api.members.get(id);
|
|
65
|
-
* await api.members.update(id, { nickname: 'newname' });
|
|
66
|
-
* ```
|
|
67
|
-
*/
|
|
68
|
-
export class MembersNamespace extends ResourceNamespace {
|
|
69
|
-
/** @internal */
|
|
70
|
-
constructor(http) {
|
|
71
|
-
super(http);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Fetch a paginated list of all members.
|
|
75
|
-
*
|
|
76
|
-
* @param opts Pagination, search, and include options.
|
|
77
|
-
*/
|
|
78
|
-
async list(opts = {}) {
|
|
79
|
-
const extra = {};
|
|
80
|
-
const include = joinIncludes(opts);
|
|
81
|
-
if (include)
|
|
82
|
-
extra['include'] = include;
|
|
83
|
-
const result = await this.http.list('/members', opts, extra);
|
|
84
|
-
const members = result.data.map((d) => new Member(d));
|
|
85
|
-
this.setCache(members);
|
|
86
|
-
return { ...result, data: members };
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Fetch a single member by ID.
|
|
90
|
-
*
|
|
91
|
-
* @param id The member's NanoID.
|
|
92
|
-
* @param opts Include options.
|
|
93
|
-
*/
|
|
94
|
-
async get(id, opts = {}) {
|
|
95
|
-
const params = {};
|
|
96
|
-
const include = joinIncludes(opts);
|
|
97
|
-
if (include)
|
|
98
|
-
params['include'] = include;
|
|
99
|
-
const data = await this.http.get(`/members/${id}`, { params });
|
|
100
|
-
return new Member(data);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Update a member's profile fields.
|
|
104
|
-
*
|
|
105
|
-
* @param id The member's NanoID.
|
|
106
|
-
* @param payload The fields to update.
|
|
107
|
-
*/
|
|
108
|
-
async update(id, payload) {
|
|
109
|
-
const data = await this.http.patch(`/members/${id}`, payload);
|
|
110
|
-
const existing = this.cache.find((m) => m.id === id);
|
|
111
|
-
if (existing) {
|
|
112
|
-
existing.applyData(data);
|
|
113
|
-
this.upsertCache(existing);
|
|
114
|
-
this.emit('updated', existing);
|
|
115
|
-
return existing;
|
|
116
|
-
}
|
|
117
|
-
const member = new Member(data);
|
|
118
|
-
this.upsertCache(member);
|
|
119
|
-
this.emit('updated', member);
|
|
120
|
-
return member;
|
|
121
|
-
}
|
|
122
|
-
}
|