@henrikvilhelmberglund/vite-plugin-monkey 4.0.4

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.
@@ -0,0 +1,845 @@
1
+ import { Plugin } from 'vite';
2
+ import { InlinePreset } from 'unimport';
3
+
4
+ /**
5
+ * format userscript comment
6
+ */
7
+ type Format = {
8
+ /**
9
+ * @description note font_width/font_family, suggest fixed-width font
10
+ * @default 2, true
11
+ */
12
+ align?: number | boolean | AlignFunc;
13
+ /**
14
+ * custom generate userscript comment
15
+ *
16
+ * if you want add other comments after userscript or modify userscript
17
+ */
18
+ generate?: (uOptions: {
19
+ userscript: string;
20
+ mode: `serve` | `build` | `meta`;
21
+ }) => IPromise<string>;
22
+ };
23
+ /**
24
+ * @example
25
+ * // input/output
26
+ * [
27
+ * [ 'name', 'example' ],
28
+ * [ 'name:ja', 'hentai' ],
29
+ * [ 'name:zh', '测试_' ],
30
+ * [ 'namespace', 'https://github.com/lisonge' ],
31
+ * [ 'version', '1.0.1' ],
32
+ * [ 'author', 'lisonge' ],
33
+ * [ 'description', 'default description zh' ],
34
+ * [ 'description:zh', '描述' ],
35
+ * [ 'description:en', 'description' ],
36
+ * [ 'description:ja', '説明z' ],
37
+ * [ 'description:zh-CN', '描述' ],
38
+ * [ 'license', 'MIT' ],
39
+ * [ 'icon', 'https://vitejs.dev/logo.svg' ],
40
+ * [
41
+ * 'homepage',
42
+ * 'https://github.com/lisonge/vite-plugin-monkey#readme'
43
+ * ],
44
+ * [
45
+ * 'homepageURL',
46
+ * 'https://github.com/lisonge/vite-plugin-monkey#readme'
47
+ * ],
48
+ * [ 'source', 'https://github.com/lisonge/vite-plugin-monkey.git' ],
49
+ * [
50
+ * 'supportURL',
51
+ * 'https://github.com/lisonge/vite-plugin-monkey/issues'
52
+ * ],
53
+ * [ 'match', 'https://songe.li/' ],
54
+ * [ 'require', 'https://cdn.jsdelivr.net/npm/blueimp-md5@2.19.0' ],
55
+ * [
56
+ * 'require',
57
+ * 'https://cdn.jsdelivr.net/npm/prettier@2.7.1/standalone.js'
58
+ * ],
59
+ * [
60
+ * 'require',
61
+ * 'https://cdn.jsdelivr.net/npm/prettier@2.7.1/parser-babel.js'
62
+ * ],
63
+ * [ 'grant', 'GM_addElement' ],
64
+ * [ 'grant', 'GM_cookie' ],
65
+ * [ 'grant', 'unsafeWindow' ]
66
+ * ]
67
+ */
68
+ type AlignFunc = (p0: [string, ...string[]][]) => IPromise<[string, ...string[]][]>;
69
+
70
+ type GreaseRunAt = 'document-start' | 'document-end' | 'document-idle';
71
+ type GreaseGrant = 'GM.info' | 'GM.deleteValue' | 'GM.getValue' | 'GM.listValues' | 'GM.setValue' | 'GM.getResourceUrl' | 'GM.notification' | 'GM.openInTab' | 'GM.registerMenuCommand' | 'GM.setClipboard' | 'GM.xmlHttpRequest' | 'unsafeWindow';
72
+ /**
73
+ * @see https://wiki.greasespot.net/Metadata_Block
74
+ */
75
+ interface GreasemonkeyUserScript {
76
+ /**
77
+ * @see https://wiki.greasespot.net/Metadata_Block#.40name
78
+ *
79
+ */
80
+ name?: string | LocaleType<string>;
81
+ /**
82
+ * @see https://wiki.greasespot.net/Metadata_Block#.40namespace
83
+ */
84
+ namespace?: string;
85
+ /**
86
+ * @see https://wiki.greasespot.net/Metadata_Block#.40version
87
+ *
88
+ */
89
+ version?: string;
90
+ /**
91
+ * @see https://wiki.greasespot.net/Metadata_Block#.40description
92
+ *
93
+ */
94
+ description?: string | LocaleType<string>;
95
+ /**
96
+ * @see https://wiki.greasespot.net/Metadata_Block#.40icon
97
+ */
98
+ icon?: string;
99
+ /**
100
+ * @see https://wiki.greasespot.net/Metadata_Block#.40include
101
+ */
102
+ include?: IArray<string | RegExp>;
103
+ /**
104
+ * @see https://wiki.greasespot.net/Metadata_Block#.40match
105
+ */
106
+ match?: IArray<string | RegExp>;
107
+ /**
108
+ * @see https://wiki.greasespot.net/Metadata_Block#.40exclude
109
+ */
110
+ exclude?: IArray<string | RegExp>;
111
+ /**
112
+ * @see https://wiki.greasespot.net/Metadata_Block#.40require
113
+ */
114
+ require?: IArray<string>;
115
+ /**
116
+ * @see https://wiki.greasespot.net/Metadata_Block#.40resource
117
+ */
118
+ resource?: Record<string, string>;
119
+ /**
120
+ * @see https://wiki.greasespot.net/Metadata_Block#.40noframes
121
+ */
122
+ noframes?: boolean;
123
+ }
124
+
125
+ type WebRequestRule = {
126
+ selector: string | {
127
+ include?: string | string[];
128
+ match?: string | string[];
129
+ exclude?: string | string[];
130
+ };
131
+ action: 'cancel' | {
132
+ cancel?: boolean;
133
+ redirect?: string | {
134
+ from: string;
135
+ to: string;
136
+ };
137
+ };
138
+ };
139
+
140
+ type TamperRunAt = 'document-start' | 'document-body' | 'document-end' | 'document-idle' | 'context-menu';
141
+ type TamperGrant = 'unsafeWindow' | 'window.close' | 'window.focus' | 'window.onurlchange' | 'GM_addStyle' | 'GM_addElement' | 'GM_deleteValue' | 'GM_listValues' | 'GM_addValueChangeListener' | 'GM_removeValueChangeListener' | 'GM_setValue' | 'GM_getValue' | 'GM_log' | 'GM_getResourceText' | 'GM_getResourceURL' | 'GM_registerMenuCommand' | 'GM_unregisterMenuCommand' | 'GM_openInTab' | 'GM_xmlhttpRequest' | 'GM_download' | 'GM_getTab' | 'GM_saveTab' | 'GM_getTabs' | 'GM_notification' | 'GM_setClipboard' | 'GM_info' | 'GM_cookie' | 'GM_webRequest';
142
+ type AntifeatureType = {
143
+ tag?: string;
144
+ type: 'ads' | 'tracking' | 'miner';
145
+ description: string;
146
+ };
147
+ /**
148
+ * @see https://www.tampermonkey.net/documentation.php
149
+ */
150
+ interface TampermonkeyUserScript {
151
+ /**
152
+ * @see https://www.tampermonkey.net/documentation.php#meta:name
153
+ *
154
+ */
155
+ name?: string | LocaleType<string>;
156
+ /**
157
+ * @see https://www.tampermonkey.net/documentation.php#meta:namespace
158
+ */
159
+ namespace?: string;
160
+ /**
161
+ * @see https://www.tampermonkey.net/documentation.php#meta:copyright
162
+ */
163
+ copyright?: string;
164
+ /**
165
+ * @see https://www.tampermonkey.net/documentation.php#meta:version
166
+ *
167
+ */
168
+ version?: string;
169
+ /**
170
+ * @see https://www.tampermonkey.net/documentation.php#meta:author
171
+ *
172
+ */
173
+ author?: string;
174
+ /**
175
+ * @see https://www.tampermonkey.net/documentation.php#meta:description
176
+ *
177
+ */
178
+ description?: string | LocaleType<string>;
179
+ /**
180
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
181
+ *
182
+ */
183
+ homepage?: string;
184
+ /**
185
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
186
+ *
187
+ */
188
+ homepageURL?: string;
189
+ /**
190
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
191
+ */
192
+ website?: string;
193
+ /**
194
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
195
+ */
196
+ source?: string;
197
+ /**
198
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
199
+ */
200
+ icon?: string;
201
+ /**
202
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
203
+ */
204
+ iconURL?: string;
205
+ /**
206
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
207
+ */
208
+ defaulticon?: string;
209
+ /**
210
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon64
211
+ */
212
+ icon64?: string;
213
+ /**
214
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon64
215
+ */
216
+ icon64URL?: string;
217
+ /**
218
+ * @see https://www.tampermonkey.net/documentation.php#meta:updateURL
219
+ */
220
+ updateURL?: string;
221
+ /**
222
+ * @see https://www.tampermonkey.net/documentation.php#meta:downloadURL
223
+ */
224
+ downloadURL?: string;
225
+ /**
226
+ * @see https://www.tampermonkey.net/documentation.php#meta:supportURL
227
+ */
228
+ supportURL?: string;
229
+ /**
230
+ * @see https://www.tampermonkey.net/documentation.php#meta:include
231
+ */
232
+ include?: IArray<string | RegExp>;
233
+ /**
234
+ * @see https://www.tampermonkey.net/documentation.php#meta:match
235
+ */
236
+ match?: IArray<string | RegExp>;
237
+ /**
238
+ * @see https://www.tampermonkey.net/documentation.php#meta:exclude
239
+ */
240
+ exclude?: IArray<string | RegExp>;
241
+ /**
242
+ * @see https://www.tampermonkey.net/documentation.php#meta:require
243
+ */
244
+ require?: IArray<string>;
245
+ /**
246
+ * @see https://www.tampermonkey.net/documentation.php#meta:resource
247
+ */
248
+ resource?: Record<string, string>;
249
+ /**
250
+ * @see https://www.tampermonkey.net/documentation.php#meta:connect
251
+ */
252
+ connect?: IArray<string>;
253
+ /**
254
+ * @see https://www.tampermonkey.net/documentation.php#meta:sandbox
255
+ */
256
+ sandbox?: 'raw' | 'JavaScript' | 'DOM';
257
+ /**
258
+ * @see https://www.tampermonkey.net/documentation.php#meta:antifeature
259
+ */
260
+ antifeature?: IArray<AntifeatureType>;
261
+ /**
262
+ * @see https://www.tampermonkey.net/documentation.php#meta:noframes
263
+ */
264
+ noframes?: boolean;
265
+ /**
266
+ * @see https://www.tampermonkey.net/documentation.php#meta:webRequest
267
+ */
268
+ webRequest?: IArray<WebRequestRule>;
269
+ /**
270
+ * @see https://www.tampermonkey.net/documentation.php#meta:unwrap
271
+ */
272
+ unwrap?: boolean;
273
+ }
274
+
275
+ type ViolentRunAt = 'document-end' | 'document-start' | 'document-idle';
276
+ type ViolentInjectInto = 'page' | 'content' | 'auto';
277
+ type ViolentGrant = 'window.close' | 'window.focus' | 'GM_info' | 'GM_getValue' | 'GM_setValue' | 'GM_deleteValue' | 'GM_listValues' | 'GM_addValueChangeListener' | 'GM_removeValueChangeListener' | 'GM_getResourceText' | 'GM_getResourceURL' | 'GM_addElement' | 'GM_addStyle' | 'GM_openInTab' | 'GM_registerMenuCommand' | 'GM_unregisterMenuCommand' | 'GM_notification' | 'GM_setClipboard' | 'GM_xmlhttpRequest' | 'GM_download' | 'GM.addStyle' | 'GM.addElement' | 'GM.registerMenuCommand' | 'GM.deleteValue' | 'GM.getResourceUrl' | 'GM.getValue' | 'GM.info' | 'GM.listValues' | 'GM.notification' | 'GM.openInTab' | 'GM.setClipboard' | 'GM.setValue' | 'GM.xmlHttpRequest';
278
+ /**
279
+ * @see https://violentmonkey.github.io/api/metadata-block/
280
+ */
281
+ interface ViolentmonkeyUserScript {
282
+ /**
283
+ * @see https://violentmonkey.github.io/api/metadata-block/#name
284
+ *
285
+ */
286
+ name?: string | LocaleType<string>;
287
+ /**
288
+ * @see https://violentmonkey.github.io/api/metadata-block/#namespace
289
+ */
290
+ namespace?: string;
291
+ /**
292
+ * @see https://violentmonkey.github.io/api/metadata-block/#version
293
+ *
294
+ */
295
+ version?: string;
296
+ /**
297
+ * @see https://violentmonkey.github.io/api/metadata-block/#description
298
+ *
299
+ */
300
+ description?: string | LocaleType<string>;
301
+ /**
302
+ * @see https://violentmonkey.github.io/api/metadata-block/#icon
303
+ */
304
+ icon?: string;
305
+ /**
306
+ * @see https://violentmonkey.github.io/api/metadata-block/#downloadurl
307
+ */
308
+ downloadURL?: string;
309
+ /**
310
+ * @see https://violentmonkey.github.io/api/metadata-block/#supporturl
311
+ */
312
+ supportURL?: string;
313
+ /**
314
+ * @see https://violentmonkey.github.io/api/metadata-block/#homepageurl
315
+ *
316
+ */
317
+ homepageURL?: string;
318
+ /**
319
+ * @see https://violentmonkey.github.io/api/metadata-block/#include--exclude
320
+ * @see https://violentmonkey.github.io/api/matching/#include--exclude
321
+ */
322
+ include?: IArray<string | RegExp>;
323
+ /**
324
+ * @see https://violentmonkey.github.io/api/metadata-block/#match--exclude-match
325
+ * @see https://violentmonkey.github.io/api/matching/#match--exclude-match
326
+ */
327
+ match?: IArray<string | RegExp>;
328
+ /**
329
+ * @see https://violentmonkey.github.io/api/metadata-block/#match--exclude-match
330
+ * @see https://violentmonkey.github.io/api/matching/#match--exclude-match
331
+ */
332
+ 'exclude-match'?: IArray<string | RegExp>;
333
+ /**
334
+ * @see https://violentmonkey.github.io/api/metadata-block/#include--exclude
335
+ * @see https://violentmonkey.github.io/api/matching/#include--exclude
336
+ */
337
+ exclude?: IArray<string | RegExp>;
338
+ /**
339
+ * @see https://violentmonkey.github.io/api/metadata-block/#require
340
+ */
341
+ require?: IArray<string>;
342
+ /**
343
+ * @see https://violentmonkey.github.io/api/metadata-block/#resource
344
+ */
345
+ resource?: Record<string, string>;
346
+ /**
347
+ * @see https://violentmonkey.github.io/api/metadata-block/#noframes
348
+ */
349
+ noframes?: boolean;
350
+ /**
351
+ * @see https://violentmonkey.github.io/api/metadata-block/#inject-into
352
+ */
353
+ 'inject-into'?: ViolentInjectInto;
354
+ /**
355
+ * @see https://violentmonkey.github.io/api/metadata-block/#unwrap
356
+ */
357
+ unwrap?: boolean;
358
+ }
359
+
360
+ /**
361
+ * @see https://greasyfork.org/help/meta-keys
362
+ */
363
+ type GreasyforkUserScript = {
364
+ /**
365
+ * @see https://greasyfork.org/help/meta-keys
366
+ * @default package.json.license
367
+ */
368
+ license?: string;
369
+ /**
370
+ * @see https://greasyfork.org/help/meta-keys
371
+ */
372
+ contributionURL?: string;
373
+ /**
374
+ * @see https://greasyfork.org/help/meta-keys
375
+ */
376
+ contributionAmount?: string;
377
+ /**
378
+ * @see https://greasyfork.org/help/meta-keys
379
+ */
380
+ compatible?: string;
381
+ /**
382
+ * @see https://greasyfork.org/help/meta-keys
383
+ */
384
+ incompatible?: string;
385
+ };
386
+ type MergemonkeyUserScript = {
387
+ /**
388
+ * @default package.json.name??'monkey'
389
+ * @default {...{'':package.json.name??'monkey'},...name} // if name is object
390
+ */
391
+ name?: string | LocaleType<string>;
392
+ /**
393
+ * @default 'vite-plugin-monkey'
394
+ */
395
+ namespace?: string;
396
+ /**
397
+ * @default package.json.version??'1.0.0'
398
+ */
399
+ version?: string;
400
+ /**
401
+ * @default package.json.description
402
+ * @default {...{'':package.json.description},...description} // if description is object
403
+ */
404
+ description?: string | LocaleType<string>;
405
+ /**
406
+ * @default package.json.author??'monkey'
407
+ */
408
+ author?: string;
409
+ /**
410
+ * @default package.json.homepage
411
+ */
412
+ homepage?: string;
413
+ /**
414
+ * @default package.json.homepage
415
+ */
416
+ homepageURL?: string;
417
+ /**
418
+ * @default package.json.repository
419
+ */
420
+ source?: string;
421
+ /**
422
+ * @default package.json.bugs
423
+ */
424
+ supportURL?: string;
425
+ /**
426
+ * @see https://wiki.greasespot.net/Metadata_Block#.40run-at
427
+ *
428
+ * @see https://www.tampermonkey.net/documentation.php#meta:run_at
429
+ *
430
+ * @see https://violentmonkey.github.io/api/metadata-block/#run-at
431
+ *
432
+ */
433
+ 'run-at'?: GreaseRunAt | TamperRunAt | ViolentRunAt;
434
+ /**
435
+ * @see https://wiki.greasespot.net/Metadata_Block#.40grant
436
+ *
437
+ * @see https://www.tampermonkey.net/documentation.php#meta:grant
438
+ *
439
+ * @see https://violentmonkey.github.io/api/metadata-block/#grant
440
+ *
441
+ * if set '\*', will add all GM_* to UserScript
442
+ */
443
+ grant?: IArray<GreaseGrant | TamperGrant | ViolentGrant> | 'none' | '*';
444
+ /**
445
+ * custom extra meta
446
+ * @example
447
+ * [['antifeature', ['miner', 'hello233']]]
448
+ * // -->
449
+ * // \@antifeature miner hello233
450
+ */
451
+ $extra?: [string, IArray<string>][] | Record<string, IArray<string>>;
452
+ };
453
+ /**
454
+ * UserScript, merge metadata from Greasemonkey, Tampermonkey, Violentmonkey, Greasyfork
455
+ */
456
+ type MonkeyUserScript = GreasemonkeyUserScript & TampermonkeyUserScript & ViolentmonkeyUserScript & GreasyforkUserScript & MergemonkeyUserScript;
457
+
458
+ type IPromise<T> = T | Promise<T>;
459
+ type IArray<T = unknown> = T | T[];
460
+ /**
461
+ * key is language code or ''
462
+ * @see https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
463
+ * @example
464
+ * {
465
+ * '':'default_name',
466
+ * 'zh-CN':'名字',
467
+ * ja: '名前'
468
+ * }
469
+ */
470
+ type LocaleType<T = unknown> = Record<string, T>;
471
+ type PkgOptions = {
472
+ name: string;
473
+ version: string;
474
+ importName: string;
475
+ resolveName: string;
476
+ resourceUrl: string;
477
+ resourceName: string;
478
+ };
479
+ type Pkg2UrlFn = (pkg: {
480
+ name: string;
481
+ version: string;
482
+ importName: string;
483
+ resolveName: string;
484
+ }) => IPromise<string>;
485
+ /**
486
+ * @param importName 'name/subname' in example
487
+ * @returns url or exportVarName
488
+ * @example
489
+ * const mod = await import('name/subname')
490
+ */
491
+ type Mod2UrlFn = (version: string, name: string, importName: string) => IPromise<string>;
492
+ type ModuleToUrlFc = (version: string, name: string, importName?: string, resolveName?: string) => string;
493
+ type ExternalGlobals = Record<string, IArray<string | Mod2UrlFn>> | [string, IArray<string | Mod2UrlFn>][];
494
+ type ExternalResource = Record<string, string | Pkg2UrlFn | {
495
+ resourceUrl: Pkg2UrlFn | string;
496
+ /**
497
+ * @default importName
498
+ */
499
+ resourceName?: Pkg2UrlFn | string;
500
+ loader?: (pkgOptions: PkgOptions) => unknown;
501
+ nodeLoader?: string | ((pkgOptions: PkgOptions) => IPromise<string>);
502
+ } | Array<string | ((version: string, name: string, importName: string, resolveName: string) => IPromise<string>)>>;
503
+ type MonkeyOption = {
504
+ /**
505
+ * userscript entry file path
506
+ */
507
+ entry: string;
508
+ userscript?: MonkeyUserScript;
509
+ format?: Format;
510
+ /**
511
+ * alias of vite-plugin-monkey/dist/client
512
+ * @default '$'
513
+ * @example
514
+ * // vite-env.d.ts for type hint
515
+ *
516
+ * // if you use default value `$`
517
+ * /// <reference types="vite-plugin-monkey/client" />
518
+ *
519
+ * // if you use other_alias
520
+ * declare module other_alias {
521
+ * export * from 'vite-plugin-monkey/dist/client';
522
+ * }
523
+ */
524
+ clientAlias?: string;
525
+ server?: {
526
+ /**
527
+ * auto open install url in default browser when userscript comment change
528
+ *
529
+ * and set `viteConfig.server.open ??= monkeyConfig.server.open`
530
+ * @default
531
+ * process.platform == 'win32' || process.platform == 'darwin' // if platform is Win/Mac
532
+ */
533
+ open?: boolean;
534
+ /**
535
+ * name prefix, distinguish server.user.js and build.user.js in monkey extension install list, if you not want prefix, set false
536
+ * @default 'server:'
537
+ */
538
+ prefix?: string | ((name: string) => string) | false;
539
+ /**
540
+ * close the preview server automatically after 3000ms
541
+ * @default false
542
+ */
543
+ closePreviewAutomatically?: boolean;
544
+ /**
545
+ * mount GM_api to unsafeWindow, not recommend it, you should use GM_api by ESM import, or use [unplugin-auto-import](https://github.com/antfu/unplugin-auto-import)
546
+ * @default false
547
+ * @example
548
+ * // if set true, you can use `vite-plugin-monkey/global` for type hint
549
+ * // vite-env.d.ts
550
+ * /// <reference types="vite-plugin-monkey/global" />
551
+ */
552
+ mountGmApi?: boolean;
553
+ };
554
+ build?: {
555
+ /**
556
+ * build bundle userscript file name
557
+ *
558
+ * it should end with '.user.js'
559
+ * @default (package.json.name??'monkey')+'.user.js'
560
+ */
561
+ fileName?: string;
562
+ /**
563
+ * build bundle userscript comment file name, this file is only include comment
564
+ *
565
+ * it can be used by userscript.updateURL, when checking for updates, just download this small file instead of downloading the entire script
566
+ *
567
+ * it should end with '.meta.js', if set false, will not generate this file
568
+ *
569
+ * if set true, will equal to fileName.replace(/\\.user\\.js$/,'.meta.js')
570
+ *
571
+ * @default false
572
+ */
573
+ metaFileName?: string | boolean | ((fileName: string) => string);
574
+ /**
575
+ * this config can be array or object, array=Object.entries(object)
576
+ *
577
+ * if value is string or function, it or its return value is exportVarName
578
+ *
579
+ * if value is Array, the first [item or its return value] is exportVarName, the items after it all are url that is [require url]
580
+ *
581
+ * if module is unimported, plugin will not add require url to userscript
582
+ *
583
+ * @example
584
+ * { // map structure
585
+ * vue:'Vue',
586
+ * // if set this
587
+ * // you need manually set userscript.require = ['https://unpkg.com/vue@3.0.0/dist/vue.global.js'], when `vite build`
588
+ *
589
+ * vuex:['Vuex', (version, name)=>`https://unpkg.com/${name}@${version}/dist/vuex.global.js`],
590
+ * // plugin will auto add this url to userscript.require
591
+ *
592
+ * 'prettier/parser-babel': [
593
+ * 'prettierPlugins.babel',
594
+ * (version, name, importName) => {
595
+ * // name == `prettier`
596
+ * // importName == `prettier/parser-babel`
597
+ * const subpath = `${importName.split('/').at(-1)}.js`;
598
+ * return `https://cdn.jsdelivr.net/npm/${name}@${version}/${subpath}`;
599
+ * },
600
+ * ],
601
+ * // sometimes importName deffers from package name
602
+ * }
603
+ * @example
604
+ * [ // array structure, this example come from [playground/ex-vue-demi](https://github.com/lisonge/vite-plugin-monkey/tree/main/playground/ex-vue-demi)
605
+ * [
606
+ * 'vue',
607
+ * cdn
608
+ * .jsdelivr('Vue', 'dist/vue.global.prod.js')
609
+ * .concat('https://unpkg.com/vue-demi@latest/lib/index.iife.js')
610
+ * .concat(
611
+ * await util.fn2dataUrl(() => {
612
+ * window.Vue = Vue;
613
+ * }),
614
+ * ),
615
+ * ],
616
+ * ['pinia', cdn.jsdelivr('Pinia', 'dist/pinia.iife.prod.js')],
617
+ * [
618
+ * 'element-plus',
619
+ * cdn.jsdelivr('ElementPlus', 'dist/index.full.min.js'),
620
+ * ],
621
+ * ]
622
+ */
623
+ externalGlobals?: ExternalGlobals;
624
+ /**
625
+ * according to final code bundle, auto inject GM_* or GM.* to userscript comment grant
626
+ *
627
+ * tree shaking code, then if code.includes('GM_xxx'), add \@grant GM_xxx to userscript
628
+ * @default true
629
+ */
630
+ autoGrant?: boolean;
631
+ /**
632
+ * @deprecated use [viteConfig.build.cssMinify](https://vitejs.dev/config/build-options.html#build-cssminify) in vite>=4.2.0
633
+ *
634
+ * now minifyCss will not work
635
+ */
636
+ minifyCss?: boolean;
637
+ /**
638
+ * @example
639
+ * { // resourceName default value is pkg.importName
640
+ * 'element-plus/dist/index.css': pkg=>`https://unpkg.com/${pkg.name}@${pkg.version}/${pkg.resolveName}`,
641
+ * 'element-plus/dist/index.css': {
642
+ * resourceName: pkg=>pkg.importName,
643
+ * resourceUrl: pkg=>`https://unpkg.com/${pkg.name}@${pkg.version}/${pkg.resolveName}`,
644
+ * loader: pkg=>{ // there are default loaders that support [css, json, the assets that vite support, ?url, ?raw] file/name suffix
645
+ * const css = GM_getResourceText(pkg.resourceName);
646
+ * GM_addStyle(css);
647
+ * return css;
648
+ * },
649
+ * nodeLoader: pkg=>{
650
+ * return [
651
+ * `export default (()=>{`,
652
+ * `const css = GM_getResourceText(${JSON.stringify(pkg.resourceName)});`,
653
+ * `GM_addStyle(css);`,
654
+ * `return css;`,
655
+ * `})();`
656
+ * ].join('');
657
+ * },
658
+ * },
659
+ * 'element-plus/dist/index.css': [
660
+ * (version, name, importName, resolveName)=>importName,
661
+ * (version, name, importName, resolveName)=>`https://unpkg.com/${name}@${version}/${resolveName}`,
662
+ * // for compat externalGlobals cdn function, if (version/name/importName/resolveName) == '', plugin will use their own default values
663
+ * ],
664
+ * 'element-plus/dist/index.css': cdn.jsdelivr(),
665
+ * }
666
+ */
667
+ externalResource?: ExternalResource;
668
+ /**
669
+ * when use dynamic-import, plugin will use systemjs build your code
670
+ *
671
+ * `cdn.jsdelivr()[1]` example -> [dynamic-import.user.js](https://github.com/lisonge/vite-plugin-monkey/blob/7645b185605faf9b48c43116db5ea01726188e03/playground/dynamic-import/dist/dynamic-import.user.js)
672
+ *
673
+ * `'inline'` exmple -> [test-v3.user.js](https://github.com/lisonge/vite-plugin-monkey/blob/7645b185605faf9b48c43116db5ea01726188e03/playground/test-v3/dist/test-v3.user.js)
674
+ *
675
+ * @default
676
+ * cdn.jsdelivr()[1]
677
+ */
678
+ systemjs?: 'inline' | ModuleToUrlFc;
679
+ /**
680
+ * @default
681
+ * const defaultFc = () => {
682
+ * return (e: string) => {
683
+ * if (typeof GM_addStyle == 'function') {
684
+ * GM_addStyle(e);
685
+ * return;
686
+ * }
687
+ * const o = document.createElement('style');
688
+ * o.textContent = e;
689
+ * document.head.append(o);
690
+ * };
691
+ * };
692
+ * @example
693
+ * const defaultFc1 = () => {
694
+ * return (e: string) => {
695
+ * const o = document.createElement('style');
696
+ * o.textContent = e;
697
+ * document.head.append(o);
698
+ * };
699
+ * };
700
+ * const defaultFc2 = (css:string)=>{
701
+ * const t = JSON.stringify(css)
702
+ * return `(e=>{const o=document.createElement("style");o.textContent=e,document.head.append(o)})(${t})`
703
+ * }
704
+ */
705
+ cssSideEffects?: (css: string) => IPromise<string | ((css: string) => void)>;
706
+ };
707
+ };
708
+
709
+ /**
710
+ * `https://cdn.jsdelivr.net/npm/${name}@${version}/${pathname}`
711
+ * @param exportVarName cdn-exportVarName or resourceName
712
+ * @param pathname jsdelivr support file combine, normally you don't need set pathname
713
+ * @see https://www.jsdelivr.com/features
714
+ */
715
+ declare const jsdelivr: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
716
+ /**
717
+ * `https://fastly.jsdelivr.net/npm/${name}@${version}/${pathname}`
718
+ * @param exportVarName cdn-exportVarName or resourceName
719
+ * @param pathname jsdelivr support file combine, normally you don't need set pathname
720
+ * @see https://www.jsdelivr.com/features
721
+ */
722
+ declare const jsdelivrFastly: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
723
+ /**
724
+ * `https://unpkg.com/${name}@${version}/${pathname}`
725
+ * @param exportVarName cdn-exportVarName or resourceName
726
+ * @see https://unpkg.com/
727
+ */
728
+ declare const unpkg: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
729
+ /**
730
+ * `https://lf9-cdn-tos.bytecdntp.com/cdn/expire-10-y/${name}/${version}/${pathname}`
731
+ * @param exportVarName cdn-exportVarName or resourceName
732
+ * @see https://cdn.bytedance.com/
733
+ */
734
+ declare const bytecdntp: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
735
+ /**
736
+ * `https://cdn.jsdelivr.net/npm/${name}@${version}/${pathname}`
737
+ * @deprecated bootcdn will return virus-infected code. Please stop using it and switch to other sources
738
+ */
739
+ declare const bootcdn: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
740
+ /**
741
+ * `https://lib.baomitu.com/${name}/${version}/${pathname}`
742
+ * @param exportVarName cdn-exportVarName or resourceName
743
+ * @see https://cdn.baomitu.com/
744
+ */
745
+ declare const baomitu: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
746
+ /**
747
+ * `https://cdn.staticfile.org/${name}/${version}/${pathname}`
748
+ * @param exportVarName cdn-exportVarName or resourceName
749
+ * @see https://staticfile.org/
750
+ */
751
+ declare const staticfile: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
752
+ /**
753
+ * `https://cdnjs.cloudflare.com/ajax/libs/${name}/${version}/${pathname}`
754
+ * @param exportVarName cdn-exportVarName or resourceName
755
+ * @see https://cdnjs.com/libraries
756
+ */
757
+ declare const cdnjs: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
758
+ /**
759
+ * `https://unpkg.zhimg.com/${name}/${version}/${pathname}`
760
+ * @param exportVarName cdn-exportVarName or resourceName
761
+ * @link https://unpkg.zhimg.com/
762
+ */
763
+ declare const zhimg: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
764
+ /**
765
+ * `https://npm.elemecdn.com/${name}@${version}/${pathname}`
766
+ * @param exportVarName cdn-exportVarName or resourceName
767
+ */
768
+ declare const elemecdn: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
769
+ /**
770
+ * `https://code.bdstatic.com/npm/${name}@${version}/${pathname}`
771
+ * @param exportVarName cdn-exportVarName or resourceName
772
+ */
773
+ declare const bdstatic: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
774
+ /**
775
+ * `https://registry.npmmirror.com/${name}/${version}/files/${pathname}`
776
+ * @param exportVarName cdn-exportVarName or resourceName
777
+ */
778
+ declare const npmmirror: (exportVarName?: string, pathname?: string) => [string, ModuleToUrlFc];
779
+
780
+ declare const cdn_baomitu: typeof baomitu;
781
+ declare const cdn_bdstatic: typeof bdstatic;
782
+ declare const cdn_bootcdn: typeof bootcdn;
783
+ declare const cdn_bytecdntp: typeof bytecdntp;
784
+ declare const cdn_cdnjs: typeof cdnjs;
785
+ declare const cdn_elemecdn: typeof elemecdn;
786
+ declare const cdn_jsdelivr: typeof jsdelivr;
787
+ declare const cdn_jsdelivrFastly: typeof jsdelivrFastly;
788
+ declare const cdn_npmmirror: typeof npmmirror;
789
+ declare const cdn_staticfile: typeof staticfile;
790
+ declare const cdn_unpkg: typeof unpkg;
791
+ declare const cdn_zhimg: typeof zhimg;
792
+ declare namespace cdn {
793
+ export { cdn_baomitu as baomitu, cdn_bdstatic as bdstatic, cdn_bootcdn as bootcdn, cdn_bytecdntp as bytecdntp, cdn_cdnjs as cdnjs, cdn_elemecdn as elemecdn, cdn_jsdelivr as jsdelivr, cdn_jsdelivrFastly as jsdelivrFastly, cdn_npmmirror as npmmirror, cdn_staticfile as staticfile, cdn_unpkg as unpkg, cdn_zhimg as zhimg };
794
+ }
795
+
796
+ /**
797
+ * transform function and parameter to iife code then mini code then transform code to data url string
798
+ *
799
+ * this tool function is used to make umd-cdn and iife-cdn work normally, such as element-plus and vue
800
+ *
801
+ * @example
802
+ * // this example comes form https://github.com/lisonge/vite-plugin-monkey/blob/main/playground/ex-vue-demi/vite.config.ts
803
+ * const externalGlobals = [
804
+ * [
805
+ * 'vue',
806
+ * cdn
807
+ * .jsdelivr('Vue', 'dist/vue.global.prod.js')
808
+ * .concat('https://unpkg.com/vue-demi@latest/lib/index.iife.js')
809
+ * .concat(
810
+ * await util.fn2dataUrl(() => {
811
+ * // \@ts-ignore
812
+ * window.Vue = Vue; // work with element-plus
813
+ * }),
814
+ * ),
815
+ * ],
816
+ * ['pinia', cdn.jsdelivr('Pinia', 'dist/pinia.iife.prod.js')],
817
+ * ['element-plus', cdn.jsdelivr('ElementPlus', 'dist/index.full.min.js')],
818
+ * ];
819
+ */
820
+ declare const fn2dataUrl: <T extends (...args: any[]) => any>(fn: T, ...args: Parameters<T>) => Promise<string>;
821
+ /**
822
+ * string -> javascript data url
823
+ */
824
+ declare function dataUrl(code: string): string;
825
+ /**
826
+ * function and it parameters -> iife -> mini_iife -> javascript data url
827
+ */
828
+ declare function dataUrl<T extends (...args: any[]) => any>(fn: T, ...args: Parameters<T>): Promise<string>;
829
+ /**
830
+ * GM api preset when you use unimport/unplugin-auto-import
831
+ *
832
+ * Note, there is not comment in unimport.d.ts/auto-imports.d.ts file
833
+ */
834
+ declare const unimportPreset: InlinePreset;
835
+
836
+ declare const util_dataUrl: typeof dataUrl;
837
+ declare const util_fn2dataUrl: typeof fn2dataUrl;
838
+ declare const util_unimportPreset: typeof unimportPreset;
839
+ declare namespace util {
840
+ export { util_dataUrl as dataUrl, util_fn2dataUrl as fn2dataUrl, util_unimportPreset as unimportPreset };
841
+ }
842
+
843
+ declare const _default: (pluginOption: MonkeyOption) => Plugin[];
844
+
845
+ export { type Format, type GreasemonkeyUserScript, type MonkeyOption, type MonkeyUserScript, type TampermonkeyUserScript, type ViolentmonkeyUserScript, cdn, _default as default, util };