mirror of
https://github.com/multipleof4/devsune.git
synced 2026-01-13 16:07:55 +00:00
107 lines
4.2 KiB
JavaScript
107 lines
4.2 KiB
JavaScript
import { defineConfig } from 'vite'
|
|
import { VitePWA } from 'vite-plugin-pwa'
|
|
import { createHtmlPlugin } from 'vite-plugin-html'
|
|
|
|
const pwa = VitePWA({
|
|
base: '/devsune/',
|
|
strategies: 'injectManifest',
|
|
registerType: 'autoUpdate',
|
|
injectManifest: { injectionPoint: undefined },
|
|
devOptions: { enabled: true },
|
|
manifest: {
|
|
id: '/devsune/',
|
|
name: 'Sune',
|
|
short_name: 'Sune',
|
|
description: 'OpenRouter GUI Frontend',
|
|
start_url: '/devsune/',
|
|
scope: '/devsune/',
|
|
display: 'standalone',
|
|
orientation: 'portrait',
|
|
theme_color: '#FFFFFF',
|
|
background_color: '#000000',
|
|
categories: ['productivity','utilities'],
|
|
icons: [{ src: 'https://sune.planetrenox.com/appstore_content/✺.png', sizes: '1024x1024', type: 'image/png' }],
|
|
screenshots: [
|
|
{ src: 'https://sune.planetrenox.com/appstore_content/screenshot1.jpg', sizes: '1344x2693', type: 'image/jpeg' },
|
|
{ src: 'https://sune.planetrenox.com/appstore_content/screenshot2.jpg', sizes: '1344x2699', type: 'image/jpeg' }
|
|
]
|
|
}
|
|
})
|
|
|
|
const html = createHtmlPlugin({
|
|
minify: false,
|
|
inject: {
|
|
tags: [
|
|
{
|
|
tag: 'script',
|
|
children: `(function(){
|
|
function h(v){try{return JSON.parse(v)}catch{return null}}
|
|
function isOR(url){try{var u=new URL(url,location.href);return /(^|\\.)openrouter\\.ai$/i.test(u.hostname)&&/\\/api\\/v1\\/chat\\/completions$/.test(u.pathname)}catch{return false}}
|
|
function hasStream(body){if(body==null)return false;try{if(typeof body==='string')return /"stream"\\s*:\\s*true/i.test(body);if(body instanceof Blob)return false;return false}catch{return false}}
|
|
function ensureHeaders(hdrs){if(hdrs instanceof Headers){return hdrs}var out=new Headers();if(Array.isArray(hdrs)){hdrs.forEach(function(p){out.append(p[0],p[1])});return out}if(hdrs&&typeof hdrs==='object'){Object.keys(hdrs).forEach(function(k){out.append(k,hdrs[k])});return out}return out}
|
|
function uid(){return 'swr-'+Math.random().toString(36).slice(2,10)}
|
|
var ofetch=window.fetch
|
|
window.fetch=function(input,init){
|
|
try{
|
|
var url=typeof input==='string'?input:(input&&input.url)||''
|
|
var m=((init&&init.method)||(input&&input.method)||'GET').toUpperCase()
|
|
if(m==='POST'&&isOR(url)){
|
|
var body=(init&&init.body)||null
|
|
if(hasStream(body)){
|
|
var id=uid()
|
|
var hdrs=ensureHeaders(init&&init.headers)
|
|
hdrs.set('x-swr-id',id)
|
|
init=Object.assign({},init,{headers:hdrs})
|
|
sessionStorage.setItem('swr:current',id)
|
|
sessionStorage.setItem('swr:seq:'+id,'0')
|
|
}
|
|
}
|
|
}catch{}
|
|
return ofetch.apply(this,arguments)
|
|
}
|
|
function applyDelta(id,seq,delta){
|
|
try{
|
|
var list=document.querySelectorAll('.msg-bubble'); if(!list.length)return
|
|
var el=list[list.length-1]
|
|
var cur=el.__swr_text||''
|
|
el.__swr_text=cur+String(delta||'')
|
|
if(window.markdownit){var md=window.markdownit({html:false,linkify:true,typographer:true,breaks:true});el.innerHTML=md.render(el.__swr_text)}
|
|
else{el.textContent=el.__swr_text}
|
|
sessionStorage.setItem('swr:seq:'+id,String(seq))
|
|
}catch{}
|
|
}
|
|
function onMsg(e){
|
|
var m=e&&e.data||{}
|
|
if(!m||!m.type)return
|
|
if(m.type==='SW_DELTA'){var id=m.id,seq=m.seq,delta=m.delta;if(id&&delta!=null)applyDelta(id,seq,delta)}
|
|
else if(m.type==='SW_DONE'){var id=m.id;if(id){sessionStorage.removeItem('swr:current')}}
|
|
}
|
|
if(navigator.serviceWorker){
|
|
navigator.serviceWorker.addEventListener('message',onMsg)
|
|
function replay(){
|
|
try{
|
|
var id=sessionStorage.getItem('swr:current')
|
|
if(!id)return
|
|
var seq=sessionStorage.getItem('swr:seq:'+id)||'0'
|
|
var ctrl=navigator.serviceWorker.controller
|
|
if(ctrl) ctrl.postMessage({type:'SW_REPLAY',id,fromSeq:+seq})
|
|
}catch{}
|
|
}
|
|
if(document.visibilityState==='visible'){
|
|
navigator.serviceWorker.ready.then(function(){setTimeout(replay,0)})
|
|
}
|
|
document.addEventListener('visibilitychange',function(){if(document.visibilityState==='visible') replay()},{passive:true})
|
|
}
|
|
})();`,
|
|
injectTo: 'head'
|
|
}
|
|
]
|
|
}
|
|
})
|
|
|
|
export default defineConfig({
|
|
base: '/devsune/',
|
|
build: { outDir: 'docs', minify: false },
|
|
plugins: [pwa, html]
|
|
})
|