wip: clicking experience launches webxr client

This commit is contained in:
Leon van Kammen 2025-10-03 17:21:58 +02:00
parent ef5368a5a8
commit 28e4082844
24 changed files with 972 additions and 240 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
node_modules
manyfold/usr
manyfold/.env

View file

@ -4,7 +4,7 @@
![](https://i.imgur.com/0NA7MMg.png)
* View [index.html](https://coderofsalvation.codeberg.page/xrforge/) for the official docs
* View [index.html](https://coderofsalvation.codeberg.page/xrforge) for the official docs
* Click [here](manyfold/README.md) for backend-installation instructions.
Powered by:

1
clients/webxr Symbolic link
View file

@ -0,0 +1 @@
../manyfold/usr/src/app/public/webxr

View file

@ -1,49 +0,0 @@
import * as xrforge from './plugin.xrforge.js';
import * as level0 from 'xrf/level0';
const widget = new Proxy({
backend: null,
player: document.querySelector("#player"),
src: document.location.search.substr(1),
ext: {},
init(opts){
for( var i in opts) this[i] = opts[i]
},
play(){
// set URL
player.setAttribute("gltf-model", `url(${widget.src})` )
document.querySelector("#btn_play").style.display = 'none'
let script = document.createElement("script")
script.src = "https://aframe.io/releases/1.7.0/aframe.min.js"
document.head.appendChild(script)
script = document.createElement("script")
script.src = "backend.xrforge.js"
document.head.appendChild(script)
}
},
{
get(me,k){ return me[k] },
set(me,k,v){
me[k] = v
return true
}
})
xrforge.init(widget)
//level0.init(widget)
document.querySelector("#btn_play").addEventListener("click", () => widget.play() )
//document.body.style.background = `url(${src.replace( /\.(glb|usdz|gltf|obj|col)$/ , ".png")})`

View file

@ -1,44 +0,0 @@
<!-- Saved from local source at 2025-10-03T11:36:27Z using monolith v2.10.1 -->
<!DOCTYPE html><html><head>
<style type="text/css">
body{
background: #555;
height: 100%;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
}
img#btn_play:hover {
opacity: 1;
}
img#btn_play {
position: fixed;
top: 50%;
left: 50%;
width:30.000002%;
max-width:400px;
transform: translate(-50%,-50%);
cursor: pointer;
opacity: 0.6;
transition: 0.3s;
z-index: 999;
}
</style>
<script type="module" crossorigin="" src="data:module;base64,Ly8gdmlld2VyL3BsdWdpbi54cmZvcmdlLmpzCmZ1bmN0aW9uIGluaXQod2lkZ2V0MikgewogIGluZmVyU291cmNlKHdpZGdldDIuc3JjKTsKfQphc3luYyBmdW5jdGlvbiBpbmZlclNvdXJjZShzcmMpIHsKICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHNyYywgewogICAgbWV0aG9kOiAiSEVBRCIKICB9KTsKICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgfQogIGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJDb250ZW50LURpc3Bvc2l0aW9uIik7CiAgY29uc29sZS5sb2cod2lkZ2V0LnNyYyk7CiAgd2lkZ2V0LnNyYyA9IGV4dHJhY3RGaWxlbmFtZShjb250ZW50RGlzcG9zaXRpb24pOwogIGNvbnNvbGUubG9nKCJkZXRlY3RlZDogIiArIHdpZGdldC5zcmMpOwp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZShjb250ZW50RGlzcG9zaXRpb25IZWFkZXIpIHsKICBjb25zdCB1dGY4TWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb25IZWFkZXIubWF0Y2goL2ZpbGVuYW1lXCo9KD86dXRmLTh8VVRGLTgpJycoLis/KSg/Ojt8JCkvaSk7CiAgaWYgKHV0ZjhNYXRjaCAmJiB1dGY4TWF0Y2hbMV0pIHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXRmOE1hdGNoWzFdLnRyaW0oKSk7CiAgfQogIGNvbnN0IGJhc2ljTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb25IZWFkZXIubWF0Y2goL2ZpbGVuYW1lPSIoLis/KSIvaSk7CiAgaWYgKGJhc2ljTWF0Y2ggJiYgYmFzaWNNYXRjaFsxXSkgewogICAgcmV0dXJuIGJhc2ljTWF0Y2hbMV0udHJpbSgpOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gdmlld2VyL2luZGV4LmpzCnZhciB3aWRnZXQyID0gbmV3IFByb3h5KHsKICBiYWNrZW5kOiBudWxsLAogIHBsYXllcjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3BsYXllciIpLAogIHNyYzogZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKSwKICBleHQ6IHt9LAogIGluaXQob3B0cykgewogICAgZm9yICh2YXIgaSBpbiBvcHRzKQogICAgICB0aGlzW2ldID0gb3B0c1tpXTsKICB9LAogIHBsYXkoKSB7CiAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCJnbHRmLW1vZGVsIiwgYHVybCgke3dpZGdldDIuc3JjfSlgKTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNidG5fcGxheSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBsZXQgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JpcHQuc3JjID0gImh0dHBzOi8vYWZyYW1lLmlvL3JlbGVhc2VzLzEuNy4wL2FmcmFtZS5taW4uanMiOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JpcHQuc3JjID0gImJhY2tlbmQueHJmb3JnZS5qcyI7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgfQp9LCB7CiAgZ2V0KG1lLCBrKSB7CiAgICByZXR1cm4gbWVba107CiAgfSwKICBzZXQobWUsIGssIHYpIHsKICAgIG1lW2tdID0gdjsKICAgIHJldHVybiB0cnVlOwogIH0KfSk7CmluaXQod2lkZ2V0Mik7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNidG5fcGxheSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gd2lkZ2V0Mi5wbGF5KCkpOwo="></script><meta name="robots" content="none"></meta></head>
<body>
<img id="btn_play" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTguNzUyIDU4Ljc1MiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTguNzUyIDU4Ljc1MjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggc3Ryb2tlPSIjQ0NDIiBzdHJva2Utb3BhY2l0eT0iMC41IiBmaWxsPSJ3aGl0ZSIgZD0iTTUyLjUyNCwyMy45MjVMMTIuNTA3LDAuODI0Yy0xLjkwNy0xLjEtNC4zNzYtMS4wOTctNi4yNzYsMEM0LjI5MywxLjk0LDMuMDg4LDQuMDI1LDMuMDg4LDYuMjY0djQ2LjIwNQ0KCQljMCwyLjI0LDEuMjA0LDQuMzI1LDMuMTMxLDUuNDM1YzAuOTUzLDAuNTU1LDIuMDQyLDAuODQ4LDMuMTQ5LDAuODQ4YzEuMTA0LDAsMi4xOTItMC4yOTIsMy4xNDEtMC44NDNsNDAuMDE3LTIzLjEwMw0KCQljMS45MzYtMS4xMTksMy4xMzgtMy4yMDMsMy4xMzgtNS40MzlDNTUuNjYzLDI3LjEzNCw1NC40NjIsMjUuMDUsNTIuNTI0LDIzLjkyNXogTTQ5LjUyNCwyOS42MTJMOS41MDQsNTIuNzE2DQoJCWMtMC4wODIsMC4wNDctMC4xOCwwLjA1Mi0wLjI3OS0wLjAwNWMtMC4wODQtMC4wNDktMC4xMzctMC4xNDItMC4xMzctMC4yNDJWNi4yNjNjMC0wLjEsMC4wNTItMC4xOTIsMC4xNC0wLjI0Mw0KCQljMC4wNDItMC4wMjUsMC4wOS0wLjAzOCwwLjEzOS0wLjAzOGMwLjA1MSwwLDAuMDk5LDAuMDEzLDAuMTQyLDAuMDM4bDQwLjAxLDIzLjA5OGMwLjA4OSwwLjA1MiwwLjE0NSwwLjE0NywwLjE0NSwwLjI0OQ0KCQlDNDkuNjYzLDI5LjQ3LDQ5LjYxMSwyOS41NjEsNDkuNTI0LDI5LjYxMnoiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K">
<a-scene>
<a-entity id="player" animation-mixer_disabled="" gltf-model=""></a-entity>
</a-scene>
</body></html>

View file

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
background: #555;
height: 100%;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
}
img#btn_play:hover {
opacity: 1.0;
}
img#btn_play {
position: fixed;
top: 50%;
left: 50%;
width:30%;
max-width:400px;
transform: translate(-50%,-50%);
cursor: pointer;
opacity: 0.6;
transition: 0.3s;
z-index: 999;
}
</style>
<script type="module" crossorigin src="./xrforge-gent5bnt.js"></script></head>
<body>
<img id="btn_play" src="./play-c89r1cs1.svg" />
<a-scene>
<a-entity id="player" animation-mixer_disabled gltf-model></a-entity>
</a-scene>
</body>
</html>

View file

@ -1,28 +0,0 @@
{
"name": "webxr",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "webxr",
"version": "1.0.0",
"license": "AGPL3",
"dependencies": {
"xrf": "^0.0.1"
}
},
"../../../xrfragment/xrf.js": {
"name": "xrf",
"version": "0.0.1",
"extraneous": true,
"license": "MIT"
},
"node_modules/xrf": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/xrf/-/xrf-0.0.1.tgz",
"integrity": "sha512-uYa8M73z45DRTymga+48gTDEeur+iM3jPktVBnaOHopb17VvZxJ6yZy6TAhMURMrliHB48mYUUSC5J5NRF8wZA==",
"license": "MIT"
}
}
}

View file

@ -1,15 +0,0 @@
{
"name": "webxr",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"build": "npm run build-xrforge",
"build-xrforge": "mkdir -p dist/xrforge && bun build --outdir=dist/xrforge xrforge.html && monolith dist/xrforge/xrforge.html --output dist/xrforge.html"
},
"author": "Leon van Kammen",
"license": "",
"description": "",
"dependencies": {
"xrf": "^0.0.1"
}
}

View file

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
background: #555;
height: 100%;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
}
img#btn_play:hover {
opacity: 1.0;
}
img#btn_play {
position: fixed;
top: 50%;
left: 50%;
width:30%;
max-width:400px;
transform: translate(-50%,-50%);
cursor: pointer;
opacity: 0.6;
transition: 0.3s;
z-index: 999;
}
</style>
</head>
<body>
<img id="btn_play" src="viewer/play.svg"/>
<a-scene>
<a-entity id="player" animation-mixer_disabled gltf-model></a-entity>
</a-scene>
<script type="module" src="aframe/index.js"></script>
</body>
</html>

View file

@ -51,6 +51,7 @@ $ manyfold/cli/manyfold run -v ./experiences:/mnt/experiences
| `APPNAME` | `manyfold` | manyfold instance name |
| `HOMEPAGE` | `/models` | show '/models' URL as homepage (use `/` for manyfold default) |
| `THEME` | `default` | bootstrap theme |
| `AFRAME_VERSION` | `1.7.0` | AFRAME version |
| `GODOT_VERSION` | `4.4.1-stable`| godot editor version |
| `GODOT_TEMPLATE_ZIP` | `` | godot template zip URL or file (default is empty godot project) |
| `RUNTESTS` | `0` | set to `1` to run XRForge related [/test](test) scripts |

View file

@ -1,10 +1,10 @@
#!/bin/sh
oci=$(which podman || which docker)
test -n "$APPNAME" || APPNAME=xrforge
test -n "$UPLOAD_PATH" || UPLOAD_PATH=/mnt/experiences
test -n "$THEME" || THEME=slate
test -n "$HOMEPAGE" || HOMEPAGE=/models
test -n "$GODOT_VERSION" || GODOT_VERSION=4.4.1-stable
test -n "$APPNAME" || export APPNAME=xrforge
test -n "$UPLOAD_PATH" || export UPLOAD_PATH=/mnt/experiences
test -n "$THEME" || export THEME=slate
test -n "$HOMEPAGE" || export HOMEPAGE=/models
test -n "$GODOT_VERSION" || export GODOT_VERSION=4.4.1-stable
db=/config/manyfold.sqlite3
# utility funcs

View file

@ -0,0 +1,20 @@
#!/bin/sh
test -z "$AFRAME_VERSION" && exit 0 # nothing to do
mkdir /usr/src/app/public/aframe || true
wget "https://aframe.io/releases/${AFRAME_VERSION}/aframe.min.js" -O /usr/src/app/public/aframe/aframe.min.js
test -f /usr/src/app/public/aframe/index.html || echo '<html>
<head>
<script src="/aframe/aframe.min.js"></script>
</head>
<body>
<a-scene>
<a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
<a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
<a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
<a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
<a-sky color="#ECECEC"></a-sky>
</a-scene>
</body>
</html>
' > /usr/src/app/public/aframe/index.html

File diff suppressed because one or more lines are too long

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
background: #555;
height: 100%;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
}
img#btn_play:hover {
opacity: 1.0;
}
img#btn_play {
position: fixed;
top: 50%;
left: 50%;
width:30%;
max-width:400px;
transform: translate(-50%,-50%);
cursor: pointer;
opacity: 0.6;
transition: 0.3s;
z-index: 999;
}
</style>
<script type="module" crossorigin src="./xrforge-r929vkvh.js"></script></head>
<body>
<img id="btn_play" src="./play-c89r1cs1.svg" />
<a-scene>
<a-entity id="scene" animation-mixer_disabled gltf-model></a-entity>
<a-entity id="player" movement-controls touch-controls="axis:y" wasd-controls="fly:true" look-controls="magicWindowTrackingEnabled:true">
<a-entity camera="fov:90" position="0 1.6 0" id="camera"></a-entity>
<a-entity id="left-hand" hand-tracking-grab-controls="hand:left;modelColor:#cccccc" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
<a-entity id="right-hand" hand-tracking-grab-controls="hand:right;modelColor:#cccccc" laser-controls="hand: right" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
</a-entity>
</a-scene>
</body>
</html>

View file

@ -0,0 +1,11 @@
import * as level0 from 'xrf/level0';
function init(){
let file = document.location.search.substr(1)
import('aframe') // window.AFRAME will be exposed
}
export {init}
//level0.init(widget)

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,10 +1,6 @@
function init(widget){
inferSource(widget.src)
}
async function inferSource(src){
response = await fetch(src, {
let response = await fetch(src, {
method: 'HEAD'
});
@ -13,15 +9,18 @@ async function inferSource(src){
}
// 1. Get the Content-Disposition header value
contentDisposition = response.headers.get('Content-Disposition');
let contentDisposition = response.headers.get('Content-Disposition');
// 2. Process the value to extract the filename
console.log(widget.src)
widget.src = extractFilename(contentDisposition)
console.log("detected: "+widget.src)
let file = extractFilename(contentDisposition)
let srcParts = src.split("/")
srcParts.pop()
srcParts.push(file)
return srcParts.join("/")
}
function extractFilename(contentDispositionHeader) {
if( !contentDispositionHeader ) return ""
// Check for the preferred 'filename*' (UTF-8 encoded)
// This looks for 'filename*=' followed by the encoding and the filename
const utf8Match = contentDispositionHeader.match(/filename\*=(?:utf-8|UTF-8)''(.+?)(?:;|$)/i);
@ -41,4 +40,4 @@ function extractFilename(contentDispositionHeader) {
return null;
}
export { init };
export { inferSource };

View file

@ -0,0 +1,754 @@
{
"name": "webxr",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "webxr",
"version": "1.0.0",
"dependencies": {
"aframe": "^1.7.1",
"xrf": "^0.0.1"
}
},
"../../../xrfragment/xrf.js": {
"name": "xrf",
"version": "0.0.1",
"extraneous": true,
"license": "MIT"
},
"node_modules/@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"license": "MIT",
"dependencies": {
"defer-to-connect": "^1.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/aframe": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/aframe/-/aframe-1.7.1.tgz",
"integrity": "sha512-dcc7PWI5z8pyJ0s2W0mUd8d83339frgMXhUvWr1yxkdgg6zSExkuQwsSJjiNn7XWKMUUqKYDvV/WzQQRA+OBXA==",
"license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"debug": "^4.3.4",
"deep-assign": "^2.0.0",
"load-bmfont": "^1.2.3",
"super-animejs": "^3.1.0",
"three": "npm:super-three@0.173.5",
"three-bmfont-text": "github:dmarcos/three-bmfont-text#eed4878795be9b3e38cf6aec6b903f56acd1f695"
},
"engines": {
"node": ">= 4.6.0",
"npm": ">= 2.15.9"
}
},
"node_modules/an-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz",
"integrity": "sha512-M175GYI7RmsYu24Ok383yZQa3eveDfNnmhTe3OQ3bm70bEovz2gWenH+ST/n32M8lrwLWk74hcPds5CDRPe2wg==",
"license": "MIT"
},
"node_modules/array-shuffle": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-shuffle/-/array-shuffle-1.0.1.tgz",
"integrity": "sha512-PBqgo1Y2XWSksBzq3GFPEb798ZrW2snAcmr4drbVeF/6MT/5aBlkGJEvu5A/CzXHf4EjbHOj/ZowatjlIiVidA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/as-number": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/as-number/-/as-number-1.0.0.tgz",
"integrity": "sha512-HkI/zLo2AbSRO4fqVkmyf3hms0bJDs3iboHqTrNuwTiCRvdYXM7HFhfhB6Dk51anV2LM/IMB83mtK9mHw4FlAg==",
"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/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-equal": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
"integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"license": "MIT",
"dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cacheable-request/node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-request/node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/centra": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz",
"integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6"
}
},
"node_modules/clone-response": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"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/decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/deep-assign": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz",
"integrity": "sha512-2QhG3Kxulu4XIF3WL5C5x0sc/S17JLgm1SfvDfIRsR/5m7ZGmcejII7fZ2RyWhN0UWIJm0TNM/eKow6LAn3evQ==",
"license": "MIT",
"dependencies": {
"is-obj": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"license": "MIT"
},
"node_modules/dom-walk": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
},
"node_modules/dtype": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
"integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==",
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/duplexer3": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
"integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
"license": "BSD-3-Clause"
},
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/end-of-stream/node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"license": "MIT",
"dependencies": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"node_modules/got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/http-cache-semantics": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"license": "BSD-2-Clause"
},
"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/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"license": "MIT"
},
"node_modules/is-function": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
"integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
"license": "MIT"
},
"node_modules/is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
"license": "MIT"
},
"node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.0"
}
},
"node_modules/layout-bmfont-text": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/layout-bmfont-text/-/layout-bmfont-text-1.3.4.tgz",
"integrity": "sha512-mceomHZ8W7pSKQhTdLvOe1Im4n37u8xa5Gr0J3KPCHRMO/9o7+goWIOzZcUUd+Xgzy3+22bvoIQ0OaN3LRtgaw==",
"license": "MIT",
"dependencies": {
"as-number": "^1.0.0",
"word-wrapper": "^1.0.7",
"xtend": "^4.0.0"
}
},
"node_modules/load-bmfont": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz",
"integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==",
"license": "MIT",
"dependencies": {
"buffer-equal": "0.0.1",
"mime": "^1.3.4",
"parse-bmfont-ascii": "^1.0.3",
"parse-bmfont-binary": "^1.0.5",
"parse-bmfont-xml": "^1.1.4",
"phin": "^3.7.1",
"xhr": "^2.0.1",
"xtend": "^4.0.0"
}
},
"node_modules/lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/map-limit": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
"integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
"license": "MIT",
"dependencies": {
"once": "~1.3.0"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"license": "MIT",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
"integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
"dependencies": {
"dom-walk": "^0.1.0"
}
},
"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/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/new-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/new-array/-/new-array-1.0.0.tgz",
"integrity": "sha512-K5AyFYbuHZ4e/ti52y7k18q8UHsS78FlRd85w2Fmsd6AkuLipDihPflKC0p3PN5i8II7+uHxo+CtkLiJDfmS5A==",
"license": "MIT"
},
"node_modules/nice-color-palettes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/nice-color-palettes/-/nice-color-palettes-3.0.0.tgz",
"integrity": "sha512-lL4AjabAAFi313tjrtmgm/bxCRzp4l3vCshojfV/ij3IPdtnRqv6Chcw+SqJUhbe7g3o3BecaqCJYUNLswGBhQ==",
"license": "MIT",
"dependencies": {
"got": "^9.2.2",
"map-limit": "0.0.1",
"minimist": "^1.2.0",
"new-array": "^1.0.0"
},
"bin": {
"nice-color-palettes": "bin/index.js"
}
},
"node_modules/normalize-url": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/once": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
"integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/parse-bmfont-ascii": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
"integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
"license": "MIT"
},
"node_modules/parse-bmfont-binary": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
"integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
"license": "MIT"
},
"node_modules/parse-bmfont-xml": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
"integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
"license": "MIT",
"dependencies": {
"xml-parse-from-string": "^1.0.0",
"xml2js": "^0.5.0"
}
},
"node_modules/parse-headers": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz",
"integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==",
"license": "MIT"
},
"node_modules/phin": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz",
"integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==",
"license": "MIT",
"dependencies": {
"centra": "^2.7.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"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/pump": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/quad-indices": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/quad-indices/-/quad-indices-2.0.1.tgz",
"integrity": "sha512-6jtmCsEbGAh5npThXrBaubbTjPcF0rMbn57XCJVI7LkW8PUT56V+uIrRCCWCn85PSgJC9v8Pm5tnJDwmOBewvA==",
"license": "MIT",
"dependencies": {
"an-array": "^1.0.0",
"dtype": "^2.0.0",
"is-buffer": "^1.0.2"
}
},
"node_modules/responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
"license": "MIT",
"dependencies": {
"lowercase-keys": "^1.0.0"
}
},
"node_modules/sax": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
"license": "ISC"
},
"node_modules/super-animejs": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/super-animejs/-/super-animejs-3.1.0.tgz",
"integrity": "sha512-6MFAFJDRuvwkovxQZPruuyHinTa4rgj4hNLOndjcYYhZLckoXtVRY9rJPuq8p6c/tgZJrFYEAYAfJ2/hhNtUCA==",
"license": "MIT"
},
"node_modules/three": {
"name": "super-three",
"version": "0.173.5",
"resolved": "https://registry.npmjs.org/super-three/-/super-three-0.173.5.tgz",
"integrity": "sha512-ecjojbhUg/5QrixwqF4s6gvtJap9XQz7TcnFUX/J8Yosgb2eE2ZUqsyqr/JczFG//6hwIaZPeAa9M5DNaM1dmQ==",
"license": "MIT"
},
"node_modules/three-bmfont-text": {
"version": "3.0.0",
"resolved": "git+ssh://git@github.com/dmarcos/three-bmfont-text.git#eed4878795be9b3e38cf6aec6b903f56acd1f695",
"integrity": "sha512-FDlyR8SyHQ0Ek38qBx5Hg/AwPuBI/1w/QWpMgzw19Vn81xsDNFTOXJpU0HcvI78C72wwXjJ3T7+EX7k2geDV4Q==",
"license": "MIT",
"dependencies": {
"array-shuffle": "^1.0.1",
"layout-bmfont-text": "^1.2.0",
"nice-color-palettes": "^3.0.0",
"quad-indices": "^2.0.1"
}
},
"node_modules/to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
"integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
"license": "MIT",
"dependencies": {
"prepend-http": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/word-wrapper": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/word-wrapper/-/word-wrapper-1.0.7.tgz",
"integrity": "sha512-VOPBFCm9b6FyYKQYfn9AVn2dQvdR/YOVFV6IBRA1TBMJWKffvhEX1af6FMGrttILs2Q9ikCRhLqkbY2weW6dOQ==",
"license": "MIT"
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/xhr": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
"integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
"license": "MIT",
"dependencies": {
"global": "~4.4.0",
"is-function": "^1.0.1",
"parse-headers": "^2.0.0",
"xtend": "^4.0.0"
}
},
"node_modules/xml-parse-from-string": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
"integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
"license": "MIT"
},
"node_modules/xml2js": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"license": "MIT",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"license": "MIT",
"engines": {
"node": ">=4.0"
}
},
"node_modules/xrf": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/xrf/-/xrf-0.0.1.tgz",
"integrity": "sha512-uYa8M73z45DRTymga+48gTDEeur+iM3jPktVBnaOHopb17VvZxJ6yZy6TAhMURMrliHB48mYUUSC5J5NRF8wZA==",
"license": "MIT"
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"license": "MIT",
"engines": {
"node": ">=0.4"
}
}
}
}

View file

@ -0,0 +1,16 @@
{
"name": "webxr",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"build": "echo -e \"hint: pass bun args via: BARG='--minify' npm run build'\n\n\" && BARG=$BARG npm run build-xrforge",
"build-xrforge": "mkdir -p dist/xrforge && bun build ${BARG} --outdir=dist/xrforge xrforge.html && monolith dist/xrforge/xrforge.html --output dist/xrforge.html && sed -i 's|data:module|data:text/javascript;|g' dist/xrforge.html # https://github.com/Y2Z/monolith/issues/474 "
},
"author": "Leon van Kammen",
"license": "",
"description": "",
"dependencies": {
"aframe": "^1.7.1",
"xrf": "^0.0.1"
}
}

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
background: #555;
height: 100%;
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
}
img#btn_play:hover {
opacity: 1.0;
}
img#btn_play {
position: fixed;
top: 50%;
left: 50%;
width:30%;
max-width:400px;
transform: translate(-50%,-50%);
cursor: pointer;
opacity: 0.6;
transition: 0.3s;
z-index: 999;
}
</style>
</head>
<body>
<img id="btn_play" src="lib/assets/play.svg"/>
<a-scene>
<a-entity id="scene" animation-mixer_disabled gltf-model></a-entity>
<a-entity id="player" movement-controls touch-controls="axis:y" wasd-controls="fly:true" look-controls="magicWindowTrackingEnabled:true">
<a-entity camera="fov:90" position="0 1.6 0" id="camera"></a-entity>
<a-entity id="left-hand" hand-tracking-grab-controls="hand:left;modelColor:#cccccc" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
<a-entity id="right-hand" hand-tracking-grab-controls="hand:right;modelColor:#cccccc" laser-controls="hand: right" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
</a-entity>
</a-scene>
<script type="module" src="lib/xrforge/index.js"></script>
</body>
</html>