Merge remote-tracking branch 'origin/main' into dev-merge

This commit is contained in:
bd_ 2023-04-15 18:16:07 +09:00
commit a910fa5c05
41 changed files with 1315 additions and 538 deletions

View File

@ -9,3 +9,7 @@ updates:
directory: "/docs" # Location of package manifests directory: "/docs" # Location of package manifests
schedule: schedule:
interval: "weekly" interval: "weekly"
- package-ecosystem: "github-actions"
schedule:
interval: "weekly"
directory: .github/workflows

View File

@ -34,7 +34,7 @@ jobs:
- name: get version - name: get version
id: version id: version
uses: notiz-dev/github-action-json-property@7c8cf5cc36eb85d8d287a8086a39dac59628eb31 uses: notiz-dev/github-action-json-property@a5a9c668b16513c737c3e1f8956772c99c73f6e8
with: with:
path: "Packages/${{env.packageName}}/package.json" path: "Packages/${{env.packageName}}/package.json"
prop_path: "version" prop_path: "version"
@ -55,7 +55,7 @@ jobs:
echo "unityPackage=${{ env.packageName }}-${{ steps.version.outputs.prop }}.unitypackage" >> $GITHUB_ENV echo "unityPackage=${{ env.packageName }}-${{ steps.version.outputs.prop }}.unitypackage" >> $GITHUB_ENV
- name: Create Zip - name: Create Zip
uses: thedoctor0/zip-release@09336613be18a8208dfa66bd57efafd9e2685657 uses: thedoctor0/zip-release@a24011d8d445e4da5935a7e73c1f98e22a439464
with: with:
type: "zip" type: "zip"
directory: "Packages/${{env.packageName}}/" directory: "Packages/${{env.packageName}}/"
@ -70,7 +70,7 @@ jobs:
include-files: metaList include-files: metaList
- name: Make Release - name: Make Release
uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
with: with:
draft: true draft: true

View File

@ -1,8 +1,21 @@
name: Build documentation name: Build documentation
on: on:
pull_request: pull_request:
workflow_call: workflow_call:
inputs:
ref:
description: 'commit to build'
type: string
required: false
path:
description: 'path within the docs pages to build to'
type: string
required: false
artifact:
description: 'artifact name to write'
type: string
required: false
jobs: jobs:
build-docs: build-docs:
@ -13,6 +26,11 @@ jobs:
with: with:
node-version: 18 node-version: 18
- uses: actions/checkout@v3 # check out this repo - uses: actions/checkout@v3 # check out this repo
if: ${{ !inputs.ref }}
- uses: actions/checkout@v3 # check out the repo we're building docs for
if: ${{ inputs.ref }}
with:
ref: ${{ inputs.ref }}
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
repository: bdunderscore/modular-avatar-images repository: bdunderscore/modular-avatar-images
@ -38,15 +56,27 @@ jobs:
restore-keys: | restore-keys: |
${{ runner.os }}-yarn- ${{ runner.os }}-yarn-
- name: Set baseUri
if: ${{ inputs.path }}
run: |
BASEURL="/${{ inputs.path }}/" perl -i -p -e "s{baseUrl: '/'}{baseUrl: '\$ENV{BASEURL}'}" docs/docusaurus.config.js
cat docs/docusaurus.config.js
- name: Build docs - name: Build docs
run: | run: |
cd docs cd docs
yarn install --immutable yarn install --immutable
yarn build yarn build
ls -lR build
- name: Set robots.txt
run: |
if [ -e docs/robots.txt ]; then
cp docs/robots.txt docs/build/robots.txt
fi
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v3
with: with:
name: docs name: ${{ inputs.artifact || 'docs' }}
path: docs/build path: docs/build

View File

@ -2,7 +2,9 @@ name: Deploy documentation
on: on:
push: push:
branches: branches:
- ci
- main - main
- dev
workflow_dispatch: workflow_dispatch:
permissions: permissions:
@ -18,9 +20,18 @@ jobs:
build-docs: build-docs:
name: Build documentation name: Build documentation
uses: bdunderscore/modular-avatar/.github/workflows/build-test-docs.yml@main uses: bdunderscore/modular-avatar/.github/workflows/build-test-docs.yml@main
build-docs-dev:
name: Build documentation (dev branch)
uses: bdunderscore/modular-avatar/.github/workflows/build-test-docs.yml@main
with:
ref: dev
path: dev
artifact: docs-dev
deploy-docs: deploy-docs:
name: Deploy documentation name: Deploy documentation
needs: build-docs needs:
- build-docs
- build-docs-dev
environment: environment:
name: github-pages name: github-pages
url: ${{ steps.deployment.outputs.page_url }} url: ${{ steps.deployment.outputs.page_url }}
@ -28,13 +39,22 @@ jobs:
steps: steps:
- name: Download artifact - name: Download artifact
uses: actions/download-artifact@v2 uses: actions/download-artifact@v3
with: with:
name: docs name: docs
path: docs/build path: docs/build
- name: Download artifact
uses: actions/download-artifact@v3
with:
name: docs-dev
path: docs/build/dev
- name: Dump file listing
run: |
ls -lR docs/build
- name: Setup Pages - name: Setup Pages
uses: actions/configure-pages@v2 uses: actions/configure-pages@v3
- name: Upload artifact - name: Upload artifact
uses: actions/upload-pages-artifact@v1 uses: actions/upload-pages-artifact@v1
@ -43,4 +63,4 @@ jobs:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deployment id: deployment
uses: actions/deploy-pages@v1 uses: actions/deploy-pages@v2

77
.github/workflows/gameci.yml vendored Normal file
View File

@ -0,0 +1,77 @@
# MIT License
#
# Copyright (c) 2022 anatawa12
# Copyright (c) 2022 bd_
#
# 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.
name: GameCI
on:
push:
branches: [master, dev]
# This is a bit of a radioactive event; we need to be very careful with what permissions
# we assign this action, as we're allowing arbitrary code execution with the context of
# whatever permissions we assign.
pull_request_target:
paths:
- 'Packages/**'
- 'Assets/**'
- 'ProjectSettings/**'
- '.github/workflows/gameci.yml'
workflow_dispatch: {}
# pull_request_target grants access to a privileged GITHUB_TOKEN by default, revoke this
permissions:
contents: read
checks: write
jobs:
build-and-test:
runs-on: ubuntu-latest
permissions:
checks: write
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: anatawa12/sh-actions/resolve-vpm-packages@master
- uses: game-ci/unity-test-runner@v2
id: gameci
env:
# meh, just a personal license...
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
testMode: EditMode
githubToken: ${{ github.token }}
coverageOptions: generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:+nadena.dev.*
customParameters: -nographics -assemblyNames Tests
- uses: actions/upload-artifact@v3
if: always()
with:
name: Test results
path: ${{ steps.gameci.outputs.artifactsPath }}
- uses: actions/upload-artifact@v3
if: always()
with:
name: Coverage results
path: ${{ steps.gameci.outputs.coveragePath }}

39
.github/workflows/gamici-activation.yml vendored Normal file
View File

@ -0,0 +1,39 @@
# MIT License
#
# Copyright (c) 2022 anatawa12
#
# 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.
name: GameCI Acquire activation file
on:
workflow_dispatch: {}
jobs:
activation:
name: Request manual activation file 🔑
runs-on: ubuntu-latest
steps:
# Request manual activation file
- name: Request manual activation file
id: getManualLicenseFile
uses: game-ci/unity-request-activation-file@v2
- name: Expose as artifact
uses: actions/upload-artifact@v3
with:
name: ${{ steps.getManualLicenseFile.outputs.filePath }}
path: ${{ steps.getManualLicenseFile.outputs.filePath }}

View File

@ -22,7 +22,7 @@ namespace modular_avatar_tests.AnimateAddedBones
var layerName = "merged"; var layerName = "merged";
var motion = findFxMotion(prefab, layerName); var motion = findFxClip(prefab, layerName);
var cubeObject = prefab.transform.Find("Armature/Hips").GetChild(0).gameObject; var cubeObject = prefab.transform.Find("Armature/Hips").GetChild(0).gameObject;
Assert.True(cubeObject.name.StartsWith("Cube$")); Assert.True(cubeObject.name.StartsWith("Cube$"));

View File

@ -0,0 +1,53 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: DBTP
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings: []
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 1
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 0
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves: []
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 822fa250a223d354b8f2c1e5e4a71beb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,115 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-2231289259402408727
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: merged
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 6794198557188456209}
m_Position: {x: 30, y: 220, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 6794198557188456209}
--- !u!206 &-43520952576507180
BlendTree:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blend Tree
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: 7400000, guid: 822fa250a223d354b8f2c1e5e4a71beb, type: 2}
m_Threshold: 0
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: A
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 7400000, guid: 822fa250a223d354b8f2c1e5e4a71beb, type: 2}
m_Threshold: 1
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: B
m_Mirror: 0
m_BlendParameter: Blend
m_BlendParameterY: Blend
m_MinThreshold: 0
m_MaxThreshold: 1
m_UseAutomaticThresholds: 1
m_NormalizedBlendValues: 0
m_BlendType: 4
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: DBTP
serializedVersion: 5
m_AnimatorParameters:
- m_Name: A
m_Type: 1
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: B
m_Type: 1
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: merged
m_StateMachine: {fileID: -2231289259402408727}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &6794198557188456209
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blend Tree
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -43520952576507180}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 10117b7b37cd8844c93d0c5c18929fcf
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,28 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
namespace modular_avatar_tests.DirectBlendTreeParameters
{
public class DirectBlendTreeParameters : TestBase
{
[Test]
public void RemapsDirectBlendTreeParameters()
{
var prefab = CreatePrefab("DirectBlendTreeParameters.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var layerName = "merged";
var motion = findFxMotion(prefab, layerName);
var blendTree = motion as BlendTree;
Assert.NotNull(blendTree);
var children = blendTree.children;
Assert.AreEqual(children[0].directBlendParameter, "A"); //not remapped
Assert.AreEqual(children[1].directBlendParameter, "C"); //remapped
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 355678dd0cdf4503b1b6545427ff5e8e
timeCreated: 1679719502

View File

@ -0,0 +1,390 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &358086172465847897
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4301418309833736947}
- component: {fileID: 8166779794048720401}
- component: {fileID: 3545031262107578409}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4301418309833736947
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4724854421498416451}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8166779794048720401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71a96d4ea0c344f39e277d82035bf9bd, type: 3}
m_Name:
m_EditorClassIdentifier:
parameters:
- nameOrPrefix: B
remapTo: C
internalParameter: 0
isPrefix: 0
syncType: 0
defaultValue: 0
saved: 0
--- !u!114 &3545031262107578409
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
m_Name:
m_EditorClassIdentifier:
animator: {fileID: 9100000, guid: 10117b7b37cd8844c93d0c5c18929fcf, type: 2}
layerType: 5
deleteAttachedAnimator: 0
pathMode: 0
matchAvatarWriteDefaults: 0
--- !u!1 &6524782399038551043
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4724854421498416451}
- component: {fileID: 2239338889414089943}
- component: {fileID: 3030341108566167033}
- component: {fileID: 5629002289773137650}
m_Layer: 0
m_Name: DirectBlendTreeParameters
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4724854421498416451
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 4.1121078, y: 0.04631436, z: -0.7135619}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 4301418309833736947}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2239338889414089943
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Name:
ViewPosition: {x: 0, y: 1.6, z: 0.2}
Animations: 0
ScaleIPD: 1
lipSync: 0
lipSyncJawBone: {fileID: 0}
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
VisemeSkinnedMesh: {fileID: 0}
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
VisemeBlendShapes: []
unityVersion:
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
customExpressions: 0
expressionsMenu: {fileID: 0}
expressionParameters: {fileID: 0}
enableEyeLook: 0
customEyeLookSettings:
eyeMovement:
confidence: 0.5
excitement: 0.5
leftEye: {fileID: 0}
rightEye: {fileID: 0}
eyesLookingStraight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingUp:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingDown:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingLeft:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingRight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidType: 0
upperLeftEyelid: {fileID: 0}
upperRightEyelid: {fileID: 0}
lowerLeftEyelid: {fileID: 0}
lowerRightEyelid: {fileID: 0}
eyelidsDefault:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsClosed:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingUp:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingDown:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsSkinnedMesh: {fileID: 0}
eyelidsBlendshapes:
customizeAnimationLayers: 0
baseAnimationLayers:
- isEnabled: 0
type: 0
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 4
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 5
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
specialAnimationLayers:
- isEnabled: 0
type: 6
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 7
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 8
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
AnimationPreset: {fileID: 0}
animationHashSet: []
autoFootsteps: 1
autoLocomotion: 1
collider_head:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_torso:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &3030341108566167033
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
m_Name:
m_EditorClassIdentifier:
launchedFromSDKPipeline: 0
completedSDKPipeline: 0
blueprintId:
contentType: 0
assetBundleUnityVersion:
fallbackStatus: 0
--- !u!95 &5629002289773137650
Animator:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorControllerStateOnDisable: 0

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 70484dfc143c0904cb1facfb29d5ee16
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,24 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects;
namespace modular_avatar_tests
{
public class NullSubparameterTest : TestBase
{
[Test]
public void TestNullSubparametersField()
{
VRCExpressionsMenu menu = ScriptableObject.CreateInstance<VRCExpressionsMenu>();
var root = CreateRoot("root");
var avatar = root.GetComponent<VRCAvatarDescriptor>();
avatar.expressionsMenu = menu;
// This should not throw an exception
ParameterPolicy.ProbeParameters(root);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: af0baf421bd9450d974871db9d25c2c4
timeCreated: 1681041544

View File

@ -0,0 +1,53 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
namespace modular_avatar_tests
{
public class RetargetMeshesTest : TestBase
{
// Real world case of this test case is with skinned mesh without bones or skinned mesh renderer with null mesh.
[Test]
public void RootBoneOnly()
{
var root = CreateRoot("root");
var a = CreateChild(root, "a");
var b = CreateChild(a, "b");
var skinnedMeshRenderer = root.AddComponent<SkinnedMeshRenderer>();
skinnedMeshRenderer.sharedMesh = new Mesh();
skinnedMeshRenderer.rootBone = b.transform;
Debug.Assert(skinnedMeshRenderer.bones.Length == 0);
BoneDatabase.AddMergedBone(b.transform);
var context = new BuildContext(root.GetComponent<VRCAvatarDescriptor>());
new RetargetMeshes().OnPreprocessAvatar(root, context);
Assert.AreEqual(a.transform, skinnedMeshRenderer.rootBone);
}
[Test]
public void NoMeshRootBoneOnly()
{
var root = CreateRoot("root");
var a = CreateChild(root, "a");
var b = CreateChild(a, "b");
b.transform.localScale = new Vector3(2, 2, 2);
var skinnedMeshRenderer = root.AddComponent<SkinnedMeshRenderer>();
skinnedMeshRenderer.sharedMesh = null;
skinnedMeshRenderer.localBounds = new Bounds(new Vector3(0, 0, 0), new Vector3(1, 1, 1));
skinnedMeshRenderer.rootBone = b.transform;
Debug.Assert(skinnedMeshRenderer.bones.Length == 0);
BoneDatabase.AddMergedBone(b.transform);
var context = new BuildContext(root.GetComponent<VRCAvatarDescriptor>());
new RetargetMeshes().OnPreprocessAvatar(root, context);
Assert.AreEqual(a.transform, skinnedMeshRenderer.rootBone);
Assert.AreEqual(new Bounds(new Vector3(0, 0, 0), new Vector3(2, 2, 2)),
skinnedMeshRenderer.localBounds);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0c1eeed79228433d8f9ee98d2ae852d1
timeCreated: 1679738453

View File

@ -17,7 +17,7 @@ namespace modular_avatar_tests.SimpleArmatureToggle
AvatarProcessor.ProcessAvatar(prefab); AvatarProcessor.ProcessAvatar(prefab);
var layerName = "merged"; var layerName = "merged";
var motion = findFxMotion(prefab, layerName); var motion = findFxClip(prefab, layerName);
var obj1 = prefab.transform.Find("Armature/Hips").GetChild(1); var obj1 = prefab.transform.Find("Armature/Hips").GetChild(1);
var obj2 = prefab.transform.Find("Armature/Hips/Chest").GetChild(0); var obj2 = prefab.transform.Find("Armature/Hips/Chest").GetChild(0);
@ -26,7 +26,7 @@ namespace modular_avatar_tests.SimpleArmatureToggle
typeof(GameObject), "m_IsActive"); typeof(GameObject), "m_IsActive");
var binding2 = EditorCurveBinding.FloatCurve(RuntimeUtil.AvatarRootPath(obj2.gameObject), var binding2 = EditorCurveBinding.FloatCurve(RuntimeUtil.AvatarRootPath(obj2.gameObject),
typeof(GameObject), "m_IsActive"); typeof(GameObject), "m_IsActive");
Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding1)); Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding1));
Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding2)); Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding2));
} }

View File

@ -62,15 +62,20 @@ namespace modular_avatar_tests
} }
protected static AnimationClip findFxMotion(GameObject prefab, string layerName) protected static AnimationClip findFxClip(GameObject prefab, string layerName)
{
var motion = findFxMotion(prefab, layerName) as AnimationClip;
Assert.NotNull(motion);
return motion;
}
protected static Motion findFxMotion(GameObject prefab, string layerName)
{ {
var layer = findFxLayer(prefab, layerName); var layer = findFxLayer(prefab, layerName);
var state = layer.stateMachine.states[0].state; var state = layer.stateMachine.states[0].state;
Assert.NotNull(state); Assert.NotNull(state);
var motion = state.motion as AnimationClip; return state.motion;
Assert.NotNull(motion);
return motion;
} }
protected static AnimatorState FindStateInLayer(AnimatorControllerLayer layer, string stateName) protected static AnimatorState FindStateInLayer(AnimatorControllerLayer layer, string stateName)

View File

@ -17,7 +17,7 @@ namespace modular_avatar_tests.TransformMappingThroughSwitchedObject
var prefab = CreatePrefab("TransformMappingThroughSwitchedObject.prefab"); var prefab = CreatePrefab("TransformMappingThroughSwitchedObject.prefab");
AvatarProcessor.ProcessAvatar(prefab); AvatarProcessor.ProcessAvatar(prefab);
var motion = findFxMotion(prefab, "child_controller"); var motion = findFxClip(prefab, "child_controller");
var binding = EditorCurveBinding.FloatCurve("Armature/Hips", typeof(Transform), "localEulerAnglesRaw.x"); var binding = EditorCurveBinding.FloatCurve("Armature/Hips", typeof(Transform), "localEulerAnglesRaw.x");
var curve = AnimationUtility.GetEditorCurve(motion, binding); var curve = AnimationUtility.GetEditorCurve(motion, binding);

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using UnityEditor; using UnityEditor;
using UnityEditor.UIElements; using UnityEditor.UIElements;
@ -18,7 +19,7 @@ namespace VRC.PackageManagement.PackageMaker
{ {
// VisualElements // VisualElements
private VisualElement _rootView; private VisualElement _rootView;
private TextField _targetAssetFolderField; private TextField _targetAssetFolderField;
private TextField _packageIDField; private TextField _packageIDField;
private Button _actionButton; private Button _actionButton;
private EnumField _targetVRCPackageField; private EnumField _targetVRCPackageField;
@ -31,9 +32,10 @@ namespace VRC.PackageManagement.PackageMaker
{ {
_targetAssetFolderField.SetValueWithoutNotify(_windowData.targetAssetFolder); _targetAssetFolderField.SetValueWithoutNotify(_windowData.targetAssetFolder);
} }
_packageIDField.SetValueWithoutNotify(_windowData.packageID); _packageIDField.SetValueWithoutNotify(_windowData.packageID);
_targetVRCPackageField.SetValueWithoutNotify(_windowData.relatedPackage); _targetVRCPackageField.SetValueWithoutNotify(_windowData.relatedPackage);
RefreshActionButtonState(); RefreshActionButtonState();
} }
@ -49,31 +51,35 @@ namespace VRC.PackageManagement.PackageMaker
PackageMakerWindow wnd = GetWindow<PackageMakerWindow>(); PackageMakerWindow wnd = GetWindow<PackageMakerWindow>();
wnd.titleContent = new GUIContent("Package Maker"); wnd.titleContent = new GUIContent("Package Maker");
} }
[MenuItem("Assets/Export VPM as UnityPackage")] [MenuItem("Assets/Export VPM as UnityPackage")]
private static void ExportAsUnityPackage () private static void ExportAsUnityPackage()
{ {
if (Selection.assetGUIDs.Length != 1) var foldersToExport = new List<string>();
StringBuilder exportFilename = new StringBuilder("exported");
foreach (string guid in Selection.assetGUIDs)
{ {
Debug.LogWarning($"Cannot export selection, must be a single Folder."); string selectedFolder = AssetDatabase.GUIDToAssetPath(guid);
return; var manifestPath = Path.Combine(selectedFolder, VRCPackageManifest.Filename);
} var manifest = VRCPackageManifest.GetManifestAtPath(manifestPath);
if (manifest == null)
string selectedFolder = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); {
var manifestPath = Path.Combine(selectedFolder, VRCPackageManifest.Filename); Debug.LogWarning(
var manifest = VRCPackageManifest.GetManifestAtPath(manifestPath); $"Could not read valid Package Manifest at {manifestPath}. You need to create this first to export a VPM Package.");
if (manifest == null) continue;
{ }
Debug.LogWarning($"Could not read valid Package Manifest at {manifestPath}. You need to create this first.");
return; exportFilename.Append($"-{manifest.Id}-{manifest.Version}");
foldersToExport.Add(selectedFolder);
} }
exportFilename.Append(".unitypackage");
var exportDir = Path.Combine(Directory.GetCurrentDirectory(), "Exports"); var exportDir = Path.Combine(Directory.GetCurrentDirectory(), "Exports");
Directory.CreateDirectory(exportDir); Directory.CreateDirectory(exportDir);
AssetDatabase.ExportPackage AssetDatabase.ExportPackage
( (
selectedFolder, foldersToExport.ToArray(),
Path.Combine(exportDir, $"{manifest.Id}-{manifest.Version}.unitypackage"), Path.Combine(exportDir, exportFilename.ToString()),
ExportPackageOptions.Recurse | ExportPackageOptions.Interactive ExportPackageOptions.Recurse | ExportPackageOptions.Interactive
); );
} }
@ -84,7 +90,7 @@ namespace VRC.PackageManagement.PackageMaker
{ {
_windowData = PackageMakerWindowData.GetOrCreate(); _windowData = PackageMakerWindowData.GetOrCreate();
} }
if (_rootView == null) return; if (_rootView == null) return;
if (_windowData != null) if (_windowData != null)
@ -110,7 +116,7 @@ namespace VRC.PackageManagement.PackageMaker
{ {
_windowData = PackageMakerWindowData.GetOrCreate(); _windowData = PackageMakerWindowData.GetOrCreate();
} }
_rootView = rootVisualElement; _rootView = rootVisualElement;
_rootView.name = "root-view"; _rootView.name = "root-view";
_rootView.styleSheets.Add((StyleSheet) Resources.Load("PackageMakerWindowStyle")); _rootView.styleSheets.Add((StyleSheet) Resources.Load("PackageMakerWindowStyle"));
@ -132,7 +138,7 @@ namespace VRC.PackageManagement.PackageMaker
Base = 3, Base = 3,
UdonSharp = 4, UdonSharp = 4,
} }
private VisualElement CreateTargetVRCPackageElement() private VisualElement CreateTargetVRCPackageElement()
{ {
_targetVRCPackageField = new EnumField("Related VRChat Package", VRCPackageEnum.None); _targetVRCPackageField = new EnumField("Related VRChat Package", VRCPackageEnum.None);
@ -144,7 +150,7 @@ namespace VRC.PackageManagement.PackageMaker
private void OnTargetVRCPackageChanged(ChangeEvent<Enum> evt) private void OnTargetVRCPackageChanged(ChangeEvent<Enum> evt)
{ {
_windowData.relatedPackage = (VRCPackageEnum)evt.newValue; _windowData.relatedPackage = (VRCPackageEnum) evt.newValue;
_windowData.Save(); _windowData.Save();
} }
@ -172,12 +178,13 @@ namespace VRC.PackageManagement.PackageMaker
ForceRefresh(); ForceRefresh();
} }
} }
public static void ForceRefresh () public static void ForceRefresh()
{ {
MethodInfo method = typeof( UnityEditor.PackageManager.Client ).GetMethod( "Resolve", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly ); MethodInfo method = typeof(UnityEditor.PackageManager.Client).GetMethod("Resolve",
if( method != null ) BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
method.Invoke( null, null ); if (method != null)
method.Invoke(null, null);
AssetDatabase.Refresh(); AssetDatabase.Refresh();
} }
@ -192,17 +199,19 @@ namespace VRC.PackageManagement.PackageMaker
_packageIDField = new TextField("Package ID", 255, false, false, '*'); _packageIDField = new TextField("Package ID", 255, false, false, '*');
_packageIDField.RegisterValueChangedCallback(OnPackageIDChanged); _packageIDField.RegisterValueChangedCallback(OnPackageIDChanged);
box.Add(_packageIDField); box.Add(_packageIDField);
box.Add(new Label("Lowercase letters, numbers and dots only.") box.Add(new Label("Lowercase letters, numbers and dots only.")
{ {
name="description", name = "description",
tooltip = "Standard practice is reverse domain notation like com.vrchat.packagename. Needs to be unique across VRChat, so if you don't own a domain you can try your username.", tooltip =
"Standard practice is reverse domain notation like com.vrchat.packagename. Needs to be unique across VRChat, so if you don't own a domain you can try your username.",
}); });
return box; return box;
} }
private Regex packageIdRegex = new Regex("[^a-z0-9.]"); private Regex packageIdRegex = new Regex("[^a-z0-9.]");
private void OnPackageIDChanged(ChangeEvent<string> evt) private void OnPackageIDChanged(ChangeEvent<string> evt)
{ {
if (evt.newValue != null) if (evt.newValue != null)
@ -212,6 +221,7 @@ namespace VRC.PackageManagement.PackageMaker
_windowData.packageID = newId; _windowData.packageID = newId;
_windowData.Save(); _windowData.Save();
} }
RefreshActionButtonState(); RefreshActionButtonState();
} }
@ -221,17 +231,22 @@ namespace VRC.PackageManagement.PackageMaker
{ {
name = "editor-target-box" name = "editor-target-box"
}; };
_targetAssetFolderField = new TextField("Target Folder"); _targetAssetFolderField = new TextField("Target Folder");
_targetAssetFolderField.RegisterCallback<DragEnterEvent>(OnTargetAssetFolderDragEnter, TrickleDown.TrickleDown); _targetAssetFolderField.RegisterCallback<DragEnterEvent>(OnTargetAssetFolderDragEnter,
_targetAssetFolderField.RegisterCallback<DragLeaveEvent>(OnTargetAssetFolderDragLeave, TrickleDown.TrickleDown); TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragUpdatedEvent>(OnTargetAssetFolderDragUpdated, TrickleDown.TrickleDown); _targetAssetFolderField.RegisterCallback<DragLeaveEvent>(OnTargetAssetFolderDragLeave,
_targetAssetFolderField.RegisterCallback<DragPerformEvent>(OnTargetAssetFolderDragPerform, TrickleDown.TrickleDown); TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragExitedEvent>(OnTargetAssetFolderDragExited, TrickleDown.TrickleDown); _targetAssetFolderField.RegisterCallback<DragUpdatedEvent>(OnTargetAssetFolderDragUpdated,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragPerformEvent>(OnTargetAssetFolderDragPerform,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragExitedEvent>(OnTargetAssetFolderDragExited,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterValueChangedCallback(OnTargetAssetFolderValueChanged); _targetAssetFolderField.RegisterValueChangedCallback(OnTargetAssetFolderValueChanged);
targetFolderBox.Add(_targetAssetFolderField); targetFolderBox.Add(_targetAssetFolderField);
targetFolderBox.Add(new Label("Drag and Drop an Assets Folder to Convert Above"){name="description"}); targetFolderBox.Add(new Label("Drag and Drop an Assets Folder to Convert Above") {name = "description"});
return targetFolderBox; return targetFolderBox;
} }
@ -241,7 +256,7 @@ namespace VRC.PackageManagement.PackageMaker
{ {
return !string.IsNullOrWhiteSpace(targetFolder) && AssetDatabase.IsValidFolder(targetFolder); return !string.IsNullOrWhiteSpace(targetFolder) && AssetDatabase.IsValidFolder(targetFolder);
} }
private void OnTargetAssetFolderValueChanged(ChangeEvent<string> evt) private void OnTargetAssetFolderValueChanged(ChangeEvent<string> evt)
{ {
string targetFolder = evt.newValue; string targetFolder = evt.newValue;
@ -257,7 +272,7 @@ namespace VRC.PackageManagement.PackageMaker
_targetAssetFolderField.SetValueWithoutNotify(evt.previousValue); _targetAssetFolderField.SetValueWithoutNotify(evt.previousValue);
} }
} }
private void OnTargetAssetFolderDragExited(DragExitedEvent evt) private void OnTargetAssetFolderDragExited(DragExitedEvent evt)
{ {
DragAndDrop.visualMode = DragAndDropVisualMode.None; DragAndDrop.visualMode = DragAndDropVisualMode.None;
@ -297,7 +312,7 @@ namespace VRC.PackageManagement.PackageMaker
private void OnTargetAssetFolderDragEnter(DragEnterEvent evt) private void OnTargetAssetFolderDragEnter(DragEnterEvent evt)
{ {
if (DragAndDrop.paths.Length == 1) if (DragAndDrop.paths.Length == 1)
{ {
DragAndDrop.visualMode = DragAndDropVisualMode.Copy; DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
DragAndDrop.AcceptDrag(); DragAndDrop.AcceptDrag();
} }
@ -309,9 +324,8 @@ namespace VRC.PackageManagement.PackageMaker
private void DoMigration(string corePath, string targetDir) private void DoMigration(string corePath, string targetDir)
{ {
EditorUtility.DisplayProgressBar("Migrating Package", "Creating Starter Package", 0.1f); EditorUtility.DisplayProgressBar("Migrating Package", "Creating Starter Package", 0.1f);
// Convert PackageType enum to VRC Package ID string // Convert PackageType enum to VRC Package ID string
string packageType = null; string packageType = null;
switch (_windowData.relatedPackage) switch (_windowData.relatedPackage)
@ -334,12 +348,11 @@ namespace VRC.PackageManagement.PackageMaker
Core.Utilities.CreateStarterPackage(_windowData.packageID, parentDir, packageType); Core.Utilities.CreateStarterPackage(_windowData.packageID, parentDir, packageType);
var allFiles = GetAllFiles(corePath).ToList(); var allFiles = GetAllFiles(corePath).ToList();
MoveFilesToPackageDir(allFiles, corePath, targetDir); MoveFilesToPackageDir(allFiles, corePath, targetDir);
// Clear target asset folder since it should no longer exist // Clear target asset folder since it should no longer exist
_windowData.targetAssetFolder = ""; _windowData.targetAssetFolder = "";
} }
private static IEnumerable<string> GetAllFiles(string path) private static IEnumerable<string> GetAllFiles(string path)
{ {
var excludedPaths = new List<string>() var excludedPaths = new List<string>()
@ -351,7 +364,7 @@ namespace VRC.PackageManagement.PackageMaker
s => excludedPaths.All(entry => !s.Contains(entry)) s => excludedPaths.All(entry => !s.Contains(entry))
); );
} }
public static void MoveFilesToPackageDir(List<string> files, string pathBase, string targetDir) public static void MoveFilesToPackageDir(List<string> files, string pathBase, string targetDir)
{ {
EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", 0f); EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", 0f);
@ -364,7 +377,7 @@ namespace VRC.PackageManagement.PackageMaker
EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", i / totalFiles); EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", i / totalFiles);
var file = files[i]; var file = files[i];
string simplifiedPath = file.Replace($"{pathBase}\\", ""); string simplifiedPath = file.Replace($"{pathBase}\\", "");
string dest = null; string dest = null;
if (simplifiedPath.Contains("Editor\\")) if (simplifiedPath.Contains("Editor\\"))
{ {
@ -389,11 +402,11 @@ namespace VRC.PackageManagement.PackageMaker
continue; continue;
} }
} }
Directory.Delete(pathBase, true); // cleans up leftover folders since only files are moved Directory.Delete(pathBase, true); // cleans up leftover folders since only files are moved
EditorUtility.ClearProgressBar(); EditorUtility.ClearProgressBar();
} }
// Important while we're doing copy-and-rename in order to rename paths with "Assets" without renaming paths with "Sample Assets" // Important while we're doing copy-and-rename in order to rename paths with "Assets" without renaming paths with "Sample Assets"
public static string ReplaceFirst(string text, string search, string replace) public static string ReplaceFirst(string text, string search, string replace)
{ {
@ -408,5 +421,4 @@ namespace VRC.PackageManagement.PackageMaker
#endregion #endregion
} }
} }

View File

@ -11,16 +11,17 @@ using UnityEngine;
using VRC.PackageManagement.Core; using VRC.PackageManagement.Core;
using VRC.PackageManagement.Core.Types; using VRC.PackageManagement.Core.Types;
using VRC.PackageManagement.Core.Types.Packages; using VRC.PackageManagement.Core.Types.Packages;
using Version = VRC.PackageManagement.Core.Types.VPMVersion.Version;
namespace VRC.PackageManagement.Resolver namespace VRC.PackageManagement.Resolver
{ {
[InitializeOnLoad] [InitializeOnLoad]
public class Resolver public class Resolver
{ {
private const string _projectLoadedKey = "PROJECT_LOADED"; private const string _projectLoadedKey = "PROJECT_LOADED";
private static string _projectDir; private static string _projectDir;
public static string ProjectDir public static string ProjectDir
{ {
get get
@ -67,7 +68,7 @@ namespace VRC.PackageManagement.Resolver
private static async Task CheckResolveNeeded() private static async Task CheckResolveNeeded()
{ {
SessionState.SetBool(_projectLoadedKey, true); SessionState.SetBool(_projectLoadedKey, true);
//Wait for project to finish compiling //Wait for project to finish compiling
while (EditorApplication.isCompiling || EditorApplication.isUpdating) while (EditorApplication.isCompiling || EditorApplication.isUpdating)
{ {
@ -76,12 +77,11 @@ namespace VRC.PackageManagement.Resolver
try try
{ {
if (string.IsNullOrWhiteSpace(ProjectDir)) if (string.IsNullOrWhiteSpace(ProjectDir))
{ {
return; return;
} }
if (VPMProjectManifest.ResolveIsNeeded(ProjectDir)) if (VPMProjectManifest.ResolveIsNeeded(ProjectDir))
{ {
Debug.Log($"Resolve needed."); Debug.Log($"Resolve needed.");
@ -103,7 +103,7 @@ namespace VRC.PackageManagement.Resolver
// Unity says we can't open windows from this function so it throws an exception but also works fine. // Unity says we can't open windows from this function so it throws an exception but also works fine.
} }
} }
public static bool VPMManifestExists() public static bool VPMManifestExists()
{ {
return VPMProjectManifest.Exists(ProjectDir, out _); return VPMProjectManifest.Exists(ProjectDir, out _);
@ -114,7 +114,7 @@ namespace VRC.PackageManagement.Resolver
VPMProjectManifest.Load(ProjectDir); VPMProjectManifest.Load(ProjectDir);
ResolverWindow.Refresh(); ResolverWindow.Refresh();
} }
public static void ResolveManifest() public static void ResolveManifest()
{ {
ResolveStatic(ProjectDir); ResolveStatic(ProjectDir);
@ -128,7 +128,7 @@ namespace VRC.PackageManagement.Resolver
EditorUtility.ClearProgressBar(); EditorUtility.ClearProgressBar();
ForceRefresh(); ForceRefresh();
} }
public static List<string> GetAllVersionsOf(string id) public static List<string> GetAllVersionsOf(string id)
{ {
var project = new UnityProject(ProjectDir); var project = new UnityProject(ProjectDir);
@ -185,15 +185,15 @@ namespace VRC.PackageManagement.Resolver
return null; return null;
} }
public static void ForceRefresh () public static void ForceRefresh()
{ {
MethodInfo method = typeof( UnityEditor.PackageManager.Client ).GetMethod( "Resolve", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly ); MethodInfo method = typeof(UnityEditor.PackageManager.Client).GetMethod("Resolve",
if( method != null ) BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
method.Invoke( null, null ); if (method != null)
method.Invoke(null, null);
AssetDatabase.Refresh(); AssetDatabase.Refresh();
} }
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"name": "com.vrchat.core.vpm-resolver", "name": "com.vrchat.core.vpm-resolver",
"displayName": "VRChat Package Resolver Tool", "displayName": "VRChat Package Resolver Tool",
"version": "0.1.17", "version": "0.1.18",
"unity": "2019.4", "unity": "2019.4",
"description": "Tool to Download VPM Packages", "description": "Tool to Download VPM Packages",
"vrchatVersion": "2022.1.1", "vrchatVersion": "2022.1.1",

View File

@ -1,132 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2022 bd_
*
* 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.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace nadena.dev.modular_avatar.core.editor
{
[InitializeOnLoad]
internal static class ComponentAllowlistPatch
{
internal static readonly bool PATCH_OK;
static ComponentAllowlistPatch()
{
try
{
PatchAllowlist();
PATCH_OK = true;
}
catch (Exception e)
{
Debug.LogException(e);
PATCH_OK = false;
}
}
static void PatchAllowlist()
{
// The below APIs are all public, but undocumented and likely to change in the future.
// As such, we use reflection to access them (allowing us to catch exceptions instead of just breaking the
// build - and allowing the user to manually bake as a workaround).
// The basic idea is to retrieve the HashSet of whitelisted components, and add all components extending
// from AvatarTagComponent to it. This HashSet is cached on first access, but the lists of allowed
// components used to initially populate it are private. So, we'll start off by making a call that (as a
// side-effect) causes the list to be initially cached. This call will throw a NPE because we're passing
// a null GameObject, but that's okay.
var avatarValidation = Util.FindType("VRC.SDK3.Validation.AvatarValidation");
var findIllegalComponents =
avatarValidation?.GetMethod("FindIllegalComponents", BindingFlags.Public | BindingFlags.Static);
if (findIllegalComponents == null)
{
Debug.LogError(
"[ModularAvatar] Unsupported VRCSDK version: Failed to find AvatarValidation.FindIllegalComponents");
return;
}
try
{
findIllegalComponents.Invoke(null, new[] {(object) null});
}
catch (TargetInvocationException e)
{
if (e.InnerException is NullReferenceException)
{
// ok!
}
else
{
System.Diagnostics.Debug.Assert(e.InnerException != null, "e.InnerException != null");
throw e.InnerException;
}
}
// Now fetch the cached allowlist and add our components to it.
var validationUtils = Util.FindType("VRC.SDKBase.Validation.ValidationUtils");
var whitelistedTypes = validationUtils?.GetMethod(
"WhitelistedTypes",
BindingFlags.Public | BindingFlags.Static,
null,
new[] {typeof(string), typeof(IEnumerable<Type>)},
null
);
if (whitelistedTypes == null)
{
Debug.LogError(
"[ModularAvatar] Unsupported VRCSDK version: Failed to find ValidationUtils.WhitelistedTypes");
return;
}
var allowlist = whitelistedTypes.Invoke(null, new object[] {"avatar-sdk3", null}) as HashSet<Type>;
if (allowlist == null)
{
Debug.LogError("[ModularAvatar] Unsupported VRCSDK version: Failed to retrieve component whitelist");
return;
}
allowlist.Add(typeof(AvatarTagComponent));
// We'll need to find all types which derive from AvatarTagComponent and inject them into the allowlist
// as well.
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var ty in assembly.GetTypes())
{
if (typeof(AvatarTagComponent).IsAssignableFrom(ty))
{
allowlist.Add(ty);
}
}
}
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 657f099f7fc04609a5cfc9ac5461d7e3
timeCreated: 1661563992

View File

@ -10,62 +10,65 @@ namespace nadena.dev.modular_avatar.core.editor
// This list is originally from https://github.com/HhotateA/AvatarModifyTools/blob/d8ae75fed8577707253d6b63a64d6053eebbe78b/Assets/HhotateA/AvatarModifyTool/Editor/EnvironmentVariable.cs#L81-L139 // This list is originally from https://github.com/HhotateA/AvatarModifyTools/blob/d8ae75fed8577707253d6b63a64d6053eebbe78b/Assets/HhotateA/AvatarModifyTool/Editor/EnvironmentVariable.cs#L81-L139
// Copyright (c) 2021 @HhotateA_xR // Copyright (c) 2021 @HhotateA_xR
// Licensed under the MIT License // Licensed under the MIT License
// In addition, some part is copied from from https://github.com/Azukimochi/BoneRenamer/blob/e9f68acd631d2a0fc3d8b382d361649ac971e988/BoneRenamer/Editor/BoneNames.xml
// Copyright (c) 2023 Azukimochi
// Licensed under the MIT License
private static string[][] boneNamePatterns = new[] private static string[][] boneNamePatterns = new[]
{ {
new[] {"Hips", "Hip"}, new[] {"Hips", "Hip"},
new[] {"LeftUpperLeg", "UpperLeg_Left", "UpperLeg_L", "Leg_Left", "Leg_L", "ULeg_L"}, new[] {"LeftUpperLeg", "UpperLeg_Left", "UpperLeg_L", "Leg_Left", "Leg_L", "ULeg_L", "Left leg", "LeftUpLeg"},
new[] {"RightUpperLeg", "UpperLeg_Right", "UpperLeg_R", "Leg_Right", "Leg_R", "ULeg_R"}, new[] {"RightUpperLeg", "UpperLeg_Right", "UpperLeg_R", "Leg_Right", "Leg_R", "ULeg_R", "Right leg", "RightUpLeg"},
new[] {"LeftLowerLeg", "LowerLeg_Left", "LowerLeg_L", "Knee_Left", "Knee_L", "LLeg_L"}, new[] {"LeftLowerLeg", "LowerLeg_Left", "LowerLeg_L", "Knee_Left", "Knee_L", "LLeg_L", "Left knee", "LeftLeg"},
new[] {"RightLowerLeg", "LowerLeg_Right", "LowerLeg_R", "Knee_Right", "Knee_R", "LLeg_R"}, new[] {"RightLowerLeg", "LowerLeg_Right", "LowerLeg_R", "Knee_Right", "Knee_R", "LLeg_R", "Right knee", "RightLeg"},
new[] {"LeftFoot", "Foot_Left", "Foot_L"}, new[] {"LeftFoot", "Foot_Left", "Foot_L", "Ankle_L", "Foot.L.001", "Left ankle"},
new[] {"RightFoot", "Foot_Right", "Foot_R"}, new[] {"RightFoot", "Foot_Right", "Foot_R", "Ankle_R", "Foot.R.001", "Right ankle"},
new[] {"Spine"}, new[] {"Spine"},
new[] {"Chest", "Bust"}, new[] {"Chest", "Bust"},
new[] {"Neck"}, new[] {"Neck"},
new[] {"Head"}, new[] {"Head"},
new[] {"LeftShoulder", "Shoulder_Left", "Shoulder_L"}, new[] {"LeftShoulder", "Shoulder_Left", "Shoulder_L"},
new[] {"RightShoulder", "Shoulder_Right", "Shoulder_R"}, new[] {"RightShoulder", "Shoulder_Right", "Shoulder_R"},
new[] {"LeftUpperArm", "UpperArm_Left", "UpperArm_L", "Arm_Left", "Arm_L", "UArm_L"}, new[] {"LeftUpperArm", "UpperArm_Left", "UpperArm_L", "Arm_Left", "Arm_L", "UArm_L", "Left arm", "UpperLeftArm"},
new[] {"RightUpperArm", "UpperArm_Right", "UpperArm_R", "Arm_Right", "Arm_R", "UArm_R"}, new[] {"RightUpperArm", "UpperArm_Right", "UpperArm_R", "Arm_Right", "Arm_R", "UArm_R", "Right arm", "UpperRightArm"},
new[] {"LeftLowerArm", "LowerArm_Left", "LowerArm_L", "LArm_L"}, new[] {"LeftLowerArm", "LowerArm_Left", "LowerArm_L", "LArm_L", "Left elbow", "LeftForeArm"},
new[] {"RightLowerArm", "LowerArm_Right", "LowerArm_R", "LArm_R"}, new[] {"RightLowerArm", "LowerArm_Right", "LowerArm_R", "LArm_R", "Right elbow", "RightForeArm"},
new[] {"LeftHand", "Hand_Left", "Hand_L"}, new[] {"LeftHand", "Hand_Left", "Hand_L", "Left wrist", "Wrist_L"},
new[] {"RightHand", "Hand_Right", "Hand_R"}, new[] {"RightHand", "Hand_Right", "Hand_R", "Right wrist", "Wrist_R"},
new[] {"LeftToes", "Toes_Left", "Toe_Left", "ToeIK_L", "Toes_L", "Toe_L"}, new[] {"LeftToes", "Toes_Left", "Toe_Left", "ToeIK_L", "Toes_L", "Toe_L", "Foot.L.002", "Left Toe", "LeftToeBase"},
new[] {"RightToes", "Toes_Right", "Toe_Right", "ToeIK_R", "Toes_R", "Toe_R"}, new[] {"RightToes", "Toes_Right", "Toe_Right", "ToeIK_R", "Toes_R", "Toe_R", "Foot.R.002", "Right Toe", "RightToeBase"},
new[] {"LeftEye", "Eye_Left", "Eye_L"}, new[] {"LeftEye", "Eye_Left", "Eye_L"},
new[] {"RightEye", "Eye_Right", "Eye_R"}, new[] {"RightEye", "Eye_Right", "Eye_R"},
new[] {"Jaw"}, new[] {"Jaw"},
new[] {"LeftThumbProximal", "ProximalThumb_Left", "ProximalThumb_L", "Thumb1_L"}, new[] {"LeftThumbProximal", "ProximalThumb_Left", "ProximalThumb_L", "Thumb1_L", "ThumbFinger1_L", "LeftHandThumb1", "Thumb Proximal.L", "Thunb1_L"},
new[] {"LeftThumbIntermediate", "IntermediateThumb_Left", "IntermediateThumb_L", "Thumb2_L"}, new[] {"LeftThumbIntermediate", "IntermediateThumb_Left", "IntermediateThumb_L", "Thumb2_L", "ThumbFinger2_L", "LeftHandThumb2", "Thumb Intermediate.L", "Thunb2_L"},
new[] {"LeftThumbDistal", "DistalThumb_Left", "DistalThumb_L", "Thumb3_L"}, new[] {"LeftThumbDistal", "DistalThumb_Left", "DistalThumb_L", "Thumb3_L", "ThumbFinger3_L", "LeftHandThumb3", "Thumb Distal.L", "Thunb3_L"},
new[] {"LeftIndexProximal", "ProximalIndex_Left", "ProximalIndex_L", "Index1_L"}, new[] {"LeftIndexProximal", "ProximalIndex_Left", "ProximalIndex_L", "Index1_L", "IndexFinger1_L", "LeftHandIndex1", "Index Proximal.L"},
new[] {"LeftIndexIntermediate", "IntermediateIndex_Left", "IntermediateIndex_L", "Index2_L"}, new[] {"LeftIndexIntermediate", "IntermediateIndex_Left", "IntermediateIndex_L", "Index2_L", "IndexFinger2_L", "LeftHandIndex2", "Index Intermediate.L"},
new[] {"LeftIndexDistal", "DistalIndex_Left", "DistalIndex_L", "Index3_L"}, new[] {"LeftIndexDistal", "DistalIndex_Left", "DistalIndex_L", "Index3_L", "IndexFinger3_L", "LeftHandIndex3", "Index Distal.L"},
new[] {"LeftMiddleProximal", "ProximalMiddle_Left", "ProximalMiddle_L", "Middle1_L"}, new[] {"LeftMiddleProximal", "ProximalMiddle_Left", "ProximalMiddle_L", "Middle1_L", "MiddleFinger1_L", "LeftHandMiddle1", "Middle Proximal.L"},
new[] {"LeftMiddleIntermediate", "IntermediateMiddle_Left", "IntermediateMiddle_L", "Middle2_L"}, new[] {"LeftMiddleIntermediate", "IntermediateMiddle_Left", "IntermediateMiddle_L", "Middle2_L", "MiddleFinger2_L", "LeftHandMiddle2", "Middle Intermediate.L"},
new[] {"LeftMiddleDistal", "DistalMiddle_Left", "DistalMiddle_L", "Middle3_L"}, new[] {"LeftMiddleDistal", "DistalMiddle_Left", "DistalMiddle_L", "Middle3_L", "MiddleFinger3_L", "LeftHandMiddle3", "Middle Distal.L"},
new[] {"LeftRingProximal", "ProximalRing_Left", "ProximalRing_L", "Ring1_L"}, new[] {"LeftRingProximal", "ProximalRing_Left", "ProximalRing_L", "Ring1_L", "RingFinger1_L", "LeftHandRing1", "Ring Proximal.L"},
new[] {"LeftRingIntermediate", "IntermediateRing_Left", "IntermediateRing_L", "Ring2_L"}, new[] {"LeftRingIntermediate", "IntermediateRing_Left", "IntermediateRing_L", "Ring2_L", "RingFinger2_L", "LeftHandRing2", "Ring Intermediate.L"},
new[] {"LeftRingDistal", "DistalRing_Left", "DistalRing_L", "Ring3_L"}, new[] {"LeftRingDistal", "DistalRing_Left", "DistalRing_L", "Ring3_L", "RingFinger3_L", "LeftHandRing3", "Ring Distal.L"},
new[] {"LeftLittleProximal", "ProximalLittle_Left", "ProximalLittle_L", "Little1_L"}, new[] {"LeftLittleProximal", "ProximalLittle_Left", "ProximalLittle_L", "Little1_L", "LittleFinger1_L", "LeftHandPinky1", "Little Proximal.L"},
new[] {"LeftLittleIntermediate", "IntermediateLittle_Left", "IntermediateLittle_L", "Little2_L"}, new[] {"LeftLittleIntermediate", "IntermediateLittle_Left", "IntermediateLittle_L", "Little2_L", "LittleFinger2_L", "LeftHandPinky2", "Little Intermediate.L"},
new[] {"LeftLittleDistal", "DistalLittle_Left", "DistalLittle_L", "Little3_L"}, new[] {"LeftLittleDistal", "DistalLittle_Left", "DistalLittle_L", "Little3_L", "LittleFinger3_L", "LeftHandPinky3", "Little Distal.L"},
new[] {"RightThumbProximal", "ProximalThumb_Right", "ProximalThumb_R", "Thumb1_R"}, new[] {"RightThumbProximal", "ProximalThumb_Right", "ProximalThumb_R", "Thumb1_R", "ThumbFinger1_R", "RightHandThumb1", "Thumb Proximal.R", "Thunb1_R"},
new[] {"RightThumbIntermediate", "IntermediateThumb_Right", "IntermediateThumb_R", "Thumb2_R"}, new[] {"RightThumbIntermediate", "IntermediateThumb_Right", "IntermediateThumb_R", "Thumb2_R", "ThumbFinger2_R", "RightHandThumb2", "Thumb Intermediate.R", "Thunb2_R"},
new[] {"RightThumbDistal", "DistalThumb_Right", "DistalThumb_R", "Thumb3_R"}, new[] {"RightThumbDistal", "DistalThumb_Right", "DistalThumb_R", "Thumb3_R", "ThumbFinger3_R", "RightHandThumb3", "Thumb Distal.R", "Thunb3_R"},
new[] {"RightIndexProximal", "ProximalIndex_Right", "ProximalIndex_R", "Index1_R"}, new[] {"RightIndexProximal", "ProximalIndex_Right", "ProximalIndex_R", "Index1_R", "IndexFinger1_R", "RightHandIndex1", "Index Proximal.R"},
new[] {"RightIndexIntermediate", "IntermediateIndex_Right", "IntermediateIndex_R", "Index2_R"}, new[] {"RightIndexIntermediate", "IntermediateIndex_Right", "IntermediateIndex_R", "Index2_R", "IndexFinger2_R", "RightHandIndex2", "Index Intermediate.R"},
new[] {"RightIndexDistal", "DistalIndex_Right", "DistalIndex_R", "Index3_R"}, new[] {"RightIndexDistal", "DistalIndex_Right", "DistalIndex_R", "Index3_R", "IndexFinger3_R", "RightHandIndex3", "Index Distal.R"},
new[] {"RightMiddleProximal", "ProximalMiddle_Right", "ProximalMiddle_R", "Middle1_R"}, new[] {"RightMiddleProximal", "ProximalMiddle_Right", "ProximalMiddle_R", "Middle1_R", "MiddleFinger1_R", "RightHandMiddle1", "Middle Proximal.R"},
new[] {"RightMiddleIntermediate", "IntermediateMiddle_Right", "IntermediateMiddle_R", "Middle2_R"}, new[] {"RightMiddleIntermediate", "IntermediateMiddle_Right", "IntermediateMiddle_R", "Middle2_R", "MiddleFinger2_R", "RightHandMiddle2", "Middle Intermediate.R"},
new[] {"RightMiddleDistal", "DistalMiddle_Right", "DistalMiddle_R", "Middle3_R"}, new[] {"RightMiddleDistal", "DistalMiddle_Right", "DistalMiddle_R", "Middle3_R", "MiddleFinger3_R", "RightHandMiddle3", "Middle Distal.R"},
new[] {"RightRingProximal", "ProximalRing_Right", "ProximalRing_R", "Ring1_R"}, new[] {"RightRingProximal", "ProximalRing_Right", "ProximalRing_R", "Ring1_R", "RingFinger1_R", "RightHandRing1", "Ring Proximal.R"},
new[] {"RightRingIntermediate", "IntermediateRing_Right", "IntermediateRing_R", "Ring2_R"}, new[] {"RightRingIntermediate", "IntermediateRing_Right", "IntermediateRing_R", "Ring2_R", "RingFinger2_R", "RightHandRing2", "Ring Intermediate.R"},
new[] {"RightRingDistal", "DistalRing_Right", "DistalRing_R", "Ring3_R"}, new[] {"RightRingDistal", "DistalRing_Right", "DistalRing_R", "Ring3_R", "RingFinger3_R", "RightHandRing3", "Ring Distal.R"},
new[] {"RightLittleProximal", "ProximalLittle_Right", "ProximalLittle_R", "Little1_R"}, new[] {"RightLittleProximal", "ProximalLittle_Right", "ProximalLittle_R", "Little1_R", "LittleFinger1_R", "RightHandPinky1", "Little Proximal.R"},
new[] {"RightLittleIntermediate", "IntermediateLittle_Right", "IntermediateLittle_R", "Little2_R"}, new[] {"RightLittleIntermediate", "IntermediateLittle_Right", "IntermediateLittle_R", "Little2_R", "LittleFinger2_R", "RightHandPinky2", "Little Intermediate.R"},
new[] {"RightLittleDistal", "DistalLittle_Right", "DistalLittle_R", "Little3_R"}, new[] {"RightLittleDistal", "DistalLittle_Right", "DistalLittle_R", "Little3_R", "LittleFinger3_R", "RightHandPinky3", "Little Distal.R"},
new[] {"UpperChest", "UChest"}, new[] {"UpperChest", "UChest"},
}; };
@ -216,4 +219,4 @@ namespace nadena.dev.modular_avatar.core.editor
} }
} }
} }
} }

View File

@ -122,7 +122,6 @@ namespace nadena.dev.modular_avatar.core.editor
} }
InspectorCommon.DisplayOutOfAvatarWarning(targets); InspectorCommon.DisplayOutOfAvatarWarning(targets);
if (!ComponentAllowlistPatch.PATCH_OK) InspectorCommon.DisplayVRCSDKVersionWarning();
OnInnerInspectorGUI(); OnInnerInspectorGUI();
} }

View File

@ -24,6 +24,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using JetBrains.Annotations;
using nadena.dev.modular_avatar.editor.ErrorReporting; using nadena.dev.modular_avatar.editor.ErrorReporting;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
@ -88,8 +89,6 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
BuildReport.ReportingObject(renderer, () => BuildReport.ReportingObject(renderer, () =>
{ {
if (renderer.sharedMesh == null) return;
bool isRetargetable = false; bool isRetargetable = false;
foreach (var bone in renderer.bones) foreach (var bone in renderer.bones)
{ {
@ -100,10 +99,12 @@ namespace nadena.dev.modular_avatar.core.editor
} }
} }
isRetargetable |= BoneDatabase.GetRetargetedBone(renderer.rootBone);
if (isRetargetable) if (isRetargetable)
{ {
var newMesh = new MeshRetargeter(renderer).Retarget(); var newMesh = new MeshRetargeter(renderer).Retarget();
_context.SaveAsset(newMesh); if (newMesh) _context.SaveAsset(newMesh);
} }
}); });
} }
@ -143,13 +144,14 @@ namespace nadena.dev.modular_avatar.core.editor
internal class MeshRetargeter internal class MeshRetargeter
{ {
private readonly SkinnedMeshRenderer renderer; private readonly SkinnedMeshRenderer renderer;
private Mesh src, dst; [CanBeNull] private Mesh src, dst;
public MeshRetargeter(SkinnedMeshRenderer renderer) public MeshRetargeter(SkinnedMeshRenderer renderer)
{ {
this.renderer = renderer; this.renderer = renderer;
} }
[CanBeNull]
public Mesh Retarget() public Mesh Retarget()
{ {
var avatar = RuntimeUtil.FindAvatarInParents(renderer.transform); var avatar = RuntimeUtil.FindAvatarInParents(renderer.transform);
@ -165,8 +167,11 @@ namespace nadena.dev.modular_avatar.core.editor
avatarTransform.localScale = Vector3.one; avatarTransform.localScale = Vector3.one;
src = renderer.sharedMesh; src = renderer.sharedMesh;
dst = Mesh.Instantiate(src); if (src != null)
dst.name = "RETARGETED: " + src.name; {
dst = Mesh.Instantiate(src);
dst.name = "RETARGETED: " + src.name;
}
RetargetBones(); RetargetBones();
AdjustShapeKeys(); AdjustShapeKeys();
@ -185,22 +190,25 @@ namespace nadena.dev.modular_avatar.core.editor
private void RetargetBones() private void RetargetBones()
{ {
var originalBindPoses = src.bindposes; var originalBindPoses = src ? src.bindposes : null;
var originalBones = renderer.bones; var originalBones = renderer.bones;
var newBones = (Transform[]) originalBones.Clone(); var newBones = (Transform[]) originalBones.Clone();
var newBindPoses = (Matrix4x4[]) originalBindPoses.Clone(); var newBindPoses = (Matrix4x4[]) originalBindPoses?.Clone();
for (int i = 0; i < originalBones.Length; i++) for (int i = 0; i < originalBones.Length; i++)
{ {
Transform newBindTarget = BoneDatabase.GetRetargetedBone(originalBones[i]); Transform newBindTarget = BoneDatabase.GetRetargetedBone(originalBones[i]);
if (newBindTarget == null) continue; if (newBindTarget == null) continue;
Matrix4x4 Bp = newBindTarget.worldToLocalMatrix * originalBones[i].localToWorldMatrix *
originalBindPoses[i];
newBones[i] = newBindTarget; newBones[i] = newBindTarget;
newBindPoses[i] = Bp;
if (originalBindPoses != null)
{
Matrix4x4 Bp = newBindTarget.worldToLocalMatrix * originalBones[i].localToWorldMatrix *
originalBindPoses[i];
newBindPoses[i] = Bp;
}
} }
var rootBone = renderer.rootBone; var rootBone = renderer.rootBone;
@ -212,9 +220,12 @@ namespace nadena.dev.modular_avatar.core.editor
scaleBone = renderer.bones[0]; scaleBone = renderer.bones[0];
} }
dst.bindposes = newBindPoses;
renderer.bones = newBones; renderer.bones = newBones;
renderer.sharedMesh = dst; if (dst)
{
dst.bindposes = newBindPoses;
renderer.sharedMesh = dst;
}
var newRootBone = BoneDatabase.GetRetargetedBone(rootBone, true); var newRootBone = BoneDatabase.GetRetargetedBone(rootBone, true);
var newScaleBone = BoneDatabase.GetRetargetedBone(scaleBone, true); var newScaleBone = BoneDatabase.GetRetargetedBone(scaleBone, true);
@ -239,4 +250,4 @@ namespace nadena.dev.modular_avatar.core.editor
renderer.probeAnchor = BoneDatabase.GetRetargetedBone(renderer.probeAnchor, true); renderer.probeAnchor = BoneDatabase.GetRetargetedBone(renderer.probeAnchor, true);
} }
} }
} }

View File

@ -171,11 +171,14 @@ namespace nadena.dev.modular_avatar.core.editor
AddParam(control.parameter.name); AddParam(control.parameter.name);
} }
foreach (var subParam in control.subParameters) if (control.subParameters != null)
{ {
if (!string.IsNullOrWhiteSpace(subParam.name)) foreach (var subParam in control.subParameters)
{ {
AddParam(subParam.name); if (!string.IsNullOrWhiteSpace(subParam.name))
{
AddParam(subParam.name);
}
} }
} }
@ -314,4 +317,4 @@ namespace nadena.dev.modular_avatar.core.editor
parameters = newParams; parameters = newParams;
} }
} }
} }

View File

@ -347,13 +347,20 @@ namespace nadena.dev.modular_avatar.core.editor
blendTree.blendParameter = remap(remaps, blendTree.blendParameter); blendTree.blendParameter = remap(remaps, blendTree.blendParameter);
blendTree.blendParameterY = remap(remaps, blendTree.blendParameterY); blendTree.blendParameterY = remap(remaps, blendTree.blendParameterY);
foreach (var childMotion in blendTree.children) var children = blendTree.children;
for (int i = 0; i < children.Length; i++)
{ {
var childMotion = children[i];
if (childMotion.motion is BlendTree subTree) if (childMotion.motion is BlendTree subTree)
{ {
ProcessBlendtree(subTree, remaps); ProcessBlendtree(subTree, remaps);
} }
childMotion.directBlendParameter = remap(remaps, childMotion.directBlendParameter);
children[i] = childMotion;
} }
blendTree.children = children;
} }
private void ProcessDriver(VRCAvatarParameterDriver driver, ImmutableDictionary<string, string> remaps) private void ProcessDriver(VRCAvatarParameterDriver driver, ImmutableDictionary<string, string> remaps)

View File

@ -24,6 +24,7 @@
using System; using System;
using UnityEngine; using UnityEngine;
using VRC.SDKBase;
namespace nadena.dev.modular_avatar.core namespace nadena.dev.modular_avatar.core
{ {
@ -31,7 +32,7 @@ namespace nadena.dev.modular_avatar.core
* This abstract base class is injected into the VRCSDK avatar component allowlist to avoid * This abstract base class is injected into the VRCSDK avatar component allowlist to avoid
*/ */
[DefaultExecutionOrder(-9999)] // run before av3emu [DefaultExecutionOrder(-9999)] // run before av3emu
public abstract class AvatarTagComponent : MonoBehaviour public abstract class AvatarTagComponent : MonoBehaviour, IEditorOnly
{ {
internal static event Action OnChangeAction; internal static event Action OnChangeAction;

View File

@ -14,7 +14,7 @@ AudioImporter:
forceToMono: 1 forceToMono: 1
normalize: 1 normalize: 1
preloadAudioData: 1 preloadAudioData: 1
loadInBackground: 0 loadInBackground: 1
ambisonic: 0 ambisonic: 0
3D: 1 3D: 1
userData: userData:

View File

@ -15,6 +15,6 @@
"com.unity.nuget.newtonsoft-json": "2.0.0" "com.unity.nuget.newtonsoft-json": "2.0.0"
}, },
"vpmDependencies": { "vpmDependencies": {
"com.vrchat.avatars": ">=3.1.9" "com.vrchat.avatars": ">=3.1.13"
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"dependencies": { "dependencies": {
"com.vrchat.avatars": { "com.vrchat.avatars": {
"version": "3.1.9" "version": "3.1.13"
}, },
"com.vrchat.core.vpm-resolver": { "com.vrchat.core.vpm-resolver": {
"version": "0.1.13" "version": "0.1.13"
@ -22,7 +22,8 @@
"dependencies": {} "dependencies": {}
}, },
"com.vrchat.core.vpm-resolver": { "com.vrchat.core.vpm-resolver": {
"version": "0.1.17" "version": "0.1.18",
"dependencies": {}
}, },
"vrchat.blackstartx.gesture-manager": { "vrchat.blackstartx.gesture-manager": {
"version": "3.8.3", "version": "3.8.3",

View File

@ -8,7 +8,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula');
const config = { const config = {
title: 'Modular Avatar', title: 'Modular Avatar',
tagline: 'Drag-and-drop avatar assembly', tagline: 'Drag-and-drop avatar assembly',
url: 'https://modular-avatar.fushizen.net', url: 'https://modular-avatar.nadena.dev',
baseUrl: '/', baseUrl: '/',
onBrokenLinks: 'throw', onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn', onBrokenMarkdownLinks: 'warn',

View File

@ -15,21 +15,21 @@
"typecheck": "tsc" "typecheck": "tsc"
}, },
"dependencies": { "dependencies": {
"@algolia/client-search": "^4.14.3", "@algolia/client-search": "^4.17.0",
"@docusaurus/core": "^2.3.1", "@docusaurus/core": "^2.4.0",
"@docusaurus/preset-classic": "^2.3.1", "@docusaurus/preset-classic": "^2.4.0",
"@mdx-js/react": "^1.6.22", "@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"prism-react-renderer": "^1.3.5", "prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-loadable": "^5.5.0", "react-loadable": "^5.5.0",
"react-player": "^2.11.2" "react-player": "^2.12.0"
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "2.3.1", "@docusaurus/module-type-aliases": "2.4.0",
"@tsconfig/docusaurus": "^1.0.6", "@tsconfig/docusaurus": "^1.0.7",
"typescript": "^4.9.5" "typescript": "^5.0.4"
}, },
"resolutions": { "resolutions": {
"trim": "1.0.1", "trim": "1.0.1",

4
docs/robots.txt Normal file
View File

@ -0,0 +1,4 @@
User-agent: *
Disallow: /dev/
Sitemap: https://modular-avatar.nadena.dev/sitemap.xml

View File

@ -49,10 +49,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/cache-common@npm:4.14.3": "@algolia/cache-common@npm:4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/cache-common@npm:4.14.3" resolution: "@algolia/cache-common@npm:4.17.0"
checksum: 56af1684870b072bb5e8acd6539c1cca69e826f790064df373bc8b86b9bc6a80c9b53fce8aa1c74f2d2bcd917196e712d5aef39fc566cebbea499e2acacea0fe checksum: cbf8d6ca4ee653f2bef6665eb36b7afee2d4031abe5444cd121d60614189f2c96d0e00cfef990cbe68d318dbcef9b38f5df70476f9088ef43f8c83d69d0802b8
languageName: node languageName: node
linkType: hard linkType: hard
@ -98,13 +98,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/client-common@npm:4.14.3": "@algolia/client-common@npm:4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/client-common@npm:4.14.3" resolution: "@algolia/client-common@npm:4.17.0"
dependencies: dependencies:
"@algolia/requester-common": 4.14.3 "@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.14.3 "@algolia/transporter": 4.17.0
checksum: 44799afbbb7955e0577cf199799e44aea6890136d277d56af5ea8628cdabb1cd67d3289eca035a6792a771c0a886164108351be438158d6d23a6c762cfe6abf0 checksum: 05791d5483e16a0776a1fb16f42a8e62c67be844e82ff506b5ed82669367f6ea5fba79bcffa90ff4af2039bd8fb16db395edc4c0b1e0c11c050de8a118642180
languageName: node languageName: node
linkType: hard linkType: hard
@ -130,14 +130,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/client-search@npm:^4.14.3": "@algolia/client-search@npm:^4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/client-search@npm:4.14.3" resolution: "@algolia/client-search@npm:4.17.0"
dependencies: dependencies:
"@algolia/client-common": 4.14.3 "@algolia/client-common": 4.17.0
"@algolia/requester-common": 4.14.3 "@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.14.3 "@algolia/transporter": 4.17.0
checksum: fb32e68d9bc815afab7199ae59d71d51f785f98fc3eb1d2bdb3065bc11424d797d1b1a2755397785bc715c2085dc1ddcf2b46d677b95dd95a825f597ba04505b checksum: ca6aedd67e69112e3a86086e48de4f38b9d127c2e606b345de58a528dd2d2016e70783cf446dfa669036c69ffbd0616f27b180cacb6ab0fafe85065b2b8d323f
languageName: node languageName: node
linkType: hard linkType: hard
@ -155,10 +155,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/logger-common@npm:4.14.3": "@algolia/logger-common@npm:4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/logger-common@npm:4.14.3" resolution: "@algolia/logger-common@npm:4.17.0"
checksum: c42bb686637ca32ab6636055b0d0ef368bc9e3e2ea71e3e3becece68a88896b34cfa6d657ccdf1b6a01fcabc075f78d10fb813f399e88323a9b17ea80dba33f5 checksum: e6359266544ed9d9eab8d4217c126a8209f74fbd1e407f2249b886915a521e89e419dc6401a65389523f3bdffb3880c0a95578c3c437653f941ddb1095c37e08
languageName: node languageName: node
linkType: hard linkType: hard
@ -187,10 +187,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/requester-common@npm:4.14.3": "@algolia/requester-common@npm:4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/requester-common@npm:4.14.3" resolution: "@algolia/requester-common@npm:4.17.0"
checksum: 1bc8400b18613c9d65b5ee07dd23e9e324669338d849fae987ed0b518567fb00a61a2ef00279fe65148c8f51603f2df6e4137c6693d2aca30bf453b8b759aa44 checksum: 13ace23f53fc88677d896ae4506f04a5defd17f69b9611571e19dd45c91fda74a71acd27f799f55f88d550264b8f4477831d9ff546ffeb7257e35ec4ee983ca8
languageName: node languageName: node
linkType: hard linkType: hard
@ -214,14 +214,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@algolia/transporter@npm:4.14.3": "@algolia/transporter@npm:4.17.0":
version: 4.14.3 version: 4.17.0
resolution: "@algolia/transporter@npm:4.14.3" resolution: "@algolia/transporter@npm:4.17.0"
dependencies: dependencies:
"@algolia/cache-common": 4.14.3 "@algolia/cache-common": 4.17.0
"@algolia/logger-common": 4.14.3 "@algolia/logger-common": 4.17.0
"@algolia/requester-common": 4.14.3 "@algolia/requester-common": 4.17.0
checksum: ad959c648d987726cc1e138cf68fd11673dbf12498ee3e3ccd573c5a2d63f9e20b0f58ab130c2b9807f7c2ff029c8e040923366d75c1e7ad62b02f40fb822ee2 checksum: 1864bf9ccdf63f5090a89f44358c30317f549b4dc37dd8ce446383ca217c1a9737ab2749ca92394a320574690ea04134ae600c2a3f1f9d393549a5124079c2a6
languageName: node languageName: node
linkType: hard linkType: hard
@ -1724,9 +1724,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/core@npm:2.3.1, @docusaurus/core@npm:^2.3.1": "@docusaurus/core@npm:2.4.0, @docusaurus/core@npm:^2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/core@npm:2.3.1" resolution: "@docusaurus/core@npm:2.4.0"
dependencies: dependencies:
"@babel/core": ^7.18.6 "@babel/core": ^7.18.6
"@babel/generator": ^7.18.7 "@babel/generator": ^7.18.7
@ -1738,13 +1738,13 @@ __metadata:
"@babel/runtime": ^7.18.6 "@babel/runtime": ^7.18.6
"@babel/runtime-corejs3": ^7.18.6 "@babel/runtime-corejs3": ^7.18.6
"@babel/traverse": ^7.18.8 "@babel/traverse": ^7.18.8
"@docusaurus/cssnano-preset": 2.3.1 "@docusaurus/cssnano-preset": 2.4.0
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/react-loadable": 5.5.2 "@docusaurus/react-loadable": 5.5.2
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.3.1 "@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
"@slorber/static-site-generator-webpack-plugin": ^4.0.7 "@slorber/static-site-generator-webpack-plugin": ^4.0.7
"@svgr/webpack": ^6.2.1 "@svgr/webpack": ^6.2.1
autoprefixer: ^10.4.7 autoprefixer: ^10.4.7
@ -1804,40 +1804,40 @@ __metadata:
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
bin: bin:
docusaurus: bin/docusaurus.mjs docusaurus: bin/docusaurus.mjs
checksum: 812aecae45af3f4d02fd16e89517ca9f1ba22821a078aaa890f5797ac7e0cc0c79e7623eb999e885cf7e7652a6ffda8ff7c06dfd85ca29aaab600993c3d9980d checksum: 04d30e31e9c4198ce3f4a47c4f59943f357ef96a5cfa10674fd3049d4cf067c15fa0ae184383ba3e420f59a9b3077ed1cf1f373626399f0e46cea6fcf0897d7b
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/cssnano-preset@npm:2.3.1": "@docusaurus/cssnano-preset@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/cssnano-preset@npm:2.3.1" resolution: "@docusaurus/cssnano-preset@npm:2.4.0"
dependencies: dependencies:
cssnano-preset-advanced: ^5.3.8 cssnano-preset-advanced: ^5.3.8
postcss: ^8.4.14 postcss: ^8.4.14
postcss-sort-media-queries: ^4.2.1 postcss-sort-media-queries: ^4.2.1
tslib: ^2.4.0 tslib: ^2.4.0
checksum: a3d00ce86b16caffde36734bb2f4541d2c0df5e8ab6891a78ad05bccc631a895fecb04c385626ebcb8f905510c28fa6158288585673ae96565532d4ee4b60d4f checksum: b8982230ec014378a5453453df400a328a6ecdeecffb666ead5cfbeb5dc689610f0e62ee818ffcc8adc270c7c47cb818ad730c769eb8fa689dd79d4f9d448b6d
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/logger@npm:2.3.1": "@docusaurus/logger@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/logger@npm:2.3.1" resolution: "@docusaurus/logger@npm:2.4.0"
dependencies: dependencies:
chalk: ^4.1.2 chalk: ^4.1.2
tslib: ^2.4.0 tslib: ^2.4.0
checksum: eff5f258aeac9c643431426256e3bc4515074cc3cc754fa643579ba427ba232ecace9a9579ae5af542330b22d7361892a1eaf84526983a0c821c5ca3ee895176 checksum: 0424b77e2abaa50f20d6042ededf831157852656d1242ae9b0829b897e6f5b1e1e5ea30df599839e0ec51c72e42a5a867b136387dd5359032c735f431eddd078
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/mdx-loader@npm:2.3.1": "@docusaurus/mdx-loader@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/mdx-loader@npm:2.3.1" resolution: "@docusaurus/mdx-loader@npm:2.4.0"
dependencies: dependencies:
"@babel/parser": ^7.18.8 "@babel/parser": ^7.18.8
"@babel/traverse": ^7.18.8 "@babel/traverse": ^7.18.8
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@mdx-js/mdx": ^1.6.22 "@mdx-js/mdx": ^1.6.22
escape-html: ^1.0.3 escape-html: ^1.0.3
file-loader: ^6.2.0 file-loader: ^6.2.0
@ -1854,16 +1854,16 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 4a1c9ef0e8506ab4d9cb4714ff7437664e238e0f2878a5eb4a2e082897bbee7ae8d0b61ba9d45ffa820beb5ce75aa0050201db815b00c18fc136aaa4c6411c21 checksum: 3d4e7bf6840fa7dcf4250aa5ea019f80dac6cc38e9f8b9a0515b81b6c0f6d6f4ed4103f521784e70db856aec06cff4be176ef281e1cac53afc82bc1182bbf9ad
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/module-type-aliases@npm:2.3.1": "@docusaurus/module-type-aliases@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/module-type-aliases@npm:2.3.1" resolution: "@docusaurus/module-type-aliases@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/react-loadable": 5.5.2 "@docusaurus/react-loadable": 5.5.2
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@types/history": ^4.7.11 "@types/history": ^4.7.11
"@types/react": "*" "@types/react": "*"
"@types/react-router-config": "*" "@types/react-router-config": "*"
@ -1873,21 +1873,21 @@ __metadata:
peerDependencies: peerDependencies:
react: "*" react: "*"
react-dom: "*" react-dom: "*"
checksum: 74f799f81455dc8ff3e6edf07428996764014c2c7b416e6b5d160af15f00ad3aa1ab75dee5356645ec7f2ea832fb2aca6e9a32b19d64abeb9e3d57c4195f1e50 checksum: fc655d9dc77d88ba9d10abe602c9fd5533992b14de495e4f3e4caea368693a7b7e5a805fb2938287bed949900e7e3d7f94bea3c1a8727b45e19c85996965d0c7
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-content-blog@npm:2.3.1": "@docusaurus/plugin-content-blog@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-content-blog@npm:2.3.1" resolution: "@docusaurus/plugin-content-blog@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.3.1 "@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
cheerio: ^1.0.0-rc.12 cheerio: ^1.0.0-rc.12
feed: ^4.2.2 feed: ^4.2.2
fs-extra: ^10.1.0 fs-extra: ^10.1.0
@ -1900,21 +1900,21 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: abc668ceab15269f57be7f74acbec2e139b4f6b90af8771d246a9036d124b49b0d9fd4890e9566df7a4ba960f2da0316c18741eed1be0646f2b4602465219ddd checksum: e912ea1a01c1769b374aecf1af72cef96dbed5faa01b74cc12d951dd5dccc089994ff649f0a18f994e39730338f99c0aa12f3b2a1eefc40888f1fb7956cece29
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-content-docs@npm:2.3.1": "@docusaurus/plugin-content-docs@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-content-docs@npm:2.3.1" resolution: "@docusaurus/plugin-content-docs@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.3.1 "@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
"@types/react-router-config": ^5.0.6 "@types/react-router-config": ^5.0.6
combine-promises: ^1.1.0 combine-promises: ^1.1.0
fs-extra: ^10.1.0 fs-extra: ^10.1.0
@ -1927,132 +1927,132 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: bcf8d921407d11b497926a1f61a1dc8c96f82fbe5a1959cc106b082e555f8fb6f42cf9262a658acf33d9543e5eb3e778049d91f71e4a2855993dc759c845cf31 checksum: 5a273e80f2c28e4a33ab994e8702b3afaff04eb73f156a0a3e42cd9d182f8e1ed2b794348b090ec170cc1e4aba2e997d1fb6e8684f73ac6698bf66d96114c57b
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-content-pages@npm:2.3.1": "@docusaurus/plugin-content-pages@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-content-pages@npm:2.3.1" resolution: "@docusaurus/plugin-content-pages@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
fs-extra: ^10.1.0 fs-extra: ^10.1.0
tslib: ^2.4.0 tslib: ^2.4.0
webpack: ^5.73.0 webpack: ^5.73.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 8543050ed7330f54a28c0daeef11662eed3f3a08a6d0015b1a32db3d5e9ec46f0c6a8a5a4cb3e871ce953074d60424cc418b7ffa280695294626855a7a1a146a checksum: 5381e913101f271476cbdc264e6058a0cbe0835ed4a823e430540da545253c1dc56578c66a6d978ee2f1aca114110aba529443ae835f26ef0eaf7de1ed6a5001
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-debug@npm:2.3.1": "@docusaurus/plugin-debug@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-debug@npm:2.3.1" resolution: "@docusaurus/plugin-debug@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
fs-extra: ^10.1.0 fs-extra: ^10.1.0
react-json-view: ^1.21.3 react-json-view: ^1.21.3
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: e660575f900eedbeab6e222eb4f8ef6a7a49815c91a97839a4839737c0b3101698bf7c6e035cbafaa49010340010a9ec0d37270dc81a470b3bae42662c7a24b8 checksum: 921614843453ef189dfa2ada31e7abed8f976b0c314f7486fde35f976911de2ab307863608326e96bea67468e98dc648aeea82dbad04d0701c3c48c92bd40c6c
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-google-analytics@npm:2.3.1": "@docusaurus/plugin-google-analytics@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-google-analytics@npm:2.3.1" resolution: "@docusaurus/plugin-google-analytics@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 9306ae89cd5fb8ca86fd58809d7e624f988411d8908a151e9b6d9e8d0b84e08f1e3eba46024bc4321bcaeb3e9bc38e919b0bcf561adc9d40fa97c8ffeb232888 checksum: 2d8c7e5689675ced9acffe1e2187144d6ebeea471a5992139c3eea87094e315e272263da5499591e85bc3501b7583f693d33c660507b36a835fc9eb75584c706
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-google-gtag@npm:2.3.1": "@docusaurus/plugin-google-gtag@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-google-gtag@npm:2.3.1" resolution: "@docusaurus/plugin-google-gtag@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 494f0405d79aa9cb36d1ea4cf739499ad15b59fe876573ab5b304b5e84ab6ef4d428ebdc26647777b0816af452f62959b5ddb25e5bbf73c7fb3d6568258980d0 checksum: 6aa0bb6ac5e410ea438db2de20c95a4a34d7056855b2e0baa7685e31bd9b3f48ef55f8135ca496688ccbfaba88945219acae146a244141bfb7e2372ba54c0ce2
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-google-tag-manager@npm:2.3.1": "@docusaurus/plugin-google-tag-manager@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-google-tag-manager@npm:2.3.1" resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: d0b2ccc212652bb4f1c1bd61420e7f235325d4f2e8de0f5b25282305f54209d05da981c1253325bcae9afbc7575bd5c246d037d2be5fbda06f2842ba8335ab47 checksum: 2df57cd95808ed7cf58ade342dcc3382e167ecebaedc7184588c214f6b64eab60fa0145ab0ce7e25803acfe3952412c1134d52ad0ea636cef652a73ccd79a5cb
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/plugin-sitemap@npm:2.3.1": "@docusaurus/plugin-sitemap@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/plugin-sitemap@npm:2.3.1" resolution: "@docusaurus/plugin-sitemap@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.3.1 "@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
fs-extra: ^10.1.0 fs-extra: ^10.1.0
sitemap: ^7.1.1 sitemap: ^7.1.1
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 667d2abbf46efffc4d20e38fe435a19392f07726446193a017306652ee9db3d478e971eefb209e1a5c243b6b82af3de72d4b975b8e74aa93bda4711ce8c309bc checksum: e96fcc84352880da6a3e566cdc249e44ad825b400f2d798746201c3a4a255b196b999f5bf5d0a5b52c752acf9e9eb1169111b463914502a6cae9c114800fa09e
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/preset-classic@npm:^2.3.1": "@docusaurus/preset-classic@npm:^2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/preset-classic@npm:2.3.1" resolution: "@docusaurus/preset-classic@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/plugin-content-blog": 2.3.1 "@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.3.1 "@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.3.1 "@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/plugin-debug": 2.3.1 "@docusaurus/plugin-debug": 2.4.0
"@docusaurus/plugin-google-analytics": 2.3.1 "@docusaurus/plugin-google-analytics": 2.4.0
"@docusaurus/plugin-google-gtag": 2.3.1 "@docusaurus/plugin-google-gtag": 2.4.0
"@docusaurus/plugin-google-tag-manager": 2.3.1 "@docusaurus/plugin-google-tag-manager": 2.4.0
"@docusaurus/plugin-sitemap": 2.3.1 "@docusaurus/plugin-sitemap": 2.4.0
"@docusaurus/theme-classic": 2.3.1 "@docusaurus/theme-classic": 2.4.0
"@docusaurus/theme-common": 2.3.1 "@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-search-algolia": 2.3.1 "@docusaurus/theme-search-algolia": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: e4128a1bcb64d5ced04a281476ec1ae2d5523040d41ed57a8f744fb83659a2a2be902e94989de69ab1e6d693ec26c60d1ef6b2fe3ec96d5af6c9b3ef58f5b0cd checksum: 33961a1edd445f13971e640db9445a0fae418babf0fe5f4078f21e605f9d945f7a3a4b7ad53ac7b578a7302f093c708429f462a76a3f297b3439d8e23b3990aa
languageName: node languageName: node
linkType: hard linkType: hard
@ -2068,26 +2068,26 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/theme-classic@npm:2.3.1": "@docusaurus/theme-classic@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/theme-classic@npm:2.3.1" resolution: "@docusaurus/theme-classic@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.3.1 "@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/plugin-content-blog": 2.3.1 "@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.3.1 "@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.3.1 "@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/theme-common": 2.3.1 "@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-translations": 2.3.1 "@docusaurus/theme-translations": 2.4.0
"@docusaurus/types": 2.3.1 "@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.3.1 "@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
"@mdx-js/react": ^1.6.22 "@mdx-js/react": ^1.6.22
clsx: ^1.2.1 clsx: ^1.2.1
copy-text-to-clipboard: ^3.0.1 copy-text-to-clipboard: ^3.0.1
infima: 0.2.0-alpha.42 infima: 0.2.0-alpha.43
lodash: ^4.17.21 lodash: ^4.17.21
nprogress: ^0.2.0 nprogress: ^0.2.0
postcss: ^8.4.14 postcss: ^8.4.14
@ -2100,20 +2100,21 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 273812924fc29b2316aff554ae0302509ebeaca5aa829b58253e74d22a66e69444f1c324a2d5e8e170e6c6f27dd0d6927e6c6a22a7e0c14567ff777d04a5b0c1 checksum: 7f3161d7be653b6a86ffd58d8a6c6d62f464db919c32b7b9ab2ec9ca1b79136e2278fdc908e90cfa31cf21385d87cd7496d5bf9c80d30c2279ef95e7f7be28aa
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/theme-common@npm:2.3.1": "@docusaurus/theme-common@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/theme-common@npm:2.3.1" resolution: "@docusaurus/theme-common@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/mdx-loader": 2.3.1 "@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.3.1 "@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/plugin-content-blog": 2.3.1 "@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.3.1 "@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.3.1 "@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@types/history": ^4.7.11 "@types/history": ^4.7.11
"@types/react": "*" "@types/react": "*"
"@types/react-router-config": "*" "@types/react-router-config": "*"
@ -2126,22 +2127,22 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 6b902e9e782721c3c49bcdee5d969ea1c1138ebcb03891e34f827b16f2c06f43a86d95f240a60ed084539e9b16435312a41be7bff4e724f4fb209998dd4d3a59 checksum: 0790c6e5ad14bc8518173314a058e01837321d5992364d1ae4f9907f1d055f5852f883512d7a64e5add95dcfe362a009b374220de6493b32624a406d8ce74750
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/theme-search-algolia@npm:2.3.1": "@docusaurus/theme-search-algolia@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/theme-search-algolia@npm:2.3.1" resolution: "@docusaurus/theme-search-algolia@npm:2.4.0"
dependencies: dependencies:
"@docsearch/react": ^3.1.1 "@docsearch/react": ^3.1.1
"@docusaurus/core": 2.3.1 "@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/plugin-content-docs": 2.3.1 "@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/theme-common": 2.3.1 "@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-translations": 2.3.1 "@docusaurus/theme-translations": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.3.1 "@docusaurus/utils-validation": 2.4.0
algoliasearch: ^4.13.1 algoliasearch: ^4.13.1
algoliasearch-helper: ^3.10.0 algoliasearch-helper: ^3.10.0
clsx: ^1.2.1 clsx: ^1.2.1
@ -2153,23 +2154,23 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 965303068e43b11f58d20b95bb6dfc01d5e575c2070d2730b94303bd2a1d33794075cae43bfe472f08061bd8770f14c8eb54932274e6b39f954ab34e7cfc5689 checksum: a74a199faf6bab1d663cd41f9477c65c17f8dd2080664d5c00f998eb7c57345f1c30ff4f2c3bc88863f2e606c6f7475300747480dc145e61dd42798ca4fd435e
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/theme-translations@npm:2.3.1": "@docusaurus/theme-translations@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/theme-translations@npm:2.3.1" resolution: "@docusaurus/theme-translations@npm:2.4.0"
dependencies: dependencies:
fs-extra: ^10.1.0 fs-extra: ^10.1.0
tslib: ^2.4.0 tslib: ^2.4.0
checksum: dd3796be63c4c946af789c3da18ed2704a2fa90d8e752ba2b780a124dc13369ba590218afad0ac4ea2342f7331ccb9eb1be086226c950b8384978d94a15c57ad checksum: 37f329eb74fcb16c14bd370038d8bd1e18017fb1f78564d960c53fd4e110eb166f6f1c03f323dea28ede95873ebe28a659554d02cc26d1c3e748a772f9d2313a
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/types@npm:2.3.1": "@docusaurus/types@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/types@npm:2.3.1" resolution: "@docusaurus/types@npm:2.4.0"
dependencies: dependencies:
"@types/history": ^4.7.11 "@types/history": ^4.7.11
"@types/react": "*" "@types/react": "*"
@ -2182,13 +2183,13 @@ __metadata:
peerDependencies: peerDependencies:
react: ^16.8.4 || ^17.0.0 react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0
checksum: 91e52f37b97964112aa0d50ee4a6f534d7da941443af5ddc96418817c6ce532a98c73e67045ac703b582c7ed703ebb360205eec30da7f738c0105f2b3ae1a246 checksum: 54b0cd8992269ab0508d94ce19a7fcc2b3e7c9700eb112c9b859ddac8228dcc64282c414b602ba44894be87be79eeeef730fb8e569be68b6e26453e18addcf21
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/utils-common@npm:2.3.1": "@docusaurus/utils-common@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/utils-common@npm:2.3.1" resolution: "@docusaurus/utils-common@npm:2.4.0"
dependencies: dependencies:
tslib: ^2.4.0 tslib: ^2.4.0
peerDependencies: peerDependencies:
@ -2196,28 +2197,28 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@docusaurus/types": "@docusaurus/types":
optional: true optional: true
checksum: 405dc5b8aba9a97b2670ba8ff3911bbdaed274edc15214ab482a7159a07ad1c9b3198835a7bee42de4e0320d42bd402ed89ae6896744a364d64d89d9f78bcfb0 checksum: 711e61e899b133fc7cd755e6de75fd79a712eeabbd9853b9122e3929c8390e015bb9e4bca2284028e40e7a0fb2b89ef1c184f7e4149097ffd7b64821b38c11da
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/utils-validation@npm:2.3.1": "@docusaurus/utils-validation@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/utils-validation@npm:2.3.1" resolution: "@docusaurus/utils-validation@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@docusaurus/utils": 2.3.1 "@docusaurus/utils": 2.4.0
joi: ^17.6.0 joi: ^17.6.0
js-yaml: ^4.1.0 js-yaml: ^4.1.0
tslib: ^2.4.0 tslib: ^2.4.0
checksum: 1e5529d1d0c4fcd9006adf2e5b545458a7dba3877563fb444dcec472f27a3d8492d4c6fb5dd1071bb6e668a13a845d74b8f6c4b6387babfa0e467a9b8b237fda checksum: 21a229858ed9254830b68dd08de6456dc19b68adead581f86e854ea3e55b64b9616a3bbca521e74f754c9c7bc835ca348dfe9f0949d9a8d189db5b39bcdb9f6b
languageName: node languageName: node
linkType: hard linkType: hard
"@docusaurus/utils@npm:2.3.1": "@docusaurus/utils@npm:2.4.0":
version: 2.3.1 version: 2.4.0
resolution: "@docusaurus/utils@npm:2.3.1" resolution: "@docusaurus/utils@npm:2.4.0"
dependencies: dependencies:
"@docusaurus/logger": 2.3.1 "@docusaurus/logger": 2.4.0
"@svgr/webpack": ^6.2.1 "@svgr/webpack": ^6.2.1
escape-string-regexp: ^4.0.0 escape-string-regexp: ^4.0.0
file-loader: ^6.2.0 file-loader: ^6.2.0
@ -2238,7 +2239,7 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@docusaurus/types": "@docusaurus/types":
optional: true optional: true
checksum: e8bce9bbd98bf63664fcd7c0a5f8dec30dad31ed19e18d724b43189b04ecdc1174537e1d987293575ec18d421236fb92d3d39d28477e921507260a39c3f6d6d0 checksum: 7ba6634b6ff71bb7cc64b0eb3c6d2892a21873bce8559bcd460693a80ca0229828c04da751277cdb17c6f18e80e061322bbcd84e9b743adc96c594b43e8a2165
languageName: node languageName: node
linkType: hard linkType: hard
@ -2700,10 +2701,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@tsconfig/docusaurus@npm:^1.0.6": "@tsconfig/docusaurus@npm:^1.0.7":
version: 1.0.6 version: 1.0.7
resolution: "@tsconfig/docusaurus@npm:1.0.6" resolution: "@tsconfig/docusaurus@npm:1.0.7"
checksum: fb0d7965c01fe64fc6369a72695b903d654bd5fb145f373d707c2bae3c2d828703517d812cef1c041ae44b108f44e52778b9d9837a54fdf782e68e6619a90a4d checksum: 8f5b14005d90b2008f10daf03a5edec86d2a7603e5641c579ea936a5c2d165a8c3007a72254fc4c2adb0554d73062f52bb97b30ff818f01c9215957822f3c4db
languageName: node languageName: node
linkType: hard linkType: hard
@ -6283,10 +6284,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"infima@npm:0.2.0-alpha.42": "infima@npm:0.2.0-alpha.43":
version: 0.2.0-alpha.42 version: 0.2.0-alpha.43
resolution: "infima@npm:0.2.0-alpha.42" resolution: "infima@npm:0.2.0-alpha.43"
checksum: 7206f36639c00a08daab811fedc748068951497efb5ec948cba846fb23856443668015f6bd65ddebe857cc2235f6ca98429f7018c73dcac47b0361ef4721bb8f checksum: fc5f79240e940eddd750439511767092ccb4051e5e91d253ec7630a9e7ce691812da3aa0f05e46b4c0a95dbfadeae5714fd0073f8d2df12e5aaff0697a1d6aa2
languageName: node languageName: node
linkType: hard linkType: hard
@ -7357,19 +7358,19 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "modular-avatar-docs@workspace:." resolution: "modular-avatar-docs@workspace:."
dependencies: dependencies:
"@algolia/client-search": ^4.14.3 "@algolia/client-search": ^4.17.0
"@docusaurus/core": ^2.3.1 "@docusaurus/core": ^2.4.0
"@docusaurus/module-type-aliases": 2.3.1 "@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/preset-classic": ^2.3.1 "@docusaurus/preset-classic": ^2.4.0
"@mdx-js/react": ^1.6.22 "@mdx-js/react": ^1.6.22
"@tsconfig/docusaurus": ^1.0.6 "@tsconfig/docusaurus": ^1.0.7
clsx: ^1.2.1 clsx: ^1.2.1
prism-react-renderer: ^1.3.5 prism-react-renderer: ^1.3.5
react: ^17.0.2 react: ^17.0.2
react-dom: ^17.0.2 react-dom: ^17.0.2
react-loadable: ^5.5.0 react-loadable: ^5.5.0
react-player: ^2.11.2 react-player: ^2.12.0
typescript: ^4.9.5 typescript: ^5.0.4
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -8770,9 +8771,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"react-player@npm:^2.11.2": "react-player@npm:^2.12.0":
version: 2.11.2 version: 2.12.0
resolution: "react-player@npm:2.11.2" resolution: "react-player@npm:2.12.0"
dependencies: dependencies:
deepmerge: ^4.0.0 deepmerge: ^4.0.0
load-script: ^1.0.0 load-script: ^1.0.0
@ -8781,7 +8782,7 @@ __metadata:
react-fast-compare: ^3.0.1 react-fast-compare: ^3.0.1
peerDependencies: peerDependencies:
react: ">=16.6.0" react: ">=16.6.0"
checksum: 003bfcfb00692f3b5e8dd831411a26a66474b7cb8003284ea835c50f7e9ca831895f8557c9ceafdb29ab9915a3ce0f5ba655c8c88fbff6acae3d4554de9986ee checksum: 77d3e55ed67cd9c1e2300a990d8015d270072daad41f8a0750c32748f3fbfbc5bd2a2f06e78ac6828c2260b84537b9571d0abac31d3e888b74a3dccb59a56365
languageName: node languageName: node
linkType: hard linkType: hard
@ -10132,23 +10133,23 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@npm:^4.9.5": "typescript@npm:^5.0.4":
version: 4.9.5 version: 5.0.4
resolution: "typescript@npm:4.9.5" resolution: "typescript@npm:5.0.4"
bin: bin:
tsc: bin/tsc tsc: bin/tsc
tsserver: bin/tsserver tsserver: bin/tsserver
checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@^4.9.5#~builtin<compat/typescript>": "typescript@patch:typescript@^5.0.4#~builtin<compat/typescript>":
version: 4.9.5 version: 5.0.4
resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin<compat/typescript>::version=4.9.5&hash=23ec76" resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin<compat/typescript>::version=5.0.4&hash=1f5320"
bin: bin:
tsc: bin/tsc tsc: bin/tsc
tsserver: bin/tsserver tsserver: bin/tsserver
checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d checksum: 6a1fe9a77bb9c5176ead919cc4a1499ee63e46b4e05bf667079f11bf3a8f7887f135aa72460a4c3b016e6e6bb65a822cb8689a6d86cbfe92d22cc9f501f09213
languageName: node languageName: node
linkType: hard linkType: hard
@ -10675,8 +10676,8 @@ __metadata:
linkType: hard linkType: hard
"webpack@npm:^5.73.0": "webpack@npm:^5.73.0":
version: 5.75.0 version: 5.76.3
resolution: "webpack@npm:5.75.0" resolution: "webpack@npm:5.76.3"
dependencies: dependencies:
"@types/eslint-scope": ^3.7.3 "@types/eslint-scope": ^3.7.3
"@types/estree": ^0.0.51 "@types/estree": ^0.0.51
@ -10707,7 +10708,7 @@ __metadata:
optional: true optional: true
bin: bin:
webpack: bin/webpack.js webpack: bin/webpack.js
checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a checksum: 363f536b56971d056e34ab4cffa4cbc630b220e51be1a8c3adea87d9f0b51c49cfc7c3720d6614a1fd2c8c63f1ab3100db916fe8367c8bb9299327ff8c3f856d
languageName: node languageName: node
linkType: hard linkType: hard