vite-add-cdn-script 0.0.7 → 0.0.8
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 +99 -92
- package/dist/index.umd.cjs +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
var D = Object.defineProperty;
|
|
2
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
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
var S = (n, t, e) => (F(n, typeof t != "symbol" ? t + "" : t, e), e);
|
|
4
|
+
import O from "node:path";
|
|
5
|
+
import y from "node:fs";
|
|
6
6
|
import b from "node:https";
|
|
7
7
|
class E {
|
|
8
8
|
constructor() {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this.cdnCachePath =
|
|
9
|
+
S(this, "cdnCache", {});
|
|
10
|
+
S(this, "cdnCachePath", "");
|
|
11
|
+
this.cdnCachePath = O.resolve(process.cwd(), "./.cdn-cache.json");
|
|
12
12
|
}
|
|
13
13
|
// 初始化cdn缓存
|
|
14
14
|
async init() {
|
|
15
15
|
try {
|
|
16
|
-
const t = await
|
|
16
|
+
const t = await y.readFileSync(this.cdnCachePath, "utf-8");
|
|
17
17
|
this.cdnCache = JSON.parse(t);
|
|
18
18
|
} catch {
|
|
19
|
-
console.log("cdn缓存文件不存在,创建缓存文件"), this.cdnCache = {}, await
|
|
19
|
+
console.log("cdn缓存文件不存在,创建缓存文件"), this.cdnCache = {}, await y.writeFileSync(this.cdnCachePath, "", "utf-8");
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
@@ -43,48 +43,48 @@ class E {
|
|
|
43
43
|
* 更新cdn缓存
|
|
44
44
|
*/
|
|
45
45
|
async save() {
|
|
46
|
-
await
|
|
46
|
+
await y.writeFileSync(this.cdnCachePath, JSON.stringify(this.cdnCache), "utf-8");
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
let
|
|
50
|
-
const L = async () => (
|
|
49
|
+
let C;
|
|
50
|
+
const L = async () => (C || (C = new E(), await C.init()), C), $ = {
|
|
51
51
|
//get请求封装
|
|
52
52
|
get: (n, t, e) => new Promise((r, s) => {
|
|
53
53
|
try {
|
|
54
|
-
b.get(n, (
|
|
54
|
+
b.get(n, (c) => {
|
|
55
55
|
let o = "";
|
|
56
|
-
|
|
57
|
-
o +=
|
|
58
|
-
}),
|
|
56
|
+
c.on("data", (i) => {
|
|
57
|
+
o += i;
|
|
58
|
+
}), c.on("end", () => {
|
|
59
59
|
t == null || t(o), r(o);
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
|
-
} catch (
|
|
63
|
-
e == null || e(
|
|
62
|
+
} catch (c) {
|
|
63
|
+
e == null || e(c), s(c);
|
|
64
64
|
}
|
|
65
65
|
})
|
|
66
66
|
}, N = async (n) => {
|
|
67
67
|
const t = /^(https:\/\/.*\d+\.\d+\.\d+\/).+?\.js$/;
|
|
68
68
|
if (t.test(n)) {
|
|
69
69
|
const e = n.replace(t, (r, s) => `${s}package.json`);
|
|
70
|
-
return JSON.parse(await
|
|
70
|
+
return JSON.parse(await $.get(e));
|
|
71
71
|
} else
|
|
72
72
|
throw new Error(`${n} 不是正确的url`);
|
|
73
73
|
}, I = (n, t) => {
|
|
74
74
|
var e, r;
|
|
75
75
|
return ((e = n.dependencies) == null ? void 0 : e[t]) || ((r = n.devDependencies) == null ? void 0 : r[t]);
|
|
76
|
-
},
|
|
76
|
+
}, J = (n) => n.reduce((t, e) => (e.type === "file" ? t.push({ name: e.path }) : e.files && t.push(...J(e.files)), t), []), k = {
|
|
77
77
|
jsdelivr: {
|
|
78
78
|
getFileList: (n, t) => new Promise((e, r) => {
|
|
79
|
-
|
|
79
|
+
$.get(
|
|
80
80
|
`https://data.jsdelivr.com/v1/stats/packages/npm/${n}@${t}/files`,
|
|
81
81
|
(s) => {
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
82
|
+
const c = JSON.parse(s);
|
|
83
|
+
if (c.length === 0) {
|
|
84
84
|
r(new Error(`${n}@${t} not found`));
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
|
-
e({ fileList:
|
|
87
|
+
e({ fileList: c });
|
|
88
88
|
},
|
|
89
89
|
(s) => {
|
|
90
90
|
r(s);
|
|
@@ -96,11 +96,11 @@ const L = async () => ($ || ($ = new E(), await $.init()), $), f = {
|
|
|
96
96
|
},
|
|
97
97
|
unpkg: {
|
|
98
98
|
getFileList: (n, t) => new Promise((e, r) => {
|
|
99
|
-
|
|
99
|
+
$.get(
|
|
100
100
|
`https://unpkg.com/${n}@${t}/?meta`,
|
|
101
101
|
(s) => {
|
|
102
|
-
const
|
|
103
|
-
e({ fileList:
|
|
102
|
+
const c = JSON.parse(s);
|
|
103
|
+
e({ fileList: J(c.files || []) });
|
|
104
104
|
},
|
|
105
105
|
(s) => {
|
|
106
106
|
r(s);
|
|
@@ -111,15 +111,15 @@ const L = async () => ($ || ($ = new E(), await $.init()), $), f = {
|
|
|
111
111
|
},
|
|
112
112
|
bootcdn: {
|
|
113
113
|
getFileList: (n, t) => new Promise((e, r) => {
|
|
114
|
-
|
|
114
|
+
$.get(
|
|
115
115
|
`https://api.bootcdn.cn/libraries/${n}`,
|
|
116
116
|
(s) => {
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
117
|
+
const c = JSON.parse(s);
|
|
118
|
+
if (c.length === 0) {
|
|
119
119
|
r(new Error(`${n} not found in bootcdn`));
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
|
-
const o =
|
|
122
|
+
const o = c[0], a = o.assets.find((d) => d.version === t);
|
|
123
123
|
if (!a) {
|
|
124
124
|
r(new Error(`${n}@${t} not found in ${o.name}`));
|
|
125
125
|
return;
|
|
@@ -138,16 +138,16 @@ const L = async () => ($ || ($ = new E(), await $.init()), $), f = {
|
|
|
138
138
|
},
|
|
139
139
|
cdnjs: {
|
|
140
140
|
getFileList: (n, t) => new Promise((e, r) => {
|
|
141
|
-
|
|
141
|
+
$.get(
|
|
142
142
|
`https://api.cdnjs.com/libraries/${n}/${t}`,
|
|
143
143
|
(s) => {
|
|
144
|
-
const
|
|
145
|
-
if (
|
|
144
|
+
const c = JSON.parse(s);
|
|
145
|
+
if (c.error) {
|
|
146
146
|
r(new Error(`cdnjs: ${n}@${t} not found`));
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
149
|
e({
|
|
150
|
-
fileList:
|
|
150
|
+
fileList: c.rawFiles.map((o) => ({
|
|
151
151
|
name: "/" + o
|
|
152
152
|
}))
|
|
153
153
|
});
|
|
@@ -164,14 +164,14 @@ const L = async () => ($ || ($ = new E(), await $.init()), $), f = {
|
|
|
164
164
|
const r = (o = t.match(/\d+(.\d+)?(.\d+)?/)) == null ? void 0 : o[0];
|
|
165
165
|
if (!r)
|
|
166
166
|
throw new Error(`${n} version ${t} is not valid`);
|
|
167
|
-
const s = await
|
|
168
|
-
throw
|
|
169
|
-
}),
|
|
170
|
-
if (!
|
|
167
|
+
const s = await k[e].getFileList(n, r).catch((i) => {
|
|
168
|
+
throw i;
|
|
169
|
+
}), c = A(s, n);
|
|
170
|
+
if (!c)
|
|
171
171
|
throw new Error(`在 ${e} 中找不到 ${n}@${r} 文件,请检查包名或版本号`);
|
|
172
|
-
return
|
|
172
|
+
return k[e].getUrl(n, r, c);
|
|
173
173
|
}, A = ({ fileList: n }, t) => {
|
|
174
|
-
var
|
|
174
|
+
var c, o;
|
|
175
175
|
let e = [
|
|
176
176
|
`umd/${t}.production.min.js`,
|
|
177
177
|
/umd\/.+?\.production\.min\.js$/,
|
|
@@ -189,10 +189,10 @@ const L = async () => ($ || ($ = new E(), await $.init()), $), f = {
|
|
|
189
189
|
/\.min\.js$/,
|
|
190
190
|
/\.js$/
|
|
191
191
|
];
|
|
192
|
-
const r = ["runtime", "compiler", ".esm", ".cjs", "development"].filter((
|
|
192
|
+
const r = ["runtime", "compiler", ".esm", ".cjs", "development"].filter((i) => !t.includes(i));
|
|
193
193
|
let s = "";
|
|
194
|
-
for (let
|
|
195
|
-
if (
|
|
194
|
+
for (let i of e)
|
|
195
|
+
if (i instanceof RegExp ? s = ((c = n.find((a) => i.test(a.name) && !r.some((l) => a.name.includes(l)))) == null ? void 0 : c.name) || "" : s = ((o = n.find((a) => a.name.includes(i) && !r.some((l) => a.name.includes(l)))) == null ? void 0 : o.name) || "", s)
|
|
196
196
|
break;
|
|
197
197
|
return s;
|
|
198
198
|
};
|
|
@@ -202,11 +202,11 @@ function M(n, t) {
|
|
|
202
202
|
e.push("0");
|
|
203
203
|
for (; r.length < s; )
|
|
204
204
|
r.push("0");
|
|
205
|
-
for (let
|
|
206
|
-
const o = parseInt(e[
|
|
207
|
-
if (o >
|
|
205
|
+
for (let c = 0; c < s; c++) {
|
|
206
|
+
const o = parseInt(e[c], 10), i = parseInt(r[c], 10);
|
|
207
|
+
if (o > i)
|
|
208
208
|
return 1;
|
|
209
|
-
if (o <
|
|
209
|
+
if (o < i)
|
|
210
210
|
return -1;
|
|
211
211
|
}
|
|
212
212
|
return 0;
|
|
@@ -216,40 +216,41 @@ function V(n, t) {
|
|
|
216
216
|
Object.prototype.hasOwnProperty.call(t, e) && (n[e] ? M(n[e], t[e]) === -1 && (n[e] = t[e]) : n[e] = t[e]);
|
|
217
217
|
return n;
|
|
218
218
|
}
|
|
219
|
-
async function
|
|
220
|
-
let s = [],
|
|
219
|
+
async function v({ external: n, packageData: t, customScript: e, defaultCdns: r }) {
|
|
220
|
+
let s = [], c = !1;
|
|
221
221
|
const o = await L();
|
|
222
222
|
return await Promise.all(
|
|
223
|
-
n.map(async (
|
|
224
|
-
const a = I(t,
|
|
225
|
-
if (e[
|
|
223
|
+
n.map(async (i) => {
|
|
224
|
+
const a = I(t, i);
|
|
225
|
+
if (e[i])
|
|
226
226
|
return {
|
|
227
227
|
urls: [],
|
|
228
|
-
key:
|
|
228
|
+
key: i
|
|
229
229
|
};
|
|
230
|
-
if (!a)
|
|
231
|
-
s.push(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
230
|
+
if (!a)
|
|
231
|
+
return s.push(i), {
|
|
232
|
+
urls: [],
|
|
233
|
+
key: i
|
|
234
|
+
};
|
|
235
|
+
const l = o.getCdnCache(i, a);
|
|
235
236
|
if (l)
|
|
236
237
|
return {
|
|
237
238
|
urls: l,
|
|
238
|
-
key:
|
|
239
|
+
key: i
|
|
239
240
|
};
|
|
240
241
|
{
|
|
241
|
-
|
|
242
|
+
c = !0, console.log(`从网络获取${i}${a}的cdn地址`);
|
|
242
243
|
const d = {
|
|
243
244
|
urls: await Promise.all(
|
|
244
|
-
r.map(async (h) => await R(
|
|
245
|
+
r.map(async (h) => await R(i, a, h))
|
|
245
246
|
),
|
|
246
|
-
key:
|
|
247
|
+
key: i
|
|
247
248
|
};
|
|
248
|
-
return o.setCdnCache(
|
|
249
|
+
return o.setCdnCache(i, a, d.urls), d;
|
|
249
250
|
}
|
|
250
251
|
})
|
|
251
|
-
).then((
|
|
252
|
-
urls:
|
|
252
|
+
).then((i) => (c && o.save(), {
|
|
253
|
+
urls: i,
|
|
253
254
|
noVersionPackages: s
|
|
254
255
|
}));
|
|
255
256
|
}
|
|
@@ -260,54 +261,60 @@ function q(n) {
|
|
|
260
261
|
name: "vite-add-cdn-script",
|
|
261
262
|
enforce: "pre",
|
|
262
263
|
apply: "build",
|
|
263
|
-
config(
|
|
264
|
-
s =
|
|
264
|
+
config(c) {
|
|
265
|
+
s = c;
|
|
265
266
|
},
|
|
266
|
-
async transformIndexHtml(
|
|
267
|
+
async transformIndexHtml(c) {
|
|
267
268
|
if (!r || r.length === 0)
|
|
268
269
|
throw new Error("defaultCdns不能为空");
|
|
269
|
-
const o =
|
|
270
|
+
const o = O.resolve(process.cwd(), "package.json");
|
|
270
271
|
try {
|
|
271
|
-
const
|
|
272
|
+
const i = y.readFileSync(o, "utf-8"), a = JSON.parse(i), l = s.build.rollupOptions.external, d = {};
|
|
272
273
|
let h = "";
|
|
273
|
-
const { urls:
|
|
274
|
+
const { urls: P, noVersionPackages: U } = await v({
|
|
274
275
|
external: l,
|
|
275
276
|
packageData: a,
|
|
276
277
|
customScript: t,
|
|
277
278
|
defaultCdns: r
|
|
278
279
|
});
|
|
279
|
-
if (
|
|
280
|
-
const
|
|
280
|
+
if (U.length > 0) {
|
|
281
|
+
const f = { dependencies: {} };
|
|
281
282
|
await Promise.all(
|
|
282
|
-
|
|
283
|
-
if (!
|
|
283
|
+
P.map(async (p) => {
|
|
284
|
+
if (!p)
|
|
284
285
|
return;
|
|
285
|
-
const { key:
|
|
286
|
-
if (!
|
|
286
|
+
const { key: j, urls: x } = p, m = t[j] || x[0];
|
|
287
|
+
if (!m)
|
|
287
288
|
return;
|
|
288
|
-
const
|
|
289
|
-
V(
|
|
289
|
+
const g = await N(m);
|
|
290
|
+
V(f.dependencies, g.dependencies);
|
|
290
291
|
})
|
|
291
292
|
);
|
|
292
|
-
const { urls:
|
|
293
|
-
external:
|
|
294
|
-
packageData:
|
|
293
|
+
const { urls: w, noVersionPackages: u } = await v({
|
|
294
|
+
external: U,
|
|
295
|
+
packageData: f,
|
|
295
296
|
customScript: t,
|
|
296
297
|
defaultCdns: r
|
|
297
298
|
});
|
|
298
|
-
if (
|
|
299
|
+
if (w.map((p) => {
|
|
300
|
+
var m;
|
|
301
|
+
if (!p)
|
|
302
|
+
return;
|
|
303
|
+
const { urls: j, key: x } = p;
|
|
304
|
+
(m = P.find((g) => (g == null ? void 0 : g.key) === x)) == null || m.urls.push(...j);
|
|
305
|
+
}), u.length > 0)
|
|
299
306
|
throw console.error(`找不到${u.join(",")}的版本`), new Error(`找不到${u.join(",")}的版本`);
|
|
300
307
|
}
|
|
301
|
-
return
|
|
302
|
-
if (!
|
|
308
|
+
return P.forEach((f) => {
|
|
309
|
+
if (!f)
|
|
303
310
|
return;
|
|
304
|
-
const { urls:
|
|
311
|
+
const { urls: w, key: u } = f;
|
|
305
312
|
if (t[u])
|
|
306
313
|
h += t[u];
|
|
307
314
|
else {
|
|
308
|
-
d[u] =
|
|
309
|
-
const
|
|
310
|
-
h += `<script src="${
|
|
315
|
+
d[u] = w;
|
|
316
|
+
const p = w[0];
|
|
317
|
+
h += `<script src="${p}" type="text/javascript" crossorigin="anonymous" onerror="errorCDN(this)" data-cur="0" data-key="${u}"><\/script>
|
|
311
318
|
`;
|
|
312
319
|
}
|
|
313
320
|
}), h = `<script>
|
|
@@ -332,9 +339,9 @@ function q(n) {
|
|
|
332
339
|
document.head.appendChild(cdnDOM);
|
|
333
340
|
e.remove();
|
|
334
341
|
}
|
|
335
|
-
<\/script>` + h,
|
|
336
|
-
} catch (
|
|
337
|
-
console.error("获取dependencies出错:",
|
|
342
|
+
<\/script>` + h, c = c.replace("</head>", `${h}</head>`), c;
|
|
343
|
+
} catch (i) {
|
|
344
|
+
console.error("获取dependencies出错:", i);
|
|
338
345
|
}
|
|
339
346
|
}
|
|
340
347
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(u,a){typeof exports=="object"&&typeof module<"u"?module.exports=a(require("node:path"),require("node:fs"),require("node:https")):typeof define=="function"&&define.amd?define(["node:path","node:fs","node:https"],a):(u=typeof globalThis<"u"?globalThis:u||self,u.index=a(u.path,u.fs,u.https))})(this,function(u,a,f){"use strict";var V=Object.defineProperty;var T=(u,a,f)=>a in u?V(u,a,{enumerable:!0,configurable:!0,writable:!0,value:f}):u[a]=f;var k=(u,a,f)=>(T(u,typeof a!="symbol"?a+"":a,f),f);class F{constructor(){k(this,"cdnCache",{});k(this,"cdnCachePath","");this.cdnCachePath=u.resolve(process.cwd(),"./.cdn-cache.json")}async init(){try{const e=await a.readFileSync(this.cdnCachePath,"utf-8");this.cdnCache=JSON.parse(e)}catch{console.log("cdn缓存文件不存在,创建缓存文件"),this.cdnCache={},await a.writeFileSync(this.cdnCachePath,"","utf-8")}}getCdnCache(e,t){var r;return(r=this.cdnCache[e])==null?void 0:r[t]}setCdnCache(e,t,r){this.cdnCache[e]?this.cdnCache[e][t]=r:this.cdnCache[e]={[t]:r}}async save(){await a.writeFileSync(this.cdnCachePath,JSON.stringify(this.cdnCache),"utf-8")}}let j;const E=async()=>(j||(j=new F,await j.init()),j),$={get:(n,e,t)=>new Promise((r,s)=>{try{f.get(n,i=>{let o="";i.on("data",c=>{o+=c}),i.on("end",()=>{e==null||e(o),r(o)})})}catch(i){t==null||t(i),s(i)}})},L=async n=>{const e=/^(https:\/\/.*\d+\.\d+\.\d+\/).+?\.js$/;if(e.test(n)){const t=n.replace(e,(r,s)=>`${s}package.json`);return JSON.parse(await $.get(t))}else throw new Error(`${n} 不是正确的url`)},b=(n,e)=>{var t,r;return((t=n.dependencies)==null?void 0:t[e])||((r=n.devDependencies)==null?void 0:r[e])},v=n=>n.reduce((e,t)=>(t.type==="file"?e.push({name:t.path}):t.files&&e.push(...v(t.files)),e),[]),O={jsdelivr:{getFileList:(n,e)=>new Promise((t,r)=>{$.get(`https://data.jsdelivr.com/v1/stats/packages/npm/${n}@${e}/files`,s=>{const i=JSON.parse(s);if(i.length===0){r(new Error(`${n}@${e} not found`));return}t({fileList:i})},s=>{r(s)})}),getUrl:(n,e,t)=>`https://cdn.jsdelivr.net/npm/${n}@${e}${t}`},unpkg:{getFileList:(n,e)=>new Promise((t,r)=>{$.get(`https://unpkg.com/${n}@${e}/?meta`,s=>{const i=JSON.parse(s);t({fileList:v(i.files||[])})},s=>{r(s)})}),getUrl:(n,e,t)=>`https://unpkg.com/${n}@${e}${t}`},bootcdn:{getFileList:(n,e)=>new Promise((t,r)=>{$.get(`https://api.bootcdn.cn/libraries/${n}`,s=>{const i=JSON.parse(s);if(i.length===0){r(new Error(`${n} not found in bootcdn`));return}const o=i[0],d=o.assets.find(h=>h.version===e);if(!d){r(new Error(`${n}@${e} not found in ${o.name}`));return}const l=d.files.map(h=>({name:"/"+h}));t({fileList:l,recommendFileName:o.filename})},s=>{r(s)})}),getUrl:(n,e,t)=>`https://cdn.bootcdn.net/ajax/libs/${n}/${e}${t}`},cdnjs:{getFileList:(n,e)=>new Promise((t,r)=>{$.get(`https://api.cdnjs.com/libraries/${n}/${e}`,s=>{const i=JSON.parse(s);if(i.error){r(new Error(`cdnjs: ${n}@${e} not found`));return}t({fileList:i.rawFiles.map(o=>({name:"/"+o}))})},s=>{r(s)})}),getUrl:(n,e,t)=>`https://cdnjs.cloudflare.com/ajax/libs/${n}/${e}${t}`}},N=async(n,e,t)=>{var o;const r=(o=e.match(/\d+(.\d+)?(.\d+)?/))==null?void 0:o[0];if(!r)throw new Error(`${n} version ${e} is not valid`);const s=await O[t].getFileList(n,r).catch(c=>{throw c}),i=I(s,n);if(!i)throw new Error(`在 ${t} 中找不到 ${n}@${r} 文件,请检查包名或版本号`);return O[t].getUrl(n,r,i)},I=({fileList:n},e)=>{var i,o;let t=[`umd/${e}.production.min.js`,/umd\/.+?\.production\.min\.js$/,/dist\/.+?\.production\.min\.js$/,/dist\/.+?\.umd\.min\.js$/,`dist/${e}.prod.min.js`,/dist\/.+?\.global.prod.min.js/,`dist/${e}.min.js`,/.+?\.global.prod.min.js/,/.+?.global.prod.js/,/lib\/.+?\.min\.js$/,/dist\/.+?\.min\.js$/,/index\.min\.js$/,/index\.js$/,/\.min\.js$/,/\.js$/];const r=["runtime","compiler",".esm",".cjs","development"].filter(c=>!e.includes(c));let s="";for(let c of t)if(c instanceof RegExp?s=((i=n.find(d=>c.test(d.name)&&!r.some(l=>d.name.includes(l))))==null?void 0:i.name)||"":s=((o=n.find(d=>d.name.includes(c)&&!r.some(l=>d.name.includes(l))))==null?void 0:o.name)||"",s)break;return s};function R(n,e){const t=n.replace(/^\D/,"").split("."),r=e.replace(/^\D/,"").split("."),s=Math.max(t.length,r.length);for(;t.length<s;)t.push("0");for(;r.length<s;)r.push("0");for(let i=0;i<s;i++){const o=parseInt(t[i],10),c=parseInt(r[i],10);if(o>c)return 1;if(o<c)return-1}return 0}function A(n,e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]?R(n[t],e[t])===-1&&(n[t]=e[t]):n[t]=e[t]);return n}async function J({external:n,packageData:e,customScript:t,defaultCdns:r}){let s=[],i=!1;const o=await E();return await Promise.all(n.map(async c=>{const d=b(e,c);if(t[c])return{urls:[],key:c};if(!d)return s.push(c),{urls:[],key:c};const l=o.getCdnCache(c,d);if(l)return{urls:l,key:c};{i=!0,console.log(`从网络获取${c}${d}的cdn地址`);const h={urls:await Promise.all(r.map(async m=>await N(c,d,m))),key:c};return o.setCdnCache(c,d,h.urls),h}})).then(c=>(i&&o.save(),{urls:c,noVersionPackages:s}))}function M(n){const{customScript:e={},retryTimes:t=1,defaultCdns:r=["jsdelivr","unpkg"]}=n;let s;return{name:"vite-add-cdn-script",enforce:"pre",apply:"build",config(i){s=i},async transformIndexHtml(i){if(!r||r.length===0)throw new Error("defaultCdns不能为空");const o=u.resolve(process.cwd(),"package.json");try{const c=a.readFileSync(o,"utf-8"),d=JSON.parse(c),l=s.build.rollupOptions.external,h={};let m="";const{urls:x,noVersionPackages:D}=await J({external:l,packageData:d,customScript:e,defaultCdns:r});if(D.length>0){const w={dependencies:{}};await Promise.all(x.map(async g=>{if(!g)return;const{key:S,urls:U}=g,C=e[S]||U[0];if(!C)return;const y=await L(C);A(w.dependencies,y.dependencies)}));const{urls:P,noVersionPackages:p}=await J({external:D,packageData:w,customScript:e,defaultCdns:r});if(P.map(g=>{var C;if(!g)return;const{urls:S,key:U}=g;(C=x.find(y=>(y==null?void 0:y.key)===U))==null||C.urls.push(...S)}),p.length>0)throw console.error(`找不到${p.join(",")}的版本`),new Error(`找不到${p.join(",")}的版本`)}return x.forEach(w=>{if(!w)return;const{urls:P,key:p}=w;if(e[p])m+=e[p];else{h[p]=P;const g=P[0];m+=`<script src="${g}" type="text/javascript" crossorigin="anonymous" onerror="errorCDN(this)" data-cur="0" data-key="${p}"><\/script>
|
|
2
2
|
`}}),m=`<script>
|
|
3
3
|
function errorCDN(e) {
|
|
4
4
|
const packNameUrl = JSON.parse('${JSON.stringify(h)}');
|
|
@@ -21,4 +21,4 @@
|
|
|
21
21
|
document.head.appendChild(cdnDOM);
|
|
22
22
|
e.remove();
|
|
23
23
|
}
|
|
24
|
-
<\/script>`+m,i=i.replace("</head>",`${m}</head>`),i}catch(c){console.error("获取dependencies出错:",c)}}}}return
|
|
24
|
+
<\/script>`+m,i=i.replace("</head>",`${m}</head>`),i}catch(c){console.error("获取dependencies出错:",c)}}}}return M});
|