@pelican.ts/sdk 0.3.4-next.4 → 0.4.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/dist/types.d.ts CHANGED
@@ -1151,7 +1151,7 @@ type Server = {
1151
1151
  limits: ServerLimits;
1152
1152
  invocation: string;
1153
1153
  docker_image: string;
1154
- egg_features: string[] | null;
1154
+ egg_features: Nullable<string[]>;
1155
1155
  feature_limits: FeatureLimits;
1156
1156
  status: Nullable<unknown>;
1157
1157
  is_suspended: boolean;
@@ -1164,7 +1164,7 @@ type Server = {
1164
1164
  uuid: string;
1165
1165
  name: string;
1166
1166
  }, "egg">;
1167
- subusers: GenericListResponse<GenericResponse<ServerSubuser, "server_subuser">>;
1167
+ subusers?: GenericListResponse<GenericResponse<ServerSubuser, "server_subuser">>;
1168
1168
  };
1169
1169
  };
1170
1170
  type ServerStats = {
@@ -1199,7 +1199,7 @@ type User = {
1199
1199
  image: string;
1200
1200
  admin: boolean;
1201
1201
  root_admin: boolean;
1202
- "2fa_enabled": number;
1202
+ "2fa_enabled": boolean;
1203
1203
  created_at: string;
1204
1204
  updated_at: string;
1205
1205
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pelican.ts/sdk",
3
- "version": "0.3.4-next.4",
3
+ "version": "0.4.0",
4
4
  "description": "Pelican panel SDK for TypeScript",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -11,18 +11,27 @@
11
11
  "require": "./dist/index.js",
12
12
  "import": "./dist/index.mjs"
13
13
  },
14
+ "./api": {
15
+ "types": "./dist/api/index.d.ts",
16
+ "require": "./dist/api/index.js",
17
+ "import": "./dist/api/index.mjs"
18
+ },
14
19
  "./types": {
15
20
  "types": "./dist/types.d.ts"
16
21
  }
17
22
  },
18
23
  "scripts": {
19
- "build:code": "tsup src/index.ts --format esm,cjs --dts --target esnext",
24
+ "build:api": "tsup src/api/index.ts --format esm,cjs --dts --target esnext -d dist/api",
25
+ "build:humane": "tsup src/index.ts --format esm,cjs --dts --target esnext",
20
26
  "build:types": "tsup src/types.ts --dts-only --target esnext",
21
- "build": "rm -rf ./dist && npm run build:code && npm run build:types",
27
+ "build": "rm -rf ./dist && npm run build:api && npm run build:humane && npm run build:types",
22
28
  "pub": "npm publish --access=public",
23
29
  "pub:next": "npm publish --access=public --tag=next",
24
30
  "generate-types": "bun run scripts/create-types.ts",
25
- "pipeline": "bun run generate-types && bun run build && bun run pub:next"
31
+ "pipeline:next": "bun run generate-types && bun run build && bun run pub:next",
32
+ "pipeline": "bun run generate-types && bun run build && bun run pub",
33
+ "format": "biome format --no-errors-on-unmatched --files-ignore-unknown=true --write .",
34
+ "prepare": "husky"
26
35
  },
27
36
  "keywords": [
28
37
  "pterodactyl",
@@ -38,8 +47,10 @@
38
47
  "url": "git+https://github.com/m41denx/Pelican.ts"
39
48
  },
40
49
  "devDependencies": {
50
+ "@biomejs/biome": "2.3.6",
41
51
  "@types/node": "^22.18.12",
42
52
  "@types/strip-color": "^0.1.2",
53
+ "husky": "^9.1.7",
43
54
  "tsc-alias": "^1.8.16",
44
55
  "tsup": "^8.5.0",
45
56
  "typescript": "^5.9.3"
@@ -22,7 +22,7 @@ export type Server = {
22
22
  limits: ServerLimits,
23
23
  invocation: string,
24
24
  docker_image: string,
25
- egg_features: string[] | null,
25
+ egg_features: Nullable<string[]>,
26
26
  feature_limits: FeatureLimits,
27
27
  status: Nullable<unknown>,
28
28
  is_suspended: boolean,
@@ -35,7 +35,7 @@ export type Server = {
35
35
  uuid: string,
36
36
  name: string
37
37
  }, "egg">,
38
- subusers: GenericListResponse<GenericResponse<ServerSubuser, "server_subuser">>
38
+ subusers?: GenericListResponse<GenericResponse<ServerSubuser, "server_subuser">>
39
39
  }
40
40
  }
41
41
 
@@ -8,7 +8,7 @@ export type User = {
8
8
  image: string,
9
9
  admin: boolean,
10
10
  root_admin: boolean,
11
- "2fa_enabled": number,
11
+ "2fa_enabled": boolean,
12
12
  created_at: string,
13
13
  updated_at: string
14
14
 
@@ -0,0 +1,17 @@
1
+ import {Client as UserClient} from "@/api/client/client";
2
+ import {Client as AppClient} from "@/api/application/client";
3
+ import {Agent} from "@/api/base/request";
4
+
5
+ export class PelicanAPIClient extends UserClient {
6
+ constructor(url: string, token: string, suffix: string = "/api") {
7
+ const ax = new Agent(url, token, "client", suffix)
8
+ super(ax.requester)
9
+ }
10
+ }
11
+
12
+ export class PelicanAPIApplication extends AppClient {
13
+ constructor(url: string, token: string, suffix: string = "/api") {
14
+ const ax = new Agent(url, token, "application", suffix)
15
+ super(ax.requester)
16
+ }
17
+ }
@@ -0,0 +1,84 @@
1
+ import type {Client} from "@/api/client/client";
2
+ import type {User} from "@/api/client/types/user";
3
+
4
+
5
+ export class Account {
6
+ private readonly client: Client
7
+ readonly uuid: string;
8
+ readonly username: string;
9
+ private $email: string;
10
+ get email() {return this.$email}
11
+ readonly language: string;
12
+ readonly image: string;
13
+ readonly admin: boolean;
14
+ readonly root_admin: boolean;
15
+ private $has2faEnabled: boolean;
16
+ get has2faEnabled() {return this.$has2faEnabled}
17
+ readonly createdAt: Date;
18
+ readonly updatedAt: Date;
19
+
20
+ constructor(client: Client, user: User) {
21
+ this.client = client
22
+ this.uuid = user.uuid
23
+ this.username = user.username
24
+ this.$email = user.email
25
+ this.language = user.language
26
+ this.image = user.image
27
+ this.admin = user.admin
28
+ this.root_admin = user.root_admin
29
+ this.$has2faEnabled = user["2fa_enabled"]
30
+ this.createdAt = new Date(user.created_at)
31
+ this.updatedAt = new Date(user.updated_at)
32
+ }
33
+
34
+ updateEmail = async (
35
+ newEmail: string,
36
+ password: string
37
+ ) => {
38
+ await this.client.account.updateEmail(newEmail, password)
39
+ this.$email = newEmail
40
+ }
41
+
42
+ updatePassword = async (
43
+ newPassword: string
44
+ ) => this.client.account.updatePassword(newPassword)
45
+
46
+ listApiKeys = async () => this.client.account.apiKeys.list()
47
+
48
+ createApiKey = async (
49
+ description: string,
50
+ allowed_ips?: string[]
51
+ ) => this.client.account.apiKeys.create(description, allowed_ips)
52
+
53
+ deleteApiKey = async (
54
+ identifier: string
55
+ ) => this.client.account.apiKeys.delete(identifier)
56
+
57
+ listSshKeys = async () => this.client.account.sshKeys.list()
58
+
59
+ createSshKey = async (
60
+ name: string,
61
+ public_key: string
62
+ ) => this.client.account.sshKeys.create(name, public_key)
63
+
64
+ deleteSshKey = async (
65
+ fingerprint: string
66
+ ) => this.client.account.sshKeys.delete(fingerprint)
67
+
68
+ get2faQR = async () => this.client.account.twoFactor.info()
69
+
70
+ enable2fa = async (
71
+ code: string
72
+ ) => {
73
+ const tokens = await this.client.account.twoFactor.enable(code)
74
+ this.$has2faEnabled = true
75
+ return tokens
76
+ }
77
+
78
+ disable2fa = async (
79
+ password: string
80
+ ) => {
81
+ await this.client.account.twoFactor.disable(password)
82
+ this.$has2faEnabled = false
83
+ }
84
+ }
@@ -0,0 +1,43 @@
1
+ import type {Client as ClientT} from "@/api/client/client";
2
+ import {Account} from "@/humane/Account";
3
+ import {Server} from "@/humane/Server";
4
+
5
+
6
+ export class Client {
7
+ private readonly client: ClientT
8
+
9
+ constructor(client: ClientT) {
10
+ this.client = client
11
+ }
12
+
13
+ get $client(): ClientT {
14
+ return this.client
15
+ }
16
+
17
+ getAccount = async () => {
18
+ const user = await this.client.account.info()
19
+ return new Account(this.client, user)
20
+ }
21
+
22
+ listPermissions = async () => this.client.listPermissions()
23
+
24
+ listServers = async (
25
+ opts: {
26
+ type?: "accessible" | "mine" | "admin" | "admin-all",
27
+ page?: number,
28
+ per_page?: number,
29
+ include?: ("egg" | "subusers")[],
30
+ } = {type: "accessible", page: 1, per_page: 50}
31
+ ) => {
32
+ const data = await this.client.listServers(opts.type, opts.page, opts.per_page, opts.include)
33
+ return data.map(d => new Server(this.client.server(d.uuid), d))
34
+ }
35
+
36
+ getServer = async (
37
+ uuid: string,
38
+ include?: ("egg" | "subusers")[]
39
+ ) => {
40
+ const server = await this.client.server(uuid).info(include)
41
+ return new Server(this.client.server(uuid), server)
42
+ }
43
+ }
@@ -0,0 +1,217 @@
1
+ import type {ServerClient} from "@/api/client/server";
2
+ import type {ServerBackups} from "@/api/client/server_backups";
3
+ import type {ServerFiles} from "@/api/client/server_files";
4
+ import type {ServerSchedules} from "@/api/client/server_schedules";
5
+ import type {Server as ServerT} from "@/api/client/types/server";
6
+ import { ServerAllocation } from "@/humane/ServerAllocation";
7
+ import {ServerBackup} from "@/humane/ServerBackup";
8
+ import {ServerDatabase} from "@/humane/ServerDatabase";
9
+ import {ServerFile} from "@/humane/ServerFile";
10
+ import {ServerSchedule} from "@/humane/ServerSchedule";
11
+ import {ServerUser} from "@/humane/ServerUser";
12
+ import type {EggVariable, FeatureLimits, ServerLimits, SubuserPermission} from "@/types";
13
+ import type {Nullable} from "@/utils/types";
14
+
15
+
16
+ export class Server {
17
+ private readonly client: ServerClient
18
+
19
+ readonly ownsServer: boolean;
20
+ readonly identifier: string;
21
+ readonly internalId?: number;
22
+ readonly uuid: string;
23
+ private $name: string;
24
+ get name() {return this.$name}
25
+ readonly node: string;
26
+ readonly isNodeUnderMaintenance: boolean;
27
+ readonly sftp: {
28
+ ip: string,
29
+ alias: Nullable<string>,
30
+ port: number
31
+ };
32
+ private $description: string;
33
+ get description() {return this.$description}
34
+ readonly limits: ServerLimits;
35
+ readonly invocation: string;
36
+ private $dockerImage: string;
37
+ get dockerImage() {return this.$dockerImage}
38
+ readonly eggFeatures: Nullable<string[]>;
39
+ readonly featureLimits: FeatureLimits;
40
+ readonly status: unknown;
41
+ readonly isSuspended: boolean;
42
+ readonly isInstalling: boolean;
43
+ readonly isTransferring: boolean;
44
+ readonly allocations: ServerAllocation[]
45
+ readonly variables: EggVariable[]
46
+ readonly egg?: {
47
+ uuid: string,
48
+ name: string
49
+ }
50
+ readonly subusers?: ServerUser[]
51
+
52
+ constructor(client: ServerClient, server: ServerT) {
53
+ this.client = client
54
+ this.ownsServer = server.server_owner
55
+ this.identifier = server.identifier
56
+ this.internalId = server.internal_id
57
+ this.uuid = server.uuid
58
+ this.$name = server.name
59
+ this.node = server.node
60
+ this.isNodeUnderMaintenance = server.is_node_under_maintenance
61
+ this.sftp = server.sftp_details
62
+ this.$description = server.description
63
+ this.limits = server.limits
64
+ this.invocation = server.invocation
65
+ this.$dockerImage = server.docker_image
66
+ this.eggFeatures = server.egg_features
67
+ this.featureLimits = server.feature_limits
68
+ this.status = server.status
69
+ this.isSuspended = server.is_suspended
70
+ this.isInstalling = server.is_installing
71
+ this.isTransferring = server.is_transferring
72
+ this.allocations = server.relationships.allocations.data.map(d => new ServerAllocation(this.client, d.attributes))
73
+ this.variables = server.relationships.variables.data.map(d => d.attributes)
74
+ this.egg = server.relationships.egg?.attributes
75
+ this.subusers = server.relationships.subusers?.data.map(d => new ServerUser(this.client, d.attributes))
76
+ }
77
+
78
+ rename = async (
79
+ name: string
80
+ ) => {
81
+ await this.client.settings.rename(name)
82
+ this.$name = name
83
+ }
84
+
85
+ updateDescription = async (
86
+ description: string
87
+ ) => {
88
+ await this.client.settings.updateDescription(description)
89
+ this.$description = description
90
+ }
91
+
92
+ reinstall = async () => this.client.settings.reinstall()
93
+
94
+ changeDockerImage = async (
95
+ image: string
96
+ ) => {
97
+ await this.client.settings.changeDockerImage(image)
98
+ this.$dockerImage = image
99
+ }
100
+
101
+ getActivityLogs = async (
102
+ opts: {
103
+ page?: number,
104
+ per_page?: number
105
+ } = {page: 1, per_page: 50}
106
+ ) => this.client.activity.list(opts.page, opts.per_page)
107
+
108
+ websocket = (stripColors: boolean = false) =>
109
+ this.client.websocket(stripColors)
110
+
111
+ getServerStats = async () => this.client.resources()
112
+
113
+ runCommand = async (command: string) => this.client.command(command)
114
+
115
+ sendPowerSignal = async (
116
+ signal: "start" | "stop" | "restart" | "kill"
117
+ ) => this.client.power(signal)
118
+
119
+
120
+
121
+ getDatabases = async (
122
+ opts: {
123
+ include?: ("password")[],
124
+ page?: number
125
+ } = {include: [], page: 1}
126
+ ) => {
127
+ const data = await this.client.databases.list(opts.include, opts.page)
128
+ return data.map(d => new ServerDatabase(this.client, d))
129
+ }
130
+
131
+ createDatabase = async (
132
+ database: string,
133
+ remote: string
134
+ ) => {
135
+ const data = await this.client.databases.create(database, remote)
136
+ return new ServerDatabase(this.client, data)
137
+ }
138
+
139
+ getSchedules = async () => {
140
+ const data = await this.client.schedules.list()
141
+ return data.map(d => new ServerSchedule(this.client, d))
142
+ }
143
+
144
+ createSchedule = async (
145
+ ...opts: Parameters<ServerSchedules["create"]>
146
+ ) => {
147
+ const data = await this.client.schedules.create(...opts)
148
+ return new ServerSchedule(this.client, data)
149
+ }
150
+
151
+ getBackups = async (
152
+ page: number = 1
153
+ ) => {
154
+ const data = await this.client.backups.list(page)
155
+ return data.map(d => new ServerBackup(this.client, d))
156
+ }
157
+
158
+ createBackup = async (
159
+ ...args: Parameters<ServerBackups["create"]>
160
+ ) => {
161
+ const data = await this.client.backups.create(...args)
162
+ return new ServerBackup(this.client, data)
163
+ }
164
+
165
+ getAllocations = async () => {
166
+ const data = await this.client.allocations.list()
167
+ return data.map(d => new ServerAllocation(this.client, d))
168
+ }
169
+
170
+ createAllocation = async () => {
171
+ const data = await this.client.allocations.autoAssign()
172
+ return new ServerAllocation(this.client, data)
173
+ }
174
+
175
+ getFiles = async (
176
+ path?: string
177
+ ) => {
178
+ const data = await this.client.files.list(path)
179
+ return data.map(d => new ServerFile(this.client, d))
180
+ }
181
+
182
+ createFolder = async (
183
+ ...opts: Parameters<ServerFiles["createFolder"]>
184
+ ) => this.client.files.createFolder(...opts)
185
+
186
+ uploadFile = async (
187
+ ...opts: Parameters<ServerFiles["upload"]>
188
+ ) => this.client.files.upload(...opts)
189
+
190
+ uploadFileGetUrl = async (
191
+ ...opts: Parameters<ServerFiles["uploadGetUrl"]>
192
+ ) => this.client.files.uploadGetUrl(...opts)
193
+
194
+ pullFileFromRemote = async (
195
+ ...opts: Parameters<ServerFiles["pullFromRemote"]>
196
+ ) => this.client.files.pullFromRemote(...opts)
197
+
198
+ getUsers = async () => {
199
+ const data = await this.client.users.list()
200
+ return data.map(d => new ServerUser(this.client, d))
201
+ }
202
+
203
+ createUser = async (
204
+ email: string,
205
+ permissions: SubuserPermission[] | string[]
206
+ ) => {
207
+ const data = await this.client.users.create(email, permissions)
208
+ return new ServerUser(this.client, data)
209
+ }
210
+
211
+ getStartupInfo = async () => this.client.startup.list()
212
+
213
+ setStartupVariable = async (
214
+ key: string,
215
+ value: string
216
+ ) => this.client.startup.set(key, value)
217
+ }
@@ -0,0 +1,39 @@
1
+ import type {ServerClient} from "@/api/client/server";
2
+ import type {ServerAllocation as ServerAllocationT} from "@/api/client/types/server_allocation";
3
+ import type {Nullable} from "@/utils/types";
4
+
5
+ export class ServerAllocation {
6
+ private readonly client: ServerClient
7
+ readonly alias: Nullable<string>
8
+ readonly id: number
9
+ readonly ip: string
10
+ private $isDefault: boolean
11
+ get isDefault() {return this.$isDefault}
12
+ private $notes: Nullable<string>
13
+ get notes() {return this.$notes}
14
+ readonly port: number
15
+
16
+ constructor(client: ServerClient, alloc: ServerAllocationT) {
17
+ this.client = client
18
+ this.alias = alloc.alias
19
+ this.id = alloc.id
20
+ this.ip = alloc.ip
21
+ this.$isDefault = alloc.is_default
22
+ this.$notes = alloc.notes
23
+ this.port = alloc.port
24
+ }
25
+
26
+ setNotes = async (
27
+ notes: string
28
+ ) => {
29
+ const data = await this.client.allocations.setNotes(this.id, notes)
30
+ this.$notes = data.notes
31
+ }
32
+
33
+ makeDefault = async () => {
34
+ const data = await this.client.allocations.setPrimary(this.id)
35
+ this.$isDefault = data.is_default
36
+ }
37
+
38
+ unassign = async () => this.client.allocations.unassign(this.id)
39
+ }
@@ -0,0 +1,37 @@
1
+ import type {ServerClient} from "@/api/client/server";
2
+ import type {ServerBackup as ServerBackupT} from "@/api/common/types/server_backup";
3
+ import type {Nullable} from "@/utils/types";
4
+
5
+
6
+ export class ServerBackup {
7
+ private readonly client: ServerClient
8
+ readonly bytes: number
9
+ readonly checksum: Nullable<string>
10
+ readonly completedAt: Nullable<Date>
11
+ readonly createdAt: Date
12
+ readonly ignoredFiles: string[]
13
+ readonly isLocked: boolean
14
+ readonly isSuccessful: boolean
15
+ readonly name: string
16
+ readonly uuid: string
17
+
18
+ constructor(client: ServerClient, backup: ServerBackupT) {
19
+ this.client = client
20
+ this.bytes = backup.bytes
21
+ this.checksum = backup.checksum
22
+ this.completedAt = backup.completed_at ? new Date(backup.completed_at) : null
23
+ this.createdAt = new Date(backup.created_at)
24
+ this.ignoredFiles = backup.ignored_files
25
+ this.isLocked = backup.is_locked
26
+ this.isSuccessful = backup.is_successful
27
+ this.name = backup.name
28
+ this.uuid = backup.uuid
29
+ }
30
+
31
+
32
+ downloadGetUrl = async () => this.client.backups.downloadGetUrl(this.uuid)
33
+
34
+ download = async () => this.client.backups.download(this.uuid)
35
+
36
+ delete = async () => this.client.backups.delete(this.uuid)
37
+ }
@@ -0,0 +1,36 @@
1
+ import type {ServerClient} from "@/api/client/server";
2
+ import type {ServerDatabase as ServerDatabaseT} from "@/api/common/types/server_database";
3
+ // TODO: Check for validity
4
+
5
+ export class ServerDatabase {
6
+ private readonly client: ServerClient
7
+ readonly allowConnectionsFrom: string
8
+ readonly host: string
9
+ readonly port: number
10
+ readonly id: string
11
+ readonly maxConnections: number
12
+ readonly name: string
13
+ private $password?: string
14
+ get password() {return this.$password}
15
+ readonly username: string
16
+
17
+ constructor(client: ServerClient, database: ServerDatabaseT) {
18
+ this.client = client
19
+ this.allowConnectionsFrom = database.connections_from
20
+ this.host = database.host.address
21
+ this.port = database.host.port
22
+ this.id = database.id
23
+ this.maxConnections = database.max_connections
24
+ this.name = database.name
25
+ this.$password = database.relationships?.password.attributes.password
26
+ this.username = database.username
27
+ }
28
+
29
+
30
+ rotatePassword = async () => {
31
+ const data = await this.client.databases.rotatePassword(this.id)
32
+ this.$password = data.relationships?.password.attributes.password
33
+ }
34
+
35
+ delete = async () => this.client.databases.delete(this.id)
36
+ }
@@ -0,0 +1,73 @@
1
+ import path from "node:path";
2
+ import type {ServerClient} from "@/api/client/server";
3
+ import type {FileObject} from "@/api/common/types/server_files";
4
+
5
+
6
+ export class ServerFile {
7
+ private readonly client: ServerClient
8
+ private readonly dir: string
9
+ private readonly path: string
10
+ readonly createdAt: Date
11
+ readonly isFile: boolean
12
+ readonly isSymlink: boolean
13
+ readonly mimetype: string
14
+ readonly mode: string
15
+ readonly modeBits: string
16
+ readonly modifiedAt: Date
17
+ readonly name: string
18
+ readonly size: number
19
+
20
+ constructor(client: ServerClient, file: FileObject, dir: string = "/") {
21
+ this.client = client
22
+ this.dir = dir
23
+ this.createdAt = new Date(file.created_at)
24
+ this.isFile = file.is_file
25
+ this.isSymlink = file.is_symlink
26
+ this.mimetype = file.mimetype
27
+ this.mode = file.mode
28
+ this.modeBits = file.mode_bits
29
+ this.modifiedAt = new Date(file.modified_at)
30
+ this.name = file.name
31
+ this.size = file.size
32
+ this.path = path.join(dir, this.name)
33
+ }
34
+
35
+ get isArchive() {
36
+ // Maybe mimetype is better
37
+ return [
38
+ "zip", "tgz", "tar.gz", "txz", "tar.xz", "tbz2", "tar.bz2"
39
+ ].some(ext => this.name.endsWith(`.${ext}`))
40
+ }
41
+
42
+ /**
43
+ * Return the contents of a file. To read binary file (non-editable) use {@link download} instead
44
+ */
45
+ contents = async () => this.client.files.contents(this.path)
46
+
47
+ downloadGetUrl = async () => this.client.files.downloadGetUrl(this.path)
48
+
49
+ download = async () => this.client.files.download(this.path)
50
+
51
+ rename = async (
52
+ newName: string
53
+ ) => this.client.files.rename(this.dir, [{from: this.name, to: newName}])
54
+
55
+ copy = async () => this.client.files.copy(this.path)
56
+
57
+ write = async (
58
+ content: string
59
+ ) => this.client.files.write(this.path, content)
60
+
61
+ compress = async (
62
+ archive_name?: string,
63
+ extension?: "zip" | "tgz" | "tar.gz" | "txz" | "tar.xz" | "tbz2" | "tar.bz2"
64
+ ) => this.client.files.compress(this.dir, [this.name], archive_name, extension)
65
+
66
+ decompress = async () => this.client.files.decompress(this.dir, this.name)
67
+
68
+ delete = async () => this.client.files.delete(this.dir, [this.name])
69
+
70
+ chmod = async (
71
+ mode: number
72
+ ) => this.client.files.chmod(this.dir, [{file: this.name, mode}])
73
+ }