diff --git a/Packages/src/Cli~/src/__tests__/package-metadata.test.ts b/Packages/src/Cli~/src/__tests__/package-metadata.test.ts index de5f92e22..ee9820dd1 100644 --- a/Packages/src/Cli~/src/__tests__/package-metadata.test.ts +++ b/Packages/src/Cli~/src/__tests__/package-metadata.test.ts @@ -23,6 +23,33 @@ type AssemblyDefinition = { const TEST_FRAMEWORK_PACKAGE_NAME = 'com.unity.test-framework'; const TEST_FRAMEWORK_DEFINE = 'ULOOPMCP_HAS_TEST_FRAMEWORK'; +const METADATA_VALIDATION_DEPENDENCY_META_PATHS = [ + 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll.meta', + 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll.meta', + 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll.meta', +] as const; +const METADATA_VALIDATION_PRIVATE_ASSEMBLIES = [ + { + relativePath: + 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll', + assemblyName: 'uLoopMCP.System.Collections.Immutable', + assemblyReferences: ['uLoopMCP.System.Runtime.CompilerServices.Unsafe'], + }, + { + relativePath: 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll', + assemblyName: 'uLoopMCP.System.Reflection.Metadata', + assemblyReferences: [ + 'uLoopMCP.System.Collections.Immutable', + 'uLoopMCP.System.Runtime.CompilerServices.Unsafe', + ], + }, + { + relativePath: + 'Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll', + assemblyName: 'uLoopMCP.System.Runtime.CompilerServices.Unsafe', + assemblyReferences: [], + }, +] as const; function loadPackageManifest(): PackageManifest { const packageJsonPath = join(__dirname, '..', '..', 'package.json'); @@ -45,6 +72,18 @@ function loadEditorAssemblyDefinition(): AssemblyDefinition { return JSON.parse(asmdefText) as AssemblyDefinition; } +function loadUnityPackageText(relativePath: string): string { + const assetPath = join(__dirname, '..', '..', '..', relativePath); + // eslint-disable-next-line security/detect-non-literal-fs-filename + return readFileSync(assetPath, 'utf8'); +} + +function loadUnityPackageBytes(relativePath: string): Buffer { + const assetPath = join(__dirname, '..', '..', '..', relativePath); + // eslint-disable-next-line security/detect-non-literal-fs-filename + return readFileSync(assetPath); +} + describe('package metadata', () => { it('avoids bin target prefixes that npm normalizes during publish', () => { const packageManifest = loadPackageManifest(); @@ -75,4 +114,27 @@ describe('package metadata', () => { }), ); }); + + it('keeps bundled metadata validation dependencies out of implicit project references', () => { + for (const metaPath of METADATA_VALIDATION_DEPENDENCY_META_PATHS) { + const metaText = loadUnityPackageText(metaPath); + + expect(metaText).toContain('isExplicitlyReferenced: 1'); + } + }); + + it('uses private assembly identities for metadata validation dependencies', () => { + for (const assembly of METADATA_VALIDATION_PRIVATE_ASSEMBLIES) { + const dllBytes = loadUnityPackageBytes(assembly.relativePath); + + expect(dllBytes.includes(Buffer.from(assembly.assemblyName))).toBe(true); + for (const assemblyReference of assembly.assemblyReferences) { + expect(dllBytes.includes(Buffer.from(assemblyReference))).toBe(true); + } + } + }); + + it('does not keep orphaned plugin folder metadata', () => { + expect(() => loadUnityPackageText('Plugins.meta')).toThrow(); + }); }); diff --git a/Packages/src/Plugins.meta b/Packages/src/Editor/MetadataValidation/Dependencies.meta similarity index 77% rename from Packages/src/Plugins.meta rename to Packages/src/Editor/MetadataValidation/Dependencies.meta index 5f3a8083a..4b430975f 100644 --- a/Packages/src/Plugins.meta +++ b/Packages/src/Editor/MetadataValidation/Dependencies.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 216dff41199af460685390e0306583dc +guid: 1650e75bb20ee4fffb2b799dec3cdcf8 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll new file mode 100644 index 000000000..7b2498cc9 Binary files /dev/null and b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll differ diff --git a/Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll.meta b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll.meta similarity index 95% rename from Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll.meta rename to Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll.meta index 4edf008b1..de331eca7 100644 --- a/Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll.meta +++ b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Collections.Immutable.dll.meta @@ -8,7 +8,7 @@ PluginImporter: defineConstraints: [] isPreloaded: 0 isOverridable: 1 - isExplicitlyReferenced: 0 + isExplicitlyReferenced: 1 validateReferences: 1 platformData: - first: diff --git a/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll new file mode 100644 index 000000000..472779dfc Binary files /dev/null and b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll differ diff --git a/Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll.meta b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll.meta similarity index 95% rename from Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll.meta rename to Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll.meta index 28f6b86c5..26f38e959 100644 --- a/Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll.meta +++ b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Reflection.Metadata.dll.meta @@ -8,7 +8,7 @@ PluginImporter: defineConstraints: [] isPreloaded: 0 isOverridable: 1 - isExplicitlyReferenced: 0 + isExplicitlyReferenced: 1 validateReferences: 1 platformData: - first: diff --git a/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 000000000..d0f5b6c04 Binary files /dev/null and b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll.meta b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll.meta similarity index 95% rename from Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll.meta rename to Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll.meta index 97ecb26fd..77a7e2719 100644 --- a/Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll.meta +++ b/Packages/src/Editor/MetadataValidation/Dependencies/uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll.meta @@ -8,7 +8,7 @@ PluginImporter: defineConstraints: [] isPreloaded: 0 isOverridable: 1 - isExplicitlyReferenced: 0 + isExplicitlyReferenced: 1 validateReferences: 1 platformData: - first: diff --git a/Packages/src/Editor/MetadataValidation/uLoopMCP.Editor.MetadataValidation.asmdef b/Packages/src/Editor/MetadataValidation/uLoopMCP.Editor.MetadataValidation.asmdef index f9e3f533b..cb47c086b 100644 --- a/Packages/src/Editor/MetadataValidation/uLoopMCP.Editor.MetadataValidation.asmdef +++ b/Packages/src/Editor/MetadataValidation/uLoopMCP.Editor.MetadataValidation.asmdef @@ -11,9 +11,9 @@ "allowUnsafeCode": false, "overrideReferences": true, "precompiledReferences": [ - "System.Collections.Immutable.dll", - "System.Runtime.CompilerServices.Unsafe.dll", - "System.Reflection.Metadata.dll" + "uLoopMCP.System.Collections.Immutable.dll", + "uLoopMCP.System.Runtime.CompilerServices.Unsafe.dll", + "uLoopMCP.System.Reflection.Metadata.dll" ], "autoReferenced": true, "defineConstraints": [], diff --git a/Packages/src/Plugins/CodeAnalysis.meta b/Packages/src/Plugins/CodeAnalysis.meta deleted file mode 100644 index d79e38e77..000000000 --- a/Packages/src/Plugins/CodeAnalysis.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d3f5f7720247b4c0e96b55df9c13bfe8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll b/Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll deleted file mode 100644 index ad944dff1..000000000 Binary files a/Packages/src/Plugins/CodeAnalysis/System.Collections.Immutable.dll and /dev/null differ diff --git a/Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll b/Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll deleted file mode 100644 index 34d543160..000000000 Binary files a/Packages/src/Plugins/CodeAnalysis/System.Reflection.Metadata.dll and /dev/null differ diff --git a/Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll b/Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100644 index 070abc296..000000000 Binary files a/Packages/src/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll and /dev/null differ