vite-userscript-plugin 1.9.1 → 1.10.0

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.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var te=Object.create;var x=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ie=(e,r)=>{for(var t in r)x(e,t,{get:r[t],enumerable:!0})},_=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of ne(r))!oe.call(e,s)&&s!==t&&x(e,s,{get:()=>r[s],enumerable:!(n=re(r,s))||n.enumerable});return e};var b=(e,r,t)=>(t=e!=null?te(se(e)):{},_(r||!e||!e.__esModule?x(t,"default",{value:e,enumerable:!0}):t,e)),ae=e=>_(x({},"__esModule",{value:!0}),e);var me={};ie(me,{default:()=>B});module.exports=ae(me);var c=require("fs"),N=require("http"),m=require("path"),V=b(require("get-port"),1),H=b(require("open"),1),S=b(require("picocolors"),1),W=b(require("serve-handler"),1),q=require("vite"),z=require("websocket");var f=class{constructor(r){this.config=r;this.addHomepageMeta(),this.maxKeyLength=Math.max(...Object.keys(this.config).map(t=>t.length))+1}header=[];maxKeyLength;addHomepageMeta(){let r=this.config.homepage??this.config.homepageURL;r&&(this.config.updateURL=new URL(`${this.config.name}.meta.js`,r).href,this.config.downloadURL=new URL(`${this.config.name}.user.js`,r).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,t){t=Array.isArray(t)?t.join(" "):t===!0?"":t,this.header.push(`// @${r}${this.addSpaces(r)}${t}`)}generate(){for(let[r,t]of Object.entries(this.config))if(Array.isArray(t))t.forEach(n=>this.addMetadata(r,n));else{if(t===void 0)continue;this.addMetadata(r,t)}return["// ==UserScript==",...this.header,"// ==/UserScript=="].join(`
2
- `)}};var O=require("path"),E=require("url"),pe={},P=(0,O.dirname)((0,E.fileURLToPath)(pe.url)),v="vite-userscript-plugin",R='console.warn("__STYLE__")',D=new RegExp(/\.(t|j)sx?$/),C=new RegExp(/\.(s[ac]|c|le)ss$/),le=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],ce=["unsafeWindow","window.onurlchange","window.focus","window.close"],g=le.map(e=>[`GM_${e}`,`GM.${e}`]).flat();g.push(...ce);var U=class{styles=new Map;add(r,t){return this.styles.set(r,t.replace(`
3
- `,"")),""}inject(){return this.styles.size?`GM_addStyle(\`${[...this.styles.values()].join("")}\`)`:void 0}merge(r){let t=[];for(let n of r){let s=this.styles.get(n);s&&t.push([n,s])}this.styles.clear(),t.forEach(n=>this.styles.set(...n))}},j=new U;var k=require("vite");function G(e){return[...new Set(Array.isArray(e)?e:e?[e]:[])]}async function $({minify:e,file:r,name:t,loader:n}){let{code:s}=await(0,k.transformWithEsbuild)(r,t,{minify:e,loader:n,sourcemap:!1,legalComments:"none"});return s}function A(e){let r=[];for(let t of g)e.indexOf(t)!==-1&&r.push(t);return r}function B(e){try{let r,t,n=null,s=(0,q.createLogger)("info",{prefix:`[${v}]`,allowClearScreen:!0}),h=(0,N.createServer)((o,i)=>(0,W.default)(o,i,{public:r.build.outDir})),K=z.server;return new K({httpServer:h}).on("request",o=>{n=o.accept(null,o.origin)}),{name:v,apply:"build",config(){return{build:{target:"esnext",minify:!1,lib:{entry:e.entry,name:e.header.name,formats:["iife"],fileName:()=>`${e.header.name}.js`},rollupOptions:{output:{extend:!0}}}}},async configResolved(o){r=o,t=o.build.watch??!1,e.entry=(0,m.resolve)(o.root,e.entry),Array.from(["match","require","include","exclude","resource","connect"]).forEach(i=>{let a=e.header[i];e.header[i]=G(a)}),e.server={port:await(0,V.default)(),open:!1,...e.server}},async transform(o,i){let a=o;if(C.test(i)){let p=await $({minify:!t,file:a,name:i,loader:"css"});a=j.add(i,p)}return i.includes(e.entry)&&(a=o+R),{code:a,map:null}},generateBundle(o,i){for(let a of Object.values(i)){if(a.type==="asset")continue;let p=Object.keys(a.modules).filter(u=>C.test(u));p.length&&j.merge(p)}},async writeBundle(o,i){let{open:a,port:p}=e.server,u=o.sanitizeFileName(e.header.name),I=`${u}.user.js`,F=`${u}.proxy.user.js`,J=`${u}.meta.js`;for(let[d]of Object.entries(i))if(D.test(d)){let y=r.root,w=r.build.outDir,M=(0,m.resolve)(y,w,d),Y=(0,m.resolve)(y,w,I),Q=(0,m.resolve)(y,w,F),X=(0,m.resolve)(y,w,J),L=(0,m.resolve)(P,`ws-${u}.js`);try{let l=(0,c.readFileSync)(M,"utf8");if(l=l.replace(R,`${j.inject()}`),l=await $({minify:!t,file:l,name:d,loader:"js"}),e.header.grant=G(t?g:[...A(l),...e.header.grant??[]]),t){let Z=(0,c.readFileSync)((0,m.resolve)(P,"ws.js"),"utf8"),ee=await $({minify:!t,file:Z.replace("__WS__",`ws://localhost:${p}`),name:L,loader:"js"});(0,c.writeFileSync)(L,ee),(0,c.writeFileSync)(Q,new f({...e.header,require:[...e.header.require??[],"file://"+L,"file://"+M]}).generate())}let T=new f(e.header).generate();(0,c.writeFileSync)(M,l),(0,c.writeFileSync)(X,T),(0,c.writeFileSync)(Y,`${T}
1
+ "use strict";var re=Object.create;var v=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var ae=(e,t)=>{for(var r in t)v(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ne(t))!ie.call(e,n)&&n!==r&&v(e,n,{get:()=>t[n],enumerable:!(s=se(t,n))||s.enumerable});return e};var j=(e,t,r)=>(r=e!=null?re(oe(e)):{},E(t||!e||!e.__esModule?v(r,"default",{value:e,enumerable:!0}):r,e)),le=e=>E(v({},"__esModule",{value:!0}),e);var ue={};ae(ue,{default:()=>K});module.exports=le(ue);var c=require("fs"),V=require("http"),p=require("path"),H=j(require("get-port"),1),W=j(require("open"),1),M=j(require("picocolors"),1),q=j(require("serve-handler"),1),z=require("vite"),B=require("websocket");var g=class{constructor(t){this.config=t;this.addHomepageMeta(),this.maxKeyLength=Math.max(...Object.keys(this.config).map(r=>r.length))+1}header=[];maxKeyLength;addHomepageMeta(){let t=this.config.homepage??this.config.homepageURL;t&&(this.config.updateURL=new URL(`${this.config.name}.meta.js`,t).href,this.config.downloadURL=new URL(`${this.config.name}.user.js`,t).href)}addSpaces(t){return" ".repeat(this.maxKeyLength-t.length)}addMetadata(t,r){r=Array.isArray(r)?r.join(" "):r===!0?"":r,this.header.push(`// @${t}${this.addSpaces(t)}${r}`)}generate(){for(let[t,r]of Object.entries(this.config))if(Array.isArray(r))r.forEach(s=>this.addMetadata(t,s));else{if(r===void 0)continue;this.addMetadata(t,r)}return["// ==UserScript==",...this.header,"// ==/UserScript=="].join(`
2
+ `)}};var _=require("path"),D=require("url"),me={},L=(0,_.dirname)((0,D.fileURLToPath)(me.url)),$="vite-userscript-plugin",R='console.warn("__STYLE__")',N=new RegExp(/\.(t|j)sx?$/),C=new RegExp(/\.(s[ac]|c|le)ss$/),ce=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],pe=["unsafeWindow","window.onurlchange","window.focus","window.close"],h=ce.map(e=>[`GM_${e}`,`GM.${e}`]).flat();h.push(...pe);var k=require("vite");function O(e){return[...new Set(Array.isArray(e)?e:e?[e]:[])]}async function y({minify:e,file:t,name:r,loader:s},n){let{code:d}=await(0,k.transformWithEsbuild)(t,r,{minify:e,loader:s,sourcemap:!1,legalComments:"none",...n});return d}function A(e){let t=[];for(let r of h)e.indexOf(r)!==-1&&t.push(r);return t}var U=class{styles=new Map;async add(t,r,s){let n=await y({name:t,file:r,minify:s,loader:"css"});return this.styles.set(t,n.replace(`
3
+ `,"")),""}inject(){return this.styles.size?`GM_addStyle(\`${[...this.styles.values()].join("")}\`)`:void 0}merge(t){let r=[];for(let s of t){let n=this.styles.get(s);n&&r.push([s,n])}this.styles.clear(),r.forEach(s=>this.styles.set(...s))}},S=new U;function K(e){try{let t,r,s=null,n=e.fileName??e.header.name,d=(0,z.createLogger)("info",{prefix:`[${$}]`,allowClearScreen:!0}),w=(0,V.createServer)((o,i)=>(0,q.default)(o,i,{public:t.build.outDir})),I=B.server;return new I({httpServer:w}).on("request",o=>{s=o.accept(null,o.origin)}),{name:$,apply:"build",config(){return{build:{target:"esnext",minify:!1,lib:{name:n,entry:e.entry,formats:["iife"],fileName:()=>`${n}.js`},rollupOptions:{output:{extend:!0}}}}},async configResolved(o){t=o,r=o.build.watch??!1,e.entry=(0,p.resolve)(o.root,e.entry),Array.from(["match","require","include","exclude","resource","connect"]).forEach(i=>{let a=e.header[i];e.header[i]=O(a)}),e.server={port:await(0,H.default)(),open:!1,...e.server}},async transform(o,i){let a=o;return C.test(i)&&(a=await S.add(i,a,!r)),i.includes(e.entry)&&(a=o+R),{code:a,map:null}},generateBundle(o,i){for(let a of Object.values(i)){if(a.type==="asset")continue;let m=Object.keys(a.modules).filter(u=>C.test(u));m.length&&S.merge(m)}},async writeBundle(o,i){let{open:a,port:m}=e.server,u=o.sanitizeFileName(n),J=`${u}.user.js`,G=`${u}.proxy.user.js`,Y=`${u}.meta.js`;for(let[f]of Object.entries(i))if(N.test(f)){let x=t.root,b=t.build.outDir,P=(0,p.resolve)(x,b,f),Q=(0,p.resolve)(x,b,J),X=(0,p.resolve)(x,b,G),Z=(0,p.resolve)(x,b,Y),T=(0,p.resolve)(L,`ws-${u}.js`);try{let l=(0,c.readFileSync)(P,"utf8");if(l=l.replace(R,`${S.inject()}`),l=await y({minify:!r,file:l,name:f,loader:"js"},e.esbuildTransformOptions),e.header.grant=O(r?h:[...A(l),...e.header.grant??[]]),r){let ee=(0,c.readFileSync)((0,p.resolve)(L,"ws.js"),"utf8"),te=await y({minify:!r,file:ee.replace("__WS__",`ws://localhost:${m}`),name:T,loader:"js"},e.esbuildTransformOptions);(0,c.writeFileSync)(T,te),(0,c.writeFileSync)(X,new g({...e.header,require:[...e.header.require??[],"file://"+T,"file://"+P]}).generate())}let F=new g(e.header).generate();(0,c.writeFileSync)(P,l),(0,c.writeFileSync)(Z,F),(0,c.writeFileSync)(Q,`${F}
4
4
 
5
- ${l}`)}catch(l){console.log(l)}}if(t&&!h.listening){let d=`http://localhost:${p}`;h.listen(p,()=>{s.clearScreen("info"),s.info(S.default.bold(`${S.default.cyan(">>> [vite-userscript-plugin]")} ${S.default.gray(d)}`))}),a&&await(0,H.default)(`${d}/${F}`)}else t||(h.close(),process.exit(0))},buildEnd(){t&&(s.clearScreen("info"),n&&n.sendUTF(JSON.stringify({message:"reload"})))}}}catch(r){return console.error(r),{name:v}}}
5
+ ${l}`)}catch(l){console.log(l)}}if(r&&!w.listening){let f=`http://localhost:${m}`;w.listen(m,()=>{d.clearScreen("info"),d.info(M.default.bold(`${M.default.cyan(">>> [vite-userscript-plugin]")} ${M.default.gray(f)}`))}),a&&await(0,W.default)(`${f}/${G}`)}else r||(w.close(),process.exit(0))},buildEnd(){r&&(d.clearScreen("info"),s&&s.sendUTF(JSON.stringify({message:"reload"})))}}}catch(t){return console.error(t),{name:$}}}
@@ -0,0 +1,187 @@
1
+ import { EsbuildTransformOptions, PluginOption } from 'vite';
2
+
3
+ declare const GM: readonly ["setValue", "getValue", "deleteValue", "listValues", "setClipboard", "addStyle", "addElement", "addValueChangeListener", "removeValueChangeListener", "registerMenuCommand", "unregisterMenuCommand", "download", "getTab", "getTabs", "saveTab", "openInTab", "notification", "getResourceURL", "getResourceText", "xmlhttpRequest", "log", "info"];
4
+ declare const GMwindow: readonly ["unsafeWindow", "window.onurlchange", "window.focus", "window.close"];
5
+
6
+ type RunAt = 'document-start' | 'document-body' | 'document-end' | 'document-idle' | 'context-menu';
7
+ type GMLiterals<T extends string> = [`GM_${T}` | `GM.${T}`];
8
+ type GMWindow = typeof GMwindow[number];
9
+ type Grants = GMWindow | GMLiterals<typeof GM[number]>[number];
10
+ type HeaderConfig = {
11
+ [property: string]: any;
12
+ /**
13
+ * @see https://www.tampermonkey.net/documentation.php#meta:name
14
+ */
15
+ name: string;
16
+ /**
17
+ * @see https://www.tampermonkey.net/documentation.php#meta:namespace
18
+ */
19
+ namespace?: string;
20
+ /**
21
+ * @see https://www.tampermonkey.net/documentation.php#meta:copyright
22
+ */
23
+ copyright?: string;
24
+ /**
25
+ * @see https://www.tampermonkey.net/documentation.php#meta:version
26
+ */
27
+ version: string;
28
+ /**
29
+ * @see https://www.tampermonkey.net/documentation.php#meta:description
30
+ */
31
+ description?: string;
32
+ /**
33
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
34
+ */
35
+ icon?: string;
36
+ /**
37
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
38
+ */
39
+ iconURL?: string;
40
+ /**
41
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon
42
+ */
43
+ defaulticon?: string;
44
+ /**
45
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon64
46
+ */
47
+ icon64?: string;
48
+ /**
49
+ * @see https://www.tampermonkey.net/documentation.php#meta:icon64
50
+ */
51
+ icon64URL?: string;
52
+ /**
53
+ * @see https://www.tampermonkey.net/documentation.php#meta:grant
54
+ */
55
+ grant?: Grants[];
56
+ /**
57
+ * @see https://www.tampermonkey.net/documentation.php#meta:author
58
+ */
59
+ author?: string;
60
+ /**
61
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
62
+ */
63
+ homepage?: string;
64
+ /**
65
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
66
+ */
67
+ homepageURL?: string;
68
+ /**
69
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
70
+ */
71
+ website?: string;
72
+ /**
73
+ * @see https://www.tampermonkey.net/documentation.php#meta:homepage
74
+ */
75
+ source?: string;
76
+ /**
77
+ * @see https://www.tampermonkey.net/documentation.phpmeta:antifeature
78
+ */
79
+ antifeature?: [type: string, description: string][];
80
+ /**
81
+ * @see https://www.tampermonkey.net/documentation.php#meta:require
82
+ */
83
+ require?: string[] | string;
84
+ /**
85
+ * @see https://www.tampermonkey.net/documentation.php#meta:resource
86
+ */
87
+ resource?: [key: string, value: string][];
88
+ /**
89
+ * @see https://www.tampermonkey.net/documentation.php#meta:include
90
+ */
91
+ include?: string[] | string;
92
+ /**
93
+ * @see https://www.tampermonkey.net/documentation.php#meta:match
94
+ * @see https://violentmonkey.github.io/api/metadata-block/#match--exclude-match
95
+ */
96
+ match: string[] | string;
97
+ /**
98
+ * @see https://violentmonkey.github.io/api/metadata-block/#match--exclude-match
99
+ */
100
+ 'exclude-match'?: string[] | string;
101
+ /**
102
+ * @see https://www.tampermonkey.net/documentation.php#meta:exclude
103
+ */
104
+ exclude?: string[] | string;
105
+ /**
106
+ * @see https://www.tampermonkey.net/documentation.php#meta:run_at
107
+ */
108
+ 'run-at'?: RunAt;
109
+ /**
110
+ * @see https://www.tampermonkey.net/documentation.phpmeta:sandbox
111
+ */
112
+ sandbox?: string;
113
+ /**
114
+ * @see https://www.tampermonkey.net/documentation.php#meta:connect
115
+ */
116
+ connect?: string[] | string;
117
+ /**
118
+ * @see https://www.tampermonkey.net/documentation.php#meta:noframes
119
+ */
120
+ noframes?: boolean;
121
+ /**
122
+ * @see https://www.tampermonkey.net/documentation.php#meta:updateURL
123
+ */
124
+ updateURL?: string;
125
+ /**
126
+ * @see https://www.tampermonkey.net/documentation.php#meta:downloadURL
127
+ */
128
+ downloadURL?: string;
129
+ /**
130
+ * @see https://www.tampermonkey.net/documentation.php#meta:supportURL
131
+ */
132
+ supportURL?: string;
133
+ /**
134
+ * @see https://www.tampermonkey.net/documentation.php#meta:webRequest
135
+ */
136
+ webRequest?: string[];
137
+ /**
138
+ * @see https://www.tampermonkey.net/documentation.php#meta:unwrap
139
+ */
140
+ unwrap?: boolean;
141
+ };
142
+ interface ServerConfig {
143
+ /**
144
+ * {@link https://github.com/sindresorhus/get-port}
145
+ */
146
+ port?: number;
147
+ /**
148
+ * @default false
149
+ */
150
+ open?: boolean;
151
+ }
152
+ interface UserscriptPluginConfig {
153
+ /**
154
+ * Path of userscript entry.
155
+ */
156
+ entry: string;
157
+ /**
158
+ * Userscript file name.
159
+ */
160
+ fileName?: string;
161
+ /**
162
+ * Userscript header config.
163
+ *
164
+ * @see https://www.tampermonkey.net/documentation.php
165
+ */
166
+ header: HeaderConfig;
167
+ /**
168
+ * Server config.
169
+ */
170
+ server?: ServerConfig;
171
+ /**
172
+ * Override default esbuild transform options.
173
+ *
174
+ * @default
175
+ * ```json
176
+ * {
177
+ * "minify": true,
178
+ * "legalComments": "none"
179
+ * }
180
+ * ```
181
+ */
182
+ esbuildTransformOptions?: Omit<EsbuildTransformOptions, 'format' | 'target' | 'loader' | 'sourcemap'>;
183
+ }
184
+
185
+ declare function UserscriptPlugin(config: UserscriptPluginConfig): PluginOption;
186
+
187
+ export { UserscriptPluginConfig, UserscriptPlugin as default };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PluginOption } from 'vite';
1
+ import { EsbuildTransformOptions, PluginOption } from 'vite';
2
2
 
3
3
  declare const GM: readonly ["setValue", "getValue", "deleteValue", "listValues", "setClipboard", "addStyle", "addElement", "addValueChangeListener", "removeValueChangeListener", "registerMenuCommand", "unregisterMenuCommand", "download", "getTab", "getTabs", "saveTab", "openInTab", "notification", "getResourceURL", "getResourceText", "xmlhttpRequest", "log", "info"];
4
4
  declare const GMwindow: readonly ["unsafeWindow", "window.onurlchange", "window.focus", "window.close"];
@@ -154,6 +154,10 @@ interface UserscriptPluginConfig {
154
154
  * Path of userscript entry.
155
155
  */
156
156
  entry: string;
157
+ /**
158
+ * Userscript file name.
159
+ */
160
+ fileName?: string;
157
161
  /**
158
162
  * Userscript header config.
159
163
  *
@@ -164,6 +168,18 @@ interface UserscriptPluginConfig {
164
168
  * Server config.
165
169
  */
166
170
  server?: ServerConfig;
171
+ /**
172
+ * Override default esbuild transform options.
173
+ *
174
+ * @default
175
+ * ```json
176
+ * {
177
+ * "minify": true,
178
+ * "legalComments": "none"
179
+ * }
180
+ * ```
181
+ */
182
+ esbuildTransformOptions?: Omit<EsbuildTransformOptions, 'format' | 'target' | 'loader' | 'sourcemap'>;
167
183
  }
168
184
 
169
185
  declare function UserscriptPlugin(config: UserscriptPluginConfig): PluginOption;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import{readFileSync as _,writeFileSync as g}from"fs";import{createServer as I}from"http";import{resolve as p}from"path";import J from"get-port";import Y from"open";import C from"picocolors";import Q from"serve-handler";import{createLogger as X}from"vite";import{server as Z}from"websocket";var d=class{constructor(r){this.config=r;this.addHomepageMeta(),this.maxKeyLength=Math.max(...Object.keys(this.config).map(e=>e.length))+1}header=[];maxKeyLength;addHomepageMeta(){let r=this.config.homepage??this.config.homepageURL;r&&(this.config.updateURL=new URL(`${this.config.name}.meta.js`,r).href,this.config.downloadURL=new URL(`${this.config.name}.user.js`,r).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,e){e=Array.isArray(e)?e.join(" "):e===!0?"":e,this.header.push(`// @${r}${this.addSpaces(r)}${e}`)}generate(){for(let[r,e]of Object.entries(this.config))if(Array.isArray(e))e.forEach(o=>this.addMetadata(r,o));else{if(e===void 0)continue;this.addMetadata(r,e)}return["// ==UserScript==",...this.header,"// ==/UserScript=="].join(`
2
- `)}};import{dirname as W}from"path";import{fileURLToPath as q}from"url";var S=W(q(import.meta.url)),x="vite-userscript-plugin",M='console.warn("__STYLE__")',F=new RegExp(/\.(t|j)sx?$/),L=new RegExp(/\.(s[ac]|c|le)ss$/),z=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],B=["unsafeWindow","window.onurlchange","window.focus","window.close"],f=z.map(t=>[`GM_${t}`,`GM.${t}`]).flat();f.push(...B);var P=class{styles=new Map;add(r,e){return this.styles.set(r,e.replace(`
3
- `,"")),""}inject(){return this.styles.size?`GM_addStyle(\`${[...this.styles.values()].join("")}\`)`:void 0}merge(r){let e=[];for(let o of r){let l=this.styles.get(o);l&&e.push([o,l])}this.styles.clear(),e.forEach(o=>this.styles.set(...o))}},b=new P;import{transformWithEsbuild as K}from"vite";function R(t){return[...new Set(Array.isArray(t)?t:t?[t]:[])]}async function v({minify:t,file:r,name:e,loader:o}){let{code:l}=await K(r,e,{minify:t,loader:o,sourcemap:!1,legalComments:"none"});return l}function T(t){let r=[];for(let e of f)t.indexOf(e)!==-1&&r.push(e);return r}function ee(t){try{let r,e,o=null,l=X("info",{prefix:`[${x}]`,allowClearScreen:!0}),h=I((n,s)=>Q(n,s,{public:r.build.outDir})),O=Z;return new O({httpServer:h}).on("request",n=>{o=n.accept(null,n.origin)}),{name:x,apply:"build",config(){return{build:{target:"esnext",minify:!1,lib:{entry:t.entry,name:t.header.name,formats:["iife"],fileName:()=>`${t.header.name}.js`},rollupOptions:{output:{extend:!0}}}}},async configResolved(n){r=n,e=n.build.watch??!1,t.entry=p(n.root,t.entry),Array.from(["match","require","include","exclude","resource","connect"]).forEach(s=>{let i=t.header[s];t.header[s]=R(i)}),t.server={port:await J(),open:!1,...t.server}},async transform(n,s){let i=n;if(L.test(s)){let c=await v({minify:!e,file:i,name:s,loader:"css"});i=b.add(s,c)}return s.includes(t.entry)&&(i=n+M),{code:i,map:null}},generateBundle(n,s){for(let i of Object.values(s)){if(i.type==="asset")continue;let c=Object.keys(i.modules).filter(m=>L.test(m));c.length&&b.merge(c)}},async writeBundle(n,s){let{open:i,port:c}=t.server,m=n.sanitizeFileName(t.header.name),E=`${m}.user.js`,U=`${m}.proxy.user.js`,D=`${m}.meta.js`;for(let[u]of Object.entries(s))if(F.test(u)){let y=r.root,w=r.build.outDir,j=p(y,w,u),k=p(y,w,E),A=p(y,w,U),N=p(y,w,D),$=p(S,`ws-${m}.js`);try{let a=_(j,"utf8");if(a=a.replace(M,`${b.inject()}`),a=await v({minify:!e,file:a,name:u,loader:"js"}),t.header.grant=R(e?f:[...T(a),...t.header.grant??[]]),e){let V=_(p(S,"ws.js"),"utf8"),H=await v({minify:!e,file:V.replace("__WS__",`ws://localhost:${c}`),name:$,loader:"js"});g($,H),g(A,new d({...t.header,require:[...t.header.require??[],"file://"+$,"file://"+j]}).generate())}let G=new d(t.header).generate();g(j,a),g(N,G),g(k,`${G}
1
+ import{readFileSync as E,writeFileSync as y}from"fs";import{createServer as J}from"http";import{resolve as c}from"path";import Y from"get-port";import Q from"open";import C from"picocolors";import X from"serve-handler";import{createLogger as Z}from"vite";import{server as ee}from"websocket";var d=class{constructor(r){this.config=r;this.addHomepageMeta(),this.maxKeyLength=Math.max(...Object.keys(this.config).map(e=>e.length))+1}header=[];maxKeyLength;addHomepageMeta(){let r=this.config.homepage??this.config.homepageURL;r&&(this.config.updateURL=new URL(`${this.config.name}.meta.js`,r).href,this.config.downloadURL=new URL(`${this.config.name}.user.js`,r).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,e){e=Array.isArray(e)?e.join(" "):e===!0?"":e,this.header.push(`// @${r}${this.addSpaces(r)}${e}`)}generate(){for(let[r,e]of Object.entries(this.config))if(Array.isArray(e))e.forEach(s=>this.addMetadata(r,s));else{if(e===void 0)continue;this.addMetadata(r,e)}return["// ==UserScript==",...this.header,"// ==/UserScript=="].join(`
2
+ `)}};import{dirname as q}from"path";import{fileURLToPath as z}from"url";var M=q(z(import.meta.url)),v="vite-userscript-plugin",P='console.warn("__STYLE__")',G=new RegExp(/\.(t|j)sx?$/),T=new RegExp(/\.(s[ac]|c|le)ss$/),B=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],K=["unsafeWindow","window.onurlchange","window.focus","window.close"],g=B.map(t=>[`GM_${t}`,`GM.${t}`]).flat();g.push(...K);import{transformWithEsbuild as I}from"vite";function L(t){return[...new Set(Array.isArray(t)?t:t?[t]:[])]}async function h({minify:t,file:r,name:e,loader:s},a){let{code:f}=await I(r,e,{minify:t,loader:s,sourcemap:!1,legalComments:"none",...a});return f}function F(t){let r=[];for(let e of g)t.indexOf(e)!==-1&&r.push(e);return r}var R=class{styles=new Map;async add(r,e,s){let a=await h({name:r,file:e,minify:s,loader:"css"});return this.styles.set(r,a.replace(`
3
+ `,"")),""}inject(){return this.styles.size?`GM_addStyle(\`${[...this.styles.values()].join("")}\`)`:void 0}merge(r){let e=[];for(let s of r){let a=this.styles.get(s);a&&e.push([s,a])}this.styles.clear(),e.forEach(s=>this.styles.set(...s))}},j=new R;function te(t){try{let r,e,s=null,a=t.fileName??t.header.name,f=Z("info",{prefix:`[${v}]`,allowClearScreen:!0}),w=J((n,o)=>X(n,o,{public:r.build.outDir})),_=ee;return new _({httpServer:w}).on("request",n=>{s=n.accept(null,n.origin)}),{name:v,apply:"build",config(){return{build:{target:"esnext",minify:!1,lib:{name:a,entry:t.entry,formats:["iife"],fileName:()=>`${a}.js`},rollupOptions:{output:{extend:!0}}}}},async configResolved(n){r=n,e=n.build.watch??!1,t.entry=c(n.root,t.entry),Array.from(["match","require","include","exclude","resource","connect"]).forEach(o=>{let i=t.header[o];t.header[o]=L(i)}),t.server={port:await Y(),open:!1,...t.server}},async transform(n,o){let i=n;return T.test(o)&&(i=await j.add(o,i,!e)),o.includes(t.entry)&&(i=n+P),{code:i,map:null}},generateBundle(n,o){for(let i of Object.values(o)){if(i.type==="asset")continue;let p=Object.keys(i.modules).filter(m=>T.test(m));p.length&&j.merge(p)}},async writeBundle(n,o){let{open:i,port:p}=t.server,m=n.sanitizeFileName(a),D=`${m}.user.js`,O=`${m}.proxy.user.js`,N=`${m}.meta.js`;for(let[u]of Object.entries(o))if(G.test(u)){let x=r.root,b=r.build.outDir,$=c(x,b,u),k=c(x,b,D),A=c(x,b,O),V=c(x,b,N),S=c(M,`ws-${m}.js`);try{let l=E($,"utf8");if(l=l.replace(P,`${j.inject()}`),l=await h({minify:!e,file:l,name:u,loader:"js"},t.esbuildTransformOptions),t.header.grant=L(e?g:[...F(l),...t.header.grant??[]]),e){let H=E(c(M,"ws.js"),"utf8"),W=await h({minify:!e,file:H.replace("__WS__",`ws://localhost:${p}`),name:S,loader:"js"},t.esbuildTransformOptions);y(S,W),y(A,new d({...t.header,require:[...t.header.require??[],"file://"+S,"file://"+$]}).generate())}let U=new d(t.header).generate();y($,l),y(V,U),y(k,`${U}
4
4
 
5
- ${a}`)}catch(a){console.log(a)}}if(e&&!h.listening){let u=`http://localhost:${c}`;h.listen(c,()=>{l.clearScreen("info"),l.info(C.bold(`${C.cyan(">>> [vite-userscript-plugin]")} ${C.gray(u)}`))}),i&&await Y(`${u}/${U}`)}else e||(h.close(),process.exit(0))},buildEnd(){e&&(l.clearScreen("info"),o&&o.sendUTF(JSON.stringify({message:"reload"})))}}}catch(r){return console.error(r),{name:x}}}export{ee as default};
5
+ ${l}`)}catch(l){console.log(l)}}if(e&&!w.listening){let u=`http://localhost:${p}`;w.listen(p,()=>{f.clearScreen("info"),f.info(C.bold(`${C.cyan(">>> [vite-userscript-plugin]")} ${C.gray(u)}`))}),i&&await Q(`${u}/${O}`)}else e||(w.close(),process.exit(0))},buildEnd(){e&&(f.clearScreen("info"),s&&s.sendUTF(JSON.stringify({message:"reload"})))}}}catch(r){return console.error(r),{name:v}}}export{te as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-userscript-plugin",
3
- "version": "1.9.1",
3
+ "version": "1.10.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.cjs",
@@ -57,13 +57,13 @@
57
57
  "@types/node": "18.15.3",
58
58
  "@types/serve-handler": "6.1.1",
59
59
  "@types/websocket": "1.0.5",
60
- "@vitest/ui": "0.32.2",
61
- "tsup": "7.0.0",
62
- "turbo": "1.10.3",
63
- "typescript": "5.1.3",
64
- "vite": "4.3.9",
65
- "vite-plugin-dts": "2.3.0",
66
- "vitest": "0.32.2"
60
+ "@vitest/ui": "0.33.0",
61
+ "tsup": "7.1.0",
62
+ "turbo": "1.10.7",
63
+ "typescript": "5.1.6",
64
+ "vite": "4.4.2",
65
+ "vite-plugin-dts": "3.1.1",
66
+ "vitest": "0.33.0"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "vite": ">=3.0.0"