"Proper" top-level-await workaround

This commit is contained in:
Yeicor
2025-01-04 23:22:18 +01:00
parent b09d5a87fa
commit 8330060bd9
10 changed files with 125 additions and 221 deletions

View File

@@ -211,12 +211,11 @@ Apache License
----------- -----------
The following npm packages may be included in this product: The following npm package may be included in this product:
- source-map-js@1.2.0
- source-map-js@1.2.1 - source-map-js@1.2.1
These packages each contain the following license: This package contains the following license:
Copyright (c) 2009-2011, Mozilla Foundation and contributors Copyright (c) 2009-2011, Mozilla Foundation and contributors
All rights reserved. All rights reserved.
@@ -778,11 +777,13 @@ The above copyright notice and this permission notice shall be included in all c
----------- -----------
The following npm package may be included in this product: The following npm packages may be included in this product:
- sharp@0.33.4 - @img/sharp-linux-x64@0.33.5
- @img/sharp-linuxmusl-x64@0.33.5
- sharp@0.33.5
This package contains the following license: These packages each contain the following license:
Apache License Apache License
Version 2.0, January 2004 Version 2.0, January 2004
@@ -980,7 +981,7 @@ third-party archives.
The following npm package may be included in this product: The following npm package may be included in this product:
- typescript@5.6.3 - typescript@5.7.2
This package contains the following license: This package contains the following license:
@@ -1120,7 +1121,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The following npm package may be included in this product: The following npm package may be included in this product:
- @lit-labs/ssr-dom-shim@1.2.0 - @lit-labs/ssr-dom-shim@1.2.1
This package contains the following license: This package contains the following license:
@@ -1246,7 +1247,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
The following npm package may be included in this product: The following npm package may be included in this product:
- @babel/parser@7.25.3 - @babel/parser@7.26.3
This package contains the following license: This package contains the following license:
@@ -1366,7 +1367,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The following npm package may be included in this product: The following npm package may be included in this product:
- magic-string@0.30.11 - magic-string@0.30.17
This package contains the following license: This package contains the following license:
@@ -1404,30 +1405,22 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
----------- -----------
The following npm package may be included in this product: The following npm packages may be included in this product:
- to-fast-properties@2.0.0 - @img/sharp-libvips-linux-x64@1.0.4
- @img/sharp-libvips-linuxmusl-x64@1.0.4
This package contains the following license: These packages each contain the following license:
MIT License LGPL-3.0-or-later
Copyright (c) 2014 Petka Antonov
2015 Sindre Sorhus
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------- -----------
The following npm packages may be included in this product: The following npm packages may be included in this product:
- @babel/helper-string-parser@7.24.8 - @babel/helper-string-parser@7.25.9
- @babel/helper-validator-identifier@7.24.7 - @babel/helper-validator-identifier@7.25.9
- @babel/types@7.25.2 - @babel/types@7.26.3
These packages each contain the following license: These packages each contain the following license:
@@ -1518,7 +1511,7 @@ SOFTWARE.
The following npm package may be included in this product: The following npm package may be included in this product:
- @monogrid/gainmap-js@3.0.3 - @monogrid/gainmap-js@3.1.0
This package contains the following license: This package contains the following license:
@@ -1608,7 +1601,7 @@ The MIT license applies to all non-font and non-icon files.
The following npm package may be included in this product: The following npm package may be included in this product:
- semver@7.6.2 - semver@7.6.3
This package contains the following license: This package contains the following license:
@@ -1692,7 +1685,7 @@ THE SOFTWARE.
The following npm package may be included in this product: The following npm package may be included in this product:
- three@0.169.0 - three@0.171.0
This package contains the following license: This package contains the following license:
@@ -1782,7 +1775,7 @@ THE SOFTWARE.
The following npm package may be included in this product: The following npm package may be included in this product:
- vuetify@3.7.4 - vuetify@3.7.6
This package contains the following license: This package contains the following license:
@@ -1913,9 +1906,9 @@ SOFTWARE.
The following npm packages may be included in this product: The following npm packages may be included in this product:
- @gltf-transform/core@4.1.0 - @gltf-transform/core@4.1.1
- @gltf-transform/extensions@4.1.0 - @gltf-transform/extensions@4.1.1
- @gltf-transform/functions@4.1.0 - @gltf-transform/functions@4.1.1
These packages each contain the following license: These packages each contain the following license:
@@ -2004,7 +1997,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
The following npm package may be included in this product: The following npm package may be included in this product:
- nanoid@3.3.7 - nanoid@3.3.8
This package contains the following license: This package contains the following license:

View File

@@ -52,10 +52,11 @@ async function onModelUpdateRequest(event: NetworkUpdateEvent) {
let model = event.models[modelIndex]; let model = event.models[modelIndex];
tools.value?.removeObjectSelections(model.name); tools.value?.removeObjectSelections(model.name);
try { try {
let loadHelpers = (await settings()).loadHelpers;
if (!model.isRemove) { if (!model.isRemove) {
doc = await SceneMgr.loadModel(sceneUrl, doc, model.name, model.url, isLast && settings.loadHelpers, isLast); doc = await SceneMgr.loadModel(sceneUrl, doc, model.name, model.url, isLast && loadHelpers, isLast);
} else { } else {
doc = await SceneMgr.removeModel(sceneUrl, doc, model.name, isLast && settings.loadHelpers, isLast); doc = await SceneMgr.removeModel(sceneUrl, doc, model.name, isLast && loadHelpers, isLast);
} }
} catch (e) { } catch (e) {
console.error("Error loading model", model, e); console.error("Error loading model", model, e);
@@ -79,16 +80,18 @@ let networkMgr = new NetworkManager();
networkMgr.addEventListener('update-early', networkMgr.addEventListener('update-early',
(e) => viewer.value?.onProgress((e as CustomEvent<Array<any>>).detail.length * 0.01)); (e) => viewer.value?.onProgress((e as CustomEvent<Array<any>>).detail.length * 0.01));
networkMgr.addEventListener('update', (e) => onModelUpdateRequest(e as NetworkUpdateEvent)); networkMgr.addEventListener('update', (e) => onModelUpdateRequest(e as NetworkUpdateEvent));
// Start loading all configured models ASAP (async () => { // Start loading all configured models ASAP
for (let model of settings.preload) { let sett = await settings();
networkMgr.load(model); watch(viewer, (newViewer) => {
} if (newViewer) {
watch(viewer, (newViewer) => { newViewer.setPosterText('<tspan x="50%" dy="1.2em">Trying to load' +
if (newViewer) { ' models from:</tspan>' + sett.preload.map((url: string) => '<tspan x="50%" dy="1.2em">- ' + url + '</tspan>').join(""));
newViewer.setPosterText('<tspan x="50%" dy="1.2em">Trying to load' + }
' models from:</tspan>' + settings.preload.map((url) => '<tspan x="50%" dy="1.2em">- ' + url + '</tspan>').join("")); });
for (let model of sett.preload) {
await networkMgr.load(model);
} }
}); })();
async function loadModelManual() { async function loadModelManual() {
const modelUrl = prompt("For an improved experience in viewing CAD/GLTF models with automatic updates, it's recommended to use the official yacv_server Python package. This ensures seamless serving of models and automatic updates.\n\nOtherwise, enter the URL of the model to load:"); const modelUrl = prompt("For an improved experience in viewing CAD/GLTF models with automatic updates, it's recommended to use the official yacv_server Python package. This ensures seamless serving of models and automatic updates.\n\nOtherwise, enter the URL of the model to load:");

View File

@@ -61,6 +61,7 @@ export class NetworkManager extends EventTarget {
private async monitorDevServer(url: URL, stop: () => boolean = () => false) { private async monitorDevServer(url: URL, stop: () => boolean = () => false) {
while (!stop()) { while (!stop()) {
let monitorEveryMs = (await settings()).monitorEveryMs;
try { try {
// WARNING: This will spam the console logs with failed requests when the server is down // WARNING: This will spam the console logs with failed requests when the server is down
const controller = new AbortController(); const controller = new AbortController();
@@ -82,12 +83,12 @@ export class NetworkManager extends EventTarget {
} }
} else { } else {
// Server is down, wait a little longer before retrying // Server is down, wait a little longer before retrying
await new Promise(resolve => setTimeout(resolve, 10 * settings.monitorEveryMs)); await new Promise(resolve => setTimeout(resolve, 10 * monitorEveryMs));
} }
controller.abort(); controller.abort();
} catch (e) { // Ignore errors (retry very soon) } catch (e) { // Ignore errors (retry very soon)
} }
await new Promise(resolve => setTimeout(resolve, settings.monitorEveryMs)); await new Promise(resolve => setTimeout(resolve, monitorEveryMs));
} }
} }

View File

@@ -1,35 +1,66 @@
// These are the default values for the settings, which are overridden below // These are the default values for the settings, which are overridden below
export const settings = { let settingsCache: any = null;
preload: [
// @ts-ignore export async function settings() {
// new URL('../../assets/fox.glb', import.meta.url).href, if (settingsCache !== null) return settingsCache;
// @ts-ignore let settings = {
// new URL('../../assets/logo_build/base.glb', import.meta.url).href, preload: [
// @ts-ignore // @ts-ignore
// new URL('../../assets/logo_build/location.glb', import.meta.url).href, // new URL('../../assets/fox.glb', import.meta.url).href,
// @ts-ignore // @ts-ignore
// new URL('../../assets/logo_build/img.jpg.glb', import.meta.url).href, // new URL('../../assets/logo_build/base.glb', import.meta.url).href,
// Websocket URLs automatically listen for new models from the python backend // @ts-ignore
'<auto>', // Get the default preload URL if not overridden // new URL('../../assets/logo_build/location.glb', import.meta.url).href,
], // @ts-ignore
loadHelpers: true, // new URL('../../assets/logo_build/img.jpg.glb', import.meta.url).href,
edgeWidth: 0, /* The default line size for edges, set to 0 to use basic gl.LINEs */ // Websocket URLs automatically listen for new models from the python backend
displayLoadingEveryMs: 1000, /* How often to display partially loaded models */ '<auto>', // Get the default preload URL if not overridden
monitorEveryMs: 100, ],
monitorOpenTimeoutMs: 1000, loadHelpers: true,
// ModelViewer settings edgeWidth: 0, /* The default line size for edges, set to 0 to use basic gl.LINEs */
autoplay: true, // Global animation toggle displayLoadingEveryMs: 1000, /* How often to display partially loaded models */
arModes: 'webxr scene-viewer quick-look', monitorEveryMs: 100,
zoomSensitivity: 0.25, monitorOpenTimeoutMs: 1000,
orbitSensitivity: 1, // ModelViewer settings
panSensitivity: 1, autoplay: true, // Global animation toggle
exposure: 1, arModes: 'webxr scene-viewer quick-look',
shadowIntensity: 0, zoomSensitivity: 0.25,
background: '', orbitSensitivity: 1,
panSensitivity: 1,
exposure: 1,
shadowIntensity: 0,
background: '',
};
// Auto-override any settings from the URL
const url = new URL(window.location.href);
url.searchParams.forEach((value, key) => {
if (key in settings) (settings as any)[key] = parseSetting(key, value, settings);
})
// Get the default preload URL if not overridden (requires a fetch that is avoided if possible)
for (let i = 0; i < settings.preload.length; i++) {
let url = settings.preload[i];
if (url === '<auto>') {
const possibleBackend = new URL("./?api_updates=true", window.location.href)
await fetch(possibleBackend, {method: "HEAD"}).then((response) => {
if (response.ok && response.headers.get("Content-Type") === "text/event-stream") {
// Frontend served by the backend: default to this URL for updates
url = "dev+" + possibleBackend.href;
}
}).catch((error) => console.error("Failed to check for backend:", error));
if (url === '<auto>') { // Fallback to the default preload URL of localhost
url = "dev+http://localhost:32323";
}
}
settings.preload[i] = url;
}
settingsCache = settings;
return settings;
} }
const firstTimeNames: Array<string> = []; // Needed for array values, which clear the array when overridden const firstTimeNames: Array<string> = []; // Needed for array values, which clear the array when overridden
function parseSetting(name: string, value: string): any { function parseSetting(name: string, value: string, settings: any): any {
let arrayElem = name.endsWith(".0") let arrayElem = name.endsWith(".0")
if (arrayElem) name = name.slice(0, -2); if (arrayElem) name = name.slice(0, -2);
let prevValue = (settings as any)[name]; let prevValue = (settings as any)[name];
@@ -42,7 +73,7 @@ function parseSetting(name: string, value: string): any {
} else { } else {
toExtend = prevValue; toExtend = prevValue;
} }
toExtend.push(parseSetting(name + ".0", value)); toExtend.push(parseSetting(name + ".0", value, settings));
return toExtend; return toExtend;
} else { } else {
prevValue = prevValue[0]; prevValue = prevValue[0];
@@ -59,27 +90,3 @@ function parseSetting(name: string, value: string): any {
throw new Error(`Unknown setting type: ${typeof prevValue} -- ${prevValue}`); throw new Error(`Unknown setting type: ${typeof prevValue} -- ${prevValue}`);
} }
} }
// Auto-override any settings from the URL
const url = new URL(window.location.href);
url.searchParams.forEach((value, key) => {
if (key in settings) (settings as any)[key] = parseSetting(key, value);
})
// Get the default preload URL if not overridden (requires a fetch that is avoided if possible)
for (let i = 0; i < settings.preload.length; i++) {
let url = settings.preload[i];
if (url === '<auto>') {
const possibleBackend = new URL("./?api_updates=true", window.location.href)
await fetch(possibleBackend, {method: "HEAD"}).then((response) => {
if (response.ok && response.headers.get("Content-Type") === "text/event-stream") {
// Frontend served by the backend: default to this URL for updates
url = "dev+" + possibleBackend.href;
}
}).catch((error) => console.error("Failed to check for backend:", error));
if (url === '<auto>') { // Fallback to the default preload URL of localhost
url = "dev+http://localhost:32323";
}
}
settings.preload[i] = url;
}

View File

@@ -55,7 +55,11 @@ const clipPlaneY = ref(1);
const clipPlaneSwappedY = ref(false); const clipPlaneSwappedY = ref(false);
const clipPlaneZ = ref(1); const clipPlaneZ = ref(1);
const clipPlaneSwappedZ = ref(false); const clipPlaneSwappedZ = ref(false);
const edgeWidth = ref(settings.edgeWidth); const edgeWidth = ref(0);
(async () => {
let s = await settings();
edgeWidth.value = s.edgeWidth;
})();
// Misc properties // Misc properties
const enabledFeatures = defineModel<Array<number>>("enabledFeatures", {default: [0, 1, 2]}); const enabledFeatures = defineModel<Array<number>>("enabledFeatures", {default: [0, 1, 2]});

View File

@@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import {defineModel, inject, ref, type ShallowRef, watch} from "vue"; import {inject, ref, type ShallowRef, watch} from "vue";
import {VBtn, VSelect, VTooltip} from "vuetify/lib/components/index.mjs"; import {VBtn, VSelect, VTooltip} from "vuetify/lib/components/index.mjs";
import SvgIcon from '@jamescoyle/vue-icon'; import SvgIcon from '@jamescoyle/vue-icon';
import type {ModelViewerElement} from '@google/model-viewer'; import type {ModelViewerElement} from '@google/model-viewer';
@@ -333,7 +333,7 @@ function updateBoundingBox() {
for (let i = 0; i < 2; i++) { // Find the 2nd closest one by running twice dropping the first for (let i = 0; i < 2; i++) { // Find the 2nd closest one by running twice dropping the first
edge = axisEdges[0]; edge = axisEdges[0];
let edgeDist = Infinity; let edgeDist = Infinity;
let cameraPos: Vector3 = props.viewer?.scene.camera.position; let cameraPos: Vector3 = props.viewer?.scene?.camera?.position ?? new Vector3();
for (let testEdge of axisEdges) { for (let testEdge of axisEdges) {
let from = new Vector3(...corners[testEdge[0]]); let from = new Vector3(...corners[testEdge[0]]);
let to = new Vector3(...corners[testEdge[1]]); let to = new Vector3(...corners[testEdge[1]]);

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import {settings} from "../misc/settings"; import {settings} from "../misc/settings";
import {inject, onMounted, type Ref, ref, watch} from "vue"; import {inject, onUpdated, type Ref, ref, watch} from "vue";
import {$renderer, $scene} from "@google/model-viewer/lib/model-viewer-base"; import {$renderer, $scene} from "@google/model-viewer/lib/model-viewer-base";
import {$controls} from '@google/model-viewer/lib/features/controls.js'; import {$controls} from '@google/model-viewer/lib/features/controls.js';
import {type SmoothControls} from '@google/model-viewer/lib/three-components/SmoothControls'; import {type SmoothControls} from '@google/model-viewer/lib/three-components/SmoothControls';
@@ -27,14 +27,19 @@ const scene = ref<ModelScene | null>(null);
const renderer = ref<Renderer | null>(null); const renderer = ref<Renderer | null>(null);
const controls = ref<SmoothControls | null>(null); const controls = ref<SmoothControls | null>(null);
const sett = ref<any | null>(null);
(async () => sett.value = await settings())();
let lastCameraTargetPosition: Vector3 | undefined = undefined; let lastCameraTargetPosition: Vector3 | undefined = undefined;
let lastCameraZoom: number | undefined = undefined; let lastCameraZoom: number | undefined = undefined;
let lastCameraUrl = props.src.toString(); let lastCameraUrl = props.src.toString();
onMounted(() => { let initialized = false
if (!elem.value) return; onUpdated(() => {
if (!elem.value) return; // Not ready yet
if (initialized) return; // Already initialized
initialized = true;
elem.value.addEventListener('before-render', () => { elem.value.addEventListener('before-render', () => {
if (!elem.value) return; if (!elem.value) return
// Extract internals of model-viewer in order to hack unsupported features // Extract internals of model-viewer in order to hack unsupported features
scene.value = elem.value[$scene] as ModelScene; scene.value = elem.value[$scene] as ModelScene;
renderer.value = elem.value[$renderer] as Renderer; renderer.value = elem.value[$renderer] as Renderer;
@@ -207,11 +212,11 @@ watch(disableTap, (newDisableTap) => {
<template> <template>
<!-- The main 3D model viewer --> <!-- The main 3D model viewer -->
<model-viewer ref="elem" :ar="settings.arModes.length > 0" :ar-modes="settings.arModes" :autoplay="settings.autoplay" <model-viewer ref="elem" v-if="sett != null" :ar="sett.arModes.length > 0" :ar-modes="sett.arModes"
:environment-image="settings.background" :exposure="settings.exposure" :environment-image="sett.background" :exposure="sett.exposure" :autoplay="sett.autoplay"
:orbit-sensitivity="settings.orbitSensitivity" :pan-sensitivity="settings.panSensitivity" :orbit-sensitivity="sett.orbitSensitivity" :pan-sensitivity="sett.panSensitivity"
:poster="poster" :shadow-intensity="settings.shadowIntensity" :skybox-image="settings.background" :poster="poster" :shadow-intensity="sett.shadowIntensity" :skybox-image="sett.background"
:src="props.src" :zoom-sensitivity="settings.zoomSensitivity" alt="The 3D model(s)" camera-controls :src="props.src" :zoom-sensitivity="sett.zoomSensitivity" alt="The 3D model(s)" camera-controls
camera-orbit="30deg 75deg auto" interaction-prompt="none" max-camera-orbit="Infinity 180deg auto" camera-orbit="30deg 75deg auto" interaction-prompt="none" max-camera-orbit="Infinity 180deg auto"
min-camera-orbit="-Infinity 0deg 5%" style="width: 100%; height: 100%"> min-camera-orbit="-Infinity 0deg 5%" style="width: 100%; height: 100%">
<slot></slot> <slot></slot>

View File

@@ -42,7 +42,6 @@
"terser": "^5.36.0", "terser": "^5.36.0",
"typescript": "~5.7.0", "typescript": "~5.7.0",
"vite": "^6.0.0", "vite": "^6.0.0",
"vite-plugin-top-level-await": "^1.4.4",
"vue-tsc": "^2.1.10" "vue-tsc": "^2.1.10"
} }
} }

View File

@@ -5,7 +5,6 @@ import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx' import vueJsx from '@vitejs/plugin-vue-jsx'
import {name, version} from './package.json' import {name, version} from './package.json'
import {execSync} from 'child_process' import {execSync} from 'child_process'
import topLevelAwait from "vite-plugin-top-level-await";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
@@ -19,12 +18,6 @@ export default defineConfig({
} }
}), }),
vueJsx(), vueJsx(),
topLevelAwait({
// The export name of top-level await promise for each chunk module
promiseExportName: "__tla",
// The function to generate import names of top-level await promise in each chunk module
promiseImportName: i => `__tla_${i}`
}),
], ],
resolve: { resolve: {
alias: { alias: {

101
yarn.lock
View File

@@ -771,11 +771,6 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@rollup/plugin-virtual@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz#17e17eeecb4c9fa1c0a6e72c9e5f66382fddbb82"
integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==
"@rollup/rollup-android-arm-eabi@4.29.1": "@rollup/rollup-android-arm-eabi@4.29.1":
version "4.29.1" version "4.29.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0"
@@ -917,87 +912,6 @@
"@sigstore/core" "^2.0.0" "@sigstore/core" "^2.0.0"
"@sigstore/protobuf-specs" "^0.3.2" "@sigstore/protobuf-specs" "^0.3.2"
"@swc/core-darwin-arm64@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.3.tgz#d84f19e12a0cc1a1c0ebffdaffd3650d318842c0"
integrity sha512-LFFCxAUKBy69AUE+01rgazQcafIXrYs6tBa9SyKPR51ft6Tp66dAVrWg9MTykaWskuXEe80LPUvUw1ga3bOH3A==
"@swc/core-darwin-x64@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.10.3.tgz#2632a331c2d78f720426aa7e658242a8499f4231"
integrity sha512-yZNv1+yPg0GvYdThsMI8WpaPRAPuw2gQDMdgijLFfRcRlr2l1sTWsDHqGd7QMTx+acYM3uB537gyd31WjUAwlQ==
"@swc/core-linux-arm-gnueabihf@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.3.tgz#467aa5b2ee72f4b2d1359103da9fddb2c046dc79"
integrity sha512-Qa6hu5ASoKV4rcYUBGG3y3z+9UT042KAG4A7ivqqYQFcMfkB4NbZb5So2YWOpUc0/5YlSVkgL22h3Mbj5EXy7A==
"@swc/core-linux-arm64-gnu@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.3.tgz#f721e57f8ddc11c4f6b5e798e57fb16958b740a0"
integrity sha512-BGnoZrmo0nlkXrOxVHk5U3j9u4BuquFviC+LvMe+HrDc5YLVe1gSXMUSBKhIz9MY9uFgxXW977TnB1XjLSKe5Q==
"@swc/core-linux-arm64-musl@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.3.tgz#45848528e653fd6d8976f30f98c5cd6e067558a5"
integrity sha512-L07/4zKnIY2S/00bE+Yn3oEHkyGjWmGGE8Ta4luVCL+00s04EIwMoE1Hc8E8xFB5zLew5ViKFc5kNb5YZ/tRFQ==
"@swc/core-linux-x64-gnu@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.3.tgz#1e62072cda6226297bd1497f056ed9f61a3ea2e8"
integrity sha512-cvTCekY4u0fBIDNfhv/2UxcOXqH4XJE2iNxKuQejS5KIapFJwrZ+fRQ2lha3+yopI/d2p96BlBEWTAcBzeTntw==
"@swc/core-linux-x64-musl@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.3.tgz#452ee7745aafe5cff5eeee5ee7c5cd748285451d"
integrity sha512-h9kUOTrSSpY9JNc41a+NMAwK62USk/pvNE9Fi/Pfoklmlf9j9j8gRCitqvHpmZcEF4PPIsoMdiGetDipTwvWlw==
"@swc/core-win32-arm64-msvc@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.3.tgz#461f88d5ef8af95a5462acb8371e41d7b9718d13"
integrity sha512-iHOmLYkZYn3r1Ff4rfyczdrYGt/wVIWyY0t8swsO9o1TE+zmucGFZuYZzgj3ng8Kp4sojJrydAGz8TINQZDBzQ==
"@swc/core-win32-ia32-msvc@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.3.tgz#18268542f1becc79fce13c22c964763128d10fed"
integrity sha512-4SqLSE4Ozh8SxuVuHIZhkSyJQru5+WbQMRs5ggLRqeUy3vkUPHOAFAY3oMwDJUN6BwbAr8+664TmdrMwaWh8Ng==
"@swc/core-win32-x64-msvc@1.10.3":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.3.tgz#235c62f53fdc74c84ed6cb41e8e43ef3960b2032"
integrity sha512-jTyf/IbNq7NVyqqDIEDzgjALjWu1IMfXKLXXAJArreklIMzkfHU1sV32ZJLOBmRKPyslCoalxIAU+hTx4reUTQ==
"@swc/core@^1.7.0":
version "1.10.3"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.10.3.tgz#d263db1f6575568ba2e85fda6b6f2a7e369f0e1e"
integrity sha512-2yjqCcsBx6SNBQZIYNlwxED9aYXW/7QBZyr8LYAxTx5bzmoNhKiClYbsNLe1NJ6ccf5uSbcInw12PjXLduNEdQ==
dependencies:
"@swc/counter" "^0.1.3"
"@swc/types" "^0.1.17"
optionalDependencies:
"@swc/core-darwin-arm64" "1.10.3"
"@swc/core-darwin-x64" "1.10.3"
"@swc/core-linux-arm-gnueabihf" "1.10.3"
"@swc/core-linux-arm64-gnu" "1.10.3"
"@swc/core-linux-arm64-musl" "1.10.3"
"@swc/core-linux-x64-gnu" "1.10.3"
"@swc/core-linux-x64-musl" "1.10.3"
"@swc/core-win32-arm64-msvc" "1.10.3"
"@swc/core-win32-ia32-msvc" "1.10.3"
"@swc/core-win32-x64-msvc" "1.10.3"
"@swc/counter@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
"@swc/types@^0.1.17":
version "0.1.17"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.17.tgz#bd1d94e73497f27341bf141abdf4c85230d41e7c"
integrity sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==
dependencies:
"@swc/counter" "^0.1.3"
"@tsconfig/node20@^20.1.4": "@tsconfig/node20@^20.1.4":
version "20.1.4" version "20.1.4"
resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.4.tgz#3457d42eddf12d3bde3976186ab0cd22b85df928" resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.4.tgz#3457d42eddf12d3bde3976186ab0cd22b85df928"
@@ -2838,7 +2752,6 @@ three-mesh-bvh@^0.8.3:
"three-orientation-gizmo@https://github.com/jrj2211/three-orientation-gizmo": "three-orientation-gizmo@https://github.com/jrj2211/three-orientation-gizmo":
version "1.1.0" version "1.1.0"
uid "000281f0559c316f72cdd23a1885d63ae6901095"
resolved "https://github.com/jrj2211/three-orientation-gizmo#000281f0559c316f72cdd23a1885d63ae6901095" resolved "https://github.com/jrj2211/three-orientation-gizmo#000281f0559c316f72cdd23a1885d63ae6901095"
dependencies: dependencies:
three "^0.125.0" three "^0.125.0"
@@ -2914,11 +2827,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
uuid@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==
validate-npm-package-license@^3.0.4: validate-npm-package-license@^3.0.4:
version "3.0.4" version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -2932,15 +2840,6 @@ validate-npm-package-name@^6.0.0:
resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz#3add966c853cfe36e0e8e6a762edd72ae6f1d6ac" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz#3add966c853cfe36e0e8e6a762edd72ae6f1d6ac"
integrity sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg== integrity sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==
vite-plugin-top-level-await@^1.4.4:
version "1.4.4"
resolved "https://registry.yarnpkg.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz#4900e06bfb7179de20aaa9b4730d04022a9e259e"
integrity sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw==
dependencies:
"@rollup/plugin-virtual" "^3.0.2"
"@swc/core" "^1.7.0"
uuid "^10.0.0"
vite@^6.0.0: vite@^6.0.0:
version "6.0.6" version "6.0.6"
resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.6.tgz#a851674fcff55b0c1962f72082354b8802e48505" resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.6.tgz#a851674fcff55b0c1962f72082354b8802e48505"