@pmate/cli 0.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 +48 -0
- package/dist/alioss.d.ts +19 -0
- package/dist/alioss.js +240 -0
- package/dist/alioss.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/AddDnsCommandHandler.d.ts +4 -0
- package/dist/commands/AddDnsCommandHandler.js +31 -0
- package/dist/commands/AddDnsCommandHandler.js.map +1 -0
- package/dist/commands/BucketCommandHandler.d.ts +4 -0
- package/dist/commands/BucketCommandHandler.js +25 -0
- package/dist/commands/BucketCommandHandler.js.map +1 -0
- package/dist/commands/DeployCommandHandler.d.ts +8 -0
- package/dist/commands/DeployCommandHandler.js +90 -0
- package/dist/commands/DeployCommandHandler.js.map +1 -0
- package/dist/commands/InitCommandHandler.d.ts +6 -0
- package/dist/commands/InitCommandHandler.js +107 -0
- package/dist/commands/InitCommandHandler.js.map +1 -0
- package/dist/commands/ListCommandHandler.d.ts +6 -0
- package/dist/commands/ListCommandHandler.js +44 -0
- package/dist/commands/ListCommandHandler.js.map +1 -0
- package/dist/commands/LoginCommandHandler.d.ts +9 -0
- package/dist/commands/LoginCommandHandler.js +95 -0
- package/dist/commands/LoginCommandHandler.js.map +1 -0
- package/dist/commands/StsCommandHandler.d.ts +5 -0
- package/dist/commands/StsCommandHandler.js +49 -0
- package/dist/commands/StsCommandHandler.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/dist/services/AliyunService.d.ts +30 -0
- package/dist/services/AliyunService.js +323 -0
- package/dist/services/AliyunService.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
require("dotenv/config");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
8
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
9
|
+
const config_1 = require("./config");
|
|
10
|
+
const cli_1 = require("./cli");
|
|
11
|
+
const types_1 = require("./types");
|
|
12
|
+
const ListCommandHandler_1 = require("./commands/ListCommandHandler");
|
|
13
|
+
const LoginCommandHandler_1 = require("./commands/LoginCommandHandler");
|
|
14
|
+
const AddDnsCommandHandler_1 = require("./commands/AddDnsCommandHandler");
|
|
15
|
+
const StsCommandHandler_1 = require("./commands/StsCommandHandler");
|
|
16
|
+
const BucketCommandHandler_1 = require("./commands/BucketCommandHandler");
|
|
17
|
+
const DeployCommandHandler_1 = require("./commands/DeployCommandHandler");
|
|
18
|
+
const InitCommandHandler_1 = require("./commands/InitCommandHandler");
|
|
19
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(node_path_1.default.resolve(__dirname, '..', 'package.json'), 'utf8'));
|
|
20
|
+
(0, config_1.loadPmateEnv)();
|
|
21
|
+
const HELP_TEXT = [
|
|
22
|
+
chalk_1.default.bold(`pmate v${pkg.version}`),
|
|
23
|
+
'',
|
|
24
|
+
chalk_1.default.bold('Usage:'),
|
|
25
|
+
` ${chalk_1.default.cyan('pmate')} ${chalk_1.default.gray('[options]')}`,
|
|
26
|
+
'',
|
|
27
|
+
chalk_1.default.bold('Options:'),
|
|
28
|
+
` ${chalk_1.default.green('-h, --help')} Show this help output`,
|
|
29
|
+
` ${chalk_1.default.green('-v, --version')} Print the current version`,
|
|
30
|
+
` ${chalk_1.default.green('-n, --name <n>')} Print a greeting for <n>`,
|
|
31
|
+
'',
|
|
32
|
+
chalk_1.default.bold('Commands:'),
|
|
33
|
+
` ${chalk_1.default.cyan('list [path]')} List apps from .pmate.yaml in the target folder`,
|
|
34
|
+
` ${chalk_1.default.cyan('login')} Log in and store a session in ~/.pmate/session.json`,
|
|
35
|
+
` ${chalk_1.default.cyan('add-dns')} Add a DNS record via Aliyun DNS`,
|
|
36
|
+
` ${chalk_1.default.gray(' --type <t> --value <v> --rr <rr> [--ttl <n>] [--domain <name>]')}`,
|
|
37
|
+
` ${chalk_1.default.cyan('sts')} Request an OSS STS token from the CI server`,
|
|
38
|
+
` ${chalk_1.default.cyan('bucket')} Manage OSS buckets`,
|
|
39
|
+
` ${chalk_1.default.gray(' --create --name <bucket>')}`,
|
|
40
|
+
` ${chalk_1.default.cyan('deploy')} Build an app package from apps/<app-name>`,
|
|
41
|
+
` ${chalk_1.default.gray(' <app-name> [--cwd <dir>]')}`,
|
|
42
|
+
` ${chalk_1.default.cyan('init')} Initialize an app bucket + CDN`,
|
|
43
|
+
` ${chalk_1.default.gray(' <app-name> [--cwd <dir>]')}`,
|
|
44
|
+
].join('\n');
|
|
45
|
+
function parseArgs(argv) {
|
|
46
|
+
const result = { help: false, version: false, rest: [] };
|
|
47
|
+
const tokens = [...argv];
|
|
48
|
+
while (tokens.length > 0) {
|
|
49
|
+
const token = tokens.shift();
|
|
50
|
+
switch (token) {
|
|
51
|
+
case '-h':
|
|
52
|
+
case '--help':
|
|
53
|
+
result.help = true;
|
|
54
|
+
break;
|
|
55
|
+
case '-v':
|
|
56
|
+
case '--version':
|
|
57
|
+
result.version = true;
|
|
58
|
+
break;
|
|
59
|
+
case '-n':
|
|
60
|
+
case '--name': {
|
|
61
|
+
const value = tokens.shift();
|
|
62
|
+
if (!value) {
|
|
63
|
+
throw new Error('Missing value for --name option');
|
|
64
|
+
}
|
|
65
|
+
result.name = value;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
if (token.startsWith('-')) {
|
|
70
|
+
throw new Error(`Unknown option: ${token}`);
|
|
71
|
+
}
|
|
72
|
+
result.rest.push(token, ...tokens);
|
|
73
|
+
tokens.length = 0;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function showHelp() {
|
|
80
|
+
cli_1.ui.plain(HELP_TEXT);
|
|
81
|
+
}
|
|
82
|
+
function greet(name) {
|
|
83
|
+
const target = name !== null && name !== void 0 ? name : 'friend';
|
|
84
|
+
cli_1.ui.success(`Hello, ${target}!`);
|
|
85
|
+
}
|
|
86
|
+
function parseCommandArgs(args) {
|
|
87
|
+
if (args.rest[0] === 'list') {
|
|
88
|
+
const targetPath = args.rest[1];
|
|
89
|
+
if (args.rest.length > 2) {
|
|
90
|
+
throw new Error('Too many arguments for list command');
|
|
91
|
+
}
|
|
92
|
+
return { type: types_1.Command.List, targetPath };
|
|
93
|
+
}
|
|
94
|
+
if (args.rest[0] === 'login') {
|
|
95
|
+
if (args.rest.length > 1) {
|
|
96
|
+
throw new Error('Too many arguments for login command');
|
|
97
|
+
}
|
|
98
|
+
return { type: types_1.Command.Login };
|
|
99
|
+
}
|
|
100
|
+
if (args.rest[0] === 'add-dns') {
|
|
101
|
+
const options = parseAddDnsOptions(args.rest.slice(1));
|
|
102
|
+
return { type: types_1.Command.AddDns, ...options };
|
|
103
|
+
}
|
|
104
|
+
if (args.rest[0] === 'sts') {
|
|
105
|
+
if (args.rest.length > 1) {
|
|
106
|
+
throw new Error('Too many arguments for sts command');
|
|
107
|
+
}
|
|
108
|
+
return { type: types_1.Command.Sts };
|
|
109
|
+
}
|
|
110
|
+
if (args.rest[0] === 'bucket') {
|
|
111
|
+
const options = parseBucketOptions(args.rest.slice(1));
|
|
112
|
+
return { type: types_1.Command.Bucket, ...options };
|
|
113
|
+
}
|
|
114
|
+
if (args.rest[0] === 'deploy') {
|
|
115
|
+
const options = parseDeployOptions(args.rest.slice(1));
|
|
116
|
+
return { type: types_1.Command.Deploy, ...options };
|
|
117
|
+
}
|
|
118
|
+
if (args.rest[0] === 'init') {
|
|
119
|
+
const options = parseInitOptions(args.rest.slice(1));
|
|
120
|
+
return { type: types_1.Command.Init, ...options };
|
|
121
|
+
}
|
|
122
|
+
return { type: types_1.Command.None };
|
|
123
|
+
}
|
|
124
|
+
function parseAddDnsOptions(tokens) {
|
|
125
|
+
const options = {
|
|
126
|
+
dnsTtl: 600,
|
|
127
|
+
};
|
|
128
|
+
const rest = [...tokens];
|
|
129
|
+
while (rest.length > 0) {
|
|
130
|
+
const token = rest.shift();
|
|
131
|
+
switch (token) {
|
|
132
|
+
case '--type':
|
|
133
|
+
options.dnsType = requireValue(rest, token);
|
|
134
|
+
break;
|
|
135
|
+
case '--value':
|
|
136
|
+
options.dnsValue = requireValue(rest, token);
|
|
137
|
+
break;
|
|
138
|
+
case '--rr':
|
|
139
|
+
options.dnsRr = requireValue(rest, token);
|
|
140
|
+
break;
|
|
141
|
+
case '--ttl': {
|
|
142
|
+
const ttlValue = requireValue(rest, token);
|
|
143
|
+
const ttl = Number.parseInt(ttlValue, 10);
|
|
144
|
+
if (!Number.isFinite(ttl) || ttl <= 0) {
|
|
145
|
+
throw new Error(`Invalid --ttl value: ${ttlValue}`);
|
|
146
|
+
}
|
|
147
|
+
options.dnsTtl = ttl;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case '--domain':
|
|
151
|
+
options.dnsDomain = requireValue(rest, token);
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
throw new Error(`Unknown add-dns option: ${token}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return options;
|
|
158
|
+
}
|
|
159
|
+
function parseBucketOptions(tokens) {
|
|
160
|
+
const options = {};
|
|
161
|
+
const rest = [...tokens];
|
|
162
|
+
while (rest.length > 0) {
|
|
163
|
+
const token = rest.shift();
|
|
164
|
+
switch (token) {
|
|
165
|
+
case '--create':
|
|
166
|
+
options.bucketCreate = true;
|
|
167
|
+
break;
|
|
168
|
+
case '--name':
|
|
169
|
+
options.bucketName = requireValue(rest, token);
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
throw new Error(`Unknown bucket option: ${token}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return options;
|
|
176
|
+
}
|
|
177
|
+
function parseDeployOptions(tokens) {
|
|
178
|
+
const options = {};
|
|
179
|
+
const rest = [...tokens];
|
|
180
|
+
const appName = rest.shift();
|
|
181
|
+
if (!appName || appName.startsWith('-')) {
|
|
182
|
+
throw new Error('Missing app name for deploy command');
|
|
183
|
+
}
|
|
184
|
+
options.deployApp = appName;
|
|
185
|
+
while (rest.length > 0) {
|
|
186
|
+
const token = rest.shift();
|
|
187
|
+
switch (token) {
|
|
188
|
+
case '--cwd':
|
|
189
|
+
options.deployCwd = requireValue(rest, token);
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
throw new Error(`Unknown deploy option: ${token}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return options;
|
|
196
|
+
}
|
|
197
|
+
function parseInitOptions(tokens) {
|
|
198
|
+
const options = {};
|
|
199
|
+
const rest = [...tokens];
|
|
200
|
+
const appName = rest.shift();
|
|
201
|
+
if (!appName || appName.startsWith('-')) {
|
|
202
|
+
throw new Error('Missing app name for init command');
|
|
203
|
+
}
|
|
204
|
+
options.initApp = appName;
|
|
205
|
+
while (rest.length > 0) {
|
|
206
|
+
const token = rest.shift();
|
|
207
|
+
switch (token) {
|
|
208
|
+
case '--cwd':
|
|
209
|
+
options.initCwd = requireValue(rest, token);
|
|
210
|
+
break;
|
|
211
|
+
default:
|
|
212
|
+
throw new Error(`Unknown init option: ${token}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return options;
|
|
216
|
+
}
|
|
217
|
+
function requireValue(tokens, optionName) {
|
|
218
|
+
const value = tokens.shift();
|
|
219
|
+
if (!value) {
|
|
220
|
+
throw new Error(`Missing value for ${optionName}`);
|
|
221
|
+
}
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
async function main() {
|
|
225
|
+
try {
|
|
226
|
+
const args = parseArgs(process.argv.slice(2));
|
|
227
|
+
if (args.help) {
|
|
228
|
+
showHelp();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (args.version) {
|
|
232
|
+
cli_1.ui.info(pkg.version);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (args.name) {
|
|
236
|
+
greet(args.name);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const commandArgs = parseCommandArgs(args);
|
|
240
|
+
if (commandArgs.type === types_1.Command.List) {
|
|
241
|
+
const handler = new ListCommandHandler_1.ListCommandHandler();
|
|
242
|
+
handler.handle(commandArgs);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (commandArgs.type === types_1.Command.Login) {
|
|
246
|
+
const handler = new LoginCommandHandler_1.LoginCommandHandler();
|
|
247
|
+
await handler.handle(commandArgs);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (commandArgs.type === types_1.Command.AddDns) {
|
|
251
|
+
const handler = new AddDnsCommandHandler_1.AddDnsCommandHandler();
|
|
252
|
+
await handler.handle(commandArgs);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (commandArgs.type === types_1.Command.Sts) {
|
|
256
|
+
const handler = new StsCommandHandler_1.StsCommandHandler();
|
|
257
|
+
await handler.handle(commandArgs);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (commandArgs.type === types_1.Command.Bucket) {
|
|
261
|
+
const handler = new BucketCommandHandler_1.BucketCommandHandler();
|
|
262
|
+
await handler.handle(commandArgs);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (commandArgs.type === types_1.Command.Deploy) {
|
|
266
|
+
const handler = new DeployCommandHandler_1.DeployCommandHandler();
|
|
267
|
+
await handler.handle(commandArgs);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (commandArgs.type === types_1.Command.Init) {
|
|
271
|
+
const handler = new InitCommandHandler_1.InitCommandHandler();
|
|
272
|
+
await handler.handle(commandArgs);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
showHelp();
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
279
|
+
cli_1.ui.error(`Error: ${message}`);
|
|
280
|
+
process.exitCode = 1;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
void main();
|
|
284
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type AddRecordInput = {
|
|
2
|
+
domainName: string;
|
|
3
|
+
rr: string;
|
|
4
|
+
type: string;
|
|
5
|
+
value: string;
|
|
6
|
+
ttl?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare class AliyunService {
|
|
9
|
+
static addRecord(input: AddRecordInput): Promise<void>;
|
|
10
|
+
static getCnameRecordValue(domainName: string, rr: string): Promise<string | undefined>;
|
|
11
|
+
static createBucket(bucketName: string): Promise<void>;
|
|
12
|
+
static ensureBucket(bucketName: string): Promise<void>;
|
|
13
|
+
static uploadDirectory(localDir: string, bucket: string, prefix?: string): Promise<void>;
|
|
14
|
+
static ensureCdnDomain(domainName: string, bucketName: string): Promise<void>;
|
|
15
|
+
static getCdnCname(domainName: string): Promise<string | undefined>;
|
|
16
|
+
static enableHttpsCertificate(domainName: string): Promise<void>;
|
|
17
|
+
static enableSpa404Fallback(domainName: string): Promise<void>;
|
|
18
|
+
static enableSpaRewriteRule(domainName: string): Promise<void>;
|
|
19
|
+
static enableOssPrivateBucketOrigin(domainName: string): Promise<void>;
|
|
20
|
+
private static requireEnv;
|
|
21
|
+
private static bucketExists;
|
|
22
|
+
private static createCdnClient;
|
|
23
|
+
private static getCdnDomainStatus;
|
|
24
|
+
private static getOssDomain;
|
|
25
|
+
private static configureBucketWebsite;
|
|
26
|
+
private static collectFiles;
|
|
27
|
+
private static toObjectKey;
|
|
28
|
+
private static getContentType;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AliyunService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const alidns20150109_1 = tslib_1.__importStar(require("@alicloud/alidns20150109"));
|
|
6
|
+
const cdn20180510_1 = tslib_1.__importStar(require("@alicloud/cdn20180510"));
|
|
7
|
+
const openapi_client_1 = require("@alicloud/openapi-client");
|
|
8
|
+
const ali_oss_1 = tslib_1.__importDefault(require("ali-oss"));
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
11
|
+
const cli_1 = require("../cli");
|
|
12
|
+
class AliyunService {
|
|
13
|
+
static async addRecord(input) {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
const accessKeyId = process.env.ALIYUN_AK;
|
|
16
|
+
const accessKeySecret = process.env.ALIYUN_SK;
|
|
17
|
+
if (!accessKeyId || !accessKeySecret) {
|
|
18
|
+
throw new Error("Missing ALIYUN_AK or ALIYUN_SK environment variable (or ~/.pmate/config).");
|
|
19
|
+
}
|
|
20
|
+
const config = new openapi_client_1.Config({
|
|
21
|
+
accessKeyId,
|
|
22
|
+
accessKeySecret,
|
|
23
|
+
regionId: (_a = process.env.ALIYUN_REGION) !== null && _a !== void 0 ? _a : "cn-hangzhou",
|
|
24
|
+
});
|
|
25
|
+
const client = new alidns20150109_1.default(config);
|
|
26
|
+
const request = new alidns20150109_1.AddDomainRecordRequest({
|
|
27
|
+
domainName: input.domainName,
|
|
28
|
+
RR: input.rr,
|
|
29
|
+
type: input.type,
|
|
30
|
+
value: input.value,
|
|
31
|
+
TTL: (_b = input.ttl) !== null && _b !== void 0 ? _b : 600,
|
|
32
|
+
});
|
|
33
|
+
await client.addDomainRecord(request);
|
|
34
|
+
}
|
|
35
|
+
static async getCnameRecordValue(domainName, rr) {
|
|
36
|
+
var _a, _b, _c, _d;
|
|
37
|
+
const accessKeyId = process.env.ALIYUN_AK;
|
|
38
|
+
const accessKeySecret = process.env.ALIYUN_SK;
|
|
39
|
+
if (!accessKeyId || !accessKeySecret) {
|
|
40
|
+
throw new Error("Missing ALIYUN_AK or ALIYUN_SK environment variable (or ~/.pmate/config).");
|
|
41
|
+
}
|
|
42
|
+
const config = new openapi_client_1.Config({
|
|
43
|
+
accessKeyId,
|
|
44
|
+
accessKeySecret,
|
|
45
|
+
regionId: (_a = process.env.ALIYUN_REGION) !== null && _a !== void 0 ? _a : "cn-hangzhou",
|
|
46
|
+
});
|
|
47
|
+
const client = new alidns20150109_1.default(config);
|
|
48
|
+
const request = new alidns20150109_1.DescribeDomainRecordsRequest({
|
|
49
|
+
domainName,
|
|
50
|
+
RRKeyWord: rr,
|
|
51
|
+
type: "CNAME",
|
|
52
|
+
searchMode: "ADVANCED",
|
|
53
|
+
pageSize: 500,
|
|
54
|
+
});
|
|
55
|
+
const response = await client.describeDomainRecords(request);
|
|
56
|
+
const records = (_d = (_c = (_b = response.body) === null || _b === void 0 ? void 0 : _b.domainRecords) === null || _c === void 0 ? void 0 : _c.record) !== null && _d !== void 0 ? _d : [];
|
|
57
|
+
const normalizedRr = rr.toLowerCase();
|
|
58
|
+
const match = records.find((record) => {
|
|
59
|
+
var _a, _b;
|
|
60
|
+
return ((_a = record === null || record === void 0 ? void 0 : record.RR) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === normalizedRr &&
|
|
61
|
+
((_b = record === null || record === void 0 ? void 0 : record.type) === null || _b === void 0 ? void 0 : _b.toUpperCase()) === "CNAME";
|
|
62
|
+
});
|
|
63
|
+
return match === null || match === void 0 ? void 0 : match.value;
|
|
64
|
+
}
|
|
65
|
+
static async createBucket(bucketName) {
|
|
66
|
+
const region = this.requireEnv("OSS_REGION");
|
|
67
|
+
const accessKeyId = this.requireEnv("ALIYUN_AK");
|
|
68
|
+
const accessKeySecret = this.requireEnv("ALIYUN_SK");
|
|
69
|
+
const client = new ali_oss_1.default({ region, accessKeyId, accessKeySecret });
|
|
70
|
+
await client.putBucket(bucketName);
|
|
71
|
+
// await this.configureBucketWebsite(bucketName)
|
|
72
|
+
}
|
|
73
|
+
static async ensureBucket(bucketName) {
|
|
74
|
+
const region = this.requireEnv("OSS_REGION");
|
|
75
|
+
const accessKeyId = this.requireEnv("ALIYUN_AK");
|
|
76
|
+
const accessKeySecret = this.requireEnv("ALIYUN_SK");
|
|
77
|
+
const client = new ali_oss_1.default({ region, accessKeyId, accessKeySecret });
|
|
78
|
+
const exists = await this.bucketExists(client, bucketName);
|
|
79
|
+
if (exists) {
|
|
80
|
+
cli_1.ui.warn(`Bucket already exists: ${bucketName}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await client.putBucket(bucketName);
|
|
84
|
+
// await this.configureBucketWebsite(bucketName)
|
|
85
|
+
cli_1.ui.success(`Bucket created: ${bucketName}`);
|
|
86
|
+
}
|
|
87
|
+
static async uploadDirectory(localDir, bucket, prefix) {
|
|
88
|
+
const region = this.requireEnv("OSS_REGION");
|
|
89
|
+
const accessKeyId = this.requireEnv("ALIYUN_AK");
|
|
90
|
+
const accessKeySecret = this.requireEnv("ALIYUN_SK");
|
|
91
|
+
const client = new ali_oss_1.default({ region, accessKeyId, accessKeySecret, bucket });
|
|
92
|
+
const files = await this.collectFiles(localDir);
|
|
93
|
+
if (files.length === 0) {
|
|
94
|
+
cli_1.ui.warn(`No files to upload from ${localDir}`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const normalizedPrefix = prefix ? prefix.replace(/^\/+|\/+$/g, "") : "";
|
|
98
|
+
for (const filePath of files) {
|
|
99
|
+
const relativePath = node_path_1.default.relative(localDir, filePath);
|
|
100
|
+
const objectKey = this.toObjectKey(normalizedPrefix, relativePath);
|
|
101
|
+
const contentType = this.getContentType(filePath);
|
|
102
|
+
const options = contentType
|
|
103
|
+
? { headers: { "Content-Type": contentType } }
|
|
104
|
+
: undefined;
|
|
105
|
+
await client.put(objectKey, filePath, options);
|
|
106
|
+
cli_1.ui.success(`Uploaded ${objectKey}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
static async ensureCdnDomain(domainName, bucketName) {
|
|
110
|
+
const client = this.createCdnClient();
|
|
111
|
+
const status = await this.getCdnDomainStatus(client, domainName);
|
|
112
|
+
if (status === "DomainExistCdnProduct") {
|
|
113
|
+
cli_1.ui.warn(`CDN domain already exists: ${domainName}`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (status && status !== "DomainNotExist") {
|
|
117
|
+
throw new Error(`CDN domain ${domainName} is already in use: ${status}`);
|
|
118
|
+
}
|
|
119
|
+
const sourceDomain = this.getOssDomain(bucketName);
|
|
120
|
+
const sources = JSON.stringify([
|
|
121
|
+
{
|
|
122
|
+
content: sourceDomain,
|
|
123
|
+
type: "oss",
|
|
124
|
+
priority: "20",
|
|
125
|
+
port: 80,
|
|
126
|
+
weight: "10",
|
|
127
|
+
},
|
|
128
|
+
]);
|
|
129
|
+
const request = new cdn20180510_1.AddCdnDomainRequest({
|
|
130
|
+
domainName,
|
|
131
|
+
cdnType: "web",
|
|
132
|
+
sources,
|
|
133
|
+
});
|
|
134
|
+
await client.addCdnDomain(request);
|
|
135
|
+
cli_1.ui.success(`CDN domain created: ${domainName}`);
|
|
136
|
+
}
|
|
137
|
+
static async getCdnCname(domainName) {
|
|
138
|
+
var _a, _b, _c, _d;
|
|
139
|
+
const client = this.createCdnClient();
|
|
140
|
+
const request = new cdn20180510_1.DescribeDomainCnameRequest({ domainName });
|
|
141
|
+
const response = await client.describeDomainCname(request);
|
|
142
|
+
const data = (_c = (_b = (_a = response.body) === null || _a === void 0 ? void 0 : _a.cnameDatas) === null || _b === void 0 ? void 0 : _b.data) !== null && _c !== void 0 ? _c : [];
|
|
143
|
+
const match = (_d = data.find((item) => (item === null || item === void 0 ? void 0 : item.domain) === domainName)) !== null && _d !== void 0 ? _d : data[0];
|
|
144
|
+
return match === null || match === void 0 ? void 0 : match.cname;
|
|
145
|
+
}
|
|
146
|
+
static async enableHttpsCertificate(domainName) {
|
|
147
|
+
const client = this.createCdnClient();
|
|
148
|
+
const request = new cdn20180510_1.SetCdnDomainSSLCertificateRequest({
|
|
149
|
+
domainName,
|
|
150
|
+
certType: "cas",
|
|
151
|
+
certName: "pmate",
|
|
152
|
+
certId: 21869146,
|
|
153
|
+
SSLProtocol: "on",
|
|
154
|
+
});
|
|
155
|
+
await client.setCdnDomainSSLCertificate(request);
|
|
156
|
+
}
|
|
157
|
+
static async enableSpa404Fallback(domainName) {
|
|
158
|
+
const client = this.createCdnClient();
|
|
159
|
+
const functions = JSON.stringify([
|
|
160
|
+
{
|
|
161
|
+
functionName: "error_page",
|
|
162
|
+
functionArgs: [
|
|
163
|
+
{ argName: "error_code", argValue: "403" },
|
|
164
|
+
{
|
|
165
|
+
argName: "rewrite_page",
|
|
166
|
+
argValue: `https://${domainName}/index.html`,
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
]);
|
|
171
|
+
const request = new cdn20180510_1.BatchSetCdnDomainConfigRequest({
|
|
172
|
+
domainNames: domainName,
|
|
173
|
+
functions,
|
|
174
|
+
});
|
|
175
|
+
await client.batchSetCdnDomainConfig(request);
|
|
176
|
+
}
|
|
177
|
+
static async enableSpaRewriteRule(domainName) {
|
|
178
|
+
const client = this.createCdnClient();
|
|
179
|
+
const functions = JSON.stringify([
|
|
180
|
+
{
|
|
181
|
+
functionName: "host_redirect",
|
|
182
|
+
functionArgs: [
|
|
183
|
+
{ argName: "regex", argValue: "^/(?!.*\\.[^/]+$).*" },
|
|
184
|
+
{ argName: "replacement", argValue: "/index.html" },
|
|
185
|
+
{ argName: "flag", argValue: "break" },
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
]);
|
|
189
|
+
const request = new cdn20180510_1.BatchSetCdnDomainConfigRequest({
|
|
190
|
+
domainNames: domainName,
|
|
191
|
+
functions,
|
|
192
|
+
});
|
|
193
|
+
await client.batchSetCdnDomainConfig(request);
|
|
194
|
+
}
|
|
195
|
+
static async enableOssPrivateBucketOrigin(domainName) {
|
|
196
|
+
const client = this.createCdnClient();
|
|
197
|
+
const functions = JSON.stringify([
|
|
198
|
+
{
|
|
199
|
+
functionName: "l2_oss_key",
|
|
200
|
+
functionArgs: [{ argName: "private_oss_auth", argValue: "on" }],
|
|
201
|
+
},
|
|
202
|
+
]);
|
|
203
|
+
const request = new cdn20180510_1.BatchSetCdnDomainConfigRequest({
|
|
204
|
+
domainNames: domainName,
|
|
205
|
+
functions,
|
|
206
|
+
});
|
|
207
|
+
await client.batchSetCdnDomainConfig(request);
|
|
208
|
+
}
|
|
209
|
+
static requireEnv(name) {
|
|
210
|
+
const value = process.env[name];
|
|
211
|
+
if (!value) {
|
|
212
|
+
throw new Error(`Missing ${name} in environment`);
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
static async bucketExists(client, bucketName) {
|
|
217
|
+
try {
|
|
218
|
+
await client.getBucketInfo(bucketName);
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
const err = error;
|
|
223
|
+
if (err.status === 404 || err.code === "NoSuchBucket") {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
static createCdnClient() {
|
|
230
|
+
var _a;
|
|
231
|
+
const accessKeyId = this.requireEnv("ALIYUN_AK");
|
|
232
|
+
const accessKeySecret = this.requireEnv("ALIYUN_SK");
|
|
233
|
+
const regionId = (_a = process.env.ALIYUN_REGION) !== null && _a !== void 0 ? _a : "cn-hangzhou";
|
|
234
|
+
const config = new openapi_client_1.Config({ accessKeyId, accessKeySecret, regionId });
|
|
235
|
+
return new cdn20180510_1.default(config);
|
|
236
|
+
}
|
|
237
|
+
static async getCdnDomainStatus(client, domainName) {
|
|
238
|
+
var _a;
|
|
239
|
+
const request = new cdn20180510_1.CheckCdnDomainExistRequest({ domainName });
|
|
240
|
+
const response = await client.checkCdnDomainExist(request);
|
|
241
|
+
return (_a = response.body) === null || _a === void 0 ? void 0 : _a.status;
|
|
242
|
+
}
|
|
243
|
+
static getOssDomain(bucketName) {
|
|
244
|
+
const region = this.requireEnv("OSS_REGION");
|
|
245
|
+
const normalizedRegion = region.startsWith("oss-")
|
|
246
|
+
? region
|
|
247
|
+
: `oss-${region}`;
|
|
248
|
+
return `${bucketName}.${normalizedRegion}.aliyuncs.com`;
|
|
249
|
+
}
|
|
250
|
+
static async configureBucketWebsite(bucketName) {
|
|
251
|
+
const region = this.requireEnv("OSS_REGION");
|
|
252
|
+
const accessKeyId = this.requireEnv("ALIYUN_AK");
|
|
253
|
+
const accessKeySecret = this.requireEnv("ALIYUN_SK");
|
|
254
|
+
const client = new ali_oss_1.default({ region, accessKeyId, accessKeySecret });
|
|
255
|
+
await client.putBucketWebsite(bucketName, {
|
|
256
|
+
index: "index.html",
|
|
257
|
+
error: "index.html",
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
static async collectFiles(dir) {
|
|
261
|
+
const entries = await node_fs_1.promises.readdir(dir, { withFileTypes: true });
|
|
262
|
+
const files = [];
|
|
263
|
+
for (const entry of entries) {
|
|
264
|
+
const fullPath = node_path_1.default.join(dir, entry.name);
|
|
265
|
+
if (entry.isDirectory()) {
|
|
266
|
+
files.push(...(await this.collectFiles(fullPath)));
|
|
267
|
+
}
|
|
268
|
+
else if (entry.isFile()) {
|
|
269
|
+
files.push(fullPath);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return files;
|
|
273
|
+
}
|
|
274
|
+
static toObjectKey(prefix, relativePath) {
|
|
275
|
+
const normalizedPath = relativePath.split(node_path_1.default.sep).join("/");
|
|
276
|
+
if (!prefix) {
|
|
277
|
+
return normalizedPath;
|
|
278
|
+
}
|
|
279
|
+
return `${prefix}/${normalizedPath}`;
|
|
280
|
+
}
|
|
281
|
+
static getContentType(filePath) {
|
|
282
|
+
const ext = node_path_1.default.extname(filePath).toLowerCase();
|
|
283
|
+
switch (ext) {
|
|
284
|
+
case ".html":
|
|
285
|
+
return "text/html";
|
|
286
|
+
case ".css":
|
|
287
|
+
return "text/css";
|
|
288
|
+
case ".js":
|
|
289
|
+
return "application/javascript";
|
|
290
|
+
case ".mjs":
|
|
291
|
+
return "application/javascript";
|
|
292
|
+
case ".json":
|
|
293
|
+
return "application/json";
|
|
294
|
+
case ".svg":
|
|
295
|
+
return "image/svg+xml";
|
|
296
|
+
case ".png":
|
|
297
|
+
return "image/png";
|
|
298
|
+
case ".jpg":
|
|
299
|
+
case ".jpeg":
|
|
300
|
+
return "image/jpeg";
|
|
301
|
+
case ".webp":
|
|
302
|
+
return "image/webp";
|
|
303
|
+
case ".ico":
|
|
304
|
+
return "image/x-icon";
|
|
305
|
+
case ".txt":
|
|
306
|
+
return "text/plain";
|
|
307
|
+
case ".map":
|
|
308
|
+
return "application/json";
|
|
309
|
+
case ".woff":
|
|
310
|
+
return "font/woff";
|
|
311
|
+
case ".woff2":
|
|
312
|
+
return "font/woff2";
|
|
313
|
+
case ".ttf":
|
|
314
|
+
return "font/ttf";
|
|
315
|
+
case ".eot":
|
|
316
|
+
return "application/vnd.ms-fontobject";
|
|
317
|
+
default:
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
exports.AliyunService = AliyunService;
|
|
323
|
+
//# sourceMappingURL=AliyunService.js.map
|