From 4904d1cc7673d549d113f0929b0ec5eea638af94 Mon Sep 17 00:00:00 2001 From: veypi Date: Tue, 29 Oct 2024 10:21:47 +0800 Subject: [PATCH] feat: v2dom --- oaer/lib/api/access.ts | 2 +- oaer/lib/api/app.ts | 2 +- oaer/lib/api/role.ts | 6 +- oaer/lib/api/token.ts | 2 +- oaer/lib/api/user.ts | 10 +- oaer/lib/api/webapi.ts | 2 +- oaer/lib/assets/css/oaer.scss | 20 ++ oaer/lib/components/account.ts | 2 +- oaer/lib/components/app.ts | 23 +-- oaer/lib/components/index.ts | 8 +- oaer/lib/components/slide.ts | 7 +- oaer/lib/components/v2dom.ts | 200 -------------------- oaer/lib/logic.ts | 2 +- oaer/lib/main.ts | 2 +- oaer/lib/v2dom/index.ts | 18 ++ oaer/lib/{components => v2dom}/proxy.ts | 12 +- oaer/lib/v2dom/v2dom.ts | 240 ++++++++++++++++++++++++ oaer/package.json | 21 +-- oaer/yarn.lock | 194 +++++++++++++++++-- 19 files changed, 505 insertions(+), 268 deletions(-) delete mode 100644 oaer/lib/components/v2dom.ts create mode 100644 oaer/lib/v2dom/index.ts rename oaer/lib/{components => v2dom}/proxy.ts (93%) create mode 100644 oaer/lib/v2dom/v2dom.ts diff --git a/oaer/lib/api/access.ts b/oaer/lib/api/access.ts index 90d163e..17dfd7e 100644 --- a/oaer/lib/api/access.ts +++ b/oaer/lib/api/access.ts @@ -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(`/access`, { json, query }) } export interface PostOpts { diff --git a/oaer/lib/api/app.ts b/oaer/lib/api/app.ts index 82e7dfb..8488392 100644 --- a/oaer/lib/api/app.ts +++ b/oaer/lib/api/app.ts @@ -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(`/app/${app_id}/app_user`, { json }) } export interface AppUserPostOpts { diff --git a/oaer/lib/api/role.ts b/oaer/lib/api/role.ts index fe5e874..fe85386 100644 --- a/oaer/lib/api/role.ts +++ b/oaer/lib/api/role.ts @@ -7,7 +7,7 @@ import webapi from "./webapi" import * as models from "./models" export function Get(role_id: string) { - return webapi.Get(`/role/${role_id}`, { }) + return webapi.Get(`/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(`/role/${role_id}`, { }) + return webapi.Delete(`/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(`/role`, { json }) } diff --git a/oaer/lib/api/token.ts b/oaer/lib/api/token.ts index 541f3f0..171a28b 100644 --- a/oaer/lib/api/token.ts +++ b/oaer/lib/api/token.ts @@ -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(`/token`, { json }) } diff --git a/oaer/lib/api/user.ts b/oaer/lib/api/user.ts index d672772..d598af7 100644 --- a/oaer/lib/api/user.ts +++ b/oaer/lib/api/user.ts @@ -7,7 +7,7 @@ import webapi from "./webapi" import * as models from "./models" export function Get(user_id: string) { - return webapi.Get(`/user/${user_id}`, { }) + return webapi.Get(`/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(`/user/${user_id}`, { }) + return webapi.Delete(`/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(`/user`, { json }) } export function UserRoleGet(user_role_id: string, user_id: string) { - return webapi.Get(`/user/${user_id}/user_role/${user_role_id}`, { }) + return webapi.Get(`/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(`/user/${user_id}/user_role`, { json }) } diff --git a/oaer/lib/api/webapi.ts b/oaer/lib/api/webapi.ts index 069d032..2a2c07b 100644 --- a/oaer/lib/api/webapi.ts +++ b/oaer/lib/api/webapi.ts @@ -1,6 +1,6 @@ // // Copyright (C) 2024 veypi -// 2024-10-22 17:13:42 +// 2024-10-28 17:46:56 // Distributed under terms of the MIT license. // diff --git a/oaer/lib/assets/css/oaer.scss b/oaer/lib/assets/css/oaer.scss index 1bdbc19..0799ba6 100644 --- a/oaer/lib/assets/css/oaer.scss +++ b/oaer/lib/assets/css/oaer.scss @@ -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"); diff --git a/oaer/lib/components/account.ts b/oaer/lib/components/account.ts index 81b2bea..426f04d 100644 --- a/oaer/lib/components/account.ts +++ b/oaer/lib/components/account.ts @@ -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', [ diff --git a/oaer/lib/components/app.ts b/oaer/lib/components/app.ts index ffffeb9..d4013cf 100644 --- a/oaer/lib/components/app.ts +++ b/oaer/lib/components/app.ts @@ -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) } }) ]) diff --git a/oaer/lib/components/index.ts b/oaer/lib/components/index.ts index 5c2fefb..d3837b8 100644 --- a/oaer/lib/components/index.ts +++ b/oaer/lib/components/index.ts @@ -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: () => ``, + children: [() => ``], 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 { diff --git a/oaer/lib/components/slide.ts b/oaer/lib/components/slide.ts index cbd5122..380b4b5 100644 --- a/oaer/lib/components/slide.ts +++ b/oaer/lib/components/slide.ts @@ -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() } diff --git a/oaer/lib/components/v2dom.ts b/oaer/lib/components/v2dom.ts deleted file mode 100644 index 76de34d..0000000 --- a/oaer/lib/components/v2dom.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* - * v2dom.ts - * Copyright (C) 2024 veypi - * 2024-10-23 15:54 - * Distributed under terms of the GPL license. - */ - -import proxy from "./proxy" - - -interface buildOpts { - id?: string - typ?: string - class?: string - vclass?: [() => string] - attrs?: attrs - style?: string - inner?: string | computedFn - onclick?: any - children?: childTyp[] - updator?: (p: HTMLElement) => void - vbind?: [Object, string] -} - -const typs = ['div', 'img', 'span', 'p', 'a', 'input'] - -type iterChild = [T[], (d: T) => HTMLElement] -type childTyp = HTMLElement | iterChild -type computedFn = () => any -type attrs = { [key: string]: string | number | computedFn } -export default (opts: buildOpts | string, inner?: string | computedFn | childTyp[], 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 - 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 -} - - diff --git a/oaer/lib/logic.ts b/oaer/lib/logic.ts index 21fe887..81d8c3a 100644 --- a/oaer/lib/logic.ts +++ b/oaer/lib/logic.ts @@ -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 diff --git a/oaer/lib/main.ts b/oaer/lib/main.ts index 1aa741e..9ca1374 100644 --- a/oaer/lib/main.ts +++ b/oaer/lib/main.ts @@ -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) { diff --git a/oaer/lib/v2dom/index.ts b/oaer/lib/v2dom/index.ts new file mode 100644 index 0000000..5926c67 --- /dev/null +++ b/oaer/lib/v2dom/index.ts @@ -0,0 +1,18 @@ +/* + * index.ts + * Copyright (C) 2024 veypi + * 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 diff --git a/oaer/lib/components/proxy.ts b/oaer/lib/v2dom/proxy.ts similarity index 93% rename from oaer/lib/components/proxy.ts rename to oaer/lib/v2dom/proxy.ts index 2d981e3..4d0e4aa 100644 --- a/oaer/lib/components/proxy.ts +++ b/oaer/lib/v2dom/proxy.ts @@ -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(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(data: T) { return res } -export default { Watch, Listen, ForceUpdate, DataID, generateUniqueId } +export default { Watch, Listen, DomListen, ForceUpdate, DataID, GenUniqueID, } diff --git a/oaer/lib/v2dom/v2dom.ts b/oaer/lib/v2dom/v2dom.ts new file mode 100644 index 0000000..86df019 --- /dev/null +++ b/oaer/lib/v2dom/v2dom.ts @@ -0,0 +1,240 @@ +/* + * v2dom.ts + * Copyright (C) 2024 veypi + * 2024-10-23 15:54 + * Distributed under terms of the GPL license. + */ + +import proxy from "./proxy" + + +interface buildOpts { + id?: string + typ?: string + class?: string + vclass?: [() => string] + attrs?: attrs + style?: string + onclick?: any + children?: childTyp[] | childTyp + updator?: (p: HTMLElement) => void + vbind?: [Object, string] +} + +const typs = ['div', 'img', 'span', 'p', 'a', 'input'] + +type vforChild = { obj: T[], fn: (d: T, idx?: number) => HTMLElement, iterID: string, ifnone: HTMLElement } +type computedFn = () => string | HTMLElement +type childTyp = HTMLElement | vforChild | string | computedFn +type attrs = { [key: string]: string | number | (() => string) } + +export const v = (opts: buildOpts | string, children?: childTyp | childTyp[], 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 = (opts: buildOpts) => { + 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, 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 = (obj: T[], fn: (d: T, idx?: number) => HTMLElement, ifnone?: () => HTMLElement): vforChild => { + 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, 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) + } +} + + diff --git a/oaer/package.json b/oaer/package.json index 109a383..0a74d22 100644 --- a/oaer/package.json +++ b/oaer/package.json @@ -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" } } diff --git a/oaer/yarn.lock b/oaer/yarn.lock index 2d48f03..20bdf5c 100644 --- a/oaer/yarn.lock +++ b/oaer/yarn.lock @@ -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"