vite-userscript-plugin 1.2.1 → 1.3.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/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  ![npm](https://img.shields.io/npm/v/vite-userscript-plugin)
4
4
  ![license](https://img.shields.io/github/license/crashmax-dev/vite-userscript-plugin)
5
5
 
6
- > Tampermonkey userscript developing and build plugin based on [Vite](https://vitejs.dev).
6
+ > ⚡️ Tampermonkey userscript developing and build plugin based on [Vite](https://vitejs.dev).\
7
+ > 📦 Use this [template](https://github.com/crashmax-dev/vite-userscript-template) to initialize your project.
7
8
 
8
9
  ## Features
9
10
 
@@ -58,7 +59,7 @@ export default defineConfig({
58
59
  ```json
59
60
  {
60
61
  "scripts": {
61
- "dev": "vite build --watch",
62
+ "dev": "vite build --watch --mode development",
62
63
  "build": "vite build"
63
64
  }
64
65
  }
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var Z=Object.create;var M=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty;var oe=(e,r)=>{for(var t in r)M(e,t,{get:r[t],enumerable:!0})},T=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of te(r))!ne.call(e,o)&&o!==t&&M(e,o,{get:()=>r[o],enumerable:!(n=ee(r,o))||n.enumerable});return e};var u=(e,r,t)=>(t=e!=null?Z(re(e)):{},T(r||!e||!e.__esModule?M(t,"default",{value:e,enumerable:!0}):t,e)),se=e=>T(M({},"__esModule",{value:!0}),e);var ie={};oe(ie,{default:()=>N});module.exports=se(ie);var D=u(require("get-port"),1),c=require("fs"),K=require("http"),a=require("path"),C=require("url"),q=u(require("open"),1),L=u(require("picocolors"),1),A=u(require("sanitize-filename"),1),H=u(require("serve-handler"),1),W=require("vite"),B=require("websocket");var g=class{constructor(r){this.config=r;this.downloadMeta(),this.configKeys=Object.keys(this.config),this.maxKeyLength=Math.max(...this.configKeys.map(t=>t.length))+1}header=[];configKeys;maxKeyLength;downloadMeta(){let{name:r,homepage:t,updateURL:n,downloadURL:o}=this.config;t&&!n&&!o&&(this.config.updateURL=new URL(`${r}.meta.js`,t).href,this.config.downloadURL=new URL(`${r}.user.js`,t).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,t){let n=typeof t=="boolean";n&&!t||(t=n?"":`${this.addSpaces(r)}${t}`,this.header.push(`// @${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
- `)}};function E({entry:e,header:r}){return{build:{lib:{entry:e,name:r.name,formats:["iife"],fileName:()=>`${r.name}.js`},rollupOptions:{output:{extend:!0}}}}}var F=new RegExp(/.(t|j)sx?/),S=new RegExp(/\.(s?css|sass)$/),x=["unsafeWindow","window.onurlchange","window.focus","window.close","GM_setValue","GM_getValue","GM_deleteValue","GM_listValues","GM_setClipboard","GM_addStyle","GM_addElement","GM_addValueChangeListener","GM_removeValueChangeListener","GM_registerMenuCommand","GM_unregisterMenuCommand","GM_download","GM_getTab","GM_getTabs","GM_saveTab","GM_openInTab","GM_notification","GM_getResourceURL","GM_getResourceText","GM_xmlhttpRequest","GM_webRequest","GM_log","GM_info"];var O=require("vite");function R(e){return[...new Set(Array.isArray(e)?e:e?[e]:[])]}async function h({file:e,name:r,loader:t}){let{code:n}=await(0,O.transformWithEsbuild)(e,r,{loader:t,minify:!0});return n}function V(e){let r=[];for(let t of x)e.indexOf(t)!==-1&&r.push(t);return r}var $=class{styles=new Map;async add(r,t){let n=await h({file:r,name:t,loader:"css"});return this.styles.set(t,n.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 o=this.styles.get(n);!o||t.push([n,o])}this.styles.clear(),t.forEach(n=>this.styles.set(...n))}},b=new $;var k={};function N(e){let r,t,n=null,o=(0,W.createLogger)("info",{prefix:"[vite-userscript-plugin]",allowClearScreen:!0}),y=(0,K.createServer)((s,i)=>(0,H.default)(s,i,{public:r.build.outDir})),z=B.server;return new z({httpServer:y}).on("request",s=>{n=s.accept(null,s.origin)}),{name:"vite-userscript-plugin",apply:"build",config(){return E(e)},async configResolved(s){r=s,t=s.build.watch??!1,e.entry=(0,a.resolve)(s.root,e.entry),e.header.name=(0,A.default)(e.header.name),Array.from(["match","require","include","exclude","resource","connect"]).forEach(i=>{let d=e.header[i];e.header[i]=R(d)}),e.server={port:await(0,D.default)(),open:!1,...e.server}},async transform(s,i){let d=s;return S.test(i)&&(d=await b.add(s,i)),i.includes(e.entry)&&(d=s+"__STYLE__"),{code:d,map:null}},generateBundle(s,i){for(let[d,p]of Object.entries(i)){let f=Object.keys(p.modules).filter(v=>S.test(v));f.length>0&&b.merge(f)}},async writeBundle(s,i){let{open:d,port:p}=e.server,U=`${e.header.name}.user.js`,f=`${e.header.name}.proxy.user.js`,v=`${e.header.name}.meta.js`;for(let[m]of Object.entries(i))if(F.test(m)){let w=r.root,_=r.build.outDir,G=(0,a.resolve)(w,_,m),Y=(0,a.resolve)(w,_,U),I=(0,a.resolve)(w,_,f),J=(0,a.resolve)(w,_,v),j=(0,a.resolve)((0,a.dirname)((0,C.fileURLToPath)(k.url)),`hot-reload-${e.header.name}.js`);try{let l=(0,c.readFileSync)(G,"utf8");if(t){let Q=(0,c.readFileSync)((0,a.resolve)((0,a.dirname)((0,C.fileURLToPath)(k.url)),"hot-reload.js"),"utf8"),X=await h({file:Q.replace("__WS__",`ws://localhost:${p}`),name:j,loader:"js"});(0,c.writeFileSync)(j,X),(0,c.writeFileSync)(I,new g({...e.header,require:[...e.header.require,"file://"+j,"file://"+G]}).generate())}l=l.replace("__STYLE__",`${b.inject()}`),l=await h({file:l,name:m,loader:"js"}),e.header.grant=R(t?x:[...V(l),...e.header.grant??[]]);let P=new g(e.header).generate();(0,c.writeFileSync)(G,l),(0,c.writeFileSync)(Y,`${P}
1
+ "use strict";var Z=Object.create;var b=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty;var oe=(e,r)=>{for(var t in r)b(e,t,{get:r[t],enumerable:!0})},T=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of te(r))!ne.call(e,s)&&s!==t&&b(e,s,{get:()=>r[s],enumerable:!(n=ee(r,s))||n.enumerable});return e};var u=(e,r,t)=>(t=e!=null?Z(re(e)):{},T(r||!e||!e.__esModule?b(t,"default",{value:e,enumerable:!0}):t,e)),se=e=>T(b({},"__esModule",{value:!0}),e);var le={};oe(le,{default:()=>N});module.exports=se(le);var V=u(require("get-port"),1),c=require("fs"),D=require("http"),a=require("path"),K=require("url"),A=u(require("open"),1),M=u(require("picocolors"),1),H=u(require("sanitize-filename"),1),W=u(require("serve-handler"),1),q=require("vite"),B=require("websocket");var g=class{constructor(r){this.config=r;this.downloadMeta(),this.configKeys=Object.keys(this.config),this.maxKeyLength=Math.max(...this.configKeys.map(t=>t.length))+1}header=[];configKeys;maxKeyLength;downloadMeta(){let{name:r,homepage:t,updateURL:n,downloadURL:s}=this.config;t&&!n&&!s&&(this.config.updateURL=new URL(`${r}.meta.js`,t).href,this.config.downloadURL=new URL(`${r}.user.js`,t).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,t){let n=typeof t=="boolean";n&&!t||(t=n?"":`${this.addSpaces(r)}${t}`,this.header.push(`// @${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
+ `)}};function E({entry:e,header:r}){return{build:{lib:{entry:e,name:r.name,formats:["iife"],fileName:()=>`${r.name}.js`},rollupOptions:{output:{extend:!0}}}}}var F=new RegExp(/.(t|j)sx?/),L=new RegExp(/\.(s?css|sass)$/),ie=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],ae=["unsafeWindow","window.onurlchange","window.focus","window.close"],h=ie.map(e=>[`GM_${e}`,`GM.${e}`]).flat();h.push(...ae);var O=require("vite");function U(e){return[...new Set(Array.isArray(e)?e:e?[e]:[])]}async function y({file:e,name:r,loader:t}){let{code:n}=await(0,O.transformWithEsbuild)(e,r,{loader:t,minify:!0});return n}function k(e){let r=[];for(let t of h)e.indexOf(t)!==-1&&r.push(t);return r}var _=class{styles=new Map;async add(r,t){let n=await y({file:r,name:t,loader:"css"});return this.styles.set(t,n.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 _;var ce={};function N(e){let r,t,n=null,s=(0,a.dirname)((0,K.fileURLToPath)(ce.url)),S=(0,q.createLogger)("info",{prefix:"[vite-userscript-plugin]",allowClearScreen:!0}),w=(0,D.createServer)((o,i)=>(0,W.default)(o,i,{public:r.build.outDir})),z=B.server;return new z({httpServer:w}).on("request",o=>{n=o.accept(null,o.origin)}),{name:"vite-userscript-plugin",apply:"build",config(){return E(e)},async configResolved(o){r=o,t=o.build.watch??!1,e.entry=(0,a.resolve)(o.root,e.entry),e.header.name=(0,H.default)(e.header.name),Array.from(["match","require","include","exclude","resource","connect"]).forEach(i=>{let p=e.header[i];e.header[i]=U(p)}),e.server={port:await(0,V.default)(),open:!1,...e.server}},async transform(o,i){let p=o;return L.test(i)&&(p=await j.add(o,i)),i.includes(e.entry)&&(p=o+"__STYLE__"),{code:p,map:null}},generateBundle(o,i){for(let[p,m]of Object.entries(i)){let f=Object.keys(m.modules).filter($=>L.test($));f.length&&j.merge(f)}},async writeBundle(o,i){let{open:p,port:m}=e.server,P=`${e.header.name}.user.js`,f=`${e.header.name}.proxy.user.js`,$=`${e.header.name}.meta.js`;for(let[d]of Object.entries(i))if(F.test(d)){let x=r.root,v=r.build.outDir,C=(0,a.resolve)(x,v,d),Y=(0,a.resolve)(x,v,P),I=(0,a.resolve)(x,v,f),J=(0,a.resolve)(x,v,$),R=(0,a.resolve)(s,`hot-reload-${e.header.name}.js`);try{let l=(0,c.readFileSync)(C,"utf8");if(l=l.replace("__STYLE__",`${j.inject()}`),l=await y({file:l,name:d,loader:"js"}),e.header.grant=U(t?h:[...k(l),...e.header.grant??[]]),t){let Q=(0,c.readFileSync)((0,a.resolve)(s,"hot-reload.js"),"utf8"),X=await y({file:Q.replace("__WS__",`ws://localhost:${m}`),name:R,loader:"js"});(0,c.writeFileSync)(R,X),(0,c.writeFileSync)(I,new g({...e.header,require:[...e.header.require,"file://"+R,"file://"+C]}).generate())}let G=new g(e.header).generate();(0,c.writeFileSync)(C,l),(0,c.writeFileSync)(J,G),(0,c.writeFileSync)(Y,`${G}
4
4
 
5
- ${l}`),(0,c.writeFileSync)(J,P)}catch(l){console.log(l)}}if(t&&!y.listening){let m=`http://localhost:${p}`;y.listen(p,()=>{o.clearScreen("info"),o.info(L.default.blue(`Running at: ${L.default.gray(m)}`))}),d&&await(0,q.default)(`${m}/${f}`)}else t||(y.close(),process.exit(0))},buildEnd(){t&&(o.clearScreen("info"),n&&n.sendUTF(JSON.stringify({message:"reload"})))}}}0&&(module.exports={});
5
+ ${l}`)}catch(l){console.log(l)}}if(t&&!w.listening){let d=`http://localhost:${m}`;w.listen(m,()=>{S.clearScreen("info"),S.info(M.default.blue(`Running at: ${M.default.gray(d)}`))}),p&&await(0,A.default)(`${d}/${f}`)}else t||(w.close(),process.exit(0))},buildEnd(){t&&(S.clearScreen("info"),n&&n.sendUTF(JSON.stringify({message:"reload"})))}}}0&&(module.exports={});
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { PluginOption } from 'vite';
2
2
 
3
- declare const grants: readonly ["unsafeWindow", "window.onurlchange", "window.focus", "window.close", "GM_setValue", "GM_getValue", "GM_deleteValue", "GM_listValues", "GM_setClipboard", "GM_addStyle", "GM_addElement", "GM_addValueChangeListener", "GM_removeValueChangeListener", "GM_registerMenuCommand", "GM_unregisterMenuCommand", "GM_download", "GM_getTab", "GM_getTabs", "GM_saveTab", "GM_openInTab", "GM_notification", "GM_getResourceURL", "GM_getResourceText", "GM_xmlhttpRequest", "GM_webRequest", "GM_log", "GM_info"];
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"];
4
5
 
5
6
  declare type RunAt = 'document-start' | 'document-body' | 'document-end' | 'document-idle' | 'context-menu';
6
- declare type Grants = typeof grants[number];
7
+ declare type GMLiterals<T extends string> = [`GM_${T}` | `GM.${T}`];
8
+ declare type GMWindow = typeof GMwindow[number];
9
+ declare type Grants = GMWindow | GMLiterals<typeof GM[number]>[number];
7
10
  declare type HeaderConfig = {
8
11
  [property: string]: string | boolean | number | string[] | undefined;
9
12
  /**
@@ -151,7 +154,7 @@ declare type HeaderConfig = {
151
154
  * some powerful window functions. If no `@grant` tag is given TM guesses
152
155
  * the scripts needs.
153
156
  */
154
- grant?: Exclude<Grants, 'GM_addStyle' | 'GM_info'>[];
157
+ grant?: Grants[];
155
158
  /**
156
159
  * Defines the moment the script is injected. In opposition to other script
157
160
  * handlers, `@run-at` defines the first possible moment a script wants to
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import H from"get-port";import{readFileSync as P,writeFileSync as g}from"fs";import{createServer as W}from"http";import{dirname as T,resolve as c}from"path";import{fileURLToPath as E}from"url";import B from"open";import F from"picocolors";import N from"sanitize-filename";import z from"serve-handler";import{createLogger as Y}from"vite";import{server as I}from"websocket";var f=class{constructor(r){this.config=r;this.downloadMeta(),this.configKeys=Object.keys(this.config),this.maxKeyLength=Math.max(...this.configKeys.map(e=>e.length))+1}header=[];configKeys;maxKeyLength;downloadMeta(){let{name:r,homepage:e,updateURL:n,downloadURL:a}=this.config;e&&!n&&!a&&(this.config.updateURL=new URL(`${r}.meta.js`,e).href,this.config.downloadURL=new URL(`${r}.user.js`,e).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,e){let n=typeof e=="boolean";n&&!e||(e=n?"":`${this.addSpaces(r)}${e}`,this.header.push(`// @${r}${e}`))}generate(){for(let[r,e]of Object.entries(this.config))if(Array.isArray(e))e.forEach(n=>this.addMetadata(r,n));else{if(e===void 0)continue;this.addMetadata(r,e)}return["// ==UserScript==",...this.header,"// ==/UserScript=="].join(`
2
- `)}};function C({entry:t,header:r}){return{build:{lib:{entry:t,name:r.name,formats:["iife"],fileName:()=>`${r.name}.js`},rollupOptions:{output:{extend:!0}}}}}var L=new RegExp(/.(t|j)sx?/),G=new RegExp(/\.(s?css|sass)$/),_=["unsafeWindow","window.onurlchange","window.focus","window.close","GM_setValue","GM_getValue","GM_deleteValue","GM_listValues","GM_setClipboard","GM_addStyle","GM_addElement","GM_addValueChangeListener","GM_removeValueChangeListener","GM_registerMenuCommand","GM_unregisterMenuCommand","GM_download","GM_getTab","GM_getTabs","GM_saveTab","GM_openInTab","GM_notification","GM_getResourceURL","GM_getResourceText","GM_xmlhttpRequest","GM_webRequest","GM_log","GM_info"];import{transformWithEsbuild as A}from"vite";function j(t){return[...new Set(Array.isArray(t)?t:t?[t]:[])]}async function u({file:t,name:r,loader:e}){let{code:n}=await A(t,r,{loader:e,minify:!0});return n}function U(t){let r=[];for(let e of _)t.indexOf(e)!==-1&&r.push(e);return r}var S=class{styles=new Map;async add(r,e){let n=await u({file:r,name:e,loader:"css"});return this.styles.set(e,n.replace(`
3
- `,"")),""}inject(){return this.styles.size?`GM_addStyle(\`${[...this.styles.values()].join("")}\`)`:void 0}merge(r){let e=[];for(let n of r){let a=this.styles.get(n);!a||e.push([n,a])}this.styles.clear(),e.forEach(n=>this.styles.set(...n))}},M=new S;function J(t){let r,e,n=null,a=Y("info",{prefix:"[vite-userscript-plugin]",allowClearScreen:!0}),h=W((o,s)=>z(o,s,{public:r.build.outDir})),O=I;return new O({httpServer:h}).on("request",o=>{n=o.accept(null,o.origin)}),{name:"vite-userscript-plugin",apply:"build",config(){return C(t)},async configResolved(o){r=o,e=o.build.watch??!1,t.entry=c(o.root,t.entry),t.header.name=N(t.header.name),Array.from(["match","require","include","exclude","resource","connect"]).forEach(s=>{let l=t.header[s];t.header[s]=j(l)}),t.server={port:await H(),open:!1,...t.server}},async transform(o,s){let l=o;return G.test(s)&&(l=await M.add(o,s)),s.includes(t.entry)&&(l=o+"__STYLE__"),{code:l,map:null}},generateBundle(o,s){for(let[l,m]of Object.entries(s)){let p=Object.keys(m.modules).filter(x=>G.test(x));p.length>0&&M.merge(p)}},async writeBundle(o,s){let{open:l,port:m}=t.server,R=`${t.header.name}.user.js`,p=`${t.header.name}.proxy.user.js`,x=`${t.header.name}.meta.js`;for(let[d]of Object.entries(s))if(L.test(d)){let y=r.root,w=r.build.outDir,b=c(y,w,d),V=c(y,w,R),k=c(y,w,p),D=c(y,w,x),v=c(T(E(import.meta.url)),`hot-reload-${t.header.name}.js`);try{let i=P(b,"utf8");if(e){let K=P(c(T(E(import.meta.url)),"hot-reload.js"),"utf8"),q=await u({file:K.replace("__WS__",`ws://localhost:${m}`),name:v,loader:"js"});g(v,q),g(k,new f({...t.header,require:[...t.header.require,"file://"+v,"file://"+b]}).generate())}i=i.replace("__STYLE__",`${M.inject()}`),i=await u({file:i,name:d,loader:"js"}),t.header.grant=j(e?_:[...U(i),...t.header.grant??[]]);let $=new f(t.header).generate();g(b,i),g(V,`${$}
1
+ import q from"get-port";import{readFileSync as T,writeFileSync as h}from"fs";import{createServer as B}from"http";import{dirname as N,resolve as c}from"path";import{fileURLToPath as z}from"url";import Y from"open";import E from"picocolors";import I from"sanitize-filename";import J from"serve-handler";import{createLogger as Q}from"vite";import{server as X}from"websocket";var f=class{constructor(r){this.config=r;this.downloadMeta(),this.configKeys=Object.keys(this.config),this.maxKeyLength=Math.max(...this.configKeys.map(t=>t.length))+1}header=[];configKeys;maxKeyLength;downloadMeta(){let{name:r,homepage:t,updateURL:n,downloadURL:l}=this.config;t&&!n&&!l&&(this.config.updateURL=new URL(`${r}.meta.js`,t).href,this.config.downloadURL=new URL(`${r}.user.js`,t).href)}addSpaces(r){return" ".repeat(this.maxKeyLength-r.length)}addMetadata(r,t){let n=typeof t=="boolean";n&&!t||(t=n?"":`${this.addSpaces(r)}${t}`,this.header.push(`// @${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
+ `)}};function M({entry:e,header:r}){return{build:{lib:{entry:e,name:r.name,formats:["iife"],fileName:()=>`${r.name}.js`},rollupOptions:{output:{extend:!0}}}}}var P=new RegExp(/.(t|j)sx?/),C=new RegExp(/\.(s?css|sass)$/),A=["setValue","getValue","deleteValue","listValues","setClipboard","addStyle","addElement","addValueChangeListener","removeValueChangeListener","registerMenuCommand","unregisterMenuCommand","download","getTab","getTabs","saveTab","openInTab","notification","getResourceURL","getResourceText","xmlhttpRequest","log","info"],H=["unsafeWindow","window.onurlchange","window.focus","window.close"],u=A.map(e=>[`GM_${e}`,`GM.${e}`]).flat();u.push(...H);import{transformWithEsbuild as W}from"vite";function R(e){return[...new Set(Array.isArray(e)?e:e?[e]:[])]}async function g({file:e,name:r,loader:t}){let{code:n}=await W(e,r,{loader:t,minify:!0});return n}function G(e){let r=[];for(let t of u)e.indexOf(t)!==-1&&r.push(t);return r}var L=class{styles=new Map;async add(r,t){let n=await g({file:r,name:t,loader:"css"});return this.styles.set(t,n.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 l=this.styles.get(n);!l||t.push([n,l])}this.styles.clear(),t.forEach(n=>this.styles.set(...n))}},v=new L;function Z(e){let r,t,n=null,l=N(z(import.meta.url)),b=Q("info",{prefix:"[vite-userscript-plugin]",allowClearScreen:!0}),y=B((o,s)=>J(o,s,{public:r.build.outDir})),F=X;return new F({httpServer:y}).on("request",o=>{n=o.accept(null,o.origin)}),{name:"vite-userscript-plugin",apply:"build",config(){return M(e)},async configResolved(o){r=o,t=o.build.watch??!1,e.entry=c(o.root,e.entry),e.header.name=I(e.header.name),Array.from(["match","require","include","exclude","resource","connect"]).forEach(s=>{let a=e.header[s];e.header[s]=R(a)}),e.server={port:await q(),open:!1,...e.server}},async transform(o,s){let a=o;return C.test(s)&&(a=await v.add(o,s)),s.includes(e.entry)&&(a=o+"__STYLE__"),{code:a,map:null}},generateBundle(o,s){for(let[a,d]of Object.entries(s)){let m=Object.keys(d.modules).filter(j=>C.test(j));m.length&&v.merge(m)}},async writeBundle(o,s){let{open:a,port:d}=e.server,U=`${e.header.name}.user.js`,m=`${e.header.name}.proxy.user.js`,j=`${e.header.name}.meta.js`;for(let[p]of Object.entries(s))if(P.test(p)){let w=r.root,x=r.build.outDir,S=c(w,x,p),O=c(w,x,U),k=c(w,x,m),V=c(w,x,j),$=c(l,`hot-reload-${e.header.name}.js`);try{let i=T(S,"utf8");if(i=i.replace("__STYLE__",`${v.inject()}`),i=await g({file:i,name:p,loader:"js"}),e.header.grant=R(t?u:[...G(i),...e.header.grant??[]]),t){let D=T(c(l,"hot-reload.js"),"utf8"),K=await g({file:D.replace("__WS__",`ws://localhost:${d}`),name:$,loader:"js"});h($,K),h(k,new f({...e.header,require:[...e.header.require,"file://"+$,"file://"+S]}).generate())}let _=new f(e.header).generate();h(S,i),h(V,_),h(O,`${_}
4
4
 
5
- ${i}`),g(D,$)}catch(i){console.log(i)}}if(e&&!h.listening){let d=`http://localhost:${m}`;h.listen(m,()=>{a.clearScreen("info"),a.info(F.blue(`Running at: ${F.gray(d)}`))}),l&&await B(`${d}/${p}`)}else e||(h.close(),process.exit(0))},buildEnd(){e&&(a.clearScreen("info"),n&&n.sendUTF(JSON.stringify({message:"reload"})))}}}export{J as default};
5
+ ${i}`)}catch(i){console.log(i)}}if(t&&!y.listening){let p=`http://localhost:${d}`;y.listen(d,()=>{b.clearScreen("info"),b.info(E.blue(`Running at: ${E.gray(p)}`))}),a&&await Y(`${p}/${m}`)}else t||(y.close(),process.exit(0))},buildEnd(){t&&(b.clearScreen("info"),n&&n.sendUTF(JSON.stringify({message:"reload"})))}}}export{Z as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-userscript-plugin",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.cjs",
@@ -45,16 +45,16 @@
45
45
  "devDependencies": {
46
46
  "@crashmax/prettier-config": "^2.0.3",
47
47
  "@crashmax/tsconfig": "^1.0.2",
48
- "@types/node": "^18.7.13",
48
+ "@types/node": "^18.7.18",
49
49
  "@types/serve-handler": "^6.1.1",
50
50
  "@types/websocket": "^1.0.5",
51
- "@vitest/ui": "^0.22.1",
51
+ "@vitest/ui": "^0.23.2",
52
52
  "tsup": "^6.2.3",
53
- "turbo": "^1.4.3",
54
- "typescript": "^4.8.2",
55
- "vite": "^3.0.9",
56
- "vite-plugin-dts": "^1.4.1",
57
- "vitest": "^0.22.1"
53
+ "turbo": "^1.4.6",
54
+ "typescript": "^4.8.3",
55
+ "vite": "^3.1.1",
56
+ "vite-plugin-dts": "^1.5.0",
57
+ "vitest": "^0.23.2"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@types/tampermonkey": ">=4.0.0",
@@ -65,8 +65,8 @@
65
65
  "build": "tsup",
66
66
  "test": "vitest",
67
67
  "test:ui": "vitest --ui --watch",
68
- "examples:dev": "turbo run dev --filter='./examples/*'",
69
- "examples:build": "turbo run build --filter='./examples/*'",
68
+ "dev:examples": "turbo run dev --filter='./examples/*'",
69
+ "build:examples": "turbo run build --filter='./examples/*'",
70
70
  "format": "prettier --write --ignore-unknown **"
71
71
  }
72
72
  }
@@ -1 +0,0 @@
1
- "use strict";function n(){let e=new WebSocket("__WS__");e.addEventListener("open",()=>{let{script:o}=GM_info;console.group(`${o.name}@${o.version}`),console.log(GM_info),console.groupEnd()}),e.addEventListener("close",()=>{setTimeout(n,1e3)}),e.addEventListener("error",()=>{e.close()}),e.addEventListener("message",()=>{location.reload()})}n();
@@ -1 +0,0 @@
1
-