From 7cc505a5e2161761cc70c4e389014ba4d0eac270 Mon Sep 17 00:00:00 2001 From: yankun Date: Sun, 26 Jul 2026 14:40:42 +0800 Subject: [PATCH] Add CUTOS capability and core API examples --- .../demo-id-card-reader/.env.development | 1 + .../demo-id-card-reader/.env.production | 1 + capabilities/demo-id-card-reader/.gitignore | 7 + capabilities/demo-id-card-reader/.prettierrc | 10 + capabilities/demo-id-card-reader/README.md | 15 + capabilities/demo-id-card-reader/index.html | 12 + capabilities/demo-id-card-reader/package.json | 32 + .../demo-id-card-reader/postcss.config.js | 7 + .../demo-id-card-reader/public/config.json | 12 + .../demo-id-card-reader/public/thumbnail.png | Bin 0 -> 52432 bytes capabilities/demo-id-card-reader/src/App.vue | 104 + .../demo-id-card-reader/src/assets/cutos.png | Bin 0 -> 7773 bytes .../src/components/CutosTopbar.vue | 75 + .../src/components/HelloCutos.vue | 18 + capabilities/demo-id-card-reader/src/main.ts | 5 + .../demo-id-card-reader/src/style.css | 22 + .../demo-id-card-reader/src/utils/config.ts | 66 + .../demo-id-card-reader/src/vite-env.d.ts | 9 + .../demo-id-card-reader/tailwind.config.js | 8 + .../demo-id-card-reader/tsconfig.json | 22 + .../demo-id-card-reader/vite.config.ts | 49 + .../demo-receipt-printer/.env.development | 1 + .../demo-receipt-printer/.env.production | 1 + capabilities/demo-receipt-printer/.gitignore | 7 + capabilities/demo-receipt-printer/.prettierrc | 10 + capabilities/demo-receipt-printer/README.md | 14 + capabilities/demo-receipt-printer/index.html | 12 + .../demo-receipt-printer/package-lock.json | 3470 +++++++++++++++++ .../demo-receipt-printer/package.json | 32 + .../demo-receipt-printer/postcss.config.js | 7 + .../demo-receipt-printer/public/config.json | 12 + .../demo-receipt-printer/public/thumbnail.png | Bin 0 -> 24064 bytes capabilities/demo-receipt-printer/src/App.vue | 140 + .../demo-receipt-printer/src/assets/cutos.png | Bin 0 -> 9405 bytes capabilities/demo-receipt-printer/src/main.ts | 5 + .../demo-receipt-printer/src/style.css | 10 + .../demo-receipt-printer/src/utils/config.ts | 66 + .../demo-receipt-printer/src/vite-env.d.ts | 9 + .../demo-receipt-printer/tailwind.config.js | 8 + .../demo-receipt-printer/tsconfig.json | 22 + .../demo-receipt-printer/vite.config.ts | 49 + core-api/demo-core-api/.env.development | 1 + core-api/demo-core-api/.env.production | 1 + core-api/demo-core-api/.gitignore | 7 + core-api/demo-core-api/.prettierrc | 10 + core-api/demo-core-api/README.md | 34 + core-api/demo-core-api/index.html | 12 + core-api/demo-core-api/package.json | 31 + core-api/demo-core-api/postcss.config.js | 7 + core-api/demo-core-api/public/config.json | 10 + core-api/demo-core-api/public/thumbnail.png | Bin 0 -> 18581 bytes core-api/demo-core-api/src/App.vue | 340 ++ core-api/demo-core-api/src/assets/cutos.png | Bin 0 -> 7773 bytes .../src/components/CutosTopbar.vue | 75 + core-api/demo-core-api/src/main.ts | 5 + core-api/demo-core-api/src/style.css | 100 + core-api/demo-core-api/src/utils/config.ts | 66 + core-api/demo-core-api/src/vite-env.d.ts | 9 + core-api/demo-core-api/tailwind.config.js | 8 + core-api/demo-core-api/tsconfig.json | 22 + core-api/demo-core-api/vite.config.ts | 48 + 61 files changed, 5136 insertions(+) create mode 100644 capabilities/demo-id-card-reader/.env.development create mode 100644 capabilities/demo-id-card-reader/.env.production create mode 100644 capabilities/demo-id-card-reader/.gitignore create mode 100644 capabilities/demo-id-card-reader/.prettierrc create mode 100644 capabilities/demo-id-card-reader/README.md create mode 100644 capabilities/demo-id-card-reader/index.html create mode 100644 capabilities/demo-id-card-reader/package.json create mode 100644 capabilities/demo-id-card-reader/postcss.config.js create mode 100644 capabilities/demo-id-card-reader/public/config.json create mode 100644 capabilities/demo-id-card-reader/public/thumbnail.png create mode 100644 capabilities/demo-id-card-reader/src/App.vue create mode 100644 capabilities/demo-id-card-reader/src/assets/cutos.png create mode 100644 capabilities/demo-id-card-reader/src/components/CutosTopbar.vue create mode 100644 capabilities/demo-id-card-reader/src/components/HelloCutos.vue create mode 100644 capabilities/demo-id-card-reader/src/main.ts create mode 100644 capabilities/demo-id-card-reader/src/style.css create mode 100644 capabilities/demo-id-card-reader/src/utils/config.ts create mode 100644 capabilities/demo-id-card-reader/src/vite-env.d.ts create mode 100644 capabilities/demo-id-card-reader/tailwind.config.js create mode 100644 capabilities/demo-id-card-reader/tsconfig.json create mode 100644 capabilities/demo-id-card-reader/vite.config.ts create mode 100644 capabilities/demo-receipt-printer/.env.development create mode 100644 capabilities/demo-receipt-printer/.env.production create mode 100644 capabilities/demo-receipt-printer/.gitignore create mode 100644 capabilities/demo-receipt-printer/.prettierrc create mode 100644 capabilities/demo-receipt-printer/README.md create mode 100644 capabilities/demo-receipt-printer/index.html create mode 100644 capabilities/demo-receipt-printer/package-lock.json create mode 100644 capabilities/demo-receipt-printer/package.json create mode 100644 capabilities/demo-receipt-printer/postcss.config.js create mode 100644 capabilities/demo-receipt-printer/public/config.json create mode 100644 capabilities/demo-receipt-printer/public/thumbnail.png create mode 100644 capabilities/demo-receipt-printer/src/App.vue create mode 100644 capabilities/demo-receipt-printer/src/assets/cutos.png create mode 100644 capabilities/demo-receipt-printer/src/main.ts create mode 100644 capabilities/demo-receipt-printer/src/style.css create mode 100644 capabilities/demo-receipt-printer/src/utils/config.ts create mode 100644 capabilities/demo-receipt-printer/src/vite-env.d.ts create mode 100644 capabilities/demo-receipt-printer/tailwind.config.js create mode 100644 capabilities/demo-receipt-printer/tsconfig.json create mode 100644 capabilities/demo-receipt-printer/vite.config.ts create mode 100644 core-api/demo-core-api/.env.development create mode 100644 core-api/demo-core-api/.env.production create mode 100644 core-api/demo-core-api/.gitignore create mode 100644 core-api/demo-core-api/.prettierrc create mode 100644 core-api/demo-core-api/README.md create mode 100644 core-api/demo-core-api/index.html create mode 100644 core-api/demo-core-api/package.json create mode 100644 core-api/demo-core-api/postcss.config.js create mode 100644 core-api/demo-core-api/public/config.json create mode 100644 core-api/demo-core-api/public/thumbnail.png create mode 100644 core-api/demo-core-api/src/App.vue create mode 100644 core-api/demo-core-api/src/assets/cutos.png create mode 100644 core-api/demo-core-api/src/components/CutosTopbar.vue create mode 100644 core-api/demo-core-api/src/main.ts create mode 100644 core-api/demo-core-api/src/style.css create mode 100644 core-api/demo-core-api/src/utils/config.ts create mode 100644 core-api/demo-core-api/src/vite-env.d.ts create mode 100644 core-api/demo-core-api/tailwind.config.js create mode 100644 core-api/demo-core-api/tsconfig.json create mode 100644 core-api/demo-core-api/vite.config.ts diff --git a/capabilities/demo-id-card-reader/.env.development b/capabilities/demo-id-card-reader/.env.development new file mode 100644 index 0000000..b0b990f --- /dev/null +++ b/capabilities/demo-id-card-reader/.env.development @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=mock diff --git a/capabilities/demo-id-card-reader/.env.production b/capabilities/demo-id-card-reader/.env.production new file mode 100644 index 0000000..ef96a64 --- /dev/null +++ b/capabilities/demo-id-card-reader/.env.production @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=localhost diff --git a/capabilities/demo-id-card-reader/.gitignore b/capabilities/demo-id-card-reader/.gitignore new file mode 100644 index 0000000..2f98841 --- /dev/null +++ b/capabilities/demo-id-card-reader/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +dist-ssr +release +*.local +*.log +.DS_Store diff --git a/capabilities/demo-id-card-reader/.prettierrc b/capabilities/demo-id-card-reader/.prettierrc new file mode 100644 index 0000000..0aa4165 --- /dev/null +++ b/capabilities/demo-id-card-reader/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 200, + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "arrowParens": "always", + "trailingComma": "none", + "plugins": ["prettier-plugin-tailwindcss"] +} \ No newline at end of file diff --git a/capabilities/demo-id-card-reader/README.md b/capabilities/demo-id-card-reader/README.md new file mode 100644 index 0000000..96a8484 --- /dev/null +++ b/capabilities/demo-id-card-reader/README.md @@ -0,0 +1,15 @@ +# demo-id-card-reader + +CUTOS 4.0 end-to-end ID Card Reader LWA using `@cutos/device-id-card-reader` and `device-id-card-reader-provider-ghc825`. + +The LWA connects automatically and starts continuous reading. A successful card is displayed immediately, the reader enters a five-second `cooldown`, and then returns automatically to `reading`. Use Stop to enter `idle`. Portrait reading is optional; keep the card steadily on the reader for at least two seconds. + +Set `params.host` to `mock` in `public/config.json` for browser-only UI development. + +```sh +npm install +npm run dev +npx cutos lwa build +npx cutos lwa upload +npx cutos lwa publish demo-id-card-reader --device +``` diff --git a/capabilities/demo-id-card-reader/index.html b/capabilities/demo-id-card-reader/index.html new file mode 100644 index 0000000..9eceb23 --- /dev/null +++ b/capabilities/demo-id-card-reader/index.html @@ -0,0 +1,12 @@ + + + + + + CUTOS LWA + + +
+ + + \ No newline at end of file diff --git a/capabilities/demo-id-card-reader/package.json b/capabilities/demo-id-card-reader/package.json new file mode 100644 index 0000000..ec7a865 --- /dev/null +++ b/capabilities/demo-id-card-reader/package.json @@ -0,0 +1,32 @@ +{ + "name": "demo-id-card-reader", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "cutos lwa build", + "build:app": "vue-tsc --noEmit && vite build", + "package": "cutos lwa package", + "validate": "cutos lwa validate", + "preview": "vite preview" + }, + "dependencies": { + "@cutos/core": "^4.0.8", + "@cutos/device-id-card-reader": "^4.0.0", + "vue": "^3.4.31" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.5", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.40", + "postcss-import": "^16.1.0", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.7", + "typescript": "^5.5.4", + "unplugin-auto-import": "^0.18.0", + "vite": "^5.3.4", + "vue-tsc": "^2.0.26" + } +} diff --git a/capabilities/demo-id-card-reader/postcss.config.js b/capabilities/demo-id-card-reader/postcss.config.js new file mode 100644 index 0000000..1cf2729 --- /dev/null +++ b/capabilities/demo-id-card-reader/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + 'postcss-import': {}, + tailwindcss: {}, + autoprefixer: {} + } +} \ No newline at end of file diff --git a/capabilities/demo-id-card-reader/public/config.json b/capabilities/demo-id-card-reader/public/config.json new file mode 100644 index 0000000..c1fa3c8 --- /dev/null +++ b/capabilities/demo-id-card-reader/public/config.json @@ -0,0 +1,12 @@ +{ + "name": "demo-id-card-reader", + "version": "0.3.0", + "description": "CUTOS 4.0 ID Card Reader end-to-end demo", + "params": { + "title": "CUTOS ID Card Reader", + "host": "localhost" + }, + "drvDependencies": { + "device-id-card-reader-provider-ghc825": "0.2.1" + } +} diff --git a/capabilities/demo-id-card-reader/public/thumbnail.png b/capabilities/demo-id-card-reader/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a275c0019f6b35ff8a4c247e3818ed1d790e44f3 GIT binary patch literal 52432 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 +import { computed, onMounted, onUnmounted, ref } from 'vue' +import { CoreAPI } from '@cutos/core' +import { DeviceCapabilityIdCardReader, type IdCardReadEvent, type DeviceInfo } from '@cutos/device-id-card-reader' +import CutosTopbar from '@/components/CutosTopbar.vue' +import { loadConfig } from '@/utils/config' + +type EventKind = 'data' | 'status' | 'error' +interface EventItem { id: number; time: string; kind: EventKind; value: unknown } +interface ReaderClient { + init(): Promise; connect(): Promise<{ connected: boolean }>; disconnect(): Promise<{ connected: boolean }> + readDeviceInfo(): Promise; startRead(params?: { image?: boolean }): Promise<{ started: boolean }> + stopRead(): Promise<{ stopped: boolean }>; onData(listener: (data: IdCardReadEvent) => void): () => void + onStatus(listener: (value: unknown) => void): () => void; onError(listener: (value: unknown) => void): () => void + dispose(): boolean +} + +class MockReader implements ReaderClient { + private listeners = { data: new Set<(v: any) => void>(), status: new Set<(v: any) => void>(), error: new Set<(v: any) => void>() } + async init() { return true } + async connect() { this.emit('status', { status: 'online', updatedAt: Date.now() }); return { connected: true } } + async disconnect() { this.emit('status', { status: 'offline', updatedAt: Date.now() }); return { connected: false } } + async readDeviceInfo() { return { manufacturer: 'GHC', model: 'GHC825 Mock', version: '0.1.0', deviceType: 'id-card-reader', SAMID: 'MOCK-001' } } + async startRead(params: { image?: boolean } = {}) { + this.emit('status', { status: 'reading', updatedAt: Date.now() }) + window.setTimeout(() => this.emit('data', { type: 'read-card', values: { code: '440101199001011234', name: 'CUTOS 示例', sex: '男', birthday: '19900101', address: '深圳市南山区', nation: '汉', department: '深圳市公安局', startDate: '20200101', endDate: '20300101', certType: '居民身份证', ...(params.image ? { base64BMPData: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMzAiIGhlaWdodD0iMTY2Ij48cmVjdCB3aWR0aD0iMTMwIiBoZWlnaHQ9IjE2NiIgZmlsbD0iI2U4ZjdmNCIvPjx0ZXh0IHg9IjY1IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzEzOGI4MCIgZm9udC1zaXplPSIxMiI+TW9jayBwaG90bzwvdGV4dD48L3N2Zz4=' } : {}) } }), 500) + return { started: true } + } + async stopRead() { this.emit('status', { status: 'online', updatedAt: Date.now() }); return { stopped: true } } + onData(fn: (v: IdCardReadEvent) => void) { return this.listen('data', fn) } + onStatus(fn: (v: unknown) => void) { return this.listen('status', fn) } + onError(fn: (v: unknown) => void) { return this.listen('error', fn) } + dispose() { Object.values(this.listeners).forEach(v => v.clear()); return true } + private listen(kind: EventKind, fn: (v: any) => void) { this.listeners[kind].add(fn); return () => this.listeners[kind].delete(fn) } + private emit(kind: EventKind, value: unknown) { this.listeners[kind].forEach(fn => fn(value)) } +} + +const title = ref('ID Card Reader') +const lwaName = ref(''); const lwaVersion = ref(''); const coreVersion = ref(''); const host = ref('localhost') +const runtimeConnected = ref(false); const initialized = ref(false); const connected = ref(false); const reading = ref(false) +const readerState = ref<'idle' | 'reading' | 'cooldown'>('idle') +const busy = ref(''); const errorText = ref(''); const deviceInfo = ref(null) +const connectResult = ref(null) +const includeImage = ref(false) +const card = ref(null); const events = ref([]) +const statusEvents = computed(() => events.value.filter(e => e.kind === 'status')) +const errorEvents = computed(() => events.value.filter(e => e.kind === 'error')) +let device: ReaderClient | null = null; let unsubscribers: Array<() => void> = [] +let lastStatusAt = 0 + +function format(value: unknown) { return value == null ? 'No data' : typeof value === 'string' ? value : JSON.stringify(value, null, 2) } +function addEvent(kind: EventKind, value: unknown) { events.value.unshift({ id: Date.now() + Math.random(), time: new Date().toLocaleTimeString(), kind, value }); events.value = events.value.slice(0, 30) } +async function run(name: string, action: () => Promise) { busy.value = name; errorText.value = ''; try { await action() } catch (e) { errorText.value = e instanceof Error ? e.message : String(e); addEvent('error', errorText.value) } finally { busy.value = '' } } +async function connect() { await run('connect', async () => { connectResult.value = await device!.connect(); connected.value = Boolean(connectResult.value && typeof connectResult.value === 'object' && 'connected' in connectResult.value && connectResult.value.connected) }) } +async function disconnect() { await run('disconnect', async () => { await device!.disconnect(); connected.value = false; reading.value = false; readerState.value = 'idle' }) } +async function startRead() { await run('startRead', async () => { reading.value = Boolean((await device!.startRead({ image: includeImage.value })).started); if (reading.value) readerState.value = 'reading' }) } +async function stopRead() { await run('stopRead', async () => { await device!.stopRead(); reading.value = false; readerState.value = 'idle' }) } +function clearCard() { card.value = null } +function handleStatus(value: unknown) { + addEvent('status', value) + const payload = value && typeof value === 'object' ? value as { status?: unknown; updatedAt?: unknown } : {} + const updatedAt = typeof payload.updatedAt === 'number' ? payload.updatedAt : Date.now() + if (updatedAt < lastStatusAt) return + lastStatusAt = updatedAt + const status = typeof payload.status === 'string' ? payload.status : '' + if (status === 'online') { connected.value = true; reading.value = false; readerState.value = 'idle' } + if (status === 'offline') { connected.value = false; reading.value = false; readerState.value = 'idle' } + if (status === 'reading' || status === 'cooldown') { reading.value = true; readerState.value = status } +} + +onMounted(async () => { + try { + const config = await loadConfig(); title.value = String(config.params.title || title.value); lwaName.value = config.name; lwaVersion.value = config.version + host.value = import.meta.env.VITE_CUTOS_BROKER_URL || String(config.params.host || 'localhost') + await CoreAPI.init(host.value); runtimeConnected.value = CoreAPI.connected(); coreVersion.value = CoreAPI.getVersion() + device = host.value === 'mock' ? new MockReader() : new DeviceCapabilityIdCardReader(); await device.init() + unsubscribers = [ + device.onData(data => { card.value = data.values; addEvent('data', data) }), + device.onStatus(handleStatus), + device.onError(value => addEvent('error', value)) + ] + initialized.value = true; await connect(); if (connected.value) { deviceInfo.value = await device.readDeviceInfo(); await startRead() } + } catch (e) { errorText.value = e instanceof Error ? e.message : String(e) } +}) +onUnmounted(() => { unsubscribers.forEach(fn => fn()); device?.dispose() }) + + + diff --git a/capabilities/demo-id-card-reader/src/assets/cutos.png b/capabilities/demo-id-card-reader/src/assets/cutos.png new file mode 100644 index 0000000000000000000000000000000000000000..9f73429832a319c18f3557b88adc7567d2114347 GIT binary patch literal 7773 zcmd^Ei$Bx*|KCMcB+0FqOL8ZY!p!9eg(CO+eIdufEX;kYZ=o{B{Z54t=9ar=v@FAP zB$q7aGE45aax1@`I*;%7kN7f1cz6+-F~aXzOcN00bIzfqlc_XJBps0MsROA9x*M-yaJ$aY6$CC*J(?22z5` zZvg;e8>U7Ewix&2&yZma<4_Xn+*rH3cd;YFn0!UxvZDc?m8F?L9X}9$)JyI_l~J`4VF87 zZo`xmPX+&ZbczGd`3*?O-dFQw8fu7dxWxwkHEV7V4XE~0W^J=R!Q6Qm_ZAZu2KVA* zQ>rqI7Me&l*kn*Al{cY~EWBufl>j3}J;-Ped%j>VPd|neNr5D>@nEr60(TRn%JB`L zQm`*&`VpJdXSlRY%GvF0kW_0pr7q*}?uTd|W@nz}uw#tZJR+m;^(&e!%d-z^$@=Mj80fZ2=>-nUNg=E?QGT9C55~ zm{}DZll|_L`qQk#g2P>dvG|Ng-W!86f2!ss23+PJeS5}yM&!B?b?Ix{_9{ZKAvwj- zLnYaZ>a9ak$4$)xlP#-m5(CBWmk2^!p_m>c@mm3}^)&+L)|DUsrgw^*;X-nCM1zh6 z2pwDEe?fd!jx7Him)NJ)_9)3?{m9Joh#RT)Cxaar@Lf~2vz@9EilVH#^SS?0JI{y& zT*X0v`hx|z*<)If6dj@h;3siut*E~IYJ;12UWuSp*!^q%IjuV!wZ`Hsshk#jb(C9v zsWgG)OWF_dlU4CeQq81j+mj4scQlss$rqdA=hVz{TQ_ir4-Sm7apen`cAZIMHB`0l zOq&+>P1n8?KkDurEc9hz7ny3wrWGS=FX`(!m=N)rk{r;_XTulrE9EOg4s}+HFZ@em z?m8=;Pm&$9ue0BxMJypsE*jwY(eZxs6%q7QU)d4A4C`~146M%2Xa8#VK!!l#Yh6F{ zILVNgHtLyU<~GtQSG~AYL{asZ#lovd$4#0%h$jp${wu)L6<5Z3=s+&sXmk`}WVE8y zg@VQc3u{!@`h_=PKyeSk*Ksrrhj?lwBu5Eyv1W>_#U|- z%;~uz{#uV28i;Isn&wYD(IJX)uMj-Vy15EEn9VJM1Eavn9PXAhE{VOngz_%Tk7&1t zp1*^LlWk&XL}0Mw6!<3(1{HxPZ{Bk7jNf?DdT00hYi}U|4BwhN!v*&Kk8jjbUn^|o z3ESfBKBjb~Ay&6o+Rk68Fg(s~qG|Y168HqcE>0}wir2Q4EQFw__Bs+x)H|a90tdZv>6OIG7f5A_GqrA*q}Hm=qsOBo&=L|@R%y+Y zBsvWKVH`e4o8J7&438A-bQ;z+B1)yh}Q$t^(d<@ zIkvD47RR?AtzxG9*1qz4Tdg}y`4eZ%cEe&llO-P2aR%hkEsB0Q&Ej zzUd(cy;fQ7%LfI+m{t!7#&#<>V`dj~yW{I%UA#bi4?vDdyL5W%jHFdypESvLSHplHqTsxF%lQA2>ru>%!N z_p_-ZQOuUdrzoLWK7KJ6bG)iQh$>s5M}GLQv_@3XuR#B7IH6cKBNT`z%+c!{<+g2`t72Wlnq%4IZQiml~q`jg^zf3&9IT_dx^KZZ)!(>v}wCAf1nu(q2Bo4g3jTAeo8m<@3?J@@g$!>S-PmL>3mpeYa=g~_}0iAfNh15(U?( zL`lCSRf-LJ>?l=hjE9FM9W#nfaMz|Fe>WB>GZ~x~q3P`=nyvsWOoP}e_~u1bpZnZW zGo1|$x*<~YT@$TidT!`VTZ11n+s2AIaJSI~KiW-h%uQT0GQ#cY{AH#uK4Z5lWqjDD z<-C+X+XVPV<+0V0p@{N(w$rD%>ei9(FWySkR^%RcajzhMsx+;Jxm4yieXy%h|Km5P zQi`ZKoNc5f9%fv}E6H0mv=NI9f>RIEe45`u%JBJiy_luNet}#7LOMlx?*M@9YdAZ8a-Ej>{ z+9gm5W?s(ffyoXb6JcTAu|WmHlW9w6!{5#7SVCIDhNPmdA|=0GT%%$;Z0T;r)_W;4 zdG`yHjFK*Z$Ge-)x#Z?BHnyh{uiZUZSZ*=>?GZo+ocDRRYVk@49_C{OZhQ764uimt zgLVu8pAKz?+%Og42!3$D@p3MQru(ZSXooO8(>$04wp!Yh{QK5=wUv&|Gvr37->)h#hjp0)+I~`_4z%nT&CEF{xako1eyo2oF0P)Sx{-)1oy1jM!;mA=lGKWE1n_UjwE``<{3C^ScannMnF+eqKBE3Wrb^DLlZrcrmVfEi4 zggyd7SW0gCl>D?FT}~_E=20I35~?*t-1x^h0_%q3W;V(A-xulhiqoXn!2hKQ5JR(+ zjGi}G;bC%CU^s8v&~`|_5GgZBP?A@IHa+()w$FRbtOZb>U$?Lgi7=ImbR0QApO(vT|ud}@(-)l`XqLXf)HNc@@!#MBrvt($`Q zckA;GZ!Z688hA&9b(05P z^BReJlccoed@7(iwL?!=vqie|yeP#xV!{XQAya*nac+0P(yQ!$RI}>7qtGC{NR~~9 zDrHf$HazDC^l|x%liL)DqpphI9fqD<7V0GW{}+g={O7|T%>-(KboN5e#&MG_Kd+|m z96b=nz=L_OBTbc_s-cz}k3XjQ{)#rTNRgT*m2JtGE^kM71#HriI)u}mVce%DrX(b} z)o_F*5a)kh&&Bod-)ZV!AEx~Zx&+`qHPbQC?}oy=sgK=lQR91*?>Kxh+K=Z>21Q zv7raGuBOVCcQ`LlXWb#c$C-chQ>u&VSPz*2jvoc>rCT@F_rhq34R_R<(tpA#iZD!IO##AYJ=NP*Y48h6l zS#z;qFyjK_mCo1^EyeHGh7!_;WZZP6{+o83&>XnObizNnA=t3#C{gnGJ<*K6Npc$` z$X&;k_>vUBiNSE>1J?gQ_Fnd6=gs(lEa4`ymI|&}dj}07U@HL-P}$t$_YIDlUmu?L ze==j|N<=7i!2c&|i7m=2wR1wGG&t^hPPrSp-wxnftt_|WOqA5!_0oBaZcoiresqD= z-q`Jc)@f8nRcrLl`93%`n#W$j5@xkEX=*HvF-3N1;9=8(mjE5F`_sQIyrXB9$S6%Y zx9=I||CNe(ne=O7;RCA_!aWu^Ve|Qy#P!zX824cFFF{R7QRh5LI8iY*DHAELj8MMn z!S+NKCAu=jHcyZ}KZDCEZO|PGjv3_3mkQs1Ut^a^vt#81V(M&lTm6<)CaF=m)3MLV z!5@hooP#%ZzX{Q4RPc~((`EyA&(3US#HmzGGm{+YfY+2uiYIlPrFj-zC~8b-?}^Q-#(I#@AUwFn5QffJR!;Y?2$)Hw9ufy#o#6vR6jw%JV+$ z9%Qvi9~&!Kch{Gs40`|^K(u$l)%T<3$5J!p#bb9>s!v|qzLSoy5M1llA#phjuD3mM z_zA;27zpX81AptiU%vM3H@D9!yibSRLi%9<@ob3m!d2LO#1Yq$s`ING4R-7}CN<&? zdxZ%@m1tMf>m087Q>7V!1qchfH_e+8Ovm#g*E`r@pX4^1lBL?a{=)O^snH~y`lh5} ze|@3S+O*DlE;ax6yUSd`)zI2*f7oO;@OvM)e5(;^GjuBB?UH_P_@57)phoW1if_l{g0Kx-6rGqfD zpifjkdKtTWlUEm{V1yDG5PpEoRDM`zH&r=__27HkCd}QO$*HKLM-grBNeli)W$Sr_ ze>8@zrC2_~;>_AB9g#yUxn@22m73Jc>6&T5@fcZuuatcfIFj9bo@f zcwWuz84-_Dvl(%Zi$mxN{;r+kGXnLrj~pXky_$clz~-}otG(dz3%!YF{710YFA**u z=cS@3$6KV=rXo%X>ZK#T9nn(Jw4WBW**V2m+8#nt+HO+_OtDu(@vN6B^1iq)#%2o$ z%!3Sdv1eR|bzfOX&DJy&-H%P%1SoEWk)D)@1666^0i{~vL7UL|;p%LCTR1&69)7YIDfK2rt9}xE*3Htzz>c{p0rv|_k0-|jyDTr`8d{*Fi zx`?*Ky;>7pB-847s!!&nyjme1%Dy%e8KzlbuKF& zM6KWJlB-r@+Ea~U9U*h3AB0GQA!SO-S+n1GcJ2ng8oHeo2%xZN_PJYK!b*iLJyijV zYWdUIb;8}M>M=o7u~o^Dj_(>1Z5G4#2Y5o?_xaYHHNIB>cbl$+6_)TR_`#d||5Lr$ zp(a~HV&V?_3#tV~r8$e1f#LZ* zTW3cc0@EhG@CR4YZ(plBV0puS)&n$`7a|&*@aO&i6RG7AU5)X1Jtf6YY{c$oJ%Uuv z7~XnTQyw)&enrd5Y~_~NDHHc~ezTzFk~MoXDRFTeTQ=WyIbnbEOkeKq%-VM&e%NoXjdYPSi-mH1vVF|;S6^g{xo{An7<(@Cc--q z!55hu%2SuQ{FiYd#^%&&I1_&<`v4hm0j2A*G{R}o3r24J*f8F`()#+W5xn$uX72k% z{<1SFw>Hnz+5~nOL>naWud5VJoN*p@S>DZwYo0q5R5*-KSRsa||FvIktt9xKnB_{trOVA$yn2-WaQm~ih7sbAtB?UcU; zJ-ozQ57AdvuO02X^X*wx(UT$fzb&Su=C62IfhGD2ZVPmNCER1V#m!V(qPWXYux(kW}3#&(g@p3qcL-p)ymp=Fu>$H%n56#@vyR^|SMF>3lc*gx&-^zTBOhN?Y^7| z8~(l%+OI!}vDY#*=TZ@*12hxS@YmjZQR_^jX!Y=5WAdt3S+u#dxow1-Sk0Yz6>9lX zE=6C6RKV%_SVOiBHlrAEfcBh;TroS=Znq=KyWY`yjmX(&`x1Bj_3?lw-v&po3>{A| zHkr*^fWEaDb7B7#Yd$VLbgiJf?h$CE;fC}5#Knie=Ec_Bp3}zL*wUJ39!1udy%HWB zLxh?TIa7U0kRxZjA%_=ZM8*`8L#wdMQ99Ge8_%l-JWJbpNaXE~#C<-k^B&logaNPX z)%NvgndGjTdHmpw{-r6^WVfN?Z=Z|-wym?6t&bHQC(Aaveva#8AB*A(?$V*Ps-bjO z%_rdIY2?_klLx0m$_lXsytlI#;_h|Gnn^WN^BG3vg~sxx!uW8N*xx^dgkxIdCy zp~4OSdG|J{Nw*M2l(#zEK7y`-1_$17ZC7CC&OrBeo~z6FrE52)sVv%`h>Ex_PA8Mq zH#8!UsrI(xNqhBtLC{C!y;71;>nhsP_v#94tyeE5q1bckWSnZm@k$c8(L8#ZL)_`a zsnZQ(w@yPM`v2VJuH{+7hurSBC5u1Q`om|)LtL7NV@v>}ytaL?<(OJ7w058+touC_ zZw3;jD2eOW^JeYnlItJ#BJYXbOAOG*CgEOFo%ibw3Mg6i-$CI?rM9huXpn0=eGpNt zx0V;8{YhR)(?sN1>K~t>811!;1KTr>{d+x-cPln@%*U*;R#!YViTC?6+P0qNy0a#p z_T-ei@Vg%_#dp+`)!~wTm5Q-IIGVmPlqbs-0)GE|$ z2MQ0yWRxhDp6b$L0>3LT!gnh^NS^v=gA?v~SP854SmqA?`y&57lwrs`J5`pw{b;l} z2z-LG>Dx#8l%m8|*2>Oo{5mHf>&VIpof>4qqnu{Fx3Z->Qak+{RqNsPS920yO9T%C z26r317e<9~qnYO2n)zmpoTmJC8ZNHY(Jsl2o^@VdGe~tloU_slG?S&SHo=kac&d18 z7=5z#T7>7F{Mmpv)U3n_@IEL$Q&kZ41JR^S2#;Q?*%vcf?o9@)f+k(v`FoIo2PeEo znf=(;HQ8W$rW_4M0kM+*@i6&(@n zinZW100ULZ;Z=p!f2QL%BUiY-7z}eX)TD5zgIdKiNmZ08?WNBf=HWd;bR-X86?r literal 0 HcmV?d00001 diff --git a/capabilities/demo-id-card-reader/src/components/CutosTopbar.vue b/capabilities/demo-id-card-reader/src/components/CutosTopbar.vue new file mode 100644 index 0000000..eac03d7 --- /dev/null +++ b/capabilities/demo-id-card-reader/src/components/CutosTopbar.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/capabilities/demo-id-card-reader/src/components/HelloCutos.vue b/capabilities/demo-id-card-reader/src/components/HelloCutos.vue new file mode 100644 index 0000000..b3d6a11 --- /dev/null +++ b/capabilities/demo-id-card-reader/src/components/HelloCutos.vue @@ -0,0 +1,18 @@ + + + diff --git a/capabilities/demo-id-card-reader/src/main.ts b/capabilities/demo-id-card-reader/src/main.ts new file mode 100644 index 0000000..5a6e246 --- /dev/null +++ b/capabilities/demo-id-card-reader/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') \ No newline at end of file diff --git a/capabilities/demo-id-card-reader/src/style.css b/capabilities/demo-id-card-reader/src/style.css new file mode 100644 index 0000000..00adc08 --- /dev/null +++ b/capabilities/demo-id-card-reader/src/style.css @@ -0,0 +1,22 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +:root { font-family: Inter,"Segoe UI",Arial,sans-serif; color:#20262c; background:#eef1f3; font-synthesis:none; } +* { box-sizing:border-box; } body { margin:0; min-width:320px; min-height:100vh; } button { font:inherit; cursor:pointer; } button:disabled { cursor:not-allowed; opacity:.48; } +.app-shell { min-height:100vh; background:#eef1f3; } +.dependency-tags,.button-row { display:flex; align-items:center; gap:9px; flex-wrap:wrap; } +main { width:100%; padding:28px clamp(18px,2vw,36px) 32px; } .error-banner { display:flex; gap:12px; margin-bottom:20px; padding:12px 16px; color:#7e2420; background:#fff0ef; border-left:4px solid #d54d47; } +.section-heading { display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:15px; } .section-heading h2 { margin:3px 0 0; font-size:18px; } .eyebrow { color:#64717a; font:11px "Cascadia Code",Consolas,monospace; } +.dependency-tags { justify-content:flex-end; } .provider-tag { padding:6px 9px; color:#5d6870; background:#f8fafb; border:1px solid #cbd3d8; border-radius:4px; font:11px "Cascadia Code",Consolas,monospace; } .provider-tag strong { color:#253038; } +.result-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; } .result-card { min-width:0; min-height:220px; background:#fff; border:1px solid #d8dee2; border-radius:6px; overflow:hidden; } +.result-header { min-height:66px; padding:13px 15px; border-bottom:1px solid #e4e8eb; background:#f8fafb; } .result-header h3 { margin:0 0 6px; font-size:14px; } .result-header code { display:block; color:#68757d; font-size:11px; overflow-wrap:anywhere; } +.method-header { display:flex; align-items:center; justify-content:space-between; gap:14px; } .state-tag { padding:5px 8px; color:#8b3c37; background:#fff0ef; border-radius:3px; font:10px "Cascadia Code",Consolas,monospace; } .state-tag.online { color:#087b71; background:#e8f7f4; } +.card-body { padding:15px; } .button { min-height:34px; padding:7px 13px; border:1px solid transparent; border-radius:4px; font-weight:650; font-size:12px; } .button.primary { color:#fff; background:#138b80; border-color:#138b80; } .button.secondary { color:#2d373d; background:#fff; border-color:#bfc8cd; } .hint,.empty-state { margin:15px 0 0; color:#77838b; font-size:12px; } +.text-button { padding:5px 0; border:0; color:#138b80; background:transparent; font-size:12px; } +.image-switch { min-height:34px; display:inline-flex; align-items:center; gap:7px; margin-left:auto; color:#46535b; font-size:12px; cursor:pointer; } .image-switch input { width:15px; height:15px; margin:0; accent-color:#138b80; } .image-switch:has(input:disabled) { cursor:not-allowed; opacity:.48; } +pre { margin:0; padding:15px; font:12px/1.55 "Cascadia Code",Consolas,monospace; white-space:pre-wrap; overflow-wrap:anywhere; overflow:auto; } .result-card>pre { max-height:260px; } +.identity-card { min-height:330px; } .identity { display:grid; grid-template-columns:130px minmax(0,1fr); gap:20px; padding:16px; } .portrait { width:130px; height:166px; display:grid; place-items:center; color:#87939a; background:#f2f5f6; border:1px solid #dce2e5; } .portrait img { width:100%; height:100%; object-fit:cover; } +dl { display:grid; grid-template-columns:90px minmax(0,1fr); gap:0; margin:0; font-size:12px; } dt,dd { margin:0; padding:7px 8px; border-bottom:1px solid #edf0f2; } dt { color:#68757d; } dd { font-family:"Cascadia Code",Consolas,monospace; overflow-wrap:anywhere; } +.event-card { min-height:330px; display:grid; grid-template-rows:auto minmax(0,1fr); } .event-list { min-height:0; max-height:300px; overflow:auto; } .event-row { display:grid; grid-template-columns:78px minmax(0,1fr); gap:10px; padding:8px 13px; border-bottom:1px solid #edf0f2; } .event-row time { padding-top:4px; color:#77838b; font-size:11px; } .event-row pre { padding:4px 0; } .error-event pre { color:#b43b35; } .event-list .empty-state,.identity-card>.empty-state { padding:10px 15px; } +@media(max-width:980px){.result-grid{grid-template-columns:repeat(2,minmax(0,1fr));}} +@media(max-width:640px){.section-heading{align-items:flex-start;flex-direction:column}.result-grid{grid-template-columns:1fr}.identity-card{grid-column:auto}.identity{grid-template-columns:1fr}.portrait{width:110px;height:140px}} diff --git a/capabilities/demo-id-card-reader/src/utils/config.ts b/capabilities/demo-id-card-reader/src/utils/config.ts new file mode 100644 index 0000000..1a87084 --- /dev/null +++ b/capabilities/demo-id-card-reader/src/utils/config.ts @@ -0,0 +1,66 @@ +export interface LwaConfig { + name: string + version: string + description?: string + params: { + title: string + host: string + [key: string]: unknown + } + drvDependencies?: Record +} + +const defaultConfig: LwaConfig = { + name: 'cutos-lwa', + version: '0.0.0', + params: { + title: 'CUTOS LWA', + host: 'localhost' + } +} + +export let config: LwaConfig = { ...defaultConfig, params: { ...defaultConfig.params } } + +function parse(str?: string) { + if (!str || !str.length) return {} + + return str.split('&').reduce>((acc, row) => { + const [key, value] = row.split('=').map(decodeURIComponent) + acc[key] = value + return acc + }, {}) +} + +function mergeQueryParams(config: LwaConfig) { + if (typeof window === 'undefined') { + return config + } + + const query = location.href.split('?')[1] + const { params } = parse(query) as { params?: string } + + try { + if (params) config.params = { ...config.params, ...JSON.parse(params) } + } catch (error) { + console.error(error) + } + + return config +} + +export async function loadConfig(): Promise { + try { + const configUrl = + typeof window === 'undefined' ? 'config.json' : new URL('config.json', window.location.href).toString() + const response = await fetch(configUrl, { cache: 'no-cache' }) + if (!response.ok) { + throw new Error(`Failed to load config.json: ${response.status}`) + } + config = mergeQueryParams((await response.json()) as LwaConfig) + return config + } catch (error) { + console.error(error) + config = mergeQueryParams({ ...defaultConfig, params: { ...defaultConfig.params } }) + return config + } +} diff --git a/capabilities/demo-id-card-reader/src/vite-env.d.ts b/capabilities/demo-id-card-reader/src/vite-env.d.ts new file mode 100644 index 0000000..67f932b --- /dev/null +++ b/capabilities/demo-id-card-reader/src/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly VITE_CUTOS_BROKER_URL?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/capabilities/demo-id-card-reader/tailwind.config.js b/capabilities/demo-id-card-reader/tailwind.config.js new file mode 100644 index 0000000..0688d92 --- /dev/null +++ b/capabilities/demo-id-card-reader/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {} + }, + plugins: [] +} \ No newline at end of file diff --git a/capabilities/demo-id-card-reader/tsconfig.json b/capabilities/demo-id-card-reader/tsconfig.json new file mode 100644 index 0000000..f279f3d --- /dev/null +++ b/capabilities/demo-id-card-reader/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "jsx": "preserve", + "types": ["vite/client"] + }, + "include": ["src/**/*.ts", "src/**/*.vue"] +} diff --git a/capabilities/demo-id-card-reader/vite.config.ts b/capabilities/demo-id-card-reader/vite.config.ts new file mode 100644 index 0000000..2f1e90e --- /dev/null +++ b/capabilities/demo-id-card-reader/vite.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' + +export default defineConfig({ + base: './', + publicDir: 'public', + build: { + target: ['chrome74'] + }, + server: { + proxy: { + // '/proxy': 'http://192.168.1.30' + } + }, + resolve: { + dedupe: ['@cutos/core'], + alias: { + '@': '/src' + } + }, + define: {}, + plugins: [ + vue(), + AutoImport({ + include: [ + /\.[tj]sx?$/, + /\.vue$/, + /\.vue\?vue/, + /\.md$/ + ], + imports: ['vue'], + vueTemplate: true, + cache: true, + dts: false + }) + ], + optimizeDeps: { + esbuildOptions: { + define: { + global: 'globalThis' + }, + target: 'es2015', + supported: { + bigint: true + } + } + } +}) diff --git a/capabilities/demo-receipt-printer/.env.development b/capabilities/demo-receipt-printer/.env.development new file mode 100644 index 0000000..b0b990f --- /dev/null +++ b/capabilities/demo-receipt-printer/.env.development @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=mock diff --git a/capabilities/demo-receipt-printer/.env.production b/capabilities/demo-receipt-printer/.env.production new file mode 100644 index 0000000..ef96a64 --- /dev/null +++ b/capabilities/demo-receipt-printer/.env.production @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=localhost diff --git a/capabilities/demo-receipt-printer/.gitignore b/capabilities/demo-receipt-printer/.gitignore new file mode 100644 index 0000000..2f98841 --- /dev/null +++ b/capabilities/demo-receipt-printer/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +dist-ssr +release +*.local +*.log +.DS_Store diff --git a/capabilities/demo-receipt-printer/.prettierrc b/capabilities/demo-receipt-printer/.prettierrc new file mode 100644 index 0000000..0aa4165 --- /dev/null +++ b/capabilities/demo-receipt-printer/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 200, + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "arrowParens": "always", + "trailingComma": "none", + "plugins": ["prettier-plugin-tailwindcss"] +} \ No newline at end of file diff --git a/capabilities/demo-receipt-printer/README.md b/capabilities/demo-receipt-printer/README.md new file mode 100644 index 0000000..19ba296 --- /dev/null +++ b/capabilities/demo-receipt-printer/README.md @@ -0,0 +1,14 @@ +# CUTOS Receipt Printer Demo + +End-to-end LWA for `@cutos/device-receipt-printer` and the MS-MA90 Provider. + +The Demo covers USB/serial connection, device information, styled text, QR code, paper feed, cutting, status, and Device events. Text and QR printing explicitly call `feed({ dots: 240 })` after printing so the result advances to the paper outlet. The standalone Feed action also defaults to 240 dots. Development uses CUTOS Mock through `.env.development`; deployed builds use CUTOS Runtime and the declared Provider dependency. + +The card grid is responsive: portrait displays use two columns, landscape displays use four columns, and narrow displays use one column. + +```sh +npm install +npx cutos lwa build +npx cutos lwa upload +npx cutos lwa publish --device +``` diff --git a/capabilities/demo-receipt-printer/index.html b/capabilities/demo-receipt-printer/index.html new file mode 100644 index 0000000..9eceb23 --- /dev/null +++ b/capabilities/demo-receipt-printer/index.html @@ -0,0 +1,12 @@ + + + + + + CUTOS LWA + + +
+ + + \ No newline at end of file diff --git a/capabilities/demo-receipt-printer/package-lock.json b/capabilities/demo-receipt-printer/package-lock.json new file mode 100644 index 0000000..11c9e7c --- /dev/null +++ b/capabilities/demo-receipt-printer/package-lock.json @@ -0,0 +1,3470 @@ +{ + "name": "demo-receipt-printer", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "demo-receipt-printer", + "version": "0.0.0", + "dependencies": { + "@cutos/core": "^4.0.8", + "@cutos/device-receipt-printer": "^4.0.0", + "vue": "^3.4.31" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.5", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.40", + "postcss-import": "^16.1.0", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.7", + "typescript": "^5.5.4", + "unplugin-auto-import": "^0.18.0", + "vite": "^5.3.4", + "vue-tsc": "^2.0.26" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cutos/core": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cutos/core/-/core-4.0.8.tgz", + "integrity": "sha512-TEJrVM8JhLX+vGtRQS4HUBS9FpiHOZ0K08/4B3wglRX/d/d+a7XOkwcVSWLkgm4giWnG4O/Xd/hvKG/T4az2gg==", + "dependencies": { + "mqtt": "^5.3.6" + } + }, + "node_modules/@cutos/device-receipt-printer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cutos/device-receipt-printer/-/device-receipt-printer-4.0.0.tgz", + "integrity": "sha512-rgY+/m1wcXSNB0Qc5JYlMIXlChE3GqPan9U+QOiIij60jJUWqPBEOyg34+zEggWJKTwKemXJ7/Zwf7dugHBQ2A==", + "license": "SipTimes", + "peerDependencies": { + "@cutos/core": "^4.0.8" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.24.tgz", + "integrity": "sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz", + "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.40", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz", + "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz", + "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.40", + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-ssr": "3.5.40", + "@vue/shared": "3.5.40", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz", + "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz", + "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz", + "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz", + "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/runtime-core": "3.5.40", + "@vue/shared": "3.5.40", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz", + "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz", + "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==", + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.44", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.44.tgz", + "integrity": "sha512-T3ghW+sl/ZJ8w1v/yQx3qvJ9040DWoLBz8JT/CILbAKcFyG9b2MRe75v6W5uXjv6uH1lumK2Kv46y2zSkcej0Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/broker-factory": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.15.tgz", + "integrity": "sha512-ko+aWvgNuP49meGrdjUu7rC+Y+Wai3cCPxP3xWwHsHfehFjOh5ZQM2yC4gEB2UddeZ/YXhm0K1eG/L6fxym2Og==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "fast-unique-numbers": "^9.0.27", + "tslib": "^2.8.1", + "worker-factory": "^7.0.50" + } + }, + "node_modules/browserslist": { + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.394.tgz", + "integrity": "sha512-Wmt2Gm0o8JWBuGgmc4XZ0u9s1RaCRqhxP47phplmfg04+qypTUurpeJGP45A7Fhv7jdrrVH44PLlR9qXo37cVQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exsolve": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", + "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-unique-numbers": { + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz", + "integrity": "sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mqtt": { + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.2.tgz", + "integrity": "sha512-VWZU2CSUY3U3oN0PSBRDE5SNsFi4zqqNeQ/uv3pZWqY3CrBXD/dhd0ZLjlsk5YnebGlrapi4lRVNJPUNQ5aZ3w==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.4.1", + "help-me": "^5.0.0", + "lru-cache": "^10.4.3", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.2", + "number-allocator": "^1.0.14", + "readable-stream": "^4.7.0", + "rfdc": "^1.4.1", + "socks": "^2.8.6", + "split2": "^4.2.0", + "worker-timers": "^8.0.23", + "ws": "^8.18.3" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", + "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.20.tgz", + "integrity": "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.1.tgz", + "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "license": "MIT" + }, + "node_modules/unimport": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", + "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.4", + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.1", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.1", + "unplugin": "^1.16.1" + } + }, + "node_modules/unimport/node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.18.6.tgz", + "integrity": "sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.1", + "magic-string": "^0.30.14", + "minimatch": "^9.0.5", + "unimport": "^3.13.4", + "unplugin": "^1.16.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz", + "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-sfc": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/server-renderer": "3.5.40", + "@vue/shared": "3.5.40" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/worker-factory": { + "version": "7.0.50", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.50.tgz", + "integrity": "sha512-hhwc0G+sFwM4qBuhJIUBn2p1Jf8v/FwmLUANBf/Q+Lt2uI8mfIZQhXaZQACodQD4R7Zp6cn/6702bIvNn2puJQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "fast-unique-numbers": "^9.0.27", + "tslib": "^2.8.1" + } + }, + "node_modules/worker-timers": { + "version": "8.0.33", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.33.tgz", + "integrity": "sha512-RQVlKkek80v8M6SHvdMKiywaXFmX3XTpYTXTw0r62PdXB06t74XNxcTuG8wsQwnjorAQymNQyyQ0rzv7PykEMQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.18", + "worker-timers-worker": "^9.0.15" + } + }, + "node_modules/worker-timers-broker": { + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.18.tgz", + "integrity": "sha512-FrjzDVX1wKfZN0gRbCFqv8VHuTncG4sbI/WGEg4tSSQeIsnwqg4YBYWMAHYLJtUDEYYmiK65UKFrVMVk2irDSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "broker-factory": "^3.1.15", + "fast-unique-numbers": "^9.0.27", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.15" + } + }, + "node_modules/worker-timers-worker": { + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.15.tgz", + "integrity": "sha512-KKUe7lZ/Aignr51H6hOUik8LwTnIgojH/1lwhli8A8qIEIyewogZTpNpMW5B6BF7nmwBOkUoTYgf1H3QShcjSA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "tslib": "^2.8.1", + "worker-factory": "^7.0.50" + } + }, + "node_modules/ws": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/capabilities/demo-receipt-printer/package.json b/capabilities/demo-receipt-printer/package.json new file mode 100644 index 0000000..2992ab4 --- /dev/null +++ b/capabilities/demo-receipt-printer/package.json @@ -0,0 +1,32 @@ +{ + "name": "demo-receipt-printer", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "cutos lwa build", + "build:app": "vue-tsc --noEmit && vite build", + "package": "cutos lwa package", + "validate": "cutos lwa validate", + "preview": "vite preview" + }, + "dependencies": { + "@cutos/core": "^4.0.8", + "@cutos/device-receipt-printer": "^4.0.0", + "vue": "^3.4.31" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.5", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.40", + "postcss-import": "^16.1.0", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.7", + "typescript": "^5.5.4", + "unplugin-auto-import": "^0.18.0", + "vite": "^5.3.4", + "vue-tsc": "^2.0.26" + } +} diff --git a/capabilities/demo-receipt-printer/postcss.config.js b/capabilities/demo-receipt-printer/postcss.config.js new file mode 100644 index 0000000..1cf2729 --- /dev/null +++ b/capabilities/demo-receipt-printer/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + 'postcss-import': {}, + tailwindcss: {}, + autoprefixer: {} + } +} \ No newline at end of file diff --git a/capabilities/demo-receipt-printer/public/config.json b/capabilities/demo-receipt-printer/public/config.json new file mode 100644 index 0000000..2541443 --- /dev/null +++ b/capabilities/demo-receipt-printer/public/config.json @@ -0,0 +1,12 @@ +{ + "name": "demo-receipt-printer", + "version": "0.1.3", + "description": "CUTOS 4.0 Receipt Printer end-to-end demo", + "params": { + "title": "CUTOS Receipt Printer", + "host": "localhost" + }, + "drvDependencies": { + "device-receipt-printer-provider-ms-ma90": "0.1.0" + } +} diff --git a/capabilities/demo-receipt-printer/public/thumbnail.png b/capabilities/demo-receipt-printer/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..83da7faf15c31176125f9a56c4dba8e8c21e5a2b GIT binary patch literal 24064 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 literal 0 HcmV?d00001 diff --git a/capabilities/demo-receipt-printer/src/App.vue b/capabilities/demo-receipt-printer/src/App.vue new file mode 100644 index 0000000..dd0bdef --- /dev/null +++ b/capabilities/demo-receipt-printer/src/App.vue @@ -0,0 +1,140 @@ + + + diff --git a/capabilities/demo-receipt-printer/src/assets/cutos.png b/capabilities/demo-receipt-printer/src/assets/cutos.png new file mode 100644 index 0000000000000000000000000000000000000000..43a51dd3090c1f2127e21a9bf9a8bd20574ea43a GIT binary patch literal 9405 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:210px}.card-body>pre{height:110px;margin-top:12px;padding:10px;background:#f7f9fa;border:1px solid #e0e5e8}.form{display:grid;gap:12px}.form label{display:grid;gap:6px;color:#5d6870;font-size:12px}.form input,.form select,.form textarea{width:100%;min-height:36px;padding:7px 9px;border:1px solid #bfc8cd;border-radius:4px;background:#fff}.form textarea{resize:vertical}.form .check{display:flex;align-items:center;grid-template-columns:auto 1fr}.form .check input{width:auto;min-height:auto}.inline-fields{display:grid;grid-template-columns:2fr 1fr 1fr;gap:8px}.last-result{display:grid;grid-template-columns:auto minmax(0,1fr);gap:15px;align-items:start;margin-top:12px;padding:12px 15px;background:#fff;border:1px solid #d8dee2;border-radius:6px}.last-result strong{padding-top:4px;font-size:12px}.last-result pre{padding:4px 0} +.event-card{height:360px;display:grid;grid-template-rows:auto minmax(0,1fr)}.event-list{min-height:0;overflow:auto}.event-row{display:grid;grid-template-columns:78px minmax(0,1fr);gap:10px;padding:8px 13px;border-bottom:1px solid #edf0f2}.event-row time{padding-top:4px;color:#77838b;font-size:11px}.event-row pre{padding:4px 0}.error-event pre{color:#b43b35}.empty-state{margin:0;padding:24px 15px;color:#77838b;font-size:12px} +@media(orientation:landscape) and (min-width:1000px){.result-grid{grid-template-columns:repeat(4,minmax(0,1fr))}} +@media(max-width:640px){.topbar,.section-heading{align-items:flex-start;flex-direction:column}.result-grid{grid-template-columns:1fr}.inline-fields{grid-template-columns:1fr}.last-result{grid-template-columns:1fr}} +.file-name{color:#77838b;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} diff --git a/capabilities/demo-receipt-printer/src/utils/config.ts b/capabilities/demo-receipt-printer/src/utils/config.ts new file mode 100644 index 0000000..1a87084 --- /dev/null +++ b/capabilities/demo-receipt-printer/src/utils/config.ts @@ -0,0 +1,66 @@ +export interface LwaConfig { + name: string + version: string + description?: string + params: { + title: string + host: string + [key: string]: unknown + } + drvDependencies?: Record +} + +const defaultConfig: LwaConfig = { + name: 'cutos-lwa', + version: '0.0.0', + params: { + title: 'CUTOS LWA', + host: 'localhost' + } +} + +export let config: LwaConfig = { ...defaultConfig, params: { ...defaultConfig.params } } + +function parse(str?: string) { + if (!str || !str.length) return {} + + return str.split('&').reduce>((acc, row) => { + const [key, value] = row.split('=').map(decodeURIComponent) + acc[key] = value + return acc + }, {}) +} + +function mergeQueryParams(config: LwaConfig) { + if (typeof window === 'undefined') { + return config + } + + const query = location.href.split('?')[1] + const { params } = parse(query) as { params?: string } + + try { + if (params) config.params = { ...config.params, ...JSON.parse(params) } + } catch (error) { + console.error(error) + } + + return config +} + +export async function loadConfig(): Promise { + try { + const configUrl = + typeof window === 'undefined' ? 'config.json' : new URL('config.json', window.location.href).toString() + const response = await fetch(configUrl, { cache: 'no-cache' }) + if (!response.ok) { + throw new Error(`Failed to load config.json: ${response.status}`) + } + config = mergeQueryParams((await response.json()) as LwaConfig) + return config + } catch (error) { + console.error(error) + config = mergeQueryParams({ ...defaultConfig, params: { ...defaultConfig.params } }) + return config + } +} diff --git a/capabilities/demo-receipt-printer/src/vite-env.d.ts b/capabilities/demo-receipt-printer/src/vite-env.d.ts new file mode 100644 index 0000000..67f932b --- /dev/null +++ b/capabilities/demo-receipt-printer/src/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly VITE_CUTOS_BROKER_URL?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/capabilities/demo-receipt-printer/tailwind.config.js b/capabilities/demo-receipt-printer/tailwind.config.js new file mode 100644 index 0000000..0688d92 --- /dev/null +++ b/capabilities/demo-receipt-printer/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {} + }, + plugins: [] +} \ No newline at end of file diff --git a/capabilities/demo-receipt-printer/tsconfig.json b/capabilities/demo-receipt-printer/tsconfig.json new file mode 100644 index 0000000..f279f3d --- /dev/null +++ b/capabilities/demo-receipt-printer/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "jsx": "preserve", + "types": ["vite/client"] + }, + "include": ["src/**/*.ts", "src/**/*.vue"] +} diff --git a/capabilities/demo-receipt-printer/vite.config.ts b/capabilities/demo-receipt-printer/vite.config.ts new file mode 100644 index 0000000..2f1e90e --- /dev/null +++ b/capabilities/demo-receipt-printer/vite.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' + +export default defineConfig({ + base: './', + publicDir: 'public', + build: { + target: ['chrome74'] + }, + server: { + proxy: { + // '/proxy': 'http://192.168.1.30' + } + }, + resolve: { + dedupe: ['@cutos/core'], + alias: { + '@': '/src' + } + }, + define: {}, + plugins: [ + vue(), + AutoImport({ + include: [ + /\.[tj]sx?$/, + /\.vue$/, + /\.vue\?vue/, + /\.md$/ + ], + imports: ['vue'], + vueTemplate: true, + cache: true, + dts: false + }) + ], + optimizeDeps: { + esbuildOptions: { + define: { + global: 'globalThis' + }, + target: 'es2015', + supported: { + bigint: true + } + } + } +}) diff --git a/core-api/demo-core-api/.env.development b/core-api/demo-core-api/.env.development new file mode 100644 index 0000000..b0b990f --- /dev/null +++ b/core-api/demo-core-api/.env.development @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=mock diff --git a/core-api/demo-core-api/.env.production b/core-api/demo-core-api/.env.production new file mode 100644 index 0000000..ef96a64 --- /dev/null +++ b/core-api/demo-core-api/.env.production @@ -0,0 +1 @@ +VITE_CUTOS_BROKER_URL=localhost diff --git a/core-api/demo-core-api/.gitignore b/core-api/demo-core-api/.gitignore new file mode 100644 index 0000000..2f98841 --- /dev/null +++ b/core-api/demo-core-api/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +dist-ssr +release +*.local +*.log +.DS_Store diff --git a/core-api/demo-core-api/.prettierrc b/core-api/demo-core-api/.prettierrc new file mode 100644 index 0000000..0aa4165 --- /dev/null +++ b/core-api/demo-core-api/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 200, + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "arrowParens": "always", + "trailingComma": "none", + "plugins": ["prettier-plugin-tailwindcss"] +} \ No newline at end of file diff --git a/core-api/demo-core-api/README.md b/core-api/demo-core-api/README.md new file mode 100644 index 0000000..1d2d464 --- /dev/null +++ b/core-api/demo-core-api/README.md @@ -0,0 +1,34 @@ +# CUTOS 4.0 Core API Demo + +The basic CUTOS 4.0 LWA demo. It depends only on `@cutos/core` and does not require an additional Capability SDK or Provider. + +The demo covers the same foundation as the CUTOS 3.x `demo-core-api`, updated for the Promise-first 4.0 API: + +- Runtime version and connection state +- Platform, runtime config, box, and device information +- Network notifications +- Logger levels +- Volume read/write +- Automatic HTTP proxy configuration and a ping request for verifying cross-origin access + +## Install + +```bash +npm install +``` + +## Development + +```bash +npm run dev +``` + +Development uses CUTOS Mock by default. To connect to a CUTOS Node, set `VITE_CUTOS_BROKER_URL` to its host. + +## Build And Package + +```bash +npm run build +``` + +The packaged `.lwa` file is generated in `release/`. diff --git a/core-api/demo-core-api/index.html b/core-api/demo-core-api/index.html new file mode 100644 index 0000000..a028728 --- /dev/null +++ b/core-api/demo-core-api/index.html @@ -0,0 +1,12 @@ + + + + + + CUTOS Core API Demo + + +
+ + + diff --git a/core-api/demo-core-api/package.json b/core-api/demo-core-api/package.json new file mode 100644 index 0000000..1b97b6e --- /dev/null +++ b/core-api/demo-core-api/package.json @@ -0,0 +1,31 @@ +{ + "name": "demo-core-api", + "private": true, + "version": "4.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "cutos lwa build", + "build:app": "vue-tsc --noEmit && vite build", + "package": "cutos lwa package", + "validate": "cutos lwa validate", + "preview": "vite preview" + }, + "dependencies": { + "@cutos/core": "^4.0.6", + "vue": "^3.4.31" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.5", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.40", + "postcss-import": "^16.1.0", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.7", + "typescript": "^5.5.4", + "unplugin-auto-import": "^0.18.0", + "vite": "^5.3.4", + "vue-tsc": "^2.0.26" + } +} diff --git a/core-api/demo-core-api/postcss.config.js b/core-api/demo-core-api/postcss.config.js new file mode 100644 index 0000000..1cf2729 --- /dev/null +++ b/core-api/demo-core-api/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + 'postcss-import': {}, + tailwindcss: {}, + autoprefixer: {} + } +} \ No newline at end of file diff --git a/core-api/demo-core-api/public/config.json b/core-api/demo-core-api/public/config.json new file mode 100644 index 0000000..9c23a66 --- /dev/null +++ b/core-api/demo-core-api/public/config.json @@ -0,0 +1,10 @@ +{ + "name": "demo-core-api", + "version": "4.0.2", + "description": "CUTOS 4.0 Core API demo", + "params": { + "title": "CUTOS Core API", + "host": "localhost" + }, + "drvDependencies": {} +} diff --git a/core-api/demo-core-api/public/thumbnail.png b/core-api/demo-core-api/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..031aad747fb3f9a6f0695f13e1a89221124a48db GIT binary patch literal 18581 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 literal 0 HcmV?d00001 diff --git a/core-api/demo-core-api/src/App.vue b/core-api/demo-core-api/src/App.vue new file mode 100644 index 0000000..b141485 --- /dev/null +++ b/core-api/demo-core-api/src/App.vue @@ -0,0 +1,340 @@ + + + diff --git a/core-api/demo-core-api/src/assets/cutos.png b/core-api/demo-core-api/src/assets/cutos.png new file mode 100644 index 0000000000000000000000000000000000000000..9f73429832a319c18f3557b88adc7567d2114347 GIT binary patch literal 7773 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 literal 0 HcmV?d00001 diff --git a/core-api/demo-core-api/src/components/CutosTopbar.vue b/core-api/demo-core-api/src/components/CutosTopbar.vue new file mode 100644 index 0000000..eac03d7 --- /dev/null +++ b/core-api/demo-core-api/src/components/CutosTopbar.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/core-api/demo-core-api/src/main.ts b/core-api/demo-core-api/src/main.ts new file mode 100644 index 0000000..5a6e246 --- /dev/null +++ b/core-api/demo-core-api/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') \ No newline at end of file diff --git a/core-api/demo-core-api/src/style.css b/core-api/demo-core-api/src/style.css new file mode 100644 index 0000000..6d37779 --- /dev/null +++ b/core-api/demo-core-api/src/style.css @@ -0,0 +1,100 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + font-family: Inter, "Segoe UI", Arial, sans-serif; + color: #20262c; + background: #eef1f3; + font-synthesis: none; + text-rendering: optimizeLegibility; + letter-spacing: 0; +} + +* { box-sizing: border-box; } +body { margin: 0; min-width: 320px; min-height: 100vh; } +button, input { font: inherit; } +button { cursor: pointer; } +button:disabled { cursor: not-allowed; opacity: 0.48; } + +.app-shell { min-height: 100vh; background: #eef1f3; } + +main { width: 100%; margin: 0 auto; padding: 28px clamp(18px, 2vw, 36px) 32px; } +section + section { margin-top: 34px; } +.error-banner { display: flex; gap: 12px; padding: 12px 16px; color: #7e2420; background: #fff0ef; border-left: 4px solid #d54d47; } +.section-heading, .panel-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; } +.section-heading { margin-bottom: 15px; } +.section-heading h2, .panel-heading h2 { margin: 3px 0 0; font-size: 18px; line-height: 1.2; } +.card-style-heading h2 { margin: 0 0 6px; } +.eyebrow { display: block; color: #64717a; font-family: "Cascadia Code", Consolas, monospace; font-size: 11px; } + +.result-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } +.result-card { min-width: 0; min-height: 224px; background: #fff; border: 1px solid #d8dee2; border-radius: 6px; overflow: hidden; } +.result-header { min-height: 66px; padding: 13px 15px; border-bottom: 1px solid #e4e8eb; background: #f8fafb; } +.result-header h3 { margin: 0 0 6px; font-size: 14px; } +.result-header code { display: block; color: #68757d; font-size: 11px; overflow-wrap: anywhere; } +pre { margin: 0; padding: 15px; font: 12px/1.55 "Cascadia Code", Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; } +.result-card pre { max-height: 220px; overflow: auto; } +.pending { color: #75828a; } +.result-error { color: #b43b35; } +.activity-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; } +.activity-card { grid-column: span 2; } +.activity-header h3 { margin-bottom: 6px; } + +.controls-section { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-top: 1px solid #cbd3d8; border-bottom: 1px solid #cbd3d8; } +.control-panel { min-width: 0; padding: 22px; background: #f7f9fa; } +.control-panel + .control-panel { border-left: 1px solid #cbd3d8; } +.panel-heading strong { font-size: 28px; color: #138b80; } +.volume-panel input[type="range"] { width: 100%; margin: 28px 0 20px; accent-color: #138b80; } +.panel-actions { min-height: 34px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } +.inline-result { max-width: 100%; color: #64717a; font: 11px/1.4 "Cascadia Code", Consolas, monospace; overflow-wrap: anywhere; } +.button-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 25px; } +.button { min-height: 34px; padding: 7px 13px; border: 1px solid transparent; border-radius: 4px; font-weight: 650; font-size: 12px; } +.button.primary { color: #fff; background: #138b80; border-color: #138b80; } +.button.secondary { color: #2d373d; background: #fff; border-color: #bfc8cd; } +.button.danger { color: #a12d28; background: #fff; border-color: #dba7a4; } +.proxy-panel { grid-column: span 2; } +.proxy-columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 18px; } +.proxy-column { min-width: 0; } +.ping-column { min-width: 0; } +.ping-actions { min-height: 44px; display: flex; align-items: center; gap: 10px; } +.proxy-target { padding: 9px 10px; background: #fff; border: 1px solid #d8dee2; overflow-wrap: anywhere; } +.proxy-target code { font-size: 11px; } +.compact-result { width: 100%; margin-top: 10px; padding: 9px 10px; background: #fff; border: 1px solid #d8dee2; max-height: 82px; overflow: auto; } +.ping-column .compact-result { margin-top: 10px; } +.ping-hint { margin: 0; color: #64717a; font-size: 11px; line-height: 1.5; } +.ping-hint code { overflow-wrap: anywhere; } + +.text-button { padding: 4px 0; border: 0; color: #138b80; background: transparent; font-size: 12px; } +.activity-list { max-height: 157px; overflow: auto; } +.activity-row { display: grid; grid-template-columns: 82px 240px minmax(0, 1fr); gap: 12px; padding: 10px 13px; font-size: 12px; border-bottom: 1px solid #edf0f2; } +.activity-row:last-child { border-bottom: 0; } +.activity-row time { color: #77838b; font-variant-numeric: tabular-nums; } +.activity-row code { color: #087b71; overflow-wrap: anywhere; } +.activity-row span { min-width: 0; overflow-wrap: anywhere; } +.empty-state { margin: 0; padding: 24px 15px; color: #77838b; font-size: 13px; } + +@media (min-width: 1400px) and (min-height: 800px) { + main { min-height: calc(100vh - 82px); display: flex; flex-direction: column; } + .runtime-section { flex: 1; display: flex; flex-direction: column; } + .result-grid { flex: 1; grid-template-rows: repeat(2, minmax(0, 1fr)); } + .result-card { min-height: 0; } + .controls-section { min-height: 220px; } + .control-panel { display: flex; flex-direction: column; justify-content: center; } +} + +@media (max-width: 980px) { + .result-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .activity-card { grid-column: auto; } + .controls-section { grid-template-columns: 1fr; } + .proxy-panel { grid-column: auto; } + .control-panel + .control-panel { border-left: 0; border-top: 1px solid #cbd3d8; } +} + +@media (max-width: 640px) { + .result-grid { grid-template-columns: 1fr; } + .result-card { min-height: 190px; } + .activity-row { grid-template-columns: 70px minmax(0, 1fr); } + .activity-row span { grid-column: 1 / -1; } + .proxy-columns { grid-template-columns: 1fr; } +} diff --git a/core-api/demo-core-api/src/utils/config.ts b/core-api/demo-core-api/src/utils/config.ts new file mode 100644 index 0000000..1a87084 --- /dev/null +++ b/core-api/demo-core-api/src/utils/config.ts @@ -0,0 +1,66 @@ +export interface LwaConfig { + name: string + version: string + description?: string + params: { + title: string + host: string + [key: string]: unknown + } + drvDependencies?: Record +} + +const defaultConfig: LwaConfig = { + name: 'cutos-lwa', + version: '0.0.0', + params: { + title: 'CUTOS LWA', + host: 'localhost' + } +} + +export let config: LwaConfig = { ...defaultConfig, params: { ...defaultConfig.params } } + +function parse(str?: string) { + if (!str || !str.length) return {} + + return str.split('&').reduce>((acc, row) => { + const [key, value] = row.split('=').map(decodeURIComponent) + acc[key] = value + return acc + }, {}) +} + +function mergeQueryParams(config: LwaConfig) { + if (typeof window === 'undefined') { + return config + } + + const query = location.href.split('?')[1] + const { params } = parse(query) as { params?: string } + + try { + if (params) config.params = { ...config.params, ...JSON.parse(params) } + } catch (error) { + console.error(error) + } + + return config +} + +export async function loadConfig(): Promise { + try { + const configUrl = + typeof window === 'undefined' ? 'config.json' : new URL('config.json', window.location.href).toString() + const response = await fetch(configUrl, { cache: 'no-cache' }) + if (!response.ok) { + throw new Error(`Failed to load config.json: ${response.status}`) + } + config = mergeQueryParams((await response.json()) as LwaConfig) + return config + } catch (error) { + console.error(error) + config = mergeQueryParams({ ...defaultConfig, params: { ...defaultConfig.params } }) + return config + } +} diff --git a/core-api/demo-core-api/src/vite-env.d.ts b/core-api/demo-core-api/src/vite-env.d.ts new file mode 100644 index 0000000..67f932b --- /dev/null +++ b/core-api/demo-core-api/src/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly VITE_CUTOS_BROKER_URL?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/core-api/demo-core-api/tailwind.config.js b/core-api/demo-core-api/tailwind.config.js new file mode 100644 index 0000000..0688d92 --- /dev/null +++ b/core-api/demo-core-api/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {} + }, + plugins: [] +} \ No newline at end of file diff --git a/core-api/demo-core-api/tsconfig.json b/core-api/demo-core-api/tsconfig.json new file mode 100644 index 0000000..f279f3d --- /dev/null +++ b/core-api/demo-core-api/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "jsx": "preserve", + "types": ["vite/client"] + }, + "include": ["src/**/*.ts", "src/**/*.vue"] +} diff --git a/core-api/demo-core-api/vite.config.ts b/core-api/demo-core-api/vite.config.ts new file mode 100644 index 0000000..538c58b --- /dev/null +++ b/core-api/demo-core-api/vite.config.ts @@ -0,0 +1,48 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' + +export default defineConfig({ + base: './', + publicDir: 'public', + build: { + target: ['chrome74'] + }, + server: { + proxy: { + // '/proxy': 'http://192.168.1.30' + } + }, + resolve: { + alias: { + '@': '/src' + } + }, + define: {}, + plugins: [ + vue(), + AutoImport({ + include: [ + /\.[tj]sx?$/, + /\.vue$/, + /\.vue\?vue/, + /\.md$/ + ], + imports: ['vue'], + vueTemplate: true, + cache: true, + dts: false + }) + ], + optimizeDeps: { + esbuildOptions: { + define: { + global: 'globalThis' + }, + target: 'es2015', + supported: { + bigint: true + } + } + } +})