vite-add-cdn-script 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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
  };