Merge branch 'main' into enhancement/add_bounds_override_module

This commit is contained in:
bd_ 2023-06-05 19:04:30 +09:00 committed by GitHub
commit d5c2b98a05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 5731 additions and 44 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c217d78c5408b04489548a5823bed3d4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,29 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
namespace modular_avatar_tests
{
internal class ProbeAnchorTests : TestBase
{
[Test]
public void TestProbeAnchor()
{
var prefab = CreatePrefab("ProbeAnchorTests.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var root = prefab.transform.Find("RendererRoot");
var target = prefab.transform.Find("ProbeTarget");
var obj1 = prefab.transform.Find("RendererRoot/SkinnedMeshRenderer").GetComponent<Renderer>();
var obj2 = prefab.transform.Find("RendererRoot/MeshRenderer").GetComponent<Renderer>();
var obj3 = prefab.transform.Find("RendererRoot/ParticleSystemRenderer").GetComponent<Renderer>();
var obj4 = prefab.transform.Find("RendererRoot/TrailRenderer").GetComponent<Renderer>();
Assert.AreEqual(target, obj1.probeAnchor);
Assert.AreEqual(target, obj2.probeAnchor);
Assert.AreEqual(target, obj3.probeAnchor);
Assert.AreEqual(target, obj4.probeAnchor);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1c3ea8cc803f79c45a629964d7316a3f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -198,6 +198,7 @@ namespace nadena.dev.modular_avatar.core.editor
new MenuInstallHook().OnPreprocessAvatar(avatarGameObject, context);
new MergeArmatureHook().OnPreprocessAvatar(context, avatarGameObject);
new BoneProxyProcessor().OnPreprocessAvatar(avatarGameObject);
new ProbeAnchorProcessor().OnPreprocessAvatar(avatarGameObject);
new VisibleHeadAccessoryProcessor(vrcAvatarDescriptor).Process(context);
new BoundsOverrideProcessor().OnProcessAvatar(avatarGameObject);
new RemapAnimationPass(vrcAvatarDescriptor).Process(context.AnimationDatabase);

View File

@ -24,6 +24,8 @@ namespace nadena.dev.modular_avatar.editor.ErrorReporting
return CheckInternal(bp);
case ModularAvatarBoundsOverride bo:
return CheckInternal(bo);
case ModularAvatarProbeAnchor pa:
return CheckInternal(pa);
case ModularAvatarMenuInstaller mi:
return CheckInternal(mi);
case ModularAvatarMergeAnimator obj:
@ -138,6 +140,19 @@ namespace nadena.dev.modular_avatar.editor.ErrorReporting
return null;
}
private static List<ErrorLog> CheckInternal(ModularAvatarProbeAnchor pa)
{
if (pa.probeTarget == null)
{
return new List<ErrorLog>()
{
new ErrorLog(ReportLevel.Validation, "validation.probe_anchor.no_target", pa)
};
}
return null;
}
private static List<ErrorLog> CheckInternal(ModularAvatarBoundsOverride bo)
{
if (bo.rootBoneTarget.Get(bo) == null)

View File

@ -0,0 +1,39 @@
using UnityEditor;
using static nadena.dev.modular_avatar.core.editor.Localization;
namespace nadena.dev.modular_avatar.core.editor
{
[CustomEditor(typeof(ModularAvatarProbeAnchor))]
[CanEditMultipleObjects]
internal class ProbeAnchorEditor : MAEditorBase
{
private SerializedProperty prop_probeTarget;
private void OnEnable()
{
prop_probeTarget = serializedObject.FindProperty(nameof(ModularAvatarProbeAnchor.probeTarget));
}
private void ShowParametersUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(prop_probeTarget, G("probeanchor.target"));
serializedObject.ApplyModifiedProperties();
}
protected override void OnInnerInspectorGUI()
{
EditorGUILayout.HelpBox(S("probe_anchor.help"), MessageType.Info);
EditorGUI.BeginChangeCheck();
ShowParametersUI();
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
}
Localization.ShowLanguageUI();
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1ac49767157d7e142b4b1f277baf00ed
timeCreated: 1664757842

View File

@ -3,6 +3,7 @@
"test0.test_b": "test_b",
"boneproxy.foldout.advanced": "Advanced",
"boneproxy.target": "Target",
"probeanchor.target": "Target",
"menuinstall.help.hint_set_menu": "This prefab will be installed to the root menu of your avatar by default. Select a different menu or uncheck the component's enabled checkbox to prevent this.",
"menuinstall.help.hint_bad_menu": "Selected menu asset is not part of your avatar.",
"menuinstall.installto": "Install To",
@ -59,6 +60,7 @@
"hint.not_in_avatar": "This component needs to be placed inside your avatar to work properly.",
"boneproxy.err.MovingTarget": "You cannot specify a target object that will be moved by other Modular Avatar components",
"boneproxy.err.NotInAvatar": "You must specify an object that is in the avatar",
"probeanchor.err.NotInAvatar": "You must specify an object that is in the avatar",
"boneproxy.attachment": "Attachment mode",
"boneproxy.attachment.AsChildAtRoot": "As child; at root",
"boneproxy.attachment.AsChildKeepWorldPose": "As child; keep position and rotation",
@ -69,6 +71,7 @@
"bounds_override.bounds": "Bounds",
"bounds_override_blocker.help": "Within this object will no longer be affected by the parent's BoundsOverride.",
"pb_blocker.help": "This object will not be affected by PhysBones attached to parents.",
"probe_anchor.help": "Sets the Anchor Override for the inner renderer object.",
"hint.bad_vrcsdk": "Incompatible version of VRCSDK detected.\n\nPlease try upgrading your VRCSDK; if this does not work, check for a newer version of Modular Avatar as well.",
"error.stack_trace": "Stack trace (provide this when reporting bugs!)",
"error.merge_armature.merge_into_self": "Your Merge Armature component is referencing itself, or a child of itself, as the merge target. You should reference the avatar's armature instead. Do not put Merge Armature on the avatar's main armature.",
@ -85,6 +88,7 @@
"validation.blendshape_sync.missing_target_mesh": "No mesh found on the renderer on the target object",
"validation.bone_proxy.no_target": "No target object specified (or target object not found)",
"validation.bounds_override.no_target": "No target object specified (or target object not found)",
"validation.probe_anchor.no_target": "No target object specified (or target object not found)",
"validation.menu_installer.no_menu": "No menu to install specified",
"validation.merge_animator.no_animator": "No animator to merge specified",
"validation.merge_armature.no_target": "No merge target specified",

View File

@ -1,6 +1,7 @@
{
"boneproxy.foldout.advanced": "詳細設定",
"boneproxy.target": "ターゲット",
"probeanchor.target": "ターゲット",
"menuinstall.help.hint_set_menu": "このプレハブは自動的にアバターの一番上のメニューに導入されます。不要な場合は別のメニューを指定するか、コンポーネントの有効状態を切ってください。",
"menuinstall.help.hint_bad_menu": "選択されたメニューがアバターに紐づけされていません。",
"menuinstall.installto": "インストール先",
@ -57,6 +58,7 @@
"hint.not_in_avatar": "このコンポーネントが正しく動作するには、アバター内に配置する必要があります。",
"boneproxy.err.MovingTarget": "他のモジュラーアバターコンポーネントで移動されるオブジェクトを指定できません。",
"boneproxy.err.NotInAvatar": "アバター内のオブジェクトを指定してください。",
"probeanchor.err.NotInAvatar": "アバター内のオブジェクトを指定してください。",
"boneproxy.attachment": "配置モード",
"boneproxy.attachment.AsChildAtRoot": "子として・ルートに配置",
"boneproxy.attachment.AsChildKeepWorldPose": "子として・ワールド位置と向きを維持",
@ -67,6 +69,7 @@
"bounds_override.bounds": "バウンズ",
"bounds_override_blocker.help": "このオブジェクト内は親のBoundsOverrideの影響を受けなくなります。",
"pb_blocker.help": "このオブジェクトは親のPhysBoneから影響を受けなくなります。",
"probe_anchor.help": "このオブジェクトに含まれるレンダラーのAnchorOverrideを設定します。",
"hint.bad_vrcsdk": "使用中のVRCSDKのバージョンとは互換性がありません。\n\nVRCSDKを更新してみてください。それでもだめでしたら、Modular Avatarにも最新版が出てないかチェックしてください。",
"error.stack_trace": "スタックトレース(バグを報告する時は必ず添付してください!)",
"error.merge_armature.merge_into_self": "Merge Armatureに自分自身のオブジェクト、もしくは自分の子をターゲットにしてしています。かわりにアバターのメインArmatureを指定してください。アバター自体のArmatureに追加しないでください。",
@ -83,6 +86,7 @@
"validation.blendshape_sync.missing_target_mesh": "同期元のオブジェクトにはSkinnedMeshRendererがありますが、メッシュがありません。",
"validation.bone_proxy.no_target": "ターゲットオブジェクトが未設定、もしくは存在しません。",
"validation.bounds_override.no_target": "ターゲットオブジェクトが未設定、もしくは存在しません。",
"validation.probe_anchor.no_target": "ターゲットオブジェクトが未設定、もしくは存在しません。",
"validation.menu_installer.no_menu": "インストールするメニューがありません。",
"validation.merge_animator.no_animator": "Animator Controllerがありません。",
"validation.merge_armature.no_target": "ターゲットオブジェクトが未設定、もしくは存在しません。",

View File

@ -1,6 +1,7 @@
{
"boneproxy.foldout.advanced": "高级设置",
"boneproxy.target": "目标",
"probeanchor.target": "目标",
"menuinstall.help.hint_set_menu": "此预制体的菜单默认会安装Avatar的顶部菜单中. 如果不需要, 可以选择其他菜单或取消勾选启用复选框.",
"menuinstall.help.hint_bad_menu": "选择的菜单不属于当前Avatar.",
"menuinstall.installto": "安装到",
@ -52,9 +53,11 @@
"hint.not_in_avatar": "此组件需要放置于你的Avatar中才能工作",
"boneproxy.err.MovingTarget": "您不能指定将由其他 Modular Avatar 组件移动的目标对象",
"boneproxy.err.NotInAvatar": "你必须指定一个在Avatar中的对象",
"probeanchor.err.NotInAvatar": "你必须指定一个在Avatar中的对象",
"boneproxy.attachment": "附加模式",
"boneproxy.attachment.AsChildAtRoot": "作为子对象, 放置于Root",
"boneproxy.attachment.AsChildKeepWorldPosition": "作为子对象, 保持原有位置",
"pb_blocker.help": "当前对象不会受到附加的父对象的PhysBones的影响.",
"probe_anchor.help": "设置此对象所包含的渲染器的AnchorOverride",
"hint.bad_vrcsdk": "检测到不兼容的VRCSDK版本.\n\n请尝试升级VRCSDK; 如果这不起作用, 请尝试新版本的Modular Avatar."
}

View File

@ -0,0 +1,75 @@
/*
* 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 nadena.dev.modular_avatar.editor.ErrorReporting;
using UnityEngine;
namespace nadena.dev.modular_avatar.core.editor
{
internal class ProbeAnchorProcessor
{
internal enum ValidationResult
{
OK,
NotInAvatar
}
internal void OnPreprocessAvatar(GameObject avatarGameObject)
{
var boneProxies = avatarGameObject.GetComponentsInChildren<ModularAvatarProbeAnchor>(true);
foreach (var proxy in boneProxies)
{
BuildReport.ReportingObject(proxy, () => ProcessAnchor(avatarGameObject, proxy));
}
}
private void ProcessAnchor(GameObject avatarGameObject, ModularAvatarProbeAnchor proxy)
{
if (proxy.probeTarget.Get(proxy) != null && ValidateTarget(avatarGameObject, proxy.probeTarget.Get(proxy).transform) == ValidationResult.OK)
{
foreach (Renderer r in proxy.GetComponentsInChildren<Renderer>(true))
{
r.probeAnchor = proxy.probeTarget.Get(proxy).transform;
}
}
Object.DestroyImmediate(proxy);
}
internal static ValidationResult ValidateTarget(GameObject avatarGameObject, Transform proxyTarget)
{
var avatar = avatarGameObject.transform;
var node = proxyTarget;
while (node != null && node != avatar)
{
node = node.parent;
}
if (node == null) return ValidationResult.NotInAvatar;
else return ValidationResult.OK;
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cdb66cfc3a147a849810baa9315df90f
timeCreated: 1661649405

View File

@ -128,6 +128,7 @@ namespace nadena.dev.modular_avatar.core.editor
SetGizmoIconEnabled(typeof(ModularAvatarBoneProxy), false);
SetGizmoIconEnabled(typeof(ModularAvatarBoundsOverride), false);
SetGizmoIconEnabled(typeof(ModularAvatarBoundsOverrideBlocker), false);
SetGizmoIconEnabled(typeof(ModularAvatarProbeAnchor), false);
SetGizmoIconEnabled(typeof(ModularAvatarBlendshapeSync), false);
SetGizmoIconEnabled(typeof(ModularAvatarMenuInstaller), false);
SetGizmoIconEnabled(typeof(ModularAvatarMergeAnimator), false);

View File

@ -0,0 +1,38 @@
/*
* 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 UnityEditor;
using UnityEngine;
namespace nadena.dev.modular_avatar.core
{
[ExecuteInEditMode]
[DisallowMultipleComponent]
[AddComponentMenu("Modular Avatar/MA Probe Anchor")]
public class ModularAvatarProbeAnchor : AvatarTagComponent
{
public AvatarObjectReference probeTarget;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b18784296c2581e498e5127a23e6f019
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: a8edd5bd1a0a64a40aa99cc09fb5f198, type: 3}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -15,7 +15,7 @@
"typecheck": "tsc"
},
"dependencies": {
"@algolia/client-search": "^4.17.0",
"@algolia/client-search": "^4.17.1",
"@docusaurus/core": "^2.4.1",
"@docusaurus/preset-classic": "^2.4.1",
"@mdx-js/react": "^1.6.22",
@ -31,7 +31,7 @@
"devDependencies": {
"@docusaurus/module-type-aliases": "2.4.1",
"@tsconfig/docusaurus": "^1.0.7",
"typescript": "^5.0.4"
"typescript": "^5.1.3"
},
"resolutions": {
"trim": "1.0.1",

View File

@ -49,10 +49,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/cache-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/cache-common@npm:4.17.0"
checksum: cbf8d6ca4ee653f2bef6665eb36b7afee2d4031abe5444cd121d60614189f2c96d0e00cfef990cbe68d318dbcef9b38f5df70476f9088ef43f8c83d69d0802b8
"@algolia/cache-common@npm:4.17.1":
version: 4.17.1
resolution: "@algolia/cache-common@npm:4.17.1"
checksum: 5d7de263b4fcb95d09e24941326e92e7e31b32fea2af983aaec2407fe8c85821913a0b4fada696ae5c2ca72a589ea2309fb7b4559c1071e66eda7ee5c5eea072
languageName: node
linkType: hard
@ -98,13 +98,13 @@ __metadata:
languageName: node
linkType: hard
"@algolia/client-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/client-common@npm:4.17.0"
"@algolia/client-common@npm:4.17.1":
version: 4.17.1
resolution: "@algolia/client-common@npm:4.17.1"
dependencies:
"@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.17.0
checksum: 05791d5483e16a0776a1fb16f42a8e62c67be844e82ff506b5ed82669367f6ea5fba79bcffa90ff4af2039bd8fb16db395edc4c0b1e0c11c050de8a118642180
"@algolia/requester-common": 4.17.1
"@algolia/transporter": 4.17.1
checksum: 0d2dff8cf56107eb4a3749325eca42451384d2d3a608429eb83b156772c243d1247213abccfda3cdcba086fc73f91f393883e8fd9115b51bfb2e3a973e7944e1
languageName: node
linkType: hard
@ -130,14 +130,14 @@ __metadata:
languageName: node
linkType: hard
"@algolia/client-search@npm:^4.17.0":
version: 4.17.0
resolution: "@algolia/client-search@npm:4.17.0"
"@algolia/client-search@npm:^4.17.1":
version: 4.17.1
resolution: "@algolia/client-search@npm:4.17.1"
dependencies:
"@algolia/client-common": 4.17.0
"@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.17.0
checksum: ca6aedd67e69112e3a86086e48de4f38b9d127c2e606b345de58a528dd2d2016e70783cf446dfa669036c69ffbd0616f27b180cacb6ab0fafe85065b2b8d323f
"@algolia/client-common": 4.17.1
"@algolia/requester-common": 4.17.1
"@algolia/transporter": 4.17.1
checksum: 1f6997566686fc3a41de1471676b0a4396c27549a5dd7df9fbe6fbcdd462dea7386879b35b01e63c47f080c805f7d140bef074299806f99e0ae6cdfcf0e2f194
languageName: node
linkType: hard
@ -155,10 +155,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/logger-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/logger-common@npm:4.17.0"
checksum: e6359266544ed9d9eab8d4217c126a8209f74fbd1e407f2249b886915a521e89e419dc6401a65389523f3bdffb3880c0a95578c3c437653f941ddb1095c37e08
"@algolia/logger-common@npm:4.17.1":
version: 4.17.1
resolution: "@algolia/logger-common@npm:4.17.1"
checksum: 5ee1a297236f0c9858657b8fb0e27d8b4eb52fa05d92ed8d4a99327447363e0429380149af5d55839a88ad688830d666a0c9fa8ee9777b821732d7d2282be83f
languageName: node
linkType: hard
@ -187,10 +187,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/requester-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/requester-common@npm:4.17.0"
checksum: 13ace23f53fc88677d896ae4506f04a5defd17f69b9611571e19dd45c91fda74a71acd27f799f55f88d550264b8f4477831d9ff546ffeb7257e35ec4ee983ca8
"@algolia/requester-common@npm:4.17.1":
version: 4.17.1
resolution: "@algolia/requester-common@npm:4.17.1"
checksum: c3589c58a99c80c3d313ed2cba1abf72af51db30ea6191deca61b37ea6b8bcc008ba0a7a3f004a97900469e74661f5dc55af5a34863622bfbf1b172b6b72fd56
languageName: node
linkType: hard
@ -214,14 +214,14 @@ __metadata:
languageName: node
linkType: hard
"@algolia/transporter@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/transporter@npm:4.17.0"
"@algolia/transporter@npm:4.17.1":
version: 4.17.1
resolution: "@algolia/transporter@npm:4.17.1"
dependencies:
"@algolia/cache-common": 4.17.0
"@algolia/logger-common": 4.17.0
"@algolia/requester-common": 4.17.0
checksum: 1864bf9ccdf63f5090a89f44358c30317f549b4dc37dd8ce446383ca217c1a9737ab2749ca92394a320574690ea04134ae600c2a3f1f9d393549a5124079c2a6
"@algolia/cache-common": 4.17.1
"@algolia/logger-common": 4.17.1
"@algolia/requester-common": 4.17.1
checksum: ca2ae63770e7a4ac580a1e63216a344ab5aba4f4ca26314d7c5619ba5ef6a92a644b97266aafb11822938f669011ebe049819936181de5a68ba9bb5849fa702e
languageName: node
linkType: hard
@ -7365,7 +7365,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "modular-avatar-docs@workspace:."
dependencies:
"@algolia/client-search": ^4.17.0
"@algolia/client-search": ^4.17.1
"@docusaurus/core": ^2.4.1
"@docusaurus/module-type-aliases": 2.4.1
"@docusaurus/preset-classic": ^2.4.1
@ -7379,7 +7379,7 @@ __metadata:
react-medium-image-zoom: ^5.1.6
react-modal: ^3.16.1
react-player: ^2.12.0
typescript: ^5.0.4
typescript: ^5.1.3
languageName: unknown
linkType: soft
@ -10167,23 +10167,23 @@ __metadata:
languageName: node
linkType: hard
"typescript@npm:^5.0.4":
version: 5.0.4
resolution: "typescript@npm:5.0.4"
"typescript@npm:^5.1.3":
version: 5.1.3
resolution: "typescript@npm:5.1.3"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172
checksum: d9d51862d98efa46534f2800a1071a613751b1585dc78884807d0c179bcd93d6e9d4012a508e276742f5f33c480adefc52ffcafaf9e0e00ab641a14cde9a31c7
languageName: node
linkType: hard
"typescript@patch:typescript@^5.0.4#~builtin<compat/typescript>":
version: 5.0.4
resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin<compat/typescript>::version=5.0.4&hash=1f5320"
"typescript@patch:typescript@^5.1.3#~builtin<compat/typescript>":
version: 5.1.3
resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin<compat/typescript>::version=5.1.3&hash=1f5320"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 6a1fe9a77bb9c5176ead919cc4a1499ee63e46b4e05bf667079f11bf3a8f7887f135aa72460a4c3b016e6e6bb65a822cb8689a6d86cbfe92d22cc9f501f09213
checksum: 32a25b2e128a4616f999d4ee502aabb1525d5647bc8955e6edf05d7fbc53af8aa98252e2f6ba80bcedfc0260c982b885f3c09cfac8bb65d2924f3133ad1e1e62
languageName: node
linkType: hard