vite-add-cdn-script 0.0.9 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.js CHANGED
@@ -1,22 +1,23 @@
1
- var D = Object.defineProperty;
2
- var F = (n, t, e) => t in n ? D(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
3
- var f = (n, t, e) => (F(n, typeof t != "symbol" ? t + "" : t, e), e);
4
- import J from "node:path";
5
- import j from "node:fs";
6
- import E from "node:https";
7
- class L {
1
+ var q = Object.defineProperty;
2
+ var G = (r, t, e) => t in r ? q(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
+ var g = (r, t, e) => (G(r, typeof t != "symbol" ? t + "" : t, e), e);
4
+ import A from "node:path";
5
+ import E from "node:fs";
6
+ import O from "node-fetch";
7
+ import V from "semver";
8
+ class B {
8
9
  constructor() {
9
- f(this, "cdnCache", {});
10
- f(this, "cdnCachePath", "");
11
- this.cdnCachePath = J.resolve(process.cwd(), "./.cdn-cache.json");
10
+ g(this, "cdnCache", {});
11
+ g(this, "cdnCachePath", "");
12
+ this.cdnCachePath = A.resolve(process.cwd(), "./.cdn-cache.json");
12
13
  }
13
14
  // 初始化cdn缓存
14
15
  async init() {
15
16
  try {
16
- const t = await j.readFileSync(this.cdnCachePath, "utf-8");
17
+ const t = await E.readFileSync(this.cdnCachePath, "utf-8");
17
18
  this.cdnCache = JSON.parse(t);
18
19
  } catch {
19
- console.log("cdn缓存文件不存在,创建缓存文件"), this.cdnCache = {}, await j.writeFileSync(this.cdnCachePath, "", "utf-8");
20
+ console.log("cdn缓存文件不存在,创建缓存文件"), this.cdnCache = {}, await E.writeFileSync(this.cdnCachePath, "", "utf-8");
20
21
  }
21
22
  }
22
23
  /**
@@ -25,8 +26,8 @@ class L {
25
26
  * @param version 版本
26
27
  */
27
28
  getCdnCache(t, e) {
28
- var r;
29
- return (r = this.cdnCache[t]) == null ? void 0 : r[e];
29
+ var s;
30
+ return (s = this.cdnCache[t]) == null ? void 0 : s[e];
30
31
  }
31
32
  /**
32
33
  * 设置cdn缓存
@@ -34,25 +35,45 @@ class L {
34
35
  * @param version 版本
35
36
  * @param urls 地址列表
36
37
  */
37
- setCdnCache(t, e, r) {
38
- this.cdnCache[t] ? this.cdnCache[t][e] = r : this.cdnCache[t] = {
39
- [e]: r
38
+ setCdnCache(t, e, s) {
39
+ this.cdnCache[t] ? this.cdnCache[t][e] = s : this.cdnCache[t] = {
40
+ [e]: s
40
41
  };
41
42
  }
42
43
  /**
43
44
  * 更新cdn缓存
44
45
  */
45
46
  async save() {
46
- await j.writeFileSync(this.cdnCachePath, JSON.stringify(this.cdnCache), "utf-8");
47
+ await E.writeFileSync(this.cdnCachePath, JSON.stringify(this.cdnCache), "utf-8");
48
+ }
49
+ }
50
+ let U;
51
+ const z = async () => (U || (U = new B(), await U.init()), U);
52
+ class u extends Error {
53
+ constructor(t) {
54
+ super(t), this.name = "NetworkError";
55
+ }
56
+ }
57
+ class P extends u {
58
+ constructor({ packageName: t, version: e, cdn: s }) {
59
+ super(`${s} ${t}@${e} 网络请求失败`), this.name = "PackageNetworkError";
60
+ }
61
+ }
62
+ class m extends Error {
63
+ constructor({ packageName: t, version: e, cdn: s }) {
64
+ super(`${s}上没有${t}@${e}的版本`), this.name = "NoVersionError";
65
+ }
66
+ }
67
+ class K extends Error {
68
+ constructor({ packageName: t, version: e, cdn: s }) {
69
+ super(`在 ${s} 中找不到 ${t}@${e} 文件,请检查包名或版本号`), this.name = "GetFileListError";
47
70
  }
48
71
  }
49
- let y;
50
- const I = async () => (y || (y = new L(), await y.init()), y);
51
72
  class N {
52
73
  constructor(t) {
53
- f(this, "_max");
54
- f(this, "_count");
55
- f(this, "_taskQueue");
74
+ g(this, "_max");
75
+ g(this, "_count");
76
+ g(this, "_taskQueue");
56
77
  this._max = t || 5, this._count = 0, this._taskQueue = [];
57
78
  }
58
79
  /**
@@ -62,9 +83,9 @@ class N {
62
83
  * @returns {Promise<any>} 返回一个promise
63
84
  */
64
85
  call(t, ...e) {
65
- return new Promise((r, s) => {
66
- const c = this._createTask(t, e, r, s);
67
- this._count >= this._max ? this._taskQueue.push(c) : c();
86
+ return new Promise((s, n) => {
87
+ const o = this._createTask(t, e, s, n);
88
+ this._count >= this._max ? this._taskQueue.push(o) : o();
68
89
  });
69
90
  }
70
91
  /**
@@ -76,138 +97,217 @@ class N {
76
97
  * @returns {Function} 返回一个任务函数
77
98
  * @private
78
99
  */
79
- _createTask(t, e, r, s) {
100
+ _createTask(t, e, s, n) {
80
101
  return () => {
81
- t(...e).then(r).catch(s).finally(() => {
102
+ t(...e).then(s).catch(n).finally(() => {
82
103
  this._count--, this._taskQueue.length && this._taskQueue.shift()();
83
104
  }), this._count++;
84
105
  };
85
106
  }
86
107
  }
87
- const U = new N(5), R = {
108
+ const _ = new N(5), J = async (r) => {
109
+ try {
110
+ const t = await O(r, { method: "HEAD", redirect: "manual" });
111
+ return t.status >= 300 && t.status < 400 ? await J(t.headers.get("location") || "") : r;
112
+ } catch (t) {
113
+ throw Promise.reject(new u(t.message));
114
+ }
115
+ }, W = {
88
116
  //get请求封装
89
- get: (n, t, e) => new Promise((r, s) => {
117
+ get: async (r) => {
90
118
  try {
91
- E.get(n, (c) => {
92
- let i = "";
93
- c.on("data", (o) => {
94
- i += o;
95
- }), c.on("end", () => {
96
- t == null || t(i), r(i);
97
- });
98
- }).on("error", function(c) {
99
- e == null || e(c), s(c);
119
+ const t = await O(r);
120
+ if (t.ok) {
121
+ const e = t.headers.get("content-type"), s = await t.text();
122
+ return e && e.includes("application/json") ? JSON.parse(s) : s;
123
+ } else
124
+ throw new u(`请求失败,状态码:${t.status}`);
125
+ } catch (t) {
126
+ throw new u(t.message);
127
+ }
128
+ }
129
+ }, $ = {
130
+ get: _.call.bind(_, W.get)
131
+ }, X = async (r, t) => {
132
+ try {
133
+ const e = await $.get(`https://api.bootcdn.cn/libraries/${r}`);
134
+ if (e.length === 0)
135
+ throw new m({
136
+ packageName: r,
137
+ version: t,
138
+ cdn: "bootcdn"
139
+ });
140
+ const s = e[0], o = s.assets.reverse().find((c) => {
141
+ if (V.satisfies(c.version, t))
142
+ return !0;
143
+ });
144
+ if (!o)
145
+ throw new m({
146
+ packageName: r,
147
+ version: t,
148
+ cdn: "bootcdn"
149
+ });
150
+ return { fileList: o.files.map((c) => ({
151
+ name: "/" + c
152
+ })), recommendFileName: s.filename, version: o.version };
153
+ } catch (e) {
154
+ throw e instanceof u ? new P({
155
+ packageName: r,
156
+ version: t,
157
+ cdn: "unpkg"
158
+ }) : e;
159
+ }
160
+ }, Y = (r, t, e) => `https://cdn.bootcdn.net/ajax/libs/${r}/${t}${e}`, Z = {
161
+ getFileList: X,
162
+ getUrl: Y
163
+ };
164
+ async function M(r, t, e = !1) {
165
+ try {
166
+ if (!e && t.match(/^\D/)) {
167
+ const n = await et(r, t);
168
+ for (let o of n)
169
+ if (V.satisfies(o, t))
170
+ return M(r, o, !0);
171
+ throw new m({
172
+ packageName: r,
173
+ version: t,
174
+ cdn: "cdnjs"
100
175
  });
101
- } catch (c) {
102
- e == null || e(c), s(c);
103
176
  }
104
- })
105
- }, w = {
106
- get: U.call.bind(U, R.get)
107
- }, A = {
108
- getFileList: (n, t) => new Promise((e, r) => {
109
- w.get(
110
- `https://api.bootcdn.cn/libraries/${n}`,
111
- (s) => {
112
- const c = JSON.parse(s);
113
- if (c.length === 0) {
114
- r(new Error(`${n} not found in bootcdn`));
115
- return;
116
- }
117
- const i = c[0], a = i.assets.find((d) => d.version === t);
118
- if (!a) {
119
- r(new Error(`${n}@${t} not found in ${i.name}`));
120
- return;
121
- }
122
- const l = a.files.map((d) => ({
123
- name: "/" + d
124
- }));
125
- e({ fileList: l, recommendFileName: i.filename });
126
- },
127
- (s) => {
128
- r(s);
129
- }
130
- );
131
- }),
132
- getUrl: (n, t, e) => `https://cdn.bootcdn.net/ajax/libs/${n}/${t}${e}`
133
- }, M = {
134
- getFileList: (n, t) => new Promise((e, r) => {
135
- w.get(
136
- `https://api.cdnjs.com/libraries/${n}/${t}`,
137
- (s) => {
138
- const c = JSON.parse(s);
139
- if (c.error) {
140
- r(new Error(`cdnjs: ${n}@${t} not found`));
141
- return;
142
- }
143
- e({
144
- fileList: c.rawFiles.map((i) => ({
145
- name: "/" + i
146
- }))
147
- });
148
- },
149
- (s) => {
150
- r(s);
151
- }
152
- );
153
- }),
154
- getUrl: (n, t, e) => `https://cdnjs.cloudflare.com/ajax/libs/${n}/${t}${e}`
155
- }, V = {
156
- getFileList: (n, t) => new Promise((e, r) => {
157
- w.get(
158
- `https://data.jsdelivr.com/v1/stats/packages/npm/${n}@${t}/files`,
159
- (s) => {
160
- const c = JSON.parse(s);
161
- if (c.length === 0) {
162
- r(new Error(`${n}@${t} not found`));
163
- return;
164
- }
165
- e({ fileList: c });
166
- },
167
- (s) => {
168
- r(s);
169
- }
170
- );
171
- }),
177
+ const s = await $.get(`https://api.cdnjs.com/libraries/${r}/${t}`);
178
+ if (s.error)
179
+ throw new m({
180
+ packageName: r,
181
+ version: t,
182
+ cdn: "cdnjs"
183
+ });
184
+ return {
185
+ fileList: s.rawFiles.map((n) => ({
186
+ name: "/" + n
187
+ })),
188
+ version: t
189
+ };
190
+ } catch (s) {
191
+ throw s instanceof u ? new P({
192
+ packageName: r,
193
+ version: t,
194
+ cdn: "unpkg"
195
+ }) : s;
196
+ }
197
+ }
198
+ const tt = (r, t, e) => `https://cdnjs.cloudflare.com/ajax/libs/${r}/${t}${e}`, et = async (r, t) => {
199
+ try {
200
+ return (await $.get(`https://api.cdnjs.com/libraries/${r}?fields=versions`)).versions;
201
+ } catch (e) {
202
+ throw e instanceof u ? new P({
203
+ packageName: r,
204
+ version: t,
205
+ cdn: "unpkg"
206
+ }) : e;
207
+ }
208
+ }, rt = {
209
+ getFileList: M,
210
+ getUrl: tt
211
+ }, I = (r, t = "") => r.reduce((e, s) => (s.type === "file" ? e.push({ name: `${t}/${s.name}` }) : s.files && e.push(...I(s.files, `${t}/${s.name}`)), e), []);
212
+ async function Q(r, t, e = !1) {
213
+ try {
214
+ if (!e && t.match(/^\D/)) {
215
+ const n = await nt(r, t);
216
+ if (typeof n == "string")
217
+ return Q(r, n, !0);
218
+ throw new m({
219
+ packageName: r,
220
+ version: t,
221
+ cdn: "jsdelivr"
222
+ });
223
+ }
224
+ const s = await $.get(`https://data.jsdelivr.com/v1/packages/npm/${r}@${t}`);
225
+ if (s.status)
226
+ throw new m({
227
+ packageName: r,
228
+ version: t,
229
+ cdn: "jsdelivr"
230
+ });
231
+ return { fileList: I(s.files), version: t };
232
+ } catch (s) {
233
+ throw s instanceof u ? new P({
234
+ packageName: r,
235
+ version: t,
236
+ cdn: "unpkg"
237
+ }) : s;
238
+ }
239
+ }
240
+ const st = (r, t, e) => `https://cdn.jsdelivr.net/npm/${r}@${t}${e}`, nt = async (r, t) => {
241
+ try {
242
+ return (await $.get(
243
+ `https://data.jsdelivr.com/v1/packages/npm/${r}/resolved?specifier=${t}`
244
+ )).version;
245
+ } catch (e) {
246
+ throw e instanceof u ? new P({
247
+ packageName: r,
248
+ version: t,
249
+ cdn: "unpkg"
250
+ }) : e;
251
+ }
252
+ }, ct = {
253
+ getFileList: Q,
172
254
  // 拼接url
173
- getUrl: (n, t, e) => `https://cdn.jsdelivr.net/npm/${n}@${t}${e}`
174
- }, b = (n) => n.reduce((t, e) => (e.type === "file" ? t.push({ name: e.path }) : e.files && t.push(...b(e.files)), t), []), T = {
175
- getFileList: (n, t) => new Promise((e, r) => {
176
- w.get(
177
- `https://unpkg.com/${n}@${t}/?meta`,
178
- (s) => {
179
- const c = JSON.parse(s);
180
- e({ fileList: b(c.files || []) });
181
- },
182
- (s) => {
183
- r(s);
184
- }
185
- );
186
- }),
187
- getUrl: (n, t, e) => `https://unpkg.com/${n}@${t}${e}`
188
- }, Q = async (n) => {
189
- const t = /^(https?:\/\/.*\d+\.\d+\.\d+\/).+?\.js$/;
190
- if (t.test(n)) {
191
- const e = n.replace(t, (r, s) => `${s}package.json`);
192
- return JSON.parse(await w.get(e));
193
- } else
194
- throw new Error(`${n} 不是正确的url`);
195
- }, q = (n, t) => {
196
- var e, r;
197
- return ((e = n.dependencies) == null ? void 0 : e[t]) || ((r = n.devDependencies) == null ? void 0 : r[t]);
198
- }, H = async (n, t, e) => {
199
- var i;
200
- const r = (i = t.match(/\d+(.\d+)?(.\d+)?/)) == null ? void 0 : i[0];
201
- if (!r)
202
- throw new Error(`${n} version ${t} is not valid`);
203
- const s = await v[e].getFileList(n, r).catch((o) => {
204
- throw console.log(o), new Error(`${n} ${t} ${e} API 请求失败`);
205
- }), c = B(s, n);
206
- if (!c)
207
- throw new Error(`在 ${e} 中找不到 ${n}@${r} 文件,请检查包名或版本号`);
208
- return v[e].getUrl(n, r, c);
209
- }, B = ({ fileList: n }, t) => {
210
- var c, i;
255
+ getUrl: st
256
+ }, T = (r) => r.reduce((t, e) => (e.type === "file" ? t.push({ name: e.path }) : e.files && t.push(...T(e.files)), t), []);
257
+ async function ot(r, t) {
258
+ var e;
259
+ try {
260
+ const n = (e = (await J(`https://unpkg.com/${r}@${t}/?meta`)).match(new RegExp("(?<=@)\\d+\\.\\d+\\.\\d+(?=\\/\\?meta)"))) == null ? void 0 : e[0];
261
+ if (n) {
262
+ const o = await $.get(`https://unpkg.com/${r}@${n}/?meta`);
263
+ return { fileList: T(o.files || []), version: n };
264
+ } else
265
+ throw new m({
266
+ packageName: r,
267
+ version: t,
268
+ cdn: "unpkg"
269
+ });
270
+ } catch (s) {
271
+ throw s instanceof u ? new P({
272
+ packageName: r,
273
+ version: t,
274
+ cdn: "unpkg"
275
+ }) : s;
276
+ }
277
+ }
278
+ function it(r, t, e) {
279
+ return `https://unpkg.com/${r}@${t}${e}`;
280
+ }
281
+ const at = {
282
+ getFileList: ot,
283
+ getUrl: it
284
+ }, lt = async (r) => {
285
+ try {
286
+ const t = /^(https?:\/\/.*\d+\.\d+\.\d+\/).+?\.js$/;
287
+ if (t.test(r)) {
288
+ const e = r.replace(t, (s, n) => `${n}package.json`);
289
+ return await $.get(e);
290
+ } else
291
+ throw new Error(`${r} 不是正确的url`);
292
+ } catch (t) {
293
+ throw t;
294
+ }
295
+ }, ut = (r, t) => {
296
+ var e, s;
297
+ return ((e = r.dependencies) == null ? void 0 : e[t]) || ((s = r.devDependencies) == null ? void 0 : s[t]);
298
+ }, dt = async (r, t, e) => {
299
+ if (!t.match(/\d+(.\d+)?(.\d+)?/))
300
+ throw new Error(`${r} version ${t} is not valid`);
301
+ const n = await D[e].getFileList(r, t), o = ht(n, r);
302
+ if (!o)
303
+ throw new K({
304
+ packageName: r,
305
+ version: t,
306
+ cdn: e
307
+ });
308
+ return D[e].getUrl(r, n.version, o);
309
+ }, ht = ({ fileList: r }, t) => {
310
+ var o, a;
211
311
  let e = [
212
312
  `umd/${t}.production.min.js`,
213
313
  /umd\/.+?\.production\.min\.js$/,
@@ -225,153 +325,218 @@ const U = new N(5), R = {
225
325
  /\.min\.js$/,
226
326
  /\.js$/
227
327
  ];
228
- const r = ["runtime", "compiler", ".esm", ".cjs", "development"].filter((o) => !t.includes(o));
229
- let s = "";
230
- for (let o of e)
231
- if (o instanceof RegExp ? s = ((c = n.find((a) => o.test(a.name) && !r.some((l) => a.name.includes(l)))) == null ? void 0 : c.name) || "" : s = ((i = n.find((a) => a.name.includes(o) && !r.some((l) => a.name.includes(l)))) == null ? void 0 : i.name) || "", s)
328
+ const s = ["runtime", "compiler", ".esm", ".cjs", "development"].filter((c) => !t.includes(c));
329
+ let n = "";
330
+ for (let c of e)
331
+ if (c instanceof RegExp ? n = ((o = r.find((i) => c.test(i.name) && !s.some((f) => i.name.includes(f)))) == null ? void 0 : o.name) || "" : n = ((a = r.find((i) => i.name.includes(c) && !s.some((f) => i.name.includes(f)))) == null ? void 0 : a.name) || "", n)
232
332
  break;
233
- return s;
234
- }, v = {
235
- jsdelivr: V,
236
- bootcdn: A,
237
- cdnjs: M,
238
- unpkg: T
333
+ return n;
334
+ }, D = {
335
+ jsdelivr: ct,
336
+ bootcdn: Z,
337
+ cdnjs: rt,
338
+ unpkg: at
239
339
  };
240
- function G(n, t) {
241
- const e = n.replace(/^\D/, "").split("."), r = t.replace(/^\D/, "").split("."), s = Math.max(e.length, r.length);
242
- for (; e.length < s; )
340
+ function ft(r, t) {
341
+ const e = r.replace(/^\D/, "").split("."), s = t.replace(/^\D/, "").split("."), n = Math.max(e.length, s.length);
342
+ for (; e.length < n; )
243
343
  e.push("0");
244
- for (; r.length < s; )
245
- r.push("0");
246
- for (let c = 0; c < s; c++) {
247
- const i = parseInt(e[c], 10), o = parseInt(r[c], 10);
248
- if (i > o)
344
+ for (; s.length < n; )
345
+ s.push("0");
346
+ for (let o = 0; o < n; o++) {
347
+ const a = parseInt(e[o], 10), c = parseInt(s[o], 10);
348
+ if (a > c)
249
349
  return 1;
250
- if (i < o)
350
+ if (a < c)
251
351
  return -1;
252
352
  }
253
353
  return 0;
254
354
  }
255
- function z(n, t) {
355
+ function pt(r, t) {
256
356
  for (let e in t)
257
- Object.prototype.hasOwnProperty.call(t, e) && (n[e] ? G(n[e], t[e]) === -1 && (n[e] = t[e]) : n[e] = t[e]);
258
- return n;
357
+ Object.prototype.hasOwnProperty.call(t, e) && (r[e] ? ft(r[e], t[e]) === -1 && (r[e] = t[e]) : r[e] = t[e]);
358
+ return r;
359
+ }
360
+ class wt {
361
+ constructor() {
362
+ // 打印记录
363
+ g(this, "logList", []);
364
+ }
365
+ // 打印方法
366
+ log(t) {
367
+ this.logList.push({
368
+ type: "log",
369
+ message: t
370
+ });
371
+ }
372
+ warn(t) {
373
+ this.logList.push({
374
+ type: "warn",
375
+ message: t
376
+ });
377
+ }
378
+ error(t) {
379
+ this.logList.push({
380
+ type: "error",
381
+ message: t
382
+ });
383
+ }
384
+ info(t) {
385
+ this.logList.push({
386
+ type: "info",
387
+ message: t
388
+ });
389
+ }
390
+ // 打印全部
391
+ consoleAll() {
392
+ this.logList.forEach((t) => {
393
+ console[t.type](`${H} ${t.message}`);
394
+ });
395
+ }
396
+ // 清除打印记录
397
+ clear() {
398
+ this.logList = [];
399
+ }
259
400
  }
260
- async function O({ external: n, packageData: t, customScript: e, defaultCdns: r }) {
261
- let s = [], c = !1;
262
- const i = await I();
401
+ const H = "vite-add-cdn-script", b = new wt();
402
+ async function R({
403
+ external: r,
404
+ packageData: t,
405
+ customScript: e,
406
+ defaultCdns: s
407
+ }) {
408
+ let n = [], o = !1;
409
+ const a = await z();
263
410
  return await Promise.all(
264
- n.map(async (o) => {
265
- const a = q(t, o);
266
- if (e[o])
411
+ r.map(async (c) => {
412
+ const i = ut(t, c);
413
+ if (e[c])
267
414
  return {
268
415
  urls: [],
269
- key: o
416
+ key: c
270
417
  };
271
- const l = i.getCdnCache(o, a);
272
- if (!a && !l)
273
- return s.push(o), {
418
+ if (!i)
419
+ return n.push(c), {
274
420
  urls: [],
275
- key: o
421
+ key: c
276
422
  };
277
- if (l)
423
+ const f = a.getCdnCache(c, i);
424
+ if (f)
278
425
  return {
279
- urls: l,
280
- key: o
426
+ urls: f,
427
+ key: c
281
428
  };
282
429
  {
283
- c = !0, console.log(`从网络获取${o}${a}的cdn地址`);
284
- const d = {
285
- urls: await Promise.all(
286
- r.map(async (C) => await H(o, a, C))
287
- ),
288
- key: o
430
+ o = !0, console.log(`从网络获取${c}${i}的cdn地址`);
431
+ const d = await Promise.allSettled(
432
+ s.map(async (j) => await dt(c, i, j))
433
+ ).then((j) => j.filter((l) => {
434
+ if (l.status === "fulfilled")
435
+ return l.value, !0;
436
+ b.warn(l.reason.toString());
437
+ }).map((l) => l.value));
438
+ if (d.length === 0)
439
+ throw new Error(`获取${c} ${i}的cdn地址失败`);
440
+ const y = {
441
+ urls: d,
442
+ key: c
289
443
  };
290
- return i.setCdnCache(o, a, d.urls), d;
444
+ return a.setCdnCache(c, i, y.urls), y;
291
445
  }
292
446
  })
293
- ).then((o) => (c && i.save(), {
294
- urls: o,
295
- noVersionPackages: s
447
+ ).then((c) => (o && a.save(), {
448
+ urls: c,
449
+ noVersionPackages: n
296
450
  }));
297
451
  }
298
- function tt(n) {
299
- const { customScript: t = {}, retryTimes: e, defaultCdns: r = ["jsdelivr", "unpkg", "cdnjs"] } = n;
300
- let s = e;
301
- s || (s = r.length - 1);
302
- let c;
452
+ function Pt(r) {
453
+ const { customScript: t = {}, defaultCdns: e = ["jsdelivr", "unpkg"] } = r;
454
+ let s;
303
455
  return {
304
- name: "vite-add-cdn-script",
456
+ name: H,
305
457
  enforce: "pre",
306
458
  apply: "build",
307
- config(i) {
308
- c = i;
459
+ config(n) {
460
+ s = n;
309
461
  },
310
- async transformIndexHtml(i) {
311
- if (!r || r.length === 0)
462
+ async transformIndexHtml(n) {
463
+ var a, c;
464
+ if (!e || e.length === 0)
312
465
  throw new Error("defaultCdns不能为空");
313
- const o = J.resolve(process.cwd(), "package.json");
466
+ const o = A.resolve(process.cwd(), "package.json");
314
467
  try {
315
- const a = j.readFileSync(o, "utf-8"), l = JSON.parse(a), d = c.build.rollupOptions.external, C = {};
316
- let p = "";
317
- const { urls: k, noVersionPackages: S } = await O({
318
- external: d,
319
- packageData: l,
468
+ const i = E.readFileSync(o, "utf-8"), f = JSON.parse(i), d = (c = (a = s.build) == null ? void 0 : a.rollupOptions) == null ? void 0 : c.external;
469
+ if (!d)
470
+ return n;
471
+ let y = [];
472
+ if (typeof d == "string")
473
+ y = [d];
474
+ else if (Array.isArray(d))
475
+ y = d.filter((w) => typeof w == "string");
476
+ else if (typeof d == "object")
477
+ return n;
478
+ const j = {};
479
+ let l = "";
480
+ const { urls: S, noVersionPackages: F } = await R({
481
+ external: y,
482
+ packageData: f,
320
483
  customScript: t,
321
- defaultCdns: r
484
+ defaultCdns: e
322
485
  });
323
- if (S.length > 0) {
324
- const m = { dependencies: {} };
325
- await Promise.all(
326
- k.map(async (u) => {
327
- if (!u)
486
+ if (F.length > 0) {
487
+ const w = { dependencies: {} };
488
+ await Promise.allSettled(
489
+ S.map(async (h) => {
490
+ if (!h)
328
491
  return;
329
- const { key: x, urls: _ } = u, g = t[x] || _[0];
330
- if (!g)
492
+ const { key: C, urls: v } = h, k = t[C] || v[0];
493
+ if (!k)
331
494
  return;
332
- const $ = await Q(g);
333
- z(m.dependencies, $.dependencies);
495
+ const x = await lt(k);
496
+ pt(w.dependencies, x.dependencies);
334
497
  })
335
- ).catch((u) => {
336
- console.log("err", u);
498
+ ).then((h) => {
499
+ h.forEach((C) => {
500
+ C.status === "rejected" && b.warn(C.reason.toString());
501
+ });
337
502
  });
338
- const { urls: P, noVersionPackages: h } = await O({
339
- external: S,
340
- packageData: m,
503
+ const { urls: L, noVersionPackages: p } = await R({
504
+ external: F,
505
+ packageData: w,
341
506
  customScript: t,
342
- defaultCdns: r
507
+ defaultCdns: e
343
508
  });
344
- if (P.map((u) => {
345
- var g;
346
- if (!u)
509
+ if (L.map((h) => {
510
+ var k;
511
+ if (!h)
347
512
  return;
348
- const { urls: x, key: _ } = u;
349
- (g = k.find(($) => ($ == null ? void 0 : $.key) === _)) == null || g.urls.push(...x);
350
- }), h.length > 0)
351
- throw console.error(`找不到${h.join(",")}的版本`), new Error(`找不到${h.join(",")}的版本`);
513
+ const { urls: C, key: v } = h;
514
+ (k = S.find((x) => (x == null ? void 0 : x.key) === v)) == null || k.urls.push(...C);
515
+ }), p.length > 0)
516
+ throw console.error(`找不到${p.join(",")}的版本`), new Error(`找不到${p.join(",")}的版本`);
352
517
  }
353
- return k.forEach((m) => {
354
- if (!m)
518
+ return b.consoleAll(), S.forEach((w) => {
519
+ if (!w)
355
520
  return;
356
- const { urls: P, key: h } = m;
357
- if (t[h])
358
- p += t[h];
521
+ const { urls: L, key: p } = w;
522
+ if (t[p])
523
+ l += t[p];
359
524
  else {
360
- C[h] = P;
361
- const u = P[0];
362
- p += `<script src="${u}" type="text/javascript" crossorigin="anonymous" onerror="errorCDN(this)" data-cur="0" data-key="${h}"><\/script>
525
+ j[p] = L;
526
+ const h = L[0];
527
+ l += `<script src="${h}" type="text/javascript" crossorigin="anonymous" onerror="errorCDN(this)" data-cur="0" data-key="${p}"><\/script>
363
528
  `;
364
529
  }
365
- }), p = `<script>
530
+ }), l = `<script>
366
531
  function errorCDN(e) {
367
- const packNameUrl = JSON.parse('${JSON.stringify(C)}');
532
+ const packNameUrl = JSON.parse('${JSON.stringify(j)}');
368
533
  const nextCur = parseInt(e.getAttribute("data-cur")) + 1;
369
- if(nextCur>${e}){return;}
370
534
 
371
535
  const key = e.getAttribute("data-key");
372
- if(nextCur>=packNameUrl[key].length){return;}
536
+ const curPackNameUrl = packNameUrl[key]
537
+ if(nextCur>=curPackNameUrl.length){return;}
373
538
  // 新的cdn链接
374
- const url = packNameUrl[key][nextCur]
539
+ const url = curPackNameUrl[nextCur]
375
540
  // 克隆原标签
376
541
  const tagName = e.tagName
377
542
  const cdnDOM = document.createElement(tagName);
@@ -384,13 +549,14 @@ function tt(n) {
384
549
  document.head.appendChild(cdnDOM);
385
550
  e.remove();
386
551
  }
387
- <\/script>` + p, i = i.replace("</head>", `${p}</head>`), i;
388
- } catch (a) {
389
- console.error("获取dependencies出错:", a);
552
+ <\/script>` + l, n = n.replace("</head>", `${l}</head>`), n;
553
+ } catch (i) {
554
+ b.consoleAll(), console.error("vite-add-cdn-script error:", i.message), process.exit(1);
390
555
  }
391
556
  }
392
557
  };
393
558
  }
394
559
  export {
395
- tt as default
560
+ Pt as default,
561
+ H as libName
396
562
  };