feat: v2dom

v3
veypi 4 weeks ago
parent 713f352bc8
commit 4904d1cc76

@ -17,7 +17,7 @@ export interface ListQuery {
updated_at?: Date
}
export function List(json: ListOpts, query: ListQuery) {
return webapi.Get<[models.Access]>(`/access`, { json, query })
return webapi.Get<models.Access[]>(`/access`, { json, query })
}
export interface PostOpts {

@ -65,7 +65,7 @@ export interface AppUserListOpts {
status?: string
}
export function AppUserList(app_id: string, json: AppUserListOpts) {
return webapi.Get<[models.AppUser]>(`/app/${app_id}/app_user`, { json })
return webapi.Get<models.AppUser[]>(`/app/${app_id}/app_user`, { json })
}
export interface AppUserPostOpts {

@ -7,7 +7,7 @@
import webapi from "./webapi"
import * as models from "./models"
export function Get(role_id: string) {
return webapi.Get<models.Role>(`/role/${role_id}`, { })
return webapi.Get<models.Role>(`/role/${role_id}`, {})
}
export interface PatchOpts {
@ -20,7 +20,7 @@ export function Patch(role_id: string, json: PatchOpts) {
}
export function Delete(role_id: string) {
return webapi.Delete<models.Role>(`/role/${role_id}`, { })
return webapi.Delete<models.Role>(`/role/${role_id}`, {})
}
export interface PostOpts {
@ -36,6 +36,6 @@ export interface ListOpts {
name?: string
}
export function List(json: ListOpts) {
return webapi.Get<[models.Role]>(`/role`, { json })
return webapi.Get<models.Role[]>(`/role`, { json })
}

@ -50,6 +50,6 @@ export interface ListOpts {
app_id: string
}
export function List(json: ListOpts) {
return webapi.Get<[models.Token]>(`/token`, { json })
return webapi.Get<models.Token[]>(`/token`, { json })
}

@ -7,7 +7,7 @@
import webapi from "./webapi"
import * as models from "./models"
export function Get(user_id: string) {
return webapi.Get<models.User>(`/user/${user_id}`, { })
return webapi.Get<models.User>(`/user/${user_id}`, {})
}
export interface PatchOpts {
@ -23,7 +23,7 @@ export function Patch(user_id: string, json: PatchOpts) {
}
export function Delete(user_id: string) {
return webapi.Delete<models.User>(`/user/${user_id}`, { })
return webapi.Delete<models.User>(`/user/${user_id}`, {})
}
export interface PostOpts {
@ -47,11 +47,11 @@ export interface ListOpts {
status?: number
}
export function List(json: ListOpts) {
return webapi.Get<[models.User]>(`/user`, { json })
return webapi.Get<models.User[]>(`/user`, { json })
}
export function UserRoleGet(user_role_id: string, user_id: string) {
return webapi.Get<models.UserRole>(`/user/${user_id}/user_role/${user_role_id}`, { })
return webapi.Get<models.UserRole>(`/user/${user_id}/user_role/${user_role_id}`, {})
}
export interface UserRolePatchOpts {
@ -82,6 +82,6 @@ export interface UserRoleListOpts {
status?: string
}
export function UserRoleList(user_id: string, json: UserRoleListOpts) {
return webapi.Get<[models.UserRole]>(`/user/${user_id}/user_role`, { json })
return webapi.Get<models.UserRole[]>(`/user/${user_id}/user_role`, { json })
}

@ -1,6 +1,6 @@
//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2024-10-22 17:13:42
// 2024-10-28 17:46:56
// Distributed under terms of the MIT license.
//

@ -186,12 +186,32 @@ div[voa] {
}
.voa-ab-info {
width: calc(100% - 6rem);
display: flex;
flex-direction: column;
div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
}
.voa-apps {
.voa-apps-header {}
.voa-apps-body {
display: flex;
flex-wrap: wrap;
gap: 1rem;
flex-direction: column;
}
.voa-apps-box {}
}
.voa-logo {
background-image: url("../favicon.svg");

@ -4,7 +4,7 @@
* 2024-10-22 22:07
* Distributed under terms of the GPL license.
*/
import v from './v2dom'
import { v } from '../v2dom'
import logic from '../logic'
export default v('voa-account', [

@ -5,17 +5,15 @@
* Distributed under terms of the GPL license.
*/
import v from "./v2dom";
import { v, proxy, vfor } from "../v2dom";
import logic from '../logic'
import api from "../api";
import proxy from "./proxy";
import * as typs from "../typs"
export default () => {
let apps: typs.App[] = proxy.Watch([])
api.app.List({}).then(e => {
e[1]
apps.push(...e)
})
return v({
@ -23,16 +21,19 @@ export default () => {
children: [
v('voa-apps-header', [v('voa-apps-title', '我的应用')]),
v('voa-apps-body', [
[logic.myapps,
(data) => v('voa-app-box', [v('span', () => data.name)])],
v('div', '222'),
[logic.myapps,
(data) => v('voa-app-box', () => data.name)],
vfor(apps,
(data, idx) => v('voa-apps-box', [v('span', () => idx + ': ' + data.name)])),
// [logic.myapps,
// (data) => v('voa-app-box', () => data.name)],
v({
typ: 'div', inner: 'add', vbind: [logic.myapps[0], 'name'],
typ: 'div', children: ['add'], vbind: [logic.myapps[0], 'name'],
onclick: () => {
logic.myapps.splice(0, 1)
logic.myapps.push({ name: new Date().toLocaleString() })
// let tmp = apps[1]
// apps[1] = apps[0]
// apps[0] = tmp
// apps.splice(2, 1)
apps.push({ name: new Date().toLocaleTimeString() } as any)
}
})
])

@ -6,7 +6,7 @@
*/
import slide from './slide'
import v from './v2dom'
import { v } from '../v2dom'
import logic from '../logic'
import bus from '../bus'
export default class {
@ -22,8 +22,9 @@ export default class {
let frame_user = v({
class: 'voa-on',
vclass: [() => logic.ready ? 'voa-scale-in' : 'voa-scale-off'],
inner: () => `<img src="${logic.user.icon}" />`,
children: [() => `<img src="${logic.user.icon}" />`],
onclick: () => {
logic.getDetailUser()
if (!this.slide) {
this.slide = new slide()
}
@ -34,13 +35,14 @@ export default class {
let frame_login = v({
class: 'voa-off voa-hover-line-b',
vclass: [() => !logic.ready ? 'voa-scale-in' : 'voa-scale-off'],
inner: '登录',
children: ['登录'],
onclick: () => {
console.log('click login')
bus.emit('login')
}
})
return () => {
console.log('gen_avatar', logic.ready)
if (logic.ready) {
return frame_user
} else {

@ -4,11 +4,10 @@
* 2024-10-22 17:57
* Distributed under terms of the GPL license.
*/
import v from './v2dom'
import { v, proxy } from '../v2dom'
import account from './account'
import app from './app'
import logic from '../logic'
import proxy from './proxy'
import bus from '../bus'
/*
@ -33,7 +32,7 @@ export default class {
})
this.footer = v({
class: 'voa-slide-footer',
inner: 'logout',
children: ['logout'],
onclick: () => {
bus.emit('logout')
}
@ -68,7 +67,7 @@ export default class {
}
}
})
proxy.Listen(this.mask, () => {
proxy.DomListen(this.mask, () => {
if (!logic.ready) {
this.hide()
}

@ -1,200 +0,0 @@
/*
* v2dom.ts
* Copyright (C) 2024 veypi <i@veypi.com>
* 2024-10-23 15:54
* Distributed under terms of the GPL license.
*/
import proxy from "./proxy"
interface buildOpts<T> {
id?: string
typ?: string
class?: string
vclass?: [() => string]
attrs?: attrs
style?: string
inner?: string | computedFn
onclick?: any
children?: childTyp<T>[]
updator?: (p: HTMLElement) => void
vbind?: [Object, string]
}
const typs = ['div', 'img', 'span', 'p', 'a', 'input']
type iterChild<T> = [T[], (d: T) => HTMLElement]
type childTyp<T> = HTMLElement | iterChild<T>
type computedFn = () => any
type attrs = { [key: string]: string | number | computedFn }
export default <T>(opts: buildOpts<T> | string, inner?: string | computedFn | childTyp<T>[], attrs?: attrs) => {
if (typeof opts === 'string') {
if (typs.indexOf(opts) >= 0) {
opts = { typ: opts }
} else {
opts = { class: opts }
}
}
let dom = document.createElement(opts.typ || 'div')
if (opts.inner) {
inner = opts.inner
}
if (inner) {
if (typeof inner == 'string') {
dom.innerHTML = inner
} else if (typeof inner == 'function') {
proxy.Listen(dom, () => {
let res = inner()
if (typeof res === 'string') {
dom.innerHTML = res
} else if (res === undefined) {
} else {
dom.innerHTML = ''
dom.appendChild(res)
}
})
} else {
opts.children = inner
}
}
if (attrs) {
opts.attrs = attrs
}
if (opts.id) {
dom.id = opts.id
}
if (opts.class) {
dom.classList.add(...opts.class.split(' '))
}
if (opts.vclass) {
for (let vc of opts.vclass) {
let oldvc: string[] = []
proxy.Listen(dom, () => {
dom.classList.remove(...oldvc)
oldvc = vc().split(' ')
dom.classList.add(...oldvc)
})
}
}
if (opts.attrs) {
for (let a in opts.attrs) {
let attr = opts.attrs[a]
if (typeof attr === 'function') {
proxy.Listen(dom, () => {
dom.setAttribute(a, attr())
})
} else {
dom.setAttribute(a, String(attr))
}
}
}
if (opts.onclick) {
dom.onclick = opts.onclick
}
if (opts.children) {
let tmpID = ''
for (let c of opts.children) {
if (Object.prototype.toString.call(c) === '[object Array]') {
const iterID = proxy.generateUniqueId()
const iterLast = tmpID
proxy.Listen(dom, () => {
c = c as iterChild<T>
let itemIDs: string[] = []
for (let i = 0; i < c[0].length; i++) {
let line = c[0][i]
//@ts-ignore
let itemID = line[proxy.DataID] || ''
let nextID = ''
if (i < c[0].length - 1) {
//@ts-ignore
nextID = c[0][i + 1][proxy.DataID] || ''
}
itemIDs.push(itemID)
let inserted = -2
let subdom: HTMLElement | null = null
let beforeChild: HTMLElement | null = null
for (let childID = 0; childID < dom.children.length; childID++) {
let child = dom.children[childID]
// console.log(`${inserted} ${childID} ${itemID} ${nextID}`)
if (child.getAttribute('vbind-iter') === iterID) {
if (child.getAttribute('vbind-proxy') === itemID) {
inserted = childID
subdom = child as HTMLElement
} else if (child.getAttribute('vbind-proxy') === nextID && nextID != '') {
// 用于交换位置
if (inserted != childID - 1) {
beforeChild = child as HTMLElement
}
}
} else if (child.getAttribute('vbind-iterlast') === iterID) {
if (inserted == -2) {
beforeChild = child as HTMLElement
}
// 找到第一个不是这个循环块的dom元素时退出
break
}
}
if (inserted == -2) {
subdom = c[1](line)
subdom.setAttribute('vbind-proxy', itemID)
subdom.setAttribute('vbind-iter', iterID)
if (iterLast != '') {
subdom.setAttribute('vbind-iterlast', iterLast)
}
if (beforeChild) {
dom.insertBefore(subdom, beforeChild)
// console.log(`${iterID} insert new`, subdom)
} else {
// console.log(`${iterID} append new`, subdom)
dom.appendChild(subdom)
}
} else if (beforeChild) {
// console.log(`${iterID} insert old`, subdom)
dom.insertBefore(subdom!, beforeChild)
} else {
// console.log(`${iterID} none`, subdom)
}
}
for (let child of dom.children) {
if (child.getAttribute('vbind-iter') === iterID && itemIDs.indexOf(child.getAttribute('vbind-proxy') || '') == -1) {
dom.removeChild(child)
}
}
})
tmpID = iterID
} else {
c = c as HTMLElement
if (tmpID != '') {
c.setAttribute('vbind-iterlast', tmpID)
}
dom.appendChild(c)
}
}
}
if (opts.style) {
const regex = /([a-zA-Z-]+)\s*:\s*([^;]+);?/g;
let match: any
while ((match = regex.exec(opts.style)) !== null) {
const key = match[1].trim();
const value = match[2].trim();
dom.style.setProperty(key, value)
}
}
dom.setAttribute('voa', '1')
if (opts.updator) {
proxy.Listen(dom, () => {
opts.updator!(dom)
})
}
if (opts.vbind && opts.typ === 'input') {
dom.setAttribute('value', Reflect.get(opts.vbind[0], opts.vbind[1]))
dom.addEventListener('input', (e) => {
// @ts-ignore
Reflect.set(opts.vbind[0], opts.vbind[1], e.target.value)
})
}
return dom
}

@ -5,9 +5,9 @@
* Distributed under terms of the GPL license.
*/
import bus from './bus'
import proxy from './components/proxy'
import api, { apitoken } from './api'
import * as typs from './typs'
import { proxy } from './v2dom'
class Token {
iat?: string

@ -20,7 +20,7 @@ export default new class {
return logic.user
}
access() {
return logic.token.app.access
return logic.token.app.access!
}
init(host?: string, code?: string) {
if (host) {

@ -0,0 +1,18 @@
/*
* index.ts
* Copyright (C) 2024 veypi <i@veypi.com>
* 2024-10-29 06:21
* Distributed under terms of the GPL license.
*/
import proxy from './proxy'
import { v, vspan, vfor } from './v2dom'
export {
v,
vfor,
vspan,
proxy
}
export default v

@ -47,7 +47,7 @@ setInterval(() => {
// }
// }, 1000)
function generateUniqueId() {
function GenUniqueID() {
const timestamp = performance.now().toString(36);
const random = Math.random().toString(36).substring(2, 5);
return `${timestamp}-${random}`;
@ -62,7 +62,7 @@ function ForceUpdate() {
}
var listen_tags: number[] = []
function listen(callback: voidFn): number {
function Listen(callback: voidFn): number {
let idx = callbackCache.length
listen_tags.push(idx)
callbackCache.push([true, callback])
@ -71,9 +71,9 @@ function listen(callback: voidFn): number {
return idx
}
function Listen(dom: HTMLElement, fn: () => void) {
function DomListen(dom: HTMLElement, fn: () => void) {
let fns = dom.getAttribute('vbind-fns')
let fnid = listen(fn)
let fnid = Listen(fn)
if (fns) {
fns += ',' + fnid
} else {
@ -86,7 +86,7 @@ const isProxy = Symbol("isProxy")
const DataID = Symbol("DataID")
function Watch<T extends Object>(data: T) {
const did = generateUniqueId()
const did = GenUniqueID()
let isArray = false
if (Object.prototype.toString.call(data) === '[object Array]') {
isArray = true
@ -158,4 +158,4 @@ function Watch<T extends Object>(data: T) {
return res
}
export default { Watch, Listen, ForceUpdate, DataID, generateUniqueId }
export default { Watch, Listen, DomListen, ForceUpdate, DataID, GenUniqueID, }

@ -0,0 +1,240 @@
/*
* v2dom.ts
* Copyright (C) 2024 veypi <i@veypi.com>
* 2024-10-23 15:54
* Distributed under terms of the GPL license.
*/
import proxy from "./proxy"
interface buildOpts<T> {
id?: string
typ?: string
class?: string
vclass?: [() => string]
attrs?: attrs
style?: string
onclick?: any
children?: childTyp<T>[] | childTyp<T>
updator?: (p: HTMLElement) => void
vbind?: [Object, string]
}
const typs = ['div', 'img', 'span', 'p', 'a', 'input']
type vforChild<T> = { obj: T[], fn: (d: T, idx?: number) => HTMLElement, iterID: string, ifnone: HTMLElement }
type computedFn = () => string | HTMLElement
type childTyp<T> = HTMLElement | vforChild<T> | string | computedFn
type attrs = { [key: string]: string | number | (() => string) }
export const v = <T>(opts: buildOpts<T> | string, children?: childTyp<T> | childTyp<T>[], attrs?: attrs) => {
if (typeof opts === 'string') {
if (typs.indexOf(opts) >= 0) {
opts = { typ: opts }
} else {
opts = { class: opts }
}
}
if (children) {
opts.children = children
}
if (attrs) {
opts.attrs = attrs
}
return vbase(opts)
}
export const vspan = (content: string, Class?: string, attrs?: attrs) => {
return vbase({ typ: 'span', class: Class, children: [content], attrs })
}
export const vbase = <T>(opts: buildOpts<T>) => {
let dom = document.createElement(opts.typ || 'div')
if (opts.id) {
dom.id = opts.id
}
if (opts.class) {
dom.classList.add(...opts.class.split(' '))
}
if (opts.vclass) {
for (let vc of opts.vclass) {
let oldvc: string[] = []
proxy.DomListen(dom, () => {
dom.classList.remove(...oldvc)
oldvc = vc().split(' ')
dom.classList.add(...oldvc)
})
}
}
if (opts.attrs) {
for (let a in opts.attrs) {
let attr = opts.attrs[a]
if (typeof attr === 'function') {
proxy.DomListen(dom, () => {
dom.setAttribute(a, attr())
})
} else {
dom.setAttribute(a, String(attr))
}
}
}
if (opts.onclick) {
dom.onclick = opts.onclick
}
if (opts.children) {
handleChild(dom, opts.children, true)
}
if (opts.style) {
const regex = /([a-zA-Z-]+)\s*:\s*([^;]+);?/g;
let match: any
while ((match = regex.exec(opts.style)) !== null) {
const key = match[1].trim();
const value = match[2].trim();
dom.style.setProperty(key, value)
}
}
dom.setAttribute('voa', '1')
if (opts.updator) {
proxy.DomListen(dom, () => {
opts.updator!(dom)
})
}
if (opts.vbind && opts.typ === 'input') {
dom.setAttribute('value', Reflect.get(opts.vbind[0], opts.vbind[1]))
dom.addEventListener('input', (e) => {
// @ts-ignore
Reflect.set(opts.vbind[0], opts.vbind[1], e.target.value)
})
}
return dom
}
function handleChild(dom: HTMLElement, c: any, is_only = false, is_listen = false) {
if (is_only) {
dom.innerHTML = ''
}
if (typeof c === 'function') {
if (!is_listen) {
proxy.DomListen(dom, () => {
handleChild(dom, c(), is_only, true)
})
} else {
handleChild(dom, c(), is_only, true)
}
} else if (typeof c === 'string' || typeof c === 'number') {
dom.innerHTML = String(c)
} else if (Array.isArray(c)) {
for (let cc of c) {
handleChild(dom, cc, is_only && c.length === 1, is_listen)
}
} else if (c && c.iterID) {
handleChildVfor(dom, c as vforChild<any>, is_listen)
} else if (c instanceof Element) {
dom.appendChild(c)
} else if (typeof c === 'undefined' || c === null) {
} else {
console.warn('unknown child type', c)
}
}
export const vfor = <T>(obj: T[], fn: (d: T, idx?: number) => HTMLElement, ifnone?: () => HTMLElement): vforChild<T> => {
let iterID = proxy.GenUniqueID()
let dom = document.createElement('div') as HTMLElement
dom.style.display = 'none'
dom.style.visibility = 'hidden'
dom.style.height = '0'
dom.style.width = '0'
if (ifnone) {
dom = ifnone()
}
dom.setAttribute('vbind-iternone', iterID)
return {
obj,
fn,
iterID,
ifnone: dom
}
}
function handleChildVfor(dom: HTMLElement, data: vforChild<any>, is_listen = false) {
let fn = () => {
let itemIDs: string[] = []
for (let i = 0; i < data.obj.length; i++) {
let line = data.obj[i]
let itemID = line[proxy.DataID] || ''
let nextID = ''
if (i < data.obj.length - 1) {
nextID = data.obj[i + 1][proxy.DataID] || ''
}
itemIDs.push(itemID)
let inserted = -1
let subdom: HTMLElement | null = null
let beforeChild: HTMLElement | null = null
let iterFound = false
for (let childID = 0; childID < dom.children.length; childID++) {
let child = dom.children[childID]
// console.log(`${inserted} ${childID} ${itemID} ${nextID}`)
if (child.getAttribute('vbind-iter') === data.iterID) {
iterFound = true
if (child.getAttribute('vbind-iteridx') === itemID) {
// 找到已存在dom
inserted = childID
subdom = child as HTMLElement
} else if (child.getAttribute('vbind-iteridx') === nextID && nextID != '') {
// 用于交换位置
beforeChild = child as HTMLElement
}
} else if (child.getAttribute('vbind-iternone') === data.iterID) {
if (inserted == -1) {
beforeChild = child as HTMLElement
}
} else if (iterFound) {
if (!beforeChild) {
beforeChild = child as HTMLElement
}
break
}
}
if (inserted == -1) {
subdom = data.fn(line, i)
subdom.setAttribute('vbind-iteridx', itemID)
subdom.setAttribute('vbind-iter', data.iterID)
if (beforeChild) {
dom.insertBefore(subdom, beforeChild)
// console.log(`${iterID} insert new`, subdom)
} else {
// console.log(`${iterID} append new`, subdom)
dom.appendChild(subdom)
}
} else if (beforeChild) {
// console.log(`${iterID} insert old`, subdom)
dom.insertBefore(subdom!, beforeChild)
} else {
// console.log(`${iterID} none`, subdom)
}
}
let noneExist = false
for (let child of dom.children) {
if (child.getAttribute('vbind-iter') === data.iterID && itemIDs.indexOf(child.getAttribute('vbind-iteridx') || '') == -1) {
dom.removeChild(child)
}
if (child.getAttribute('vbind-iternone') === data.iterID) {
noneExist = true
}
}
if (data.obj.length == 0) {
if (!noneExist) {
dom.appendChild(data.ifnone)
}
} else {
if (noneExist) {
dom.removeChild(data.ifnone)
}
}
}
if (is_listen) {
fn()
} else {
proxy.DomListen(dom, fn)
}
}

@ -1,20 +1,12 @@
{
"name": "oaer",
"private": true,
"version": "0.0.0",
"name": "@veypi/oaer",
"author": "veypi",
"version": "0.3.0",
"type": "module",
"main": "./lib/main.ts",
"files": [
"dist",
"index.d.ts"
"dist"
],
"main": "./dist/oaer.umd.cjs",
"module": "./dist/oaer.js",
"types": "./index.d.ts",
"exports": {
"types": "./index.d.ts",
"import": "./dist/oaer.js",
"require": "./dist/oaer.umd.cjs"
},
"scripts": {
"dev": "vite",
"build": "tsc && vite build"
@ -32,6 +24,7 @@
"license": "Apache-2.0",
"dependencies": {
"axios": "^1.7.2",
"mitt": "^3.0.1"
"mitt": "^3.0.1",
"webdav": "^5.7.1"
}
}

@ -2,6 +2,13 @@
# yarn lockfile v1
"@buttercup/fetch@^0.2.1":
version "0.2.1"
resolved "https://registry.yarnpkg.com/@buttercup/fetch/-/fetch-0.2.1.tgz#f38bed5f879231920ed4477bd202695d6e70a867"
integrity sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==
optionalDependencies:
node-fetch "^3.3.0"
"@esbuild/aix-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
@ -224,18 +231,45 @@ axios@^1.7.2:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base-64@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a"
integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==
binary-extensions@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
braces@^3.0.3, braces@~3.0.2:
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"
braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"
byte-length@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/byte-length/-/byte-length-1.0.2.tgz#ba5a5909240b0121c079b7f7b15248d6f08223cc"
integrity sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==
charenc@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
"chokidar@>=3.0.0 <4.0.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
@ -258,11 +292,26 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
crypt@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
data-uri-to-buffer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
entities@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-5.0.0.tgz#b2ab51fe40d995817979ec79dd621154c3c0f62b"
integrity sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==
esbuild@^0.21.3:
version "0.21.5"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
@ -292,6 +341,21 @@ esbuild@^0.21.3:
"@esbuild/win32-ia32" "0.21.5"
"@esbuild/win32-x64" "0.21.5"
fast-xml-parser@^4.4.1:
version "4.5.0"
resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37"
integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
dependencies:
strnum "^1.0.5"
fetch-blob@^3.1.2, fetch-blob@^3.1.4:
version "3.2.0"
resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9"
integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
dependencies:
node-domexception "^1.0.0"
web-streams-polyfill "^3.0.3"
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@ -313,6 +377,13 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
formdata-polyfill@^4.0.10:
version "4.0.10"
resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423"
integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
dependencies:
fetch-blob "^3.1.2"
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
@ -325,6 +396,11 @@ glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
hot-patcher@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/hot-patcher/-/hot-patcher-2.0.1.tgz#1473b799a3b756460ef226e10cf2cea4d79b435e"
integrity sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==
immutable@^4.0.0:
version "4.3.6"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447"
@ -337,6 +413,11 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
is-buffer@~1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@ -354,13 +435,19 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
micromatch@^4.0.7:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
layerr@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/layerr/-/layerr-3.0.0.tgz#bc4e0e5986ffd3ab8c3c88b458f53be8dceea29e"
integrity sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==
md5@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"
charenc "0.0.2"
crypt "0.0.2"
is-buffer "~1.1.6"
mime-db@1.52.0:
version "1.52.0"
@ -374,6 +461,13 @@ mime-types@^2.1.12:
dependencies:
mime-db "1.52.0"
minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies:
brace-expansion "^2.0.1"
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
@ -384,17 +478,41 @@ nanoid@^3.3.7:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
nested-property@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-4.0.0.tgz#a67b5a31991e701e03cdbaa6453bc5b1011bb88d"
integrity sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==
node-domexception@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
node-fetch@^3.3.0, node-fetch@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b"
integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
dependencies:
data-uri-to-buffer "^4.0.0"
fetch-blob "^3.1.4"
formdata-polyfill "^4.0.10"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
path-posix@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f"
integrity sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==
picocolors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@ -413,6 +531,11 @@ proxy-from-env@^1.1.0:
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@ -420,6 +543,11 @@ readdirp@~3.6.0:
dependencies:
picomatch "^2.2.1"
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
rollup@^4.13.0:
version "4.18.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda"
@ -459,6 +587,11 @@ sass@^1.77.6:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
strnum@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@ -471,18 +604,24 @@ typescript@^5.4.5:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa"
integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==
url-join@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1"
integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==
url-parse@^1.5.10:
version "1.5.10"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
vite-plugin-css-injected-by-js@^3.5.2:
version "3.5.2"
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.5.2.tgz#1f75d16ad5c05b6b49bf18018099a189ec2e46ad"
integrity sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ==
vite-plugin-singlefile@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/vite-plugin-singlefile/-/vite-plugin-singlefile-2.0.2.tgz#af2c95e0182bd363dbe29b80bea5c5a78209f649"
integrity sha512-Z2ou6HcvED5CF0hM+vcFSaFa+klyS8RyyLxW0PbMRLnMbvzTI6ueWyxdYNFhpuXZgz/aj6+E/dHFTdEcw6gb9w==
dependencies:
micromatch "^4.0.7"
vite@^5.2.10:
version "5.3.3"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2"
@ -493,3 +632,28 @@ vite@^5.2.10:
rollup "^4.13.0"
optionalDependencies:
fsevents "~2.3.3"
web-streams-polyfill@^3.0.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
webdav@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/webdav/-/webdav-5.7.1.tgz#f1c6f1e743938ac61d916aded0f68f4dd6a1d672"
integrity sha512-JVPn3nLxXJfHSRvennHsOrDYjFLkilZ1Qlw8Ff6hpqp6AvkgF7a//aOh5wA4rMp+sLZ1Km0V+iv0LyO1FIwtXg==
dependencies:
"@buttercup/fetch" "^0.2.1"
base-64 "^1.0.0"
byte-length "^1.0.2"
entities "^5.0.0"
fast-xml-parser "^4.4.1"
hot-patcher "^2.0.1"
layerr "^3.0.0"
md5 "^2.3.0"
minimatch "^9.0.5"
nested-property "^4.0.0"
node-fetch "^3.3.2"
path-posix "^1.0.0"
url-join "^5.0.0"
url-parse "^1.5.10"

Loading…
Cancel
Save