@cloudbase/manager-node 4.11.0-alpha.1 → 4.11.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/jest.config.js +1 -0
  3. package/lib/agent/index.js +607 -16
  4. package/lib/agent/type.js +1 -0
  5. package/lib/cloudApp/index.js +243 -0
  6. package/lib/cloudApp/types.js +10 -0
  7. package/lib/database/index.js +79 -0
  8. package/lib/docs/index.js +288 -0
  9. package/lib/docs/types.js +2 -0
  10. package/lib/env/index.js +92 -0
  11. package/lib/environment.js +20 -0
  12. package/lib/function/index.js +97 -33
  13. package/lib/index.js +34 -0
  14. package/lib/interfaces/cloudApp.interface.js +20 -0
  15. package/lib/interfaces/index.js +1 -0
  16. package/lib/log/index.js +105 -0
  17. package/lib/log/types.js +24 -0
  18. package/lib/mysql/index.js +551 -0
  19. package/lib/mysql/types/account.js +2 -0
  20. package/lib/mysql/types/backup.js +2 -0
  21. package/lib/mysql/types/base.js +2 -0
  22. package/lib/mysql/types/index.js +19 -0
  23. package/lib/permission/index.js +310 -0
  24. package/lib/permission/types.js +2 -0
  25. package/lib/storage/index.js +424 -10
  26. package/lib/user/index.js +200 -0
  27. package/package.json +1 -1
  28. package/types/agent/index.d.ts +115 -5
  29. package/types/agent/type.d.ts +389 -0
  30. package/types/cloudApp/index.d.ts +73 -0
  31. package/types/cloudApp/types.d.ts +325 -0
  32. package/types/database/index.d.ts +112 -0
  33. package/types/docs/index.d.ts +37 -0
  34. package/types/docs/types.d.ts +24 -0
  35. package/types/env/index.d.ts +39 -1
  36. package/types/env/type.d.ts +187 -0
  37. package/types/environment.d.ts +12 -0
  38. package/types/function/index.d.ts +34 -5
  39. package/types/index.d.ts +26 -0
  40. package/types/interfaces/cloudApp.interface.d.ts +4 -0
  41. package/types/interfaces/index.d.ts +1 -0
  42. package/types/log/index.d.ts +53 -0
  43. package/types/log/types.d.ts +177 -0
  44. package/types/mysql/index.d.ts +261 -0
  45. package/types/mysql/types/account.d.ts +160 -0
  46. package/types/mysql/types/backup.d.ts +161 -0
  47. package/types/mysql/types/base.d.ts +579 -0
  48. package/types/mysql/types/index.d.ts +3 -0
  49. package/types/permission/index.d.ts +31 -0
  50. package/types/permission/types.d.ts +127 -0
  51. package/types/storage/index.d.ts +151 -3
  52. package/types/user/index.d.ts +17 -1
  53. package/types/user/types.d.ts +62 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PermissionService = void 0;
10
+ const utils_1 = require("../utils");
11
+ const PERMISSION_BY_RESOURCE = {
12
+ function: ['CUSTOM'],
13
+ storage: ['READONLY', 'PRIVATE', 'ADMINWRITE', 'ADMINONLY', 'CUSTOM'],
14
+ table: ['READONLY', 'PRIVATE', 'ADMINWRITE', 'ADMINONLY'],
15
+ collection: ['READONLY', 'PRIVATE', 'ADMINWRITE', 'ADMINONLY', 'CUSTOM']
16
+ };
17
+ class PermissionService {
18
+ constructor(environment) {
19
+ this.environment = environment;
20
+ this.tcbService = new utils_1.CloudService(environment.cloudBaseContext, 'tcb', '2018-06-08');
21
+ }
22
+ async modifyResourcePermission(options) {
23
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
24
+ const { resourceType, resource, permission, securityRule } = options;
25
+ if (!resourceType || !PERMISSION_BY_RESOURCE[resourceType]) {
26
+ throw new Error('Invalid resourceType');
27
+ }
28
+ const isFunctionResourceType = resourceType === 'function';
29
+ const hasValidResourceValue = typeof resource === 'string' && resource.trim().length > 0;
30
+ if (!isFunctionResourceType && !hasValidResourceValue) {
31
+ throw new Error('Invalid resource');
32
+ }
33
+ const allowed = PERMISSION_BY_RESOURCE[resourceType];
34
+ if (!allowed.includes(permission)) {
35
+ throw new Error(`Permission ${permission} is not allowed for resourceType ${resourceType}`);
36
+ }
37
+ if (permission === 'CUSTOM') {
38
+ if (typeof securityRule !== 'string' || securityRule.trim().length === 0) {
39
+ throw new Error('securityRule is required when permission is CUSTOM');
40
+ }
41
+ // // 校验 JSON 字符串合法性
42
+ // try {
43
+ // JSON.parse(securityRule)
44
+ // } catch {
45
+ // throw new Error('securityRule must be a valid JSON string')
46
+ // }
47
+ }
48
+ const reqData = Object.assign({ EnvId, ResourceType: resourceType, Permission: permission }, (hasValidResourceValue || !isFunctionResourceType ? { Resource: resource } : {}));
49
+ if (permission === 'CUSTOM') {
50
+ reqData.SecurityRule = securityRule;
51
+ }
52
+ return this.tcbService.request('ModifyResourcePermission', reqData);
53
+ }
54
+ async describeResourcePermission(options) {
55
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
56
+ const { resourceType, resources } = options;
57
+ if (!resourceType || !PERMISSION_BY_RESOURCE[resourceType]) {
58
+ throw new Error('Invalid resourceType');
59
+ }
60
+ if (resources !== undefined) {
61
+ if (!Array.isArray(resources)) {
62
+ throw new Error('Invalid resources');
63
+ }
64
+ if (resources.length > 100) {
65
+ throw new Error('resources length must be <= 100');
66
+ }
67
+ const invalid = resources.find(item => typeof item !== 'string' || item.trim().length === 0);
68
+ if (invalid !== undefined) {
69
+ throw new Error('resources contains invalid item');
70
+ }
71
+ }
72
+ return this.tcbService.request('DescribeResourcePermission', Object.assign({ EnvId, ResourceType: resourceType }, (resources !== undefined ? { Resources: resources } : {})));
73
+ }
74
+ async createRole(options) {
75
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
76
+ const { roleName, roleIdentity, description, memberUids, policies } = options;
77
+ // RoleName 校验:非空,2-32字符,中文/字母/数字/_-:@.,必须以字母或中文开头
78
+ if (typeof roleName !== 'string' || roleName.trim().length === 0) {
79
+ throw new Error('roleName is required');
80
+ }
81
+ if (roleName.length < 2 || roleName.length > 32) {
82
+ throw new Error('roleName length must be between 2 and 32');
83
+ }
84
+ if (!/^[\u4e00-\u9fa5a-zA-Z]/.test(roleName)) {
85
+ throw new Error('roleName must start with a letter or Chinese character');
86
+ }
87
+ if (!/^[\u4e00-\u9fa5a-zA-Z0-9\-_:@.]+$/.test(roleName)) {
88
+ throw new Error('roleName can only contain Chinese, letters, digits, and -_:@.');
89
+ }
90
+ // RoleIdentity 校验:非空,字母/数字/_-:@.,不能与默认角色标识重复
91
+ if (typeof roleIdentity !== 'string' || roleIdentity.trim().length === 0) {
92
+ throw new Error('roleIdentity is required');
93
+ }
94
+ if (!/^[a-zA-Z0-9\-_:@.]+$/.test(roleIdentity)) {
95
+ throw new Error('roleIdentity can only contain letters, digits, and -_:@.');
96
+ }
97
+ // Description 校验
98
+ if (description !== undefined && description.length > 255) {
99
+ throw new Error('description length must be <= 255');
100
+ }
101
+ // MemberUids 校验
102
+ if (memberUids !== undefined) {
103
+ if (!Array.isArray(memberUids)) {
104
+ throw new Error('memberUids must be an array');
105
+ }
106
+ if (memberUids.length > 100) {
107
+ throw new Error('memberUids length must be <= 100');
108
+ }
109
+ const invalidUid = memberUids.find(uid => typeof uid !== 'string' || uid.trim().length === 0);
110
+ if (invalidUid !== undefined) {
111
+ throw new Error('memberUids contains invalid item');
112
+ }
113
+ }
114
+ // Policies 校验
115
+ if (policies !== undefined) {
116
+ if (!Array.isArray(policies)) {
117
+ throw new Error('policies must be an array');
118
+ }
119
+ if (policies.length > 50) {
120
+ throw new Error('policies length must be <= 50');
121
+ }
122
+ const invalidPolicy = policies.find(policy => !policy.ResourceType || !policy.Resource);
123
+ if (invalidPolicy !== undefined) {
124
+ throw new Error('each policy must have ResourceType and Resource');
125
+ }
126
+ }
127
+ const reqData = {
128
+ EnvId,
129
+ RoleName: roleName,
130
+ RoleIdentity: roleIdentity
131
+ };
132
+ if (description !== undefined) {
133
+ reqData.Description = description;
134
+ }
135
+ if (memberUids !== undefined && memberUids.length > 0) {
136
+ reqData.MemberUids = memberUids;
137
+ }
138
+ if (policies !== undefined && policies.length > 0) {
139
+ reqData.Policies = policies;
140
+ }
141
+ return this.tcbService.request('CreateRole', reqData);
142
+ }
143
+ async describeRoleList(options = {}) {
144
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
145
+ const { pageNumber, pageSize, roleId, roleIdentity, roleName, loadDetails } = options;
146
+ // PageNumber 校验:从1开始
147
+ if (pageNumber !== undefined && (pageNumber < 1 || !Number.isInteger(pageNumber))) {
148
+ throw new Error('pageNumber must be a positive integer');
149
+ }
150
+ // PageSize 校验:默认10,最大100
151
+ if (pageSize !== undefined && (pageSize < 1 || pageSize > 100 || !Number.isInteger(pageSize))) {
152
+ throw new Error('pageSize must be an integer between 1 and 100');
153
+ }
154
+ // RoleId 校验
155
+ if (roleId !== undefined && (typeof roleId !== 'string' || roleId.trim().length === 0)) {
156
+ throw new Error('Invalid roleId');
157
+ }
158
+ // RoleIdentity 校验
159
+ if (roleIdentity !== undefined && (typeof roleIdentity !== 'string' || roleIdentity.trim().length === 0)) {
160
+ throw new Error('Invalid roleIdentity');
161
+ }
162
+ // RoleName 校验
163
+ if (roleName !== undefined && (typeof roleName !== 'string' || roleName.trim().length === 0)) {
164
+ throw new Error('Invalid roleName');
165
+ }
166
+ const reqData = { EnvId };
167
+ if (pageNumber !== undefined) {
168
+ reqData.PageNumber = pageNumber;
169
+ }
170
+ if (pageSize !== undefined) {
171
+ reqData.PageSize = pageSize;
172
+ }
173
+ if (roleId !== undefined) {
174
+ reqData.RoleId = roleId;
175
+ }
176
+ if (roleIdentity !== undefined) {
177
+ reqData.RoleIdentity = roleIdentity;
178
+ }
179
+ if (roleName !== undefined) {
180
+ reqData.RoleName = roleName;
181
+ }
182
+ if (loadDetails !== undefined) {
183
+ reqData.LoadDetails = loadDetails;
184
+ }
185
+ return this.tcbService.request('DescribeRoleList', reqData);
186
+ }
187
+ async modifyRole(options) {
188
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
189
+ const { roleId, roleName, description, addMemberUids, removeMemberUids, addPolicies, removePolicies } = options;
190
+ // RoleId 校验:必填
191
+ if (typeof roleId !== 'string' || roleId.trim().length === 0) {
192
+ throw new Error('roleId is required');
193
+ }
194
+ // RoleName 校验:不传或传空 => 不修改;非空时校验规则
195
+ if (roleName !== undefined && roleName !== '') {
196
+ if (roleName.length < 2 || roleName.length > 32) {
197
+ throw new Error('roleName length must be between 2 and 32');
198
+ }
199
+ if (!/^[\u4e00-\u9fa5a-zA-Z]/.test(roleName)) {
200
+ throw new Error('roleName must start with a letter or Chinese character');
201
+ }
202
+ if (!/^[\u4e00-\u9fa5a-zA-Z0-9\-_:@.]+$/.test(roleName)) {
203
+ throw new Error('roleName can only contain Chinese, letters, digits, and -_:@.');
204
+ }
205
+ }
206
+ // Description 校验
207
+ if (description !== undefined && description.length > 255) {
208
+ throw new Error('description length must be <= 255');
209
+ }
210
+ // AddMemberUids 校验
211
+ if (addMemberUids !== undefined) {
212
+ if (!Array.isArray(addMemberUids)) {
213
+ throw new Error('addMemberUids must be an array');
214
+ }
215
+ const invalidUid = addMemberUids.find(uid => typeof uid !== 'string' || uid.trim().length === 0);
216
+ if (invalidUid !== undefined) {
217
+ throw new Error('addMemberUids contains invalid item');
218
+ }
219
+ }
220
+ // RemoveMemberUids 校验
221
+ if (removeMemberUids !== undefined) {
222
+ if (!Array.isArray(removeMemberUids)) {
223
+ throw new Error('removeMemberUids must be an array');
224
+ }
225
+ const invalidUid = removeMemberUids.find(uid => typeof uid !== 'string' || uid.trim().length === 0);
226
+ if (invalidUid !== undefined) {
227
+ throw new Error('removeMemberUids contains invalid item');
228
+ }
229
+ }
230
+ // AddPolicies 校验
231
+ if (addPolicies !== undefined) {
232
+ if (!Array.isArray(addPolicies)) {
233
+ throw new Error('addPolicies must be an array');
234
+ }
235
+ const invalidPolicy = addPolicies.find(policy => !policy.ResourceType || !policy.Resource);
236
+ if (invalidPolicy !== undefined) {
237
+ throw new Error('each addPolicy must have ResourceType and Resource');
238
+ }
239
+ }
240
+ // RemovePolicies 校验
241
+ if (removePolicies !== undefined) {
242
+ if (!Array.isArray(removePolicies)) {
243
+ throw new Error('removePolicies must be an array');
244
+ }
245
+ const invalidPolicy = removePolicies.find(policy => !policy.ResourceType || !policy.Resource);
246
+ if (invalidPolicy !== undefined) {
247
+ throw new Error('each removePolicy must have ResourceType and Resource');
248
+ }
249
+ }
250
+ const reqData = { EnvId, RoleId: roleId };
251
+ // RoleName:不传或传空 => 不修改(不下发)
252
+ if (roleName !== undefined && roleName !== '') {
253
+ reqData.RoleName = roleName;
254
+ }
255
+ if (description !== undefined) {
256
+ reqData.Description = description;
257
+ }
258
+ if (addMemberUids !== undefined) {
259
+ reqData.AddMemberUids = addMemberUids;
260
+ }
261
+ if (removeMemberUids !== undefined) {
262
+ reqData.RemoveMemberUids = removeMemberUids;
263
+ }
264
+ if (addPolicies !== undefined) {
265
+ reqData.AddPolicies = addPolicies;
266
+ }
267
+ if (removePolicies !== undefined) {
268
+ reqData.RemovePolicies = removePolicies;
269
+ }
270
+ return this.tcbService.request('ModifyRole', reqData);
271
+ }
272
+ async deleteRoles(options) {
273
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
274
+ const { roleIds } = options;
275
+ // RoleIds 校验:必填数组,最多100个
276
+ if (!Array.isArray(roleIds) || roleIds.length === 0) {
277
+ throw new Error('roleIds is required and must be a non-empty array');
278
+ }
279
+ if (roleIds.length > 100) {
280
+ throw new Error('roleIds length must be <= 100');
281
+ }
282
+ const invalidId = roleIds.find(id => typeof id !== 'string' || id.trim().length === 0);
283
+ if (invalidId !== undefined) {
284
+ throw new Error('roleIds contains invalid item');
285
+ }
286
+ return this.tcbService.request('DeleteRoles', {
287
+ EnvId,
288
+ RoleIds: roleIds
289
+ });
290
+ }
291
+ }
292
+ exports.PermissionService = PermissionService;
293
+ __decorate([
294
+ (0, utils_1.preLazy)()
295
+ ], PermissionService.prototype, "modifyResourcePermission", null);
296
+ __decorate([
297
+ (0, utils_1.preLazy)()
298
+ ], PermissionService.prototype, "describeResourcePermission", null);
299
+ __decorate([
300
+ (0, utils_1.preLazy)()
301
+ ], PermissionService.prototype, "createRole", null);
302
+ __decorate([
303
+ (0, utils_1.preLazy)()
304
+ ], PermissionService.prototype, "describeRoleList", null);
305
+ __decorate([
306
+ (0, utils_1.preLazy)()
307
+ ], PermissionService.prototype, "modifyRole", null);
308
+ __decorate([
309
+ (0, utils_1.preLazy)()
310
+ ], PermissionService.prototype, "deleteRoles", null);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });