@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
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InitCommandHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
7
|
+
const yaml_1 = tslib_1.__importDefault(require("yaml"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const AliyunService_1 = require("../services/AliyunService");
|
|
10
|
+
const cli_1 = require("../cli");
|
|
11
|
+
class InitCommandHandler {
|
|
12
|
+
async handle(args) {
|
|
13
|
+
var _a, _b, _c, _d;
|
|
14
|
+
if (args.type !== types_1.Command.Init) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const appName = (_a = args.initApp) === null || _a === void 0 ? void 0 : _a.trim();
|
|
18
|
+
if (!appName) {
|
|
19
|
+
throw new Error("Missing app name. Usage: init <app-name> [--cwd <dir>].");
|
|
20
|
+
}
|
|
21
|
+
const cwd = this.resolveCwd(args.initCwd);
|
|
22
|
+
const config = this.loadConfig(cwd);
|
|
23
|
+
const appConfig = config.apps.find((entry) => (entry === null || entry === void 0 ? void 0 : entry.app) === appName);
|
|
24
|
+
if (!appConfig) {
|
|
25
|
+
throw new Error(`No app named ${appName} found in ${node_path_1.default.join(cwd, ".pmate.yaml")}`);
|
|
26
|
+
}
|
|
27
|
+
const bucketName = (_b = appConfig.bucket) === null || _b === void 0 ? void 0 : _b.trim();
|
|
28
|
+
if (!bucketName) {
|
|
29
|
+
throw new Error(`Missing bucket for ${appName} in ${node_path_1.default.join(cwd, ".pmate.yaml")}`);
|
|
30
|
+
}
|
|
31
|
+
const baseDomain = (_c = config.domain) === null || _c === void 0 ? void 0 : _c.trim();
|
|
32
|
+
if (!baseDomain) {
|
|
33
|
+
throw new Error(`Missing domain in ${node_path_1.default.join(cwd, ".pmate.yaml")}`);
|
|
34
|
+
}
|
|
35
|
+
const subdomain = (_d = appConfig.subdomain) === null || _d === void 0 ? void 0 : _d.trim();
|
|
36
|
+
const dnsRr = subdomain || "@";
|
|
37
|
+
const cdnDomain = subdomain ? `${subdomain}.${baseDomain}` : baseDomain;
|
|
38
|
+
await AliyunService_1.AliyunService.ensureBucket(bucketName);
|
|
39
|
+
await AliyunService_1.AliyunService.ensureCdnDomain(cdnDomain, bucketName);
|
|
40
|
+
await AliyunService_1.AliyunService.enableOssPrivateBucketOrigin(cdnDomain);
|
|
41
|
+
cli_1.ui.success(`Enabled OSS private bucket origin for ${cdnDomain}`);
|
|
42
|
+
const cname = await AliyunService_1.AliyunService.getCdnCname(cdnDomain);
|
|
43
|
+
if (!cname) {
|
|
44
|
+
throw new Error(`No CNAME found for ${cdnDomain}. Try again in a minute.`);
|
|
45
|
+
}
|
|
46
|
+
cli_1.ui.info(`CNAME for ${cdnDomain}:`, cname);
|
|
47
|
+
const existingCname = await AliyunService_1.AliyunService.getCnameRecordValue(baseDomain, dnsRr);
|
|
48
|
+
if (existingCname) {
|
|
49
|
+
if (existingCname !== cname) {
|
|
50
|
+
throw new Error(`Existing CNAME record for ${cdnDomain} points to ${existingCname}, not ${cname}.`);
|
|
51
|
+
}
|
|
52
|
+
cli_1.ui.success(`CNAME record already exists for ${cdnDomain}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await AliyunService_1.AliyunService.addRecord({
|
|
56
|
+
domainName: baseDomain,
|
|
57
|
+
rr: dnsRr,
|
|
58
|
+
type: "CNAME",
|
|
59
|
+
value: cname,
|
|
60
|
+
ttl: 600,
|
|
61
|
+
});
|
|
62
|
+
cli_1.ui.success(`Added CNAME record ${cdnDomain} -> ${cname}`);
|
|
63
|
+
}
|
|
64
|
+
if (!subdomain) {
|
|
65
|
+
const wwwCname = await AliyunService_1.AliyunService.getCnameRecordValue(baseDomain, "www");
|
|
66
|
+
if (wwwCname) {
|
|
67
|
+
if (wwwCname !== baseDomain) {
|
|
68
|
+
throw new Error(`Existing CNAME record for www.${baseDomain} points to ${wwwCname}, not ${baseDomain}.`);
|
|
69
|
+
}
|
|
70
|
+
cli_1.ui.success(`CNAME record already exists for www.${baseDomain}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
await AliyunService_1.AliyunService.addRecord({
|
|
74
|
+
domainName: baseDomain,
|
|
75
|
+
rr: "www",
|
|
76
|
+
type: "CNAME",
|
|
77
|
+
value: baseDomain,
|
|
78
|
+
ttl: 600,
|
|
79
|
+
});
|
|
80
|
+
cli_1.ui.success(`Added CNAME record www.${baseDomain} -> ${baseDomain}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
await AliyunService_1.AliyunService.enableHttpsCertificate(cdnDomain);
|
|
84
|
+
cli_1.ui.success(`Enabled HTTPS certificate for ${cdnDomain}`);
|
|
85
|
+
// await AliyunService.enableSpa404Fallback(cdnDomain)
|
|
86
|
+
// ui.success(`Enabled SPA 404 fallback for ${cdnDomain}`)
|
|
87
|
+
await AliyunService_1.AliyunService.enableSpaRewriteRule(cdnDomain);
|
|
88
|
+
cli_1.ui.success(`Enabled SPA rewrite rule for ${cdnDomain}`);
|
|
89
|
+
}
|
|
90
|
+
resolveCwd(target) {
|
|
91
|
+
return target ? node_path_1.default.resolve(process.cwd(), target) : process.cwd();
|
|
92
|
+
}
|
|
93
|
+
loadConfig(cwd) {
|
|
94
|
+
const configPath = node_path_1.default.join(cwd, ".pmate.yaml");
|
|
95
|
+
if (!(0, node_fs_1.existsSync)(configPath)) {
|
|
96
|
+
throw new Error(`No .pmate.yaml found in ${cwd}`);
|
|
97
|
+
}
|
|
98
|
+
const raw = (0, node_fs_1.readFileSync)(configPath, "utf8");
|
|
99
|
+
const parsed = yaml_1.default.parse(raw);
|
|
100
|
+
if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.apps)) {
|
|
101
|
+
throw new Error("Invalid .pmate.yaml: missing apps array");
|
|
102
|
+
}
|
|
103
|
+
return parsed;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.InitCommandHandler = InitCommandHandler;
|
|
107
|
+
//# sourceMappingURL=InitCommandHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InitCommandHandler.js","sourceRoot":"","sources":["../../src/commands/InitCommandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ListCommandHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
7
|
+
const yaml_1 = tslib_1.__importDefault(require("yaml"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const cli_1 = require("../cli");
|
|
10
|
+
class ListCommandHandler {
|
|
11
|
+
handle(args) {
|
|
12
|
+
if (args.type !== types_1.Command.List) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const targetDir = this.resolveTargetDir(args.targetPath);
|
|
16
|
+
const config = this.loadConfig(targetDir);
|
|
17
|
+
if (config.apps.length === 0) {
|
|
18
|
+
cli_1.ui.warn("No apps defined.");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
for (const app of config.apps) {
|
|
22
|
+
if (app && typeof app.app === "string") {
|
|
23
|
+
cli_1.ui.info(app.app);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
resolveTargetDir(targetPath) {
|
|
28
|
+
return targetPath ? node_path_1.default.resolve(process.cwd(), targetPath) : process.cwd();
|
|
29
|
+
}
|
|
30
|
+
loadConfig(targetDir) {
|
|
31
|
+
const configPath = node_path_1.default.join(targetDir, ".pmate.yaml");
|
|
32
|
+
if (!(0, node_fs_1.existsSync)(configPath)) {
|
|
33
|
+
throw new Error(`No .pmate.yaml found in ${targetDir}`);
|
|
34
|
+
}
|
|
35
|
+
const raw = (0, node_fs_1.readFileSync)(configPath, "utf8");
|
|
36
|
+
const parsed = yaml_1.default.parse(raw);
|
|
37
|
+
if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.apps)) {
|
|
38
|
+
throw new Error("Invalid .pmate.yaml: missing apps array");
|
|
39
|
+
}
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ListCommandHandler = ListCommandHandler;
|
|
44
|
+
//# sourceMappingURL=ListCommandHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListCommandHandler.js","sourceRoot":"","sources":["../../src/commands/ListCommandHandler.ts"],"names":[],"mappings":";;;;AAAA,qCAAkD;AAClD,kEAA4B;AAC5B,wDAAuB;AACvB,oCAA4D;AAC5D,gCAA2B;AAE3B,MAAa,kBAAkB;IAC7B,MAAM,CAAC,IAAiB;QACtB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAEzC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,QAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvC,QAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,UAAmB;QAC1C,OAAO,UAAU,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;IAC7E,CAAC;IAEO,UAAU,CAAC,SAAiB;QAClC,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACtD,IAAI,CAAC,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,cAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IACE,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAC5D,CAAC;QAED,OAAO,MAAqB,CAAA;IAC9B,CAAC;CACF;AAzCD,gDAyCC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LoginCommandHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_os_1 = tslib_1.__importDefault(require("node:os"));
|
|
7
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
8
|
+
const promises_1 = require("node:readline/promises");
|
|
9
|
+
const cli_1 = require("../cli");
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
class LoginCommandHandler {
|
|
12
|
+
async handle(args) {
|
|
13
|
+
if (args.type !== types_1.Command.Login) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const baseUrl = this.normalizeBaseUrl("https://auth.pmate.chat");
|
|
17
|
+
const rl = (0, promises_1.createInterface)({
|
|
18
|
+
input: process.stdin,
|
|
19
|
+
output: process.stdout,
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
const mobile = await this.promptRequired(rl, "Mobile: ");
|
|
23
|
+
const issue = await this.issueVCode(baseUrl, mobile);
|
|
24
|
+
cli_1.ui.info("Verification code issued.", issue);
|
|
25
|
+
const vcodeInput = await rl.question(`VCode (press enter to use mocked ${issue.vcode}): `);
|
|
26
|
+
const vcode = vcodeInput.trim() || issue.vcode;
|
|
27
|
+
const loginPayload = {
|
|
28
|
+
body: { type: "sms", mobile, vcode },
|
|
29
|
+
nonce: issue.nonce,
|
|
30
|
+
issuedAt: issue.issuedAt,
|
|
31
|
+
};
|
|
32
|
+
const loginResponse = await this.login(baseUrl, loginPayload);
|
|
33
|
+
const sessionPath = this.writeSession(loginResponse);
|
|
34
|
+
cli_1.ui.success(`Logged in. Session saved to ${sessionPath}`);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
rl.close();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
normalizeBaseUrl(value) {
|
|
41
|
+
return value.replace(/\/+$/, "");
|
|
42
|
+
}
|
|
43
|
+
async promptRequired(rl, question) {
|
|
44
|
+
while (true) {
|
|
45
|
+
const answer = (await rl.question(question)).trim();
|
|
46
|
+
if (answer) {
|
|
47
|
+
return answer;
|
|
48
|
+
}
|
|
49
|
+
cli_1.ui.warn("Please enter a value.");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async issueVCode(baseUrl, mobile) {
|
|
53
|
+
const response = await fetch(`${baseUrl}/vcode`, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "content-type": "application/json" },
|
|
56
|
+
body: JSON.stringify({ mobile, purpose: "login" }),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const detail = await response.text();
|
|
60
|
+
throw new Error(`Failed to issue vcode (${response.status}): ${detail || response.statusText}`);
|
|
61
|
+
}
|
|
62
|
+
const resp = (await response.json());
|
|
63
|
+
return resp.data;
|
|
64
|
+
}
|
|
65
|
+
async login(baseUrl, payload) {
|
|
66
|
+
const response = await fetch(`${baseUrl}/login`, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: { "content-type": "application/json" },
|
|
69
|
+
body: JSON.stringify(payload),
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
const detail = await response.text();
|
|
73
|
+
throw new Error(`Login failed (${response.status}): ${detail || response.statusText}`);
|
|
74
|
+
}
|
|
75
|
+
const resp = (await response.json());
|
|
76
|
+
return resp.data;
|
|
77
|
+
}
|
|
78
|
+
writeSession(session) {
|
|
79
|
+
const sessionDir = node_path_1.default.join(node_os_1.default.homedir(), ".pmate");
|
|
80
|
+
const sessionPath = node_path_1.default.join(sessionDir, "session.json");
|
|
81
|
+
(0, node_fs_1.mkdirSync)(sessionDir, { recursive: true });
|
|
82
|
+
(0, node_fs_1.writeFileSync)(sessionPath, JSON.stringify(session, null, 2), {
|
|
83
|
+
mode: 0o600,
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
(0, node_fs_1.chmodSync)(sessionPath, 0o600);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Best-effort permissions on filesystems that ignore chmod.
|
|
90
|
+
}
|
|
91
|
+
return sessionPath;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.LoginCommandHandler = LoginCommandHandler;
|
|
95
|
+
//# sourceMappingURL=LoginCommandHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginCommandHandler.js","sourceRoot":"","sources":["../../src/commands/LoginCommandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StsCommandHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_os_1 = tslib_1.__importDefault(require("node:os"));
|
|
7
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
8
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
9
|
+
const cli_1 = require("../cli");
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
class StsCommandHandler {
|
|
12
|
+
async handle(args) {
|
|
13
|
+
var _a;
|
|
14
|
+
if (args.type !== types_1.Command.Sts) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const session = this.readSession();
|
|
18
|
+
cli_1.ui.info("Session loaded.", session);
|
|
19
|
+
const token = (_a = session.token) === null || _a === void 0 ? void 0 : _a.trim();
|
|
20
|
+
if (!token) {
|
|
21
|
+
throw new Error("Missing session token. Run `pmate login` first.");
|
|
22
|
+
}
|
|
23
|
+
const baseUrl = "https://ci.pmate.chat";
|
|
24
|
+
const response = await fetch(`${baseUrl}/oss/sts`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
"content-type": "application/json",
|
|
28
|
+
authorization: `Bearer ${token}`,
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify({}),
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const detail = await response.text();
|
|
34
|
+
throw new Error(`STS request failed (${response.status}): ${detail || response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const payload = await response.json();
|
|
37
|
+
cli_1.ui.plain(chalk_1.default.cyan(JSON.stringify(payload, null, 2)));
|
|
38
|
+
}
|
|
39
|
+
readSession() {
|
|
40
|
+
const sessionPath = node_path_1.default.join(node_os_1.default.homedir(), ".pmate", "session.json");
|
|
41
|
+
if (!(0, node_fs_1.existsSync)(sessionPath)) {
|
|
42
|
+
throw new Error("Missing session. Run `pmate login` first.");
|
|
43
|
+
}
|
|
44
|
+
const raw = (0, node_fs_1.readFileSync)(sessionPath, "utf8");
|
|
45
|
+
return JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.StsCommandHandler = StsCommandHandler;
|
|
49
|
+
//# sourceMappingURL=StsCommandHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StsCommandHandler.js","sourceRoot":"","sources":["../../src/commands/StsCommandHandler.ts"],"names":[],"mappings":";;;;AAAA,qCAAkD;AAClD,8DAAwB;AACxB,kEAA4B;AAC5B,0DAAyB;AACzB,gCAA2B;AAC3B,oCAA+C;AAM/C,MAAa,iBAAiB;IAC5B,KAAK,CAAC,MAAM,CAAC,IAAiB;;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAO,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAClC,QAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,KAAK,0CAAE,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,uBAAuB,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACzB,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACpC,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,MAAM,MACpC,MAAM,IAAI,QAAQ,CAAC,UACrB,EAAE,CACH,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACrC,QAAE,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC;IAEO,WAAW;QACjB,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QACrE,IAAI,CAAC,IAAA,oBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAA;IACvC,CAAC;CACF;AA5CD,8CA4CC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function loadPmateEnv(): void;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadPmateEnv = loadPmateEnv;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_os_1 = tslib_1.__importDefault(require("node:os"));
|
|
7
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
8
|
+
const dotenv_1 = require("dotenv");
|
|
9
|
+
function loadPmateEnv() {
|
|
10
|
+
const configPath = node_path_1.default.join(node_os_1.default.homedir(), '.pmate', 'config');
|
|
11
|
+
if (!(0, node_fs_1.existsSync)(configPath)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const raw = (0, node_fs_1.readFileSync)(configPath, 'utf8');
|
|
15
|
+
try {
|
|
16
|
+
const parsed = (0, dotenv_1.parse)(raw);
|
|
17
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
18
|
+
if (process.env[key] === undefined) {
|
|
19
|
+
process.env[key] = value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
25
|
+
throw new Error(`Invalid dotenv in ${configPath}: ${message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAKA,oCAkBC;;AAvBD,qCAAmD;AACnD,8DAAyB;AACzB,kEAA6B;AAC7B,mCAA+B;AAE/B,SAAgB,YAAY;IAC1B,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,cAAK,EAAC,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED