@certd/plugin-cert 1.25.4 → 1.25.6

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 (38) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/access/eab-access.d.ts +4 -4
  3. package/dist/access/eab-access.js +48 -48
  4. package/dist/access/index.d.ts +1 -1
  5. package/dist/access/index.js +1 -1
  6. package/dist/dns-provider/api.d.ts +27 -27
  7. package/dist/dns-provider/api.js +1 -1
  8. package/dist/dns-provider/base.d.ts +8 -8
  9. package/dist/dns-provider/base.js +6 -6
  10. package/dist/dns-provider/decorator.d.ts +3 -3
  11. package/dist/dns-provider/decorator.js +26 -26
  12. package/dist/dns-provider/index.d.ts +4 -4
  13. package/dist/dns-provider/index.js +4 -4
  14. package/dist/dns-provider/registry.d.ts +2 -2
  15. package/dist/dns-provider/registry.js +2 -2
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +3 -3
  18. package/dist/plugin/cert-plugin/acme.d.ts +66 -66
  19. package/dist/plugin/cert-plugin/acme.js +280 -280
  20. package/dist/plugin/cert-plugin/base.d.ts +46 -46
  21. package/dist/plugin/cert-plugin/base.js +281 -281
  22. package/dist/plugin/cert-plugin/cert-reader.d.ts +34 -34
  23. package/dist/plugin/cert-plugin/cert-reader.js +112 -112
  24. package/dist/plugin/cert-plugin/convert.d.ts +21 -21
  25. package/dist/plugin/cert-plugin/convert.js +71 -71
  26. package/dist/plugin/cert-plugin/index.d.ts +18 -18
  27. package/dist/plugin/cert-plugin/index.js +208 -208
  28. package/dist/plugin/cert-plugin/lego/dns.d.ts +1 -1
  29. package/dist/plugin/cert-plugin/lego/dns.js +1 -1
  30. package/dist/plugin/cert-plugin/lego/index.d.ts +17 -17
  31. package/dist/plugin/cert-plugin/lego/index.js +172 -172
  32. package/dist/plugin/index.d.ts +2 -2
  33. package/dist/plugin/index.js +2 -2
  34. package/package.json +9 -7
  35. package/tsconfig.tsbuildinfo +1 -1
  36. package/stats.html +0 -6177
  37. package/test/user.secret.js +0 -7
  38. package/test/user.secret.ts +0 -4
@@ -1,172 +1,172 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { IsTaskPlugin, pluginGroups, RunStrategy, sp, TaskInput } from "@certd/pipeline";
11
- import { CertReader } from "../cert-reader.js";
12
- import { CertApplyBasePlugin } from "../base.js";
13
- import fs from "fs";
14
- import path from "path";
15
- export { CertReader };
16
- let CertApplyLegoPlugin = class CertApplyLegoPlugin extends CertApplyBasePlugin {
17
- // @TaskInput({
18
- // title: "ACME服务端点",
19
- // default: "https://acme-v02.api.letsencrypt.org/directory",
20
- // component: {
21
- // name: "a-select",
22
- // vModel: "value",
23
- // options: [
24
- // { value: "https://acme-v02.api.letsencrypt.org/directory", label: "Let's Encrypt" },
25
- // { value: "https://letsencrypt.proxy.handsfree.work/directory", label: "Let's Encrypt代理,letsencrypt.org无法访问时使用" },
26
- // ],
27
- // },
28
- // required: true,
29
- // })
30
- acmeServer;
31
- dnsType;
32
- environment;
33
- legoEabAccessId;
34
- customArgs = "";
35
- eab;
36
- async onInstance() {
37
- this.accessService = this.ctx.accessService;
38
- this.logger = this.ctx.logger;
39
- this.userContext = this.ctx.userContext;
40
- this.http = this.ctx.http;
41
- this.lastStatus = this.ctx.lastStatus;
42
- if (this.legoEabAccessId) {
43
- this.eab = await this.accessService.getById(this.legoEabAccessId);
44
- }
45
- }
46
- async onInit() { }
47
- async doCertApply() {
48
- const env = {};
49
- const env_lines = this.environment.split("\n");
50
- for (const line of env_lines) {
51
- const [key, value] = line.trim().split("=");
52
- env[key] = value.trim();
53
- }
54
- let domainArgs = "";
55
- for (const domain of this.domains) {
56
- domainArgs += ` -d "${domain}"`;
57
- }
58
- this.logger.info(`环境变量:${JSON.stringify(env)}`);
59
- let eabArgs = "";
60
- if (this.eab) {
61
- eabArgs = ` --eab "${this.eab.kid}" --kid "${this.eab.kid}" --hmac "${this.eab.hmacKey}"`;
62
- }
63
- const keyType = "-k rsa2048";
64
- const saveDir = `./data/.lego/pipeline_${this.pipeline.id}/`;
65
- const savePathArgs = `--path "${saveDir}"`;
66
- const os_type = process.platform === "win32" ? "windows" : "linux";
67
- const legoPath = path.resolve("./tools", os_type, "lego");
68
- let serverArgs = "";
69
- if (this.acmeServer) {
70
- serverArgs = ` --server ${this.acmeServer}`;
71
- }
72
- const cmds = [
73
- `${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || ""} run`,
74
- ];
75
- await sp.spawn({
76
- cmd: cmds,
77
- logger: this.logger,
78
- env,
79
- });
80
- //读取证书文件
81
- // example.com.crt
82
- // example.com.issuer.crt
83
- // example.com.json
84
- // example.com.key
85
- let domain1 = this.domains[0];
86
- domain1 = domain1.replaceAll("*", "_");
87
- const crtPath = path.resolve(saveDir, "certificates", `${domain1}.crt`);
88
- if (fs.existsSync(crtPath) === false) {
89
- throw new Error(`证书文件不存在,证书申请失败:${crtPath}`);
90
- }
91
- const crt = fs.readFileSync(crtPath, "utf8");
92
- const keyPath = path.resolve(saveDir, "certificates", `${domain1}.key`);
93
- const key = fs.readFileSync(keyPath, "utf8");
94
- const csr = "";
95
- const cert = { crt, key, csr };
96
- const certInfo = this.formatCerts(cert);
97
- return new CertReader(certInfo);
98
- }
99
- };
100
- __decorate([
101
- TaskInput({
102
- title: "DNS类型",
103
- component: {
104
- name: "a-input",
105
- vModel: "value",
106
- placeholder: "alidns",
107
- },
108
- helper: "你的域名是通过哪家提供商进行解析的,具体应该配置什么请参考lego文档:https://go-acme.github.io/lego/dns/",
109
- required: true,
110
- }),
111
- __metadata("design:type", String)
112
- ], CertApplyLegoPlugin.prototype, "dnsType", void 0);
113
- __decorate([
114
- TaskInput({
115
- title: "环境变量",
116
- component: {
117
- name: "a-textarea",
118
- vModel: "value",
119
- rows: 4,
120
- placeholder: "ALICLOUD_ACCESS_KEY=abcdefghijklmnopqrstuvwx\nALICLOUD_SECRET_KEY=your-secret-key",
121
- },
122
- required: true,
123
- helper: "一行一条,例如 appKeyId=xxxxx,具体配置请参考lego文档:https://go-acme.github.io/lego/dns/",
124
- }),
125
- __metadata("design:type", String)
126
- ], CertApplyLegoPlugin.prototype, "environment", void 0);
127
- __decorate([
128
- TaskInput({
129
- title: "EAB授权",
130
- component: {
131
- name: "pi-access-selector",
132
- type: "eab",
133
- },
134
- maybeNeed: true,
135
- helper: "如果需要提供EAB授权",
136
- }),
137
- __metadata("design:type", Number)
138
- ], CertApplyLegoPlugin.prototype, "legoEabAccessId", void 0);
139
- __decorate([
140
- TaskInput({
141
- title: "自定义LEGO参数",
142
- component: {
143
- name: "a-input",
144
- vModel: "value",
145
- placeholder: "--dns-timeout 30",
146
- },
147
- helper: "额外的lego命令行参数,参考文档:https://go-acme.github.io/lego/usage/cli/options/",
148
- maybeNeed: true,
149
- }),
150
- __metadata("design:type", Object)
151
- ], CertApplyLegoPlugin.prototype, "customArgs", void 0);
152
- CertApplyLegoPlugin = __decorate([
153
- IsTaskPlugin({
154
- name: "CertApplyLego",
155
- icon: "ph:certificate",
156
- title: "证书申请(Lego)",
157
- group: pluginGroups.cert.key,
158
- desc: "支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上",
159
- default: {
160
- input: {
161
- renewDays: 20,
162
- forceUpdate: false,
163
- },
164
- strategy: {
165
- runStrategy: RunStrategy.AlwaysRun,
166
- },
167
- },
168
- })
169
- ], CertApplyLegoPlugin);
170
- export { CertApplyLegoPlugin };
171
- new CertApplyLegoPlugin();
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGx1Z2luL2NlcnQtcGx1Z2luL2xlZ28vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBUSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUVwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBbUJmLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW9CLFNBQVEsbUJBQW1CO0lBQzFELGVBQWU7SUFDZix1QkFBdUI7SUFDdkIsK0RBQStEO0lBQy9ELGlCQUFpQjtJQUNqQix3QkFBd0I7SUFDeEIsdUJBQXVCO0lBQ3ZCLGlCQUFpQjtJQUNqQiw2RkFBNkY7SUFDN0YsMEhBQTBIO0lBQzFILFNBQVM7SUFDVCxPQUFPO0lBQ1Asb0JBQW9CO0lBQ3BCLEtBQUs7SUFDTCxVQUFVLENBQVU7SUFZcEIsT0FBTyxDQUFVO0lBYWpCLFdBQVcsQ0FBVTtJQVdyQixlQUFlLENBQVU7SUFZekIsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUVoQixHQUFHLENBQWE7SUFFaEIsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FB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
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { IsTaskPlugin, pluginGroups, RunStrategy, sp, TaskInput } from "@certd/pipeline";
11
+ import { CertReader } from "../cert-reader.js";
12
+ import { CertApplyBasePlugin } from "../base.js";
13
+ import fs from "fs";
14
+ import path from "path";
15
+ export { CertReader };
16
+ let CertApplyLegoPlugin = class CertApplyLegoPlugin extends CertApplyBasePlugin {
17
+ // @TaskInput({
18
+ // title: "ACME服务端点",
19
+ // default: "https://acme-v02.api.letsencrypt.org/directory",
20
+ // component: {
21
+ // name: "a-select",
22
+ // vModel: "value",
23
+ // options: [
24
+ // { value: "https://acme-v02.api.letsencrypt.org/directory", label: "Let's Encrypt" },
25
+ // { value: "https://letsencrypt.proxy.handsfree.work/directory", label: "Let's Encrypt代理,letsencrypt.org无法访问时使用" },
26
+ // ],
27
+ // },
28
+ // required: true,
29
+ // })
30
+ acmeServer;
31
+ dnsType;
32
+ environment;
33
+ legoEabAccessId;
34
+ customArgs = "";
35
+ eab;
36
+ async onInstance() {
37
+ this.accessService = this.ctx.accessService;
38
+ this.logger = this.ctx.logger;
39
+ this.userContext = this.ctx.userContext;
40
+ this.http = this.ctx.http;
41
+ this.lastStatus = this.ctx.lastStatus;
42
+ if (this.legoEabAccessId) {
43
+ this.eab = await this.accessService.getById(this.legoEabAccessId);
44
+ }
45
+ }
46
+ async onInit() { }
47
+ async doCertApply() {
48
+ const env = {};
49
+ const env_lines = this.environment.split("\n");
50
+ for (const line of env_lines) {
51
+ const [key, value] = line.trim().split("=");
52
+ env[key] = value.trim();
53
+ }
54
+ let domainArgs = "";
55
+ for (const domain of this.domains) {
56
+ domainArgs += ` -d "${domain}"`;
57
+ }
58
+ this.logger.info(`环境变量:${JSON.stringify(env)}`);
59
+ let eabArgs = "";
60
+ if (this.eab) {
61
+ eabArgs = ` --eab "${this.eab.kid}" --kid "${this.eab.kid}" --hmac "${this.eab.hmacKey}"`;
62
+ }
63
+ const keyType = "-k rsa2048";
64
+ const saveDir = `./data/.lego/pipeline_${this.pipeline.id}/`;
65
+ const savePathArgs = `--path "${saveDir}"`;
66
+ const os_type = process.platform === "win32" ? "windows" : "linux";
67
+ const legoPath = path.resolve("./tools", os_type, "lego");
68
+ let serverArgs = "";
69
+ if (this.acmeServer) {
70
+ serverArgs = ` --server ${this.acmeServer}`;
71
+ }
72
+ const cmds = [
73
+ `${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || ""} run`,
74
+ ];
75
+ await sp.spawn({
76
+ cmd: cmds,
77
+ logger: this.logger,
78
+ env,
79
+ });
80
+ //读取证书文件
81
+ // example.com.crt
82
+ // example.com.issuer.crt
83
+ // example.com.json
84
+ // example.com.key
85
+ let domain1 = this.domains[0];
86
+ domain1 = domain1.replaceAll("*", "_");
87
+ const crtPath = path.resolve(saveDir, "certificates", `${domain1}.crt`);
88
+ if (fs.existsSync(crtPath) === false) {
89
+ throw new Error(`证书文件不存在,证书申请失败:${crtPath}`);
90
+ }
91
+ const crt = fs.readFileSync(crtPath, "utf8");
92
+ const keyPath = path.resolve(saveDir, "certificates", `${domain1}.key`);
93
+ const key = fs.readFileSync(keyPath, "utf8");
94
+ const csr = "";
95
+ const cert = { crt, key, csr };
96
+ const certInfo = this.formatCerts(cert);
97
+ return new CertReader(certInfo);
98
+ }
99
+ };
100
+ __decorate([
101
+ TaskInput({
102
+ title: "DNS类型",
103
+ component: {
104
+ name: "a-input",
105
+ vModel: "value",
106
+ placeholder: "alidns",
107
+ },
108
+ helper: "你的域名是通过哪家提供商进行解析的,具体应该配置什么请参考lego文档:https://go-acme.github.io/lego/dns/",
109
+ required: true,
110
+ }),
111
+ __metadata("design:type", String)
112
+ ], CertApplyLegoPlugin.prototype, "dnsType", void 0);
113
+ __decorate([
114
+ TaskInput({
115
+ title: "环境变量",
116
+ component: {
117
+ name: "a-textarea",
118
+ vModel: "value",
119
+ rows: 4,
120
+ placeholder: "ALICLOUD_ACCESS_KEY=abcdefghijklmnopqrstuvwx\nALICLOUD_SECRET_KEY=your-secret-key",
121
+ },
122
+ required: true,
123
+ helper: "一行一条,例如 appKeyId=xxxxx,具体配置请参考lego文档:https://go-acme.github.io/lego/dns/",
124
+ }),
125
+ __metadata("design:type", String)
126
+ ], CertApplyLegoPlugin.prototype, "environment", void 0);
127
+ __decorate([
128
+ TaskInput({
129
+ title: "EAB授权",
130
+ component: {
131
+ name: "pi-access-selector",
132
+ type: "eab",
133
+ },
134
+ maybeNeed: true,
135
+ helper: "如果需要提供EAB授权",
136
+ }),
137
+ __metadata("design:type", Number)
138
+ ], CertApplyLegoPlugin.prototype, "legoEabAccessId", void 0);
139
+ __decorate([
140
+ TaskInput({
141
+ title: "自定义LEGO参数",
142
+ component: {
143
+ name: "a-input",
144
+ vModel: "value",
145
+ placeholder: "--dns-timeout 30",
146
+ },
147
+ helper: "额外的lego命令行参数,参考文档:https://go-acme.github.io/lego/usage/cli/options/",
148
+ maybeNeed: true,
149
+ }),
150
+ __metadata("design:type", Object)
151
+ ], CertApplyLegoPlugin.prototype, "customArgs", void 0);
152
+ CertApplyLegoPlugin = __decorate([
153
+ IsTaskPlugin({
154
+ name: "CertApplyLego",
155
+ icon: "ph:certificate",
156
+ title: "证书申请(Lego)",
157
+ group: pluginGroups.cert.key,
158
+ desc: "支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上",
159
+ default: {
160
+ input: {
161
+ renewDays: 20,
162
+ forceUpdate: false,
163
+ },
164
+ strategy: {
165
+ runStrategy: RunStrategy.AlwaysRun,
166
+ },
167
+ },
168
+ })
169
+ ], CertApplyLegoPlugin);
170
+ export { CertApplyLegoPlugin };
171
+ new CertApplyLegoPlugin();
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGx1Z2luL2NlcnQtcGx1Z2luL2xlZ28vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBUSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUVwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBbUJmLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW9CLFNBQVEsbUJBQW1CO0lBQzFELGVBQWU7SUFDZix1QkFBdUI7SUFDdkIsK0RBQStEO0lBQy9ELGlCQUFpQjtJQUNqQix3QkFBd0I7SUFDeEIsdUJBQXVCO0lBQ3ZCLGlCQUFpQjtJQUNqQiw2RkFBNkY7SUFDN0YsMEhBQTBIO0lBQzFILFNBQVM7SUFDVCxPQUFPO0lBQ1Asb0JBQW9CO0lBQ3BCLEtBQUs7SUFDTCxVQUFVLENBQVU7SUFZcEIsT0FBTyxDQUFVO0lBYWpCLFdBQVcsQ0FBVTtJQVdyQixlQUFlLENBQVU7SUFZekIsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUVoQixHQUFHLENBQWE7SUFFaEIsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FB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
@@ -1,2 +1,2 @@
1
- export * from "./cert-plugin/index.js";
2
- export * from "./cert-plugin/lego/index.js";
1
+ export * from "./cert-plugin/index.js";
2
+ export * from "./cert-plugin/lego/index.js";
@@ -1,3 +1,3 @@
1
- export * from "./cert-plugin/index.js";
2
- export * from "./cert-plugin/lego/index.js";
1
+ export * from "./cert-plugin/index.js";
2
+ export * from "./cert-plugin/lego/index.js";
3
3
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2luL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw2QkFBNkIsQ0FBQyJ9
package/package.json CHANGED
@@ -1,23 +1,25 @@
1
1
  {
2
2
  "name": "@certd/plugin-cert",
3
3
  "private": false,
4
- "version": "1.25.4",
4
+ "version": "1.25.6",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "scripts": {
9
9
  "dev": "vite",
10
- "build": "tsc --skipLibCheck",
10
+ "before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
11
+ "build": "npm run before-build &&tsc --skipLibCheck",
11
12
  "build3": "rollup -c",
12
13
  "build2": "vue-tsc --noEmit && vite build",
13
14
  "preview": "vite preview"
14
15
  },
15
16
  "dependencies": {
16
- "@certd/acme-client": "^1.25.4",
17
- "@certd/pipeline": "^1.25.4",
17
+ "@certd/acme-client": "^1.25.6",
18
+ "@certd/pipeline": "^1.25.6",
18
19
  "jszip": "^3.10.1",
19
20
  "node-forge": "^0.10.0",
20
- "psl": "^1.9.0"
21
+ "psl": "^1.9.0",
22
+ "rimraf": "^5.0.5"
21
23
  },
22
24
  "devDependencies": {
23
25
  "@alicloud/cs20151215": "^3.0.3",
@@ -49,9 +51,9 @@
49
51
  "rollup-plugin-visualizer": "^5.8.2",
50
52
  "ts-node": "^10.9.1",
51
53
  "tslib": "^2.5.2",
52
- "typescript": "^4.8.4",
54
+ "typescript": "^5.4.2",
53
55
  "vite": "^3.1.0",
54
56
  "vue-tsc": "^0.38.9"
55
57
  },
56
- "gitHead": "03ce69dbfb317db7a3688d33ccc17ef06fd68393"
58
+ "gitHead": "5668a3e2225059d9d2d236e698b020e272bba076"
57
59
  }